Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ReflogPanel.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /*
  2. * Copyright 2013 gitblit.com.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.gitblit.wicket.panels;
  17. import java.text.DateFormat;
  18. import java.text.MessageFormat;
  19. import java.text.SimpleDateFormat;
  20. import java.util.ArrayList;
  21. import java.util.Calendar;
  22. import java.util.Date;
  23. import java.util.List;
  24. import java.util.TimeZone;
  25. import org.apache.wicket.markup.html.basic.Label;
  26. import org.apache.wicket.markup.repeater.Item;
  27. import org.apache.wicket.markup.repeater.data.DataView;
  28. import org.apache.wicket.markup.repeater.data.ListDataProvider;
  29. import org.apache.wicket.model.StringResourceModel;
  30. import org.eclipse.jgit.lib.Repository;
  31. import com.gitblit.Constants;
  32. import com.gitblit.GitBlit;
  33. import com.gitblit.Keys;
  34. import com.gitblit.models.RefLogEntry;
  35. import com.gitblit.models.RepositoryCommit;
  36. import com.gitblit.models.RepositoryModel;
  37. import com.gitblit.models.UserModel;
  38. import com.gitblit.utils.RefLogUtils;
  39. import com.gitblit.utils.StringUtils;
  40. import com.gitblit.utils.TimeUtils;
  41. import com.gitblit.wicket.WicketUtils;
  42. import com.gitblit.wicket.pages.CommitPage;
  43. import com.gitblit.wicket.pages.ComparePage;
  44. import com.gitblit.wicket.pages.ReflogPage;
  45. import com.gitblit.wicket.pages.TagPage;
  46. import com.gitblit.wicket.pages.TreePage;
  47. import com.gitblit.wicket.pages.UserPage;
  48. public class ReflogPanel extends BasePanel {
  49. private static final long serialVersionUID = 1L;
  50. private final boolean hasChanges;
  51. private boolean hasMore;
  52. public ReflogPanel(String wicketId, final RepositoryModel model, Repository r, int limit, int pageOffset) {
  53. super(wicketId);
  54. boolean pageResults = limit <= 0;
  55. int changesPerPage = GitBlit.getInteger(Keys.web.reflogChangesPerPage, 10);
  56. if (changesPerPage <= 1) {
  57. changesPerPage = 10;
  58. }
  59. List<RefLogEntry> changes;
  60. if (pageResults) {
  61. changes = RefLogUtils.getLogByRef(model.name, r, pageOffset * changesPerPage, changesPerPage);
  62. } else {
  63. changes = RefLogUtils.getLogByRef(model.name, r, limit);
  64. }
  65. // inaccurate way to determine if there are more commits.
  66. // works unless commits.size() represents the exact end.
  67. hasMore = changes.size() >= changesPerPage;
  68. hasChanges = changes.size() > 0;
  69. setup(changes);
  70. // determine to show pager, more, or neither
  71. if (limit <= 0) {
  72. // no display limit
  73. add(new Label("moreChanges").setVisible(false));
  74. } else {
  75. if (pageResults) {
  76. // paging
  77. add(new Label("moreChanges").setVisible(false));
  78. } else {
  79. // more
  80. if (changes.size() == limit) {
  81. // show more
  82. add(new LinkPanel("moreChanges", "link", new StringResourceModel("gb.moreChanges",
  83. this, null), ReflogPage.class,
  84. WicketUtils.newRepositoryParameter(model.name)));
  85. } else {
  86. // no more
  87. add(new Label("moreChanges").setVisible(false));
  88. }
  89. }
  90. }
  91. }
  92. public ReflogPanel(String wicketId, List<RefLogEntry> changes) {
  93. super(wicketId);
  94. hasChanges = changes.size() > 0;
  95. setup(changes);
  96. add(new Label("moreChanges").setVisible(false));
  97. }
  98. protected void setup(List<RefLogEntry> changes) {
  99. final int hashLen = GitBlit.getInteger(Keys.web.shortCommitIdLength, 6);
  100. String dateFormat = GitBlit.getString(Keys.web.datestampLongFormat, "EEEE, MMMM d, yyyy");
  101. final TimeZone timezone = getTimeZone();
  102. final DateFormat df = new SimpleDateFormat(dateFormat);
  103. df.setTimeZone(timezone);
  104. final Calendar cal = Calendar.getInstance(timezone);
  105. ListDataProvider<RefLogEntry> dp = new ListDataProvider<RefLogEntry>(changes);
  106. DataView<RefLogEntry> changeView = new DataView<RefLogEntry>("change", dp) {
  107. private static final long serialVersionUID = 1L;
  108. public void populateItem(final Item<RefLogEntry> changeItem) {
  109. final RefLogEntry change = changeItem.getModelObject();
  110. String fullRefName = change.getChangedRefs().get(0);
  111. String shortRefName = fullRefName;
  112. boolean isTag = false;
  113. if (shortRefName.startsWith(Constants.R_HEADS)) {
  114. shortRefName = shortRefName.substring(Constants.R_HEADS.length());
  115. } else if (shortRefName.startsWith(Constants.R_TAGS)) {
  116. shortRefName = shortRefName.substring(Constants.R_TAGS.length());
  117. isTag = true;
  118. }
  119. String fuzzydate;
  120. TimeUtils tu = getTimeUtils();
  121. Date changeDate = change.date;
  122. if (TimeUtils.isToday(changeDate, timezone)) {
  123. fuzzydate = tu.today();
  124. } else if (TimeUtils.isYesterday(changeDate, timezone)) {
  125. fuzzydate = tu.yesterday();
  126. } else {
  127. // calculate a fuzzy time ago date
  128. cal.setTime(changeDate);
  129. cal.set(Calendar.HOUR_OF_DAY, 0);
  130. cal.set(Calendar.MINUTE, 0);
  131. cal.set(Calendar.SECOND, 0);
  132. cal.set(Calendar.MILLISECOND, 0);
  133. changeDate = cal.getTime();
  134. fuzzydate = getTimeUtils().timeAgo(changeDate);
  135. }
  136. changeItem.add(new Label("whenChanged", fuzzydate + ", " + df.format(changeDate)));
  137. Label changeIcon = new Label("changeIcon");
  138. if (isTag) {
  139. WicketUtils.setCssClass(changeIcon, "iconic-tag");
  140. } else {
  141. WicketUtils.setCssClass(changeIcon, "iconic-upload");
  142. }
  143. changeItem.add(changeIcon);
  144. if (change.user.username.equals(change.user.emailAddress) && change.user.emailAddress.indexOf('@') > -1) {
  145. // username is an email address - 1.2.1 push log bug
  146. changeItem.add(new Label("whoChanged", change.user.getDisplayName()));
  147. } else if (change.user.username.equals(UserModel.ANONYMOUS.username)) {
  148. // anonymous change
  149. changeItem.add(new Label("whoChanged", getString("gb.anonymousUser")));
  150. } else {
  151. // link to user account page
  152. changeItem.add(new LinkPanel("whoChanged", null, change.user.getDisplayName(),
  153. UserPage.class, WicketUtils.newUsernameParameter(change.user.username)));
  154. }
  155. boolean isDelete = false;
  156. boolean isRewind = false;
  157. String what;
  158. String by = null;
  159. switch(change.getChangeType(fullRefName)) {
  160. case CREATE:
  161. if (isTag) {
  162. // new tag
  163. what = getString("gb.pushedNewTag");
  164. } else {
  165. // new branch
  166. what = getString("gb.pushedNewBranch");
  167. }
  168. break;
  169. case DELETE:
  170. isDelete = true;
  171. if (isTag) {
  172. what = getString("gb.deletedTag");
  173. } else {
  174. what = getString("gb.deletedBranch");
  175. }
  176. break;
  177. case UPDATE_NONFASTFORWARD:
  178. isRewind = true;
  179. default:
  180. what = MessageFormat.format(change.getCommitCount() > 1 ? getString("gb.pushedNCommitsTo") : getString("gb.pushedOneCommitTo") , change.getCommitCount());
  181. if (change.getAuthorCount() == 1) {
  182. by = MessageFormat.format(getString("gb.byOneAuthor"), change.getAuthorIdent().getName());
  183. } else {
  184. by = MessageFormat.format(getString("gb.byNAuthors"), change.getAuthorCount());
  185. }
  186. break;
  187. }
  188. changeItem.add(new Label("whatChanged", what));
  189. changeItem.add(new Label("byAuthors", by).setVisible(!StringUtils.isEmpty(by)));
  190. changeItem.add(new Label("refRewind", getString("gb.rewind")).setVisible(isRewind));
  191. if (isDelete) {
  192. // can't link to deleted ref
  193. changeItem.add(new Label("refChanged", shortRefName));
  194. } else if (isTag) {
  195. // link to tag
  196. changeItem.add(new LinkPanel("refChanged", null, shortRefName,
  197. TagPage.class, WicketUtils.newObjectParameter(change.repository, fullRefName)));
  198. } else {
  199. // link to tree
  200. changeItem.add(new LinkPanel("refChanged", null, shortRefName,
  201. TreePage.class, WicketUtils.newObjectParameter(change.repository, fullRefName)));
  202. }
  203. int maxCommitCount = 5;
  204. List<RepositoryCommit> commits = change.getCommits();
  205. if (commits.size() > maxCommitCount) {
  206. commits = new ArrayList<RepositoryCommit>(commits.subList(0, maxCommitCount));
  207. }
  208. // compare link
  209. String compareLinkText = null;
  210. if ((change.getCommitCount() <= maxCommitCount) && (change.getCommitCount() > 1)) {
  211. compareLinkText = MessageFormat.format(getString("gb.viewComparison"), commits.size());
  212. } else if (change.getCommitCount() > maxCommitCount) {
  213. int diff = change.getCommitCount() - maxCommitCount;
  214. compareLinkText = MessageFormat.format(diff > 1 ? getString("gb.nMoreCommits") : getString("gb.oneMoreCommit"), diff);
  215. }
  216. if (StringUtils.isEmpty(compareLinkText)) {
  217. changeItem.add(new Label("compareLink").setVisible(false));
  218. } else {
  219. String endRangeId = change.getNewId(fullRefName);
  220. String startRangeId = change.getOldId(fullRefName);
  221. changeItem.add(new LinkPanel("compareLink", null, compareLinkText, ComparePage.class, WicketUtils.newRangeParameter(change.repository, startRangeId, endRangeId)));
  222. }
  223. ListDataProvider<RepositoryCommit> cdp = new ListDataProvider<RepositoryCommit>(commits);
  224. DataView<RepositoryCommit> commitsView = new DataView<RepositoryCommit>("commit", cdp) {
  225. private static final long serialVersionUID = 1L;
  226. public void populateItem(final Item<RepositoryCommit> commitItem) {
  227. final RepositoryCommit commit = commitItem.getModelObject();
  228. // author gravatar
  229. commitItem.add(new GravatarImage("commitAuthor", commit.getAuthorIdent().getName(),
  230. commit.getAuthorIdent().getEmailAddress(), null, 16, false, false));
  231. // merge icon
  232. if (commit.getParentCount() > 1) {
  233. commitItem.add(WicketUtils.newImage("commitIcon", "commit_merge_16x16.png"));
  234. } else {
  235. commitItem.add(WicketUtils.newBlankImage("commitIcon"));
  236. }
  237. // short message
  238. String shortMessage = commit.getShortMessage();
  239. String trimmedMessage = shortMessage;
  240. if (commit.getRefs() != null && commit.getRefs().size() > 0) {
  241. trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG_REFS);
  242. } else {
  243. trimmedMessage = StringUtils.trimString(shortMessage, Constants.LEN_SHORTLOG);
  244. }
  245. LinkPanel shortlog = new LinkPanel("commitShortMessage", "list",
  246. trimmedMessage, CommitPage.class, WicketUtils.newObjectParameter(
  247. change.repository, commit.getName()));
  248. if (!shortMessage.equals(trimmedMessage)) {
  249. WicketUtils.setHtmlTooltip(shortlog, shortMessage);
  250. }
  251. commitItem.add(shortlog);
  252. // commit hash link
  253. LinkPanel commitHash = new LinkPanel("hashLink", null, commit.getName().substring(0, hashLen),
  254. CommitPage.class, WicketUtils.newObjectParameter(
  255. change.repository, commit.getName()));
  256. WicketUtils.setCssClass(commitHash, "shortsha1");
  257. WicketUtils.setHtmlTooltip(commitHash, commit.getName());
  258. commitItem.add(commitHash);
  259. }
  260. };
  261. changeItem.add(commitsView);
  262. }
  263. };
  264. add(changeView);
  265. }
  266. public boolean hasMore() {
  267. return hasMore;
  268. }
  269. public boolean hideIfEmpty() {
  270. setVisible(hasChanges);
  271. return hasChanges;
  272. }
  273. }