123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /*
- * Copyright 2011 gitblit.com.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- package com.gitblit.wicket.panels;
-
- import java.text.MessageFormat;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.List;
- import java.util.Map;
-
- import org.apache.wicket.Component;
- import org.apache.wicket.markup.html.WebPage;
- 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.eclipse.jgit.lib.ObjectId;
- import org.eclipse.jgit.revwalk.RevCommit;
-
- import com.gitblit.Constants;
- import com.gitblit.models.RefModel;
- import com.gitblit.models.RepositoryModel;
- import com.gitblit.utils.StringUtils;
- import com.gitblit.wicket.WicketUtils;
- import com.gitblit.wicket.pages.CommitPage;
- import com.gitblit.wicket.pages.LogPage;
- import com.gitblit.wicket.pages.TagPage;
- import com.gitblit.wicket.pages.TicketsPage;
-
- public class RefsPanel extends BasePanel {
-
- private static final long serialVersionUID = 1L;
-
- public RefsPanel(String id, final String repositoryName, RevCommit c,
- Map<ObjectId, List<RefModel>> refs) {
- this(id, repositoryName, refs.get(c.getId()));
- }
-
- public RefsPanel(String id, final String repositoryName, List<RefModel> refs) {
- super(id);
- if (refs == null) {
- refs = new ArrayList<RefModel>();
- }
- Collections.sort(refs, new Comparator<RefModel>() {
- @Override
- public int compare(RefModel o1, RefModel o2) {
- // sort remote heads last, otherwise sort by name
- // this is so we can insert a break on the refs panel
- // [head][branch][branch][tag][tag]
- // [remote][remote][remote]
- boolean remote1 = o1.displayName.startsWith(Constants.R_REMOTES);
- boolean remote2 = o2.displayName.startsWith(Constants.R_REMOTES);
- if (remote1 && remote2) {
- // both are remote heads, sort by name
- return o1.displayName.compareTo(o2.displayName);
- }
- if (remote1) {
- // o1 is remote, o2 comes first
- return 1;
- }
- if (remote2) {
- // remote is o2, o1 comes first
- return -1;
- }
- // standard sort
- return o1.displayName.compareTo(o2.displayName);
- }
- });
-
- // count remote and determine if we should insert a break
- int remoteCount = 0;
- for (RefModel ref : refs) {
- if (ref.displayName.startsWith(Constants.R_REMOTES)) {
- remoteCount++;
- }
- }
- final boolean shouldBreak = remoteCount < refs.size();
- RepositoryModel repository = app().repositories().getRepositoryModel(repositoryName);
- final boolean hasTickets = app().tickets().hasTickets(repository);
-
- ListDataProvider<RefModel> refsDp = new ListDataProvider<RefModel>(refs);
- DataView<RefModel> refsView = new DataView<RefModel>("ref", refsDp) {
- private static final long serialVersionUID = 1L;
- private boolean alreadyInsertedBreak = !shouldBreak;
-
- @Override
- public void populateItem(final Item<RefModel> item) {
- RefModel entry = item.getModelObject();
- String name = entry.displayName;
- String objectid = entry.getReferencedObjectId().getName();
- boolean breakLine = false;
- Class<? extends WebPage> linkClass = CommitPage.class;
- String cssClass = "";
- String tooltip = "";
- if (name.startsWith(Constants.R_TICKET)) {
- // Gitblit ticket ref
- objectid = name.substring(Constants.R_TICKET.length());
- name = name.substring(Constants.R_HEADS.length());
- linkClass = TicketsPage.class;
- cssClass = "localBranch";
- } else if (name.startsWith(Constants.R_HEADS)) {
- // local branch
- linkClass = LogPage.class;
- name = name.substring(Constants.R_HEADS.length());
- cssClass = "localBranch";
- } else if (name.equals(Constants.HEAD)) {
- // local head
- linkClass = LogPage.class;
- cssClass = "headRef";
- } else if (name.startsWith(Constants.R_CHANGES)) {
- // Gitblit change ref
- name = name.substring(Constants.R_CHANGES.length());
- // strip leading nn/ from nn/#####nn/ps = #####nn-ps
- name = name.substring(name.indexOf('/') + 1).replace('/', '-');
- String [] values = name.split("-");
- // Gerrit change
- tooltip = MessageFormat.format(getString("gb.reviewPatchset"), values[0], values[1]);
- cssClass = "otherRef";
- } else if (name.startsWith(Constants.R_TICKETS_PATCHSETS)) {
- // Gitblit patchset ref
- name = name.substring(Constants.R_TICKETS_PATCHSETS.length());
- // strip leading nn/ from nn/#####nn/ps = #####nn-ps
- name = name.substring(name.indexOf('/') + 1).replace('/', '-');
- String [] values = name.split("-");
- tooltip = MessageFormat.format(getString("gb.ticketPatchset"), values[0], values[1]);
- linkClass = LogPage.class;
- cssClass = "otherRef";
- } else if (name.startsWith(Constants.R_PULL)) {
- // Pull Request ref
- String num = name.substring(Constants.R_PULL.length());
- if (num.endsWith("/head")) {
- // strip pull request head from name
- num = num.substring(0, num.length() - "/head".length());
- }
- name = "pr #" + num;
- tooltip = "pull request #" + num;
- cssClass = "pullRef";
- } else if (name.startsWith(Constants.R_REMOTES)) {
- // remote branch
- linkClass = LogPage.class;
- name = name.substring(Constants.R_REMOTES.length());
- cssClass = "remoteBranch";
- if (!alreadyInsertedBreak) {
- breakLine = true;
- alreadyInsertedBreak = true;
- }
- } else if (name.startsWith(Constants.R_TAGS)) {
- // tag
- if (entry.isAnnotatedTag()) {
- linkClass = TagPage.class;
- objectid = entry.getObjectId().getName();
- } else {
- linkClass = CommitPage.class;
- objectid = entry.getReferencedObjectId().getName();
- }
- name = name.substring(Constants.R_TAGS.length());
- cssClass = "tagRef";
- } else if (name.startsWith(Constants.R_NOTES)) {
- // codereview refs
- linkClass = CommitPage.class;
- cssClass = "otherRef";
- } else if (name.startsWith(com.gitblit.Constants.R_GITBLIT)) {
- // gitblit refs
- linkClass = LogPage.class;
- cssClass = "otherRef";
- name = name.substring(com.gitblit.Constants.R_GITBLIT.length());
- }
-
- Component c = new LinkPanel("refName", null, name, linkClass,
- WicketUtils.newObjectParameter(repositoryName, objectid));
- WicketUtils.setCssClass(c, cssClass);
- if (StringUtils.isEmpty(tooltip)) {
- WicketUtils.setHtmlTooltip(c, name);
- } else {
- WicketUtils.setHtmlTooltip(c, tooltip);
- }
- item.add(c);
- Label lb = new Label("lineBreak", "<br/>");
- lb.setVisible(breakLine);
- lb.setRenderBodyOnly(true);
- item.add(lb.setEscapeModelStrings(false));
- item.setRenderBodyOnly(true);
- }
- };
- add(refsView);
- }
- }
|