List of usage examples for org.eclipse.jgit.lib Repository close
@Override public void close()
Decrement the use count, and maybe close resources.
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("|", "|"); } 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("|", "|"))); } 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(); }