Example usage for org.eclipse.jgit.lib Repository close

List of usage examples for org.eclipse.jgit.lib Repository close

Introduction

In this page you can find the example usage for org.eclipse.jgit.lib Repository close.

Prototype

@Override
public void close() 

Source Link

Document

Decrement the use count, and maybe close resources.

Usage

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Returns the list of milestones for the repository.
 *
 * @param repository//from  w w  w .j a v a 2  s  . c o  m
 * @return the list of milestones
 * @since 1.4.0
 */
public List<TicketMilestone> getMilestones(RepositoryModel repository) {
    String key = repository.name;
    if (milestonesCache.containsKey(key)) {
        return milestonesCache.get(key);
    }
    List<TicketMilestone> list = new ArrayList<TicketMilestone>();
    Repository db = repositoryManager.getRepository(repository.name);
    try {
        StoredConfig config = db.getConfig();
        Set<String> names = config.getSubsections(MILESTONE);
        for (String name : names) {
            TicketMilestone milestone = new TicketMilestone(name);
            milestone.status = Status.fromObject(config.getString(MILESTONE, name, STATUS), milestone.status);
            milestone.color = config.getString(MILESTONE, name, COLOR);
            String due = config.getString(MILESTONE, name, DUE);
            if (!StringUtils.isEmpty(due)) {
                try {
                    milestone.due = new SimpleDateFormat(DUE_DATE_PATTERN).parse(due);
                } catch (ParseException e) {
                    log.error("failed to parse {} milestone {} due date \"{}\"",
                            new Object[] { repository, name, due });
                }
            }
            list.add(milestone);
        }
        milestonesCache.put(key, Collections.unmodifiableList(list));
    } catch (Exception e) {
        log.error("invalid tickets settings for " + repository, e);
    } finally {
        db.close();
    }
    return list;
}

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Creates a milestone./*w w  w  .  j a  v a 2  s  .  c  om*/
 *
 * @param repository
 * @param milestone
 * @param createdBy
 * @return the milestone
 * @since 1.4.0
 */
public synchronized TicketMilestone createMilestone(RepositoryModel repository, String milestone,
        String createdBy) {
    TicketMilestone ms = new TicketMilestone(milestone);
    Repository db = null;
    try {
        db = repositoryManager.getRepository(repository.name);
        StoredConfig config = db.getConfig();
        config.setString(MILESTONE, milestone, STATUS, ms.status.name());
        config.setString(MILESTONE, milestone, COLOR, ms.color);
        config.save();

        milestonesCache.remove(repository.name);
    } catch (IOException e) {
        log.error("failed to create milestone " + milestone + " in " + repository, e);
    } finally {
        if (db != null) {
            db.close();
        }
    }
    return ms;
}

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Updates a milestone./*ww  w  .j  av  a  2  s  .c o m*/
 *
 * @param repository
 * @param milestone
 * @param createdBy
 * @return true if successful
 * @since 1.4.0
 */
public synchronized boolean updateMilestone(RepositoryModel repository, TicketMilestone milestone,
        String createdBy) {
    Repository db = null;
    try {
        db = repositoryManager.getRepository(repository.name);
        StoredConfig config = db.getConfig();
        config.setString(MILESTONE, milestone.name, STATUS, milestone.status.name());
        config.setString(MILESTONE, milestone.name, COLOR, milestone.color);
        if (milestone.due != null) {
            config.setString(MILESTONE, milestone.name, DUE,
                    new SimpleDateFormat(DUE_DATE_PATTERN).format(milestone.due));
        }
        config.save();

        milestonesCache.remove(repository.name);
        return true;
    } catch (IOException e) {
        log.error("failed to update milestone " + milestone + " in " + repository, e);
    } finally {
        if (db != null) {
            db.close();
        }
    }
    return false;
}

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Renames a milestone.// w  w w . ja va  2 s  . c  om
 *
 * @param repository
 * @param oldName
 * @param newName
 * @param createdBy
 * @param notifyOpenTickets
 * @return true if successful
 * @since 1.6.0
 */
public synchronized boolean renameMilestone(RepositoryModel repository, String oldName, String newName,
        String createdBy, boolean notifyOpenTickets) {
    if (StringUtils.isEmpty(newName)) {
        throw new IllegalArgumentException("new milestone can not be empty!");
    }
    Repository db = null;
    try {
        db = repositoryManager.getRepository(repository.name);
        TicketMilestone tm = getMilestone(repository, oldName);
        if (tm == null) {
            return false;
        }
        StoredConfig config = db.getConfig();
        config.unsetSection(MILESTONE, oldName);
        config.setString(MILESTONE, newName, STATUS, tm.status.name());
        config.setString(MILESTONE, newName, COLOR, tm.color);
        if (tm.due != null) {
            config.setString(MILESTONE, newName, DUE, new SimpleDateFormat(DUE_DATE_PATTERN).format(tm.due));
        }
        config.save();

        milestonesCache.remove(repository.name);

        TicketNotifier notifier = createNotifier();
        for (QueryResult qr : tm.tickets) {
            Change change = new Change(createdBy);
            change.setField(Field.milestone, newName);
            TicketModel ticket = updateTicket(repository, qr.number, change);
            if (notifyOpenTickets && ticket.isOpen()) {
                notifier.queueMailing(ticket);
            }
        }
        if (notifyOpenTickets) {
            notifier.sendAll();
        }

        return true;
    } catch (IOException e) {
        log.error("failed to rename milestone " + oldName + " in " + repository, e);
    } finally {
        if (db != null) {
            db.close();
        }
    }
    return false;
}

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Deletes a milestone.//from  www  .ja v a2s .c  o  m
 *
 * @param repository
 * @param milestone
 * @param createdBy
 * @param notifyOpenTickets
 * @return true if successful
 * @since 1.6.0
 */
public synchronized boolean deleteMilestone(RepositoryModel repository, String milestone, String createdBy,
        boolean notifyOpenTickets) {
    if (StringUtils.isEmpty(milestone)) {
        throw new IllegalArgumentException("milestone can not be empty!");
    }
    Repository db = null;
    try {
        TicketMilestone tm = getMilestone(repository, milestone);
        if (tm == null) {
            return false;
        }
        db = repositoryManager.getRepository(repository.name);
        StoredConfig config = db.getConfig();
        config.unsetSection(MILESTONE, milestone);
        config.save();

        milestonesCache.remove(repository.name);

        TicketNotifier notifier = createNotifier();
        for (QueryResult qr : tm.tickets) {
            Change change = new Change(createdBy);
            change.setField(Field.milestone, "");
            TicketModel ticket = updateTicket(repository, qr.number, change);
            if (notifyOpenTickets && ticket.isOpen()) {
                notifier.queueMailing(ticket);
            }
        }
        if (notifyOpenTickets) {
            notifier.sendAll();
        }
        return true;
    } catch (IOException e) {
        log.error("failed to delete milestone " + milestone + " in " + repository, e);
    } finally {
        if (db != null) {
            db.close();
        }
    }
    return false;
}

From source file:com.gitblit.tickets.ITicketService.java

License:Apache License

/**
 * Retrieves the ticket./*from w w w  .  j  a v a2 s .  c  o m*/
 *
 * @param repository
 * @param ticketId
 * @return a ticket, if it exists, otherwise null
 * @since 1.4.0
 */
public final TicketModel getTicket(RepositoryModel repository, long ticketId) {
    TicketKey key = new TicketKey(repository, ticketId);
    TicketModel ticket = ticketsCache.getIfPresent(key);

    // if ticket not cached
    if (ticket == null) {
        //load ticket
        ticket = getTicketImpl(repository, ticketId);
        // if ticket exists
        if (ticket != null) {
            if (ticket.hasPatchsets() && updateDiffstats) {
                Repository r = repositoryManager.getRepository(repository.name);
                try {
                    Patchset patchset = ticket.getCurrentPatchset();
                    DiffStat diffStat = DiffUtils.getDiffStat(r, patchset.base, patchset.tip);
                    // diffstat could be null if we have ticket data without the
                    // commit objects.  e.g. ticket replication without repo
                    // mirroring
                    if (diffStat != null) {
                        ticket.insertions = diffStat.getInsertions();
                        ticket.deletions = diffStat.getDeletions();
                    }
                } finally {
                    r.close();
                }
            }
            //cache ticket
            ticketsCache.put(key, ticket);
        }
    }
    return ticket;
}

From source file:com.gitblit.tickets.TicketNotifier.java

License:Apache License

protected String formatLastChange(TicketModel ticket) {
    Change lastChange = ticket.changes.get(ticket.changes.size() - 1);
    UserModel user = getUserModel(lastChange.author);

    // define the fields we do NOT want to see in an email notification
    Set<TicketModel.Field> fieldExclusions = new HashSet<TicketModel.Field>();
    fieldExclusions.addAll(Arrays.asList(Field.watchers, Field.voters));

    StringBuilder sb = new StringBuilder();
    boolean newTicket = lastChange.isStatusChange() && Status.New == lastChange.getStatus();
    boolean isFastForward = true;
    List<RevCommit> commits = null;
    DiffStat diffstat = null;/*w w  w .  ja  va  2 s .co  m*/

    String pattern;
    if (lastChange.hasPatchset()) {
        // patchset uploaded
        Patchset patchset = lastChange.patchset;
        String base = "";
        // determine the changed paths
        Repository repo = null;
        try {
            repo = repositoryManager.getRepository(ticket.repository);
            if (patchset.isFF() && (patchset.rev > 1)) {
                // fast-forward update, just show the new data
                isFastForward = true;
                Patchset prev = ticket.getPatchset(patchset.number, patchset.rev - 1);
                base = prev.tip;
            } else {
                // proposal OR non-fast-forward update
                isFastForward = false;
                base = patchset.base;
            }

            diffstat = DiffUtils.getDiffStat(repo, base, patchset.tip);
            commits = JGitUtils.getRevLog(repo, base, patchset.tip);
        } catch (Exception e) {
            Logger.getLogger(getClass()).error("failed to get changed paths", e);
        } finally {
            if (repo != null) {
                repo.close();
            }
        }

        String compareUrl = ticketService.getCompareUrl(ticket, base, patchset.tip);

        if (newTicket) {
            // new proposal
            pattern = "**{0}** is proposing a change.";
            sb.append(MessageFormat.format(pattern, user.getDisplayName()));
            fieldExclusions.add(Field.status);
            fieldExclusions.add(Field.title);
            fieldExclusions.add(Field.body);
        } else {
            // describe the patchset
            if (patchset.isFF()) {
                pattern = "**{0}** added {1} {2} to patchset {3}.";
                sb.append(MessageFormat.format(pattern, user.getDisplayName(), patchset.added,
                        patchset.added == 1 ? "commit" : "commits", patchset.number));
            } else {
                pattern = "**{0}** uploaded patchset {1}. *({2})*";
                sb.append(MessageFormat.format(pattern, user.getDisplayName(), patchset.number,
                        patchset.type.toString().toUpperCase()));
            }
        }
        sb.append(HARD_BRK);

        sb.append(MessageFormat.format(
                "{0} {1}, {2} {3}, <span style=\"color:darkgreen;\">+{4} insertions</span>, <span style=\"color:darkred;\">-{5} deletions</span> from {6}. [compare]({7})",
                commits.size(), commits.size() == 1 ? "commit" : "commits", diffstat.paths.size(),
                diffstat.paths.size() == 1 ? "file" : "files", diffstat.getInsertions(),
                diffstat.getDeletions(), isFastForward ? "previous revision" : "merge base", compareUrl));

        // note commit additions on a rebase,if any
        switch (lastChange.patchset.type) {
        case Rebase:
            if (lastChange.patchset.added > 0) {
                sb.append(SOFT_BRK);
                sb.append(MessageFormat.format("{0} {1} added.", lastChange.patchset.added,
                        lastChange.patchset.added == 1 ? "commit" : "commits"));
            }
            break;
        default:
            break;
        }
        sb.append(HARD_BRK);
    } else if (lastChange.isStatusChange()) {
        if (newTicket) {
            fieldExclusions.add(Field.status);
            fieldExclusions.add(Field.title);
            fieldExclusions.add(Field.body);
            pattern = "**{0}** created this ticket.";
            sb.append(MessageFormat.format(pattern, user.getDisplayName()));
        } else if (lastChange.hasField(Field.mergeSha)) {
            // closed by merged
            pattern = "**{0}** closed this ticket by merging {1} to {2}.";

            // identify patchset that closed the ticket
            String merged = ticket.mergeSha;
            for (Patchset patchset : ticket.getPatchsets()) {
                if (patchset.tip.equals(ticket.mergeSha)) {
                    merged = patchset.toString();
                    break;
                }
            }
            sb.append(MessageFormat.format(pattern, user.getDisplayName(), merged, ticket.mergeTo));
        } else {
            // workflow status change by user
            pattern = "**{0}** changed the status of this ticket to **{1}**.";
            sb.append(MessageFormat.format(pattern, user.getDisplayName(),
                    lastChange.getStatus().toString().toUpperCase()));
        }
        sb.append(HARD_BRK);
    } else if (lastChange.hasReview()) {
        // review
        Review review = lastChange.review;
        pattern = "**{0}** has reviewed patchset {1,number,0} revision {2,number,0}.";
        sb.append(MessageFormat.format(pattern, user.getDisplayName(), review.patchset, review.rev));
        sb.append(HARD_BRK);

        String d = settings.getString(Keys.web.datestampShortFormat, "yyyy-MM-dd");
        String t = settings.getString(Keys.web.timeFormat, "HH:mm");
        DateFormat df = new SimpleDateFormat(d + " " + t);
        List<Change> reviews = ticket.getReviews(ticket.getPatchset(review.patchset, review.rev));
        sb.append("| Date | Reviewer      | Score | Description  |\n");
        sb.append("| :--- | :------------ | :---: | :----------- |\n");
        for (Change change : reviews) {
            String name = change.author;
            UserModel u = userManager.getUserModel(change.author);
            if (u != null) {
                name = u.getDisplayName();
            }
            String score;
            switch (change.review.score) {
            case approved:
                score = MessageFormat.format(addPattern, change.review.score.getValue());
                break;
            case vetoed:
                score = MessageFormat.format(delPattern, Math.abs(change.review.score.getValue()));
                break;
            default:
                score = "" + change.review.score.getValue();
            }
            String date = df.format(change.date);
            sb.append(String.format("| %1$s | %2$s | %3$s | %4$s |\n", date, name, score,
                    change.review.score.toString()));
        }
        sb.append(HARD_BRK);
    } else if (lastChange.hasComment()) {
        // comment update
        sb.append(MessageFormat.format("**{0}** commented on this ticket.", user.getDisplayName()));
        sb.append(HARD_BRK);
    } else if (lastChange.hasReference()) {
        // reference update
        String type = "?";

        switch (lastChange.reference.getSourceType()) {
        case Commit: {
            type = "commit";
        }
            break;
        case Ticket: {
            type = "ticket";
        }
            break;
        default: {
        }
            break;
        }

        sb.append(
                MessageFormat.format("**{0}** referenced this ticket in {1} {2}", type, lastChange.toString()));
        sb.append(HARD_BRK);

    } else {
        // general update
        pattern = "**{0}** has updated this ticket.";
        sb.append(MessageFormat.format(pattern, user.getDisplayName()));
        sb.append(HARD_BRK);
    }

    // ticket link
    sb.append(MessageFormat.format("[view ticket {0,number,0}]({1})", ticket.number,
            ticketService.getTicketUrl(ticket)));
    sb.append(HARD_BRK);

    if (newTicket) {
        // ticket title
        sb.append(MessageFormat.format("### {0}", ticket.title));
        sb.append(HARD_BRK);

        // ticket description, on state change
        if (StringUtils.isEmpty(ticket.body)) {
            sb.append("<span style=\"color: #888;\">no description entered</span>");
        } else {
            sb.append(ticket.body);
        }
        sb.append(HARD_BRK);
        sb.append(HR);
    }

    // field changes
    if (lastChange.hasFieldChanges()) {
        Map<Field, String> filtered = new HashMap<Field, String>();
        for (Map.Entry<Field, String> fc : lastChange.fields.entrySet()) {
            if (!fieldExclusions.contains(fc.getKey())) {
                // field is included
                filtered.put(fc.getKey(), fc.getValue());
            }
        }

        // sort by field ordinal
        List<Field> fields = new ArrayList<Field>(filtered.keySet());
        Collections.sort(fields);

        if (filtered.size() > 0) {
            sb.append(HARD_BRK);
            sb.append("| Field Changes               ||\n");
            sb.append("| ------------: | :----------- |\n");
            for (Field field : fields) {
                String value;
                if (filtered.get(field) == null) {
                    value = "";
                } else {
                    value = filtered.get(field).replace("\r\n", "<br/>").replace("\n", "<br/>").replace("|",
                            "&#124;");
                }
                sb.append(String.format("| **%1$s:** | %2$s |\n", field.name(), value));
            }
            sb.append(HARD_BRK);
        }
    }

    // new comment
    if (lastChange.hasComment()) {
        sb.append(HR);
        sb.append(lastChange.comment.text);
        sb.append(HARD_BRK);
    }

    // insert the patchset details and review instructions
    if (lastChange.hasPatchset() && ticket.isOpen()) {
        if (commits != null && commits.size() > 0) {
            // append the commit list
            String title = isFastForward ? "Commits added to previous patchset revision"
                    : "All commits in patchset";
            sb.append(MessageFormat.format("| {0} |||\n", title));
            sb.append("| SHA | Author | Title |\n");
            sb.append("| :-- | :----- | :---- |\n");
            for (RevCommit commit : commits) {
                sb.append(MessageFormat.format("| {0} | {1} | {2} |\n", commit.getName(),
                        commit.getAuthorIdent().getName(),
                        StringUtils.trimString(commit.getShortMessage(), Constants.LEN_SHORTLOG).replace("|",
                                "&#124;")));
            }
            sb.append(HARD_BRK);
        }

        if (diffstat != null) {
            // append the changed path list
            String title = isFastForward ? "Files changed since previous patchset revision"
                    : "All files changed in patchset";
            sb.append(MessageFormat.format("| {0} |||\n", title));
            sb.append("| :-- | :----------- | :-: |\n");
            for (PathChangeModel path : diffstat.paths) {
                String add = MessageFormat.format(addPattern, path.insertions);
                String del = MessageFormat.format(delPattern, path.deletions);
                String diff = null;
                switch (path.changeType) {
                case ADD:
                    diff = add;
                    break;
                case DELETE:
                    diff = del;
                    break;
                case MODIFY:
                    if (path.insertions > 0 && path.deletions > 0) {
                        // insertions & deletions
                        diff = add + "/" + del;
                    } else if (path.insertions > 0) {
                        // just insertions
                        diff = add;
                    } else {
                        // just deletions
                        diff = del;
                    }
                    break;
                default:
                    diff = path.changeType.name();
                    break;
                }
                sb.append(MessageFormat.format("| {0} | {1} | {2} |\n", getChangeType(path.changeType),
                        path.name, diff));
            }
            sb.append(HARD_BRK);
        }

        sb.append(formatPatchsetInstructions(ticket, lastChange.patchset));
    }

    return sb.toString();
}

From source file:com.gitblit.utils.ActivityUtils.java

License:Apache License

/**
 * Gets the recent activity from the repositories for the last daysBack days
 * on the specified branch.//from  ww  w .  j  a v  a 2s.  c om
 *
 * @param settings
 *            the runtime settings
 * @param repositoryManager
 *            the repository manager
 * @param models
 *            the list of repositories to query
 * @param daysBack
 *            the number of days back from Now to collect
 * @param objectId
 *            the branch to retrieve. If this value is null or empty all
 *            branches are queried.
 * @param timezone
 *            the timezone for aggregating commits
 * @return
 */
public static List<Activity> getRecentActivity(IStoredSettings settings, IRepositoryManager repositoryManager,
        List<RepositoryModel> models, int daysBack, String objectId, TimeZone timezone) {

    // Activity panel shows last daysBack of activity across all
    // repositories.
    Date thresholdDate = new Date(System.currentTimeMillis() - daysBack * TimeUtils.ONEDAY);

    // Build a map of DailyActivity from the available repositories for the
    // specified threshold date.
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    df.setTimeZone(timezone);
    Calendar cal = Calendar.getInstance();
    cal.setTimeZone(timezone);

    // aggregate author exclusions
    Set<String> authorExclusions = new TreeSet<String>();
    authorExclusions.addAll(settings.getStrings(Keys.web.metricAuthorExclusions));
    for (RepositoryModel model : models) {
        if (!ArrayUtils.isEmpty(model.metricAuthorExclusions)) {
            authorExclusions.addAll(model.metricAuthorExclusions);
        }
    }

    Map<String, Activity> activity = new HashMap<String, Activity>();
    for (RepositoryModel model : models) {
        if (!model.isShowActivity()) {
            // skip this repository
            continue;
        }
        if (model.hasCommits && model.lastChange.after(thresholdDate)) {
            if (model.isCollectingGarbage) {
                continue;
            }
            Repository repository = repositoryManager.getRepository(model.name);
            List<String> branches = new ArrayList<String>();
            if (StringUtils.isEmpty(objectId)) {
                for (RefModel local : JGitUtils.getLocalBranches(repository, true, -1)) {
                    if (!local.getDate().after(thresholdDate)) {
                        // branch not recently updated
                        continue;
                    }
                    branches.add(local.getName());
                }
            } else {
                branches.add(objectId);
            }

            for (String branch : branches) {
                String shortName = branch;
                if (shortName.startsWith(Constants.R_HEADS)) {
                    shortName = shortName.substring(Constants.R_HEADS.length());
                }
                List<RepositoryCommit> commits = CommitCache.instance().getCommits(model.name, repository,
                        branch, thresholdDate);
                if (model.maxActivityCommits > 0 && commits.size() > model.maxActivityCommits) {
                    // trim commits to maximum count
                    commits = commits.subList(0, model.maxActivityCommits);
                }
                for (RepositoryCommit commit : commits) {
                    Date date = commit.getCommitDate();
                    String dateStr = df.format(date);
                    if (!activity.containsKey(dateStr)) {
                        // Normalize the date to midnight
                        cal.setTime(date);
                        cal.set(Calendar.HOUR_OF_DAY, 0);
                        cal.set(Calendar.MINUTE, 0);
                        cal.set(Calendar.SECOND, 0);
                        cal.set(Calendar.MILLISECOND, 0);
                        Activity a = new Activity(cal.getTime());
                        a.excludeAuthors(authorExclusions);
                        activity.put(dateStr, a);
                    }
                    activity.get(dateStr).addCommit(commit);
                }
            }

            // close the repository
            repository.close();
        }
    }

    List<Activity> recentActivity = new ArrayList<Activity>(activity.values());
    return recentActivity;
}

From source file:com.gitblit.utils.JGitUtils.java

License:Apache License

/**
 * Clone or Fetch a repository. If the local repository does not exist,
 * clone is called. If the repository does exist, fetch is called. By
 * default the clone/fetch retrieves the remote heads, tags, and notes.
 *
 * @param repositoriesFolder/* www  .  j av  a 2s  .  c o  m*/
 * @param name
 * @param fromUrl
 * @param bare
 * @param credentialsProvider
 * @return CloneResult
 * @throws Exception
 */
public static CloneResult cloneRepository(File repositoriesFolder, String name, String fromUrl, boolean bare,
        CredentialsProvider credentialsProvider) throws Exception {
    CloneResult result = new CloneResult();
    if (bare) {
        // bare repository, ensure .git suffix
        if (!name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
            name += Constants.DOT_GIT_EXT;
        }
    } else {
        // normal repository, strip .git suffix
        if (name.toLowerCase().endsWith(Constants.DOT_GIT_EXT)) {
            name = name.substring(0, name.indexOf(Constants.DOT_GIT_EXT));
        }
    }
    result.name = name;

    File folder = new File(repositoriesFolder, name);
    if (folder.exists()) {
        File gitDir = FileKey.resolve(new File(repositoriesFolder, name), FS.DETECTED);
        Repository repository = new FileRepositoryBuilder().setGitDir(gitDir).build();
        result.fetchResult = fetchRepository(credentialsProvider, repository);
        repository.close();
    } else {
        CloneCommand clone = new CloneCommand();
        clone.setBare(bare);
        clone.setCloneAllBranches(true);
        clone.setURI(fromUrl);
        clone.setDirectory(folder);
        if (credentialsProvider != null) {
            clone.setCredentialsProvider(credentialsProvider);
        }
        Repository repository = clone.call().getRepository();

        // Now we have to fetch because CloneCommand doesn't fetch
        // refs/notes nor does it allow manual RefSpec.
        result.createdRepository = true;
        result.fetchResult = fetchRepository(credentialsProvider, repository);
        repository.close();
    }
    return result;
}

From source file:com.gitblit.wicket.pages.ComparePage.java

License:Apache License

public ComparePage(PageParameters params) {
    super(params);
    Repository r = getRepository();
    RepositoryModel repository = getRepositoryModel();

    if (StringUtils.isEmpty(objectId)) {
        // seleciton form
        add(new Label("comparison").setVisible(false));
    } else {// w w w.j a  v a  2  s. co m
        // active comparison
        Fragment comparison = new Fragment("comparison", "comparisonFragment", ComparePage.this);
        add(comparison);

        RevCommit fromCommit;
        RevCommit toCommit;

        String[] parts = objectId.split("\\.\\.");
        if (parts[0].startsWith("refs/") && parts[1].startsWith("refs/")) {
            // set the ref models
            fromRefId.setObject(parts[0]);
            toRefId.setObject(parts[1]);

            fromCommit = getCommit(r, fromRefId.getObject());
            toCommit = getCommit(r, toRefId.getObject());
        } else {
            // set the id models
            fromCommitId.setObject(parts[0]);
            toCommitId.setObject(parts[1]);

            fromCommit = getCommit(r, fromCommitId.getObject());
            toCommit = getCommit(r, toCommitId.getObject());
        }

        // prepare submodules
        getSubmodules(toCommit);

        final String startId = fromCommit.getId().getName();
        final String endId = toCommit.getId().getName();

        // commit ids
        fromCommitId.setObject(startId);
        toCommitId.setObject(endId);

        final List<String> imageExtensions = app().settings().getStrings(Keys.web.imageExtensions);
        final ImageDiffHandler handler = new ImageDiffHandler(this, repositoryName, fromCommit.getName(),
                toCommit.getName(), imageExtensions);
        final DiffComparator diffComparator = WicketUtils.getDiffComparator(params);
        final int tabLength = app().settings().getInteger(Keys.web.tabLength, 4);
        final DiffOutput diff = DiffUtils.getDiff(r, fromCommit, toCommit, diffComparator, DiffOutputType.HTML,
                handler, tabLength);
        if (handler.getImgDiffCount() > 0) {
            addBottomScript("scripts/imgdiff.js"); // Tiny support script for image diffs
        }

        // add compare diffstat
        int insertions = 0;
        int deletions = 0;
        for (PathChangeModel pcm : diff.stat.paths) {
            insertions += pcm.insertions;
            deletions += pcm.deletions;
        }
        comparison.add(new DiffStatPanel("diffStat", insertions, deletions));

        // compare page links
        //         comparison.add(new BookmarkablePageLink<Void>("patchLink", PatchPage.class,
        //               WicketUtils.newRangeParameter(repositoryName, fromCommitId.toString(), toCommitId.getObject())));

        // display list of commits
        comparison.add(
                new LogPanel("commitList", repositoryName, objectId, r, 0, 0, repository.showRemoteBranches));

        // changed paths list
        comparison.add(new CommitLegendPanel("commitLegend", diff.stat.paths));
        ListDataProvider<PathChangeModel> pathsDp = new ListDataProvider<PathChangeModel>(diff.stat.paths);
        DataView<PathChangeModel> pathsView = new DataView<PathChangeModel>("changedPath", pathsDp) {
            private static final long serialVersionUID = 1L;
            int counter;

            @Override
            public void populateItem(final Item<PathChangeModel> item) {
                final PathChangeModel entry = item.getModelObject();
                Label changeType = new Label("changeType", "");
                WicketUtils.setChangeTypeCssClass(changeType, entry.changeType);
                setChangeTypeTooltip(changeType, entry.changeType);
                item.add(changeType);
                item.add(new DiffStatPanel("diffStat", entry.insertions, entry.deletions, true));

                boolean hasSubmodule = false;
                String submodulePath = null;
                if (entry.isTree()) {
                    // tree
                    item.add(new LinkPanel("pathName", null, entry.path, TreePage.class,
                            WicketUtils.newPathParameter(repositoryName, endId, entry.path)));
                } else if (entry.isSubmodule()) {
                    // submodule
                    String submoduleId = entry.objectId;
                    SubmoduleModel submodule = getSubmodule(entry.path);
                    submodulePath = submodule.gitblitPath;
                    hasSubmodule = submodule.hasSubmodule;

                    // add relative link
                    item.add(new LinkPanel("pathName", "list",
                            entry.path + " @ " + getShortObjectId(submoduleId), "#n" + entry.objectId));
                } else {
                    // add relative link
                    item.add(new LinkPanel("pathName", "list", entry.path, "#n" + entry.objectId));
                }

                // quick links
                if (entry.isSubmodule()) {
                    // submodule
                    item.add(new ExternalLink("patch", "").setEnabled(false));
                    item.add(new BookmarkablePageLink<Void>("view", CommitPage.class,
                            WicketUtils.newObjectParameter(submodulePath, entry.objectId))
                                    .setEnabled(hasSubmodule));
                    item.add(new ExternalLink("raw", "").setEnabled(false));
                    item.add(new ExternalLink("blame", "").setEnabled(false));
                    item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
                            WicketUtils.newPathParameter(repositoryName, endId, entry.path))
                                    .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
                } else {
                    // tree or blob
                    item.add(new BookmarkablePageLink<Void>("patch", PatchPage.class,
                            WicketUtils.newBlobDiffParameter(repositoryName, startId, endId, entry.path))
                                    .setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
                    item.add(new BookmarkablePageLink<Void>("view", BlobPage.class,
                            WicketUtils.newPathParameter(repositoryName, endId, entry.path))
                                    .setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
                    String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, endId, entry.path);
                    item.add(new ExternalLink("raw", rawUrl)
                            .setEnabled(!entry.changeType.equals(ChangeType.DELETE)));
                    item.add(new BookmarkablePageLink<Void>("blame", BlamePage.class,
                            WicketUtils.newPathParameter(repositoryName, endId, entry.path))
                                    .setEnabled(!entry.changeType.equals(ChangeType.ADD)
                                            && !entry.changeType.equals(ChangeType.DELETE)));
                    item.add(new BookmarkablePageLink<Void>("history", HistoryPage.class,
                            WicketUtils.newPathParameter(repositoryName, endId, entry.path))
                                    .setEnabled(!entry.changeType.equals(ChangeType.ADD)));
                }
                WicketUtils.setAlternatingBackground(item, counter);
                counter++;
            }
        };
        comparison.add(pathsView);
        comparison.add(new Label("diffText", diff.content).setEscapeModelStrings(false));
    }

    // set the default DiffComparator
    DiffComparator diffComparator = WicketUtils.getDiffComparator(params);
    ignoreWhitespace.setObject(DiffComparator.IGNORE_WHITESPACE == diffComparator);

    //
    // ref selection form
    //
    SessionlessForm<Void> refsForm = new SessionlessForm<Void>("compareRefsForm", getClass(),
            getPageParameters()) {

        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            String from = ComparePage.this.fromRefId.getObject();
            String to = ComparePage.this.toRefId.getObject();
            boolean ignoreWS = ignoreWhitespace.getObject();

            PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to);
            if (ignoreWS) {
                params.add("w", 1);
            }

            String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params);
            getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
        }
    };

    List<String> refs = new ArrayList<String>();
    for (RefModel ref : JGitUtils.getLocalBranches(r, true, -1)) {
        refs.add(ref.getName());
    }
    if (repository.showRemoteBranches) {
        for (RefModel ref : JGitUtils.getRemoteBranches(r, true, -1)) {
            refs.add(ref.getName());
        }
    }
    for (RefModel ref : JGitUtils.getTags(r, true, -1)) {
        refs.add(ref.getName());
    }
    refsForm.add(new DropDownChoice<String>("fromRef", fromRefId, refs).setEnabled(refs.size() > 0));
    refsForm.add(new DropDownChoice<String>("toRef", toRefId, refs).setEnabled(refs.size() > 0));
    refsForm.add(new Label("ignoreWhitespaceLabel",
            getString(DiffComparator.IGNORE_WHITESPACE.getTranslationKey())));
    refsForm.add(new CheckBox("ignoreWhitespaceCheckbox", ignoreWhitespace));
    add(refsForm);

    //
    // manual ids form
    //
    SessionlessForm<Void> idsForm = new SessionlessForm<Void>("compareIdsForm", getClass(),
            getPageParameters()) {

        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            String from = ComparePage.this.fromCommitId.getObject();
            String to = ComparePage.this.toCommitId.getObject();
            boolean ignoreWS = ignoreWhitespace.getObject();

            PageParameters params = WicketUtils.newRangeParameter(repositoryName, from, to);
            if (ignoreWS) {
                params.add("w", 1);
            }
            String absoluteUrl = GitBlitRequestUtils.toAbsoluteUrl(ComparePage.class, params);
            getRequestCycle().scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(absoluteUrl));
        }
    };

    TextField<String> fromIdField = new TextField<String>("fromId", fromCommitId);
    WicketUtils.setInputPlaceholder(fromIdField, getString("gb.from") + "...");
    idsForm.add(fromIdField);

    TextField<String> toIdField = new TextField<String>("toId", toCommitId);
    WicketUtils.setInputPlaceholder(toIdField, getString("gb.to") + "...");
    idsForm.add(toIdField);
    idsForm.add(new Label("ignoreWhitespaceLabel",
            getString(DiffComparator.IGNORE_WHITESPACE.getTranslationKey())));
    idsForm.add(new CheckBox("ignoreWhitespaceCheckbox", ignoreWhitespace));
    add(idsForm);

    r.close();
}