From e14d3e49756f07a9cc73ecb46948c1c8b2b5d6fa Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 31 May 2013 07:39:46 -0400 Subject: [PATCH] Documentation --- src/main/java/com/gitblit/wicket/panels/PushesPanel.java | 298 +++++++++++++++++++++++++++++++++++++++++------------------ 1 files changed, 208 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/gitblit/wicket/panels/PushesPanel.java b/src/main/java/com/gitblit/wicket/panels/PushesPanel.java index bab9c9e..423c44b 100644 --- a/src/main/java/com/gitblit/wicket/panels/PushesPanel.java +++ b/src/main/java/com/gitblit/wicket/panels/PushesPanel.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 gitblit.com. + * Copyright 2013 gitblit.com. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,29 +16,32 @@ package com.gitblit.wicket.panels; import java.text.MessageFormat; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.data.DataView; import org.apache.wicket.markup.repeater.data.ListDataProvider; +import org.apache.wicket.model.StringResourceModel; import org.eclipse.jgit.lib.Repository; import com.gitblit.Constants; import com.gitblit.GitBlit; import com.gitblit.Keys; +import com.gitblit.models.DailyLogEntry; import com.gitblit.models.PushLogEntry; import com.gitblit.models.RepositoryCommit; import com.gitblit.models.RepositoryModel; -import com.gitblit.models.UserModel; import com.gitblit.utils.PushLogUtils; import com.gitblit.utils.StringUtils; import com.gitblit.wicket.WicketUtils; import com.gitblit.wicket.pages.CommitPage; -import com.gitblit.wicket.pages.GitSearchPage; +import com.gitblit.wicket.pages.ComparePage; +import com.gitblit.wicket.pages.PushesPage; import com.gitblit.wicket.pages.SummaryPage; +import com.gitblit.wicket.pages.TagPage; +import com.gitblit.wicket.pages.TreePage; import com.gitblit.wicket.pages.UserPage; public class PushesPanel extends BasePanel { @@ -49,82 +52,220 @@ private boolean hasMore; - public PushesPanel(String wicketId, final RepositoryModel model, Repository r, int limit, int pageOffset) { + public PushesPanel(String wicketId, final RepositoryModel model, Repository r, int limit, int pageOffset, boolean showRepo) { super(wicketId); boolean pageResults = limit <= 0; - int itemsPerPage = GitBlit.getInteger(Keys.web.itemsPerPage, 50); - if (itemsPerPage <= 1) { - itemsPerPage = 50; + int pushesPerPage = GitBlit.getInteger(Keys.web.pushesPerPage, 10); + if (pushesPerPage <= 1) { + pushesPerPage = 10; } - final Map<String, String> usernameLookup = new HashMap<String, String>(); - final int hashLen = GitBlit.getInteger(Keys.web.shortCommitIdLength, 6); - List<PushLogEntry> entries = PushLogUtils.getPushLog(model.name, r, limit); - // establish pusher identities - for (PushLogEntry push : entries) { - // handle push logs with email address instead of account name - String username = push.user.username; - if (push.user.username.indexOf('@') > -1) { - // push username is an email address, reverse lookup for account - if (!usernameLookup.containsKey(push.user.username)) { - for (UserModel user : GitBlit.self().getAllUsers()) { - if (push.user.username.equals(user.emailAddress)) { - username = user.username; - usernameLookup.put(push.user.username, username); - break; - } - } - } else { - username = usernameLookup.get(push.user.username); - } + List<PushLogEntry> pushes; + if (pageResults) { + pushes = PushLogUtils.getPushLogByRef(model.name, r, pageOffset * pushesPerPage, pushesPerPage); + } else { + pushes = PushLogUtils.getPushLogByRef(model.name, r, limit); + } + + // inaccurate way to determine if there are more commits. + // works unless commits.size() represents the exact end. + hasMore = pushes.size() >= pushesPerPage; + hasPushes = pushes.size() > 0; + + setup(pushes, showRepo); + + // determine to show pager, more, or neither + if (limit <= 0) { + // no display limit + add(new Label("morePushes").setVisible(false)); + } else { + if (pageResults) { + // paging + add(new Label("morePushes").setVisible(false)); } else { - // push username is an account name, lookup for email address - if (!usernameLookup.containsKey(push.user.username)) { - UserModel user = GitBlit.self().getUserModel(push.user.username); - if (user != null) { - push.user.emailAddress = user.emailAddress; - usernameLookup.put(push.user.username, user.emailAddress); - } + // more + if (pushes.size() == limit) { + // show more + add(new LinkPanel("morePushes", "link", new StringResourceModel("gb.morePushes", + this, null), PushesPage.class, + WicketUtils.newRepositoryParameter(model.name))); } else { - push.user.emailAddress = usernameLookup.get(push.user.username); + // no more + add(new Label("morePushes").setVisible(false)); } } } - - hasPushes = entries.size() > 0; - - ListDataProvider<PushLogEntry> dp = new ListDataProvider<PushLogEntry>(entries); + } + + public PushesPanel(String wicketId, List<PushLogEntry> pushes) { + super(wicketId); + hasPushes = pushes.size() > 0; + setup(pushes, true); + add(new Label("morePushes").setVisible(false)); + } + + protected void setup(List<PushLogEntry> pushes, final boolean showRepo) { + final int hashLen = GitBlit.getInteger(Keys.web.shortCommitIdLength, 6); + + ListDataProvider<PushLogEntry> dp = new ListDataProvider<PushLogEntry>(pushes); DataView<PushLogEntry> pushView = new DataView<PushLogEntry>("push", dp) { private static final long serialVersionUID = 1L; public void populateItem(final Item<PushLogEntry> pushItem) { final PushLogEntry push = pushItem.getModelObject(); + String fullRefName = push.getChangedRefs().get(0); + String shortRefName = fullRefName; + boolean isTag = false; + if (shortRefName.startsWith(org.eclipse.jgit.lib.Constants.R_HEADS)) { + shortRefName = shortRefName.substring(org.eclipse.jgit.lib.Constants.R_HEADS.length()); + } else if (shortRefName.startsWith(org.eclipse.jgit.lib.Constants.R_TAGS)) { + shortRefName = shortRefName.substring(org.eclipse.jgit.lib.Constants.R_TAGS.length()); + isTag = true; + } + boolean isDigest = push instanceof DailyLogEntry; - - pushItem.add(new GravatarImage("whoAvatar", push.getCommitterIdent(), 40)); - pushItem.add(new LinkPanel("whoPushed", null, push.user.getDisplayName(), - UserPage.class, WicketUtils.newUsernameParameter(push.user.username))); - pushItem.add(new Label("whatPushed", - MessageFormat.format(push.getCommitCount() > 1 ? "pushed {0} commits to":"pushed 1 commit to", push.getCommitCount()))); - String repoName = StringUtils.stripDotGit(model.name); - pushItem.add(new LinkPanel("wherePushed", null, repoName, - SummaryPage.class, WicketUtils.newRepositoryParameter(model.name))); pushItem.add(WicketUtils.createDateLabel("whenPushed", push.date, getTimeZone(), getTimeUtils())); + Label pushIcon = new Label("pushIcon"); + if (showRepo) { + // if we are showing the repo, we are showing multiple + // repos. use the repository hash color to differentiate + // the icon. + String color = StringUtils.getColor(StringUtils.stripDotGit(push.repository)); + WicketUtils.setCssStyle(pushIcon, "color: " + color); + } + if (isTag) { + WicketUtils.setCssClass(pushIcon, "iconic-tag"); + } else if (isDigest) { + WicketUtils.setCssClass(pushIcon, "iconic-loop"); + } else { + WicketUtils.setCssClass(pushIcon, "iconic-upload"); + } + pushItem.add(pushIcon); - ListDataProvider<RepositoryCommit> cdp = new ListDataProvider<RepositoryCommit>(push.getCommits()); + if (isDigest && !isTag) { + pushItem.add(new Label("whoPushed").setVisible(false)); + } else { + if (push.user.username.equals(push.user.emailAddress) && push.user.emailAddress.indexOf('@') > -1) { + // username is an email address - 1.2.1 push log bug + pushItem.add(new Label("whoPushed", push.user.getDisplayName())); + } else { + // link to user account page + pushItem.add(new LinkPanel("whoPushed", null, push.user.getDisplayName(), + UserPage.class, WicketUtils.newUsernameParameter(push.user.username))); + } + } + + String preposition = "gb.of"; + boolean isDelete = false; + boolean isRewind = false; + String what; + String by = null; + switch(push.getChangeType(fullRefName)) { + case CREATE: + if (isTag) { + if (isDigest) { + what = getString("gb.createdNewTag"); + preposition = "gb.in"; + } else { + what = getString("gb.pushedNewTag"); + preposition = "gb.to"; + } + } else { + what = getString("gb.pushedNewBranch"); + preposition = "gb.to"; + } + break; + case DELETE: + isDelete = true; + if (isTag) { + what = getString("gb.deletedTag"); + } else { + what = getString("gb.deletedBranch"); + } + preposition = "gb.from"; + break; + case UPDATE_NONFASTFORWARD: + isRewind = true; + default: + if (isDigest) { + what = MessageFormat.format(push.getCommitCount() > 1 ? getString("gb.commitsTo") : getString("gb.oneCommitTo"), push.getCommitCount()); + } else { + what = MessageFormat.format(push.getCommitCount() > 1 ? getString("gb.pushedNCommitsTo") : getString("gb.pushedOneCommitTo") , push.getCommitCount()); + } + + if (push.getAuthorCount() == 1) { + by = MessageFormat.format(getString("gb.byOneAuthor"), push.getAuthorIdent().getName()); + } else { + by = MessageFormat.format(getString("gb.byNAuthors"), push.getAuthorCount()); + } + break; + } + pushItem.add(new Label("whatPushed", what)); + pushItem.add(new Label("byAuthors", by).setVisible(!StringUtils.isEmpty(by))); + + pushItem.add(new Label("refRewind", getString("gb.rewind")).setVisible(isRewind)); + + if (isDelete) { + // can't link to deleted ref + pushItem.add(new Label("refPushed", shortRefName)); + } else if (isTag) { + // link to tag + pushItem.add(new LinkPanel("refPushed", null, shortRefName, + TagPage.class, WicketUtils.newObjectParameter(push.repository, fullRefName))); + } else { + // link to tree + pushItem.add(new LinkPanel("refPushed", null, shortRefName, + TreePage.class, WicketUtils.newObjectParameter(push.repository, fullRefName))); + } + + if (showRepo) { + // to/from/etc + pushItem.add(new Label("repoPreposition", getString(preposition))); + + String repoName = StringUtils.stripDotGit(push.repository); + pushItem.add(new LinkPanel("repoPushed", null, repoName, + SummaryPage.class, WicketUtils.newRepositoryParameter(push.repository))); + } else { + // do not display repository name if we are viewing the push + // log of a repository. + pushItem.add(new Label("repoPreposition").setVisible(false)); + pushItem.add(new Label("repoPushed").setVisible(false)); + } + + int maxCommitCount = 5; + List<RepositoryCommit> commits = push.getCommits(); + if (commits.size() > maxCommitCount) { + commits = new ArrayList<RepositoryCommit>(commits.subList(0, maxCommitCount)); + } + + // compare link + String compareLinkText = null; + if ((push.getCommitCount() <= maxCommitCount) && (push.getCommitCount() > 1)) { + compareLinkText = MessageFormat.format(getString("gb.viewComparison"), commits.size()); + } else if (push.getCommitCount() > maxCommitCount) { + int diff = push.getCommitCount() - maxCommitCount; + compareLinkText = MessageFormat.format(diff > 1 ? getString("gb.nMoreCommits") : getString("gb.oneMoreCommit"), diff); + } + if (StringUtils.isEmpty(compareLinkText)) { + pushItem.add(new Label("compareLink").setVisible(false)); + } else { + String endRangeId = push.getNewId(fullRefName); + String startRangeId = push.getOldId(fullRefName); + pushItem.add(new LinkPanel("compareLink", null, compareLinkText, ComparePage.class, WicketUtils.newRangeParameter(push.repository, startRangeId, endRangeId))); + } + + final boolean showSwatch = showRepo && GitBlit.getBoolean(Keys.web.repositoryListSwatches, true); + + ListDataProvider<RepositoryCommit> cdp = new ListDataProvider<RepositoryCommit>(commits); DataView<RepositoryCommit> commitsView = new DataView<RepositoryCommit>("commit", cdp) { private static final long serialVersionUID = 1L; public void populateItem(final Item<RepositoryCommit> commitItem) { final RepositoryCommit commit = commitItem.getModelObject(); - // author search link - String author = commit.getAuthorIdent().getName(); - LinkPanel authorLink = new LinkPanel("commitAuthor", "list", author, - GitSearchPage.class, WicketUtils.newSearchParameter(model.name, - null, author, Constants.SearchType.AUTHOR)); - setPersonSearchTooltip(authorLink, author, Constants.SearchType.AUTHOR); - commitItem.add(authorLink); + // author gravatar + commitItem.add(new GravatarImage("commitAuthor", commit.getAuthorIdent().getName(), + commit.getAuthorIdent().getEmailAddress(), null, 16, false, false)); // merge icon if (commit.getParentCount() > 1) { @@ -143,56 +284,33 @@ } LinkPanel shortlog = new LinkPanel("commitShortMessage", "list", trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter( - model.name, commit.getName())); + push.repository, commit.getName())); if (!shortMessage.equals(trimmedMessage)) { WicketUtils.setHtmlTooltip(shortlog, shortMessage); } commitItem.add(shortlog); - commitItem.add(new RefsPanel("commitRefs", commit.repository, commit.getRefs())); - // commit hash link LinkPanel commitHash = new LinkPanel("hashLink", null, commit.getName().substring(0, hashLen), CommitPage.class, WicketUtils.newObjectParameter( - model.name, commit.getName())); + push.repository, commit.getName())); WicketUtils.setCssClass(commitHash, "shortsha1"); WicketUtils.setHtmlTooltip(commitHash, commit.getName()); commitItem.add(commitHash); -// item.add(new BookmarkablePageLink<Void>("diff", CommitDiffPage.class, WicketUtils -// .newObjectParameter(repositoryName, entry.getName())).setEnabled(entry -// .getParentCount() > 0)); -// item.add(new BookmarkablePageLink<Void>("tree", TreePage.class, WicketUtils -// .newObjectParameter(repositoryName, entry.getName()))); + if (showSwatch) { + // set repository color + String color = StringUtils.getColor(StringUtils.stripDotGit(push.repository)); + WicketUtils.setCssStyle(commitItem, MessageFormat.format("border-left: 2px solid {0};", color)); + } } }; - + pushItem.add(commitsView); } }; + add(pushView); - - // determine to show pager, more, or neither -// if (limit <= 0) { -// // no display limit -// add(new Label("moreLogs", "").setVisible(false)); -// } else { -// if (pageResults) { -// // paging -// add(new Label("moreLogs", "").setVisible(false)); -// } else { -// // more -// if (commits.size() == limit) { -// // show more -// add(new LinkPanel("moreLogs", "link", new StringResourceModel("gb.moreLogs", -// this, null), LogPage.class, -// WicketUtils.newRepositoryParameter(repositoryName))); -// } else { -// // no more -// add(new Label("moreLogs", "").setVisible(false)); -// } -// } -// } } public boolean hasMore() { -- Gitblit v1.9.1