From c0bf1a3ebffac49e59ee8b3283b95bfa672630da Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 22 Jul 2013 08:02:52 -0400
Subject: [PATCH] Merge pull request #104 from rafaelcavazin/master
---
src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java | 177 +++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 112 insertions(+), 65 deletions(-)
diff --git a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
index 00c7cf7..aaab2b1 100644
--- a/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
+++ b/src/main/java/com/gitblit/wicket/panels/RepositoryUrlPanel.java
@@ -38,12 +38,12 @@
import com.gitblit.Constants.AccessRestrictionType;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
-import com.gitblit.SparkleShareInviteServlet;
import com.gitblit.models.GitClientApplication;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.RepositoryUrl;
import com.gitblit.models.UserModel;
import com.gitblit.utils.StringUtils;
+import com.gitblit.wicket.ExternalImage;
import com.gitblit.wicket.GitBlitWebSession;
import com.gitblit.wicket.WicketUtils;
@@ -85,17 +85,24 @@
// grab primary url from the top of the list
primaryUrl = repositoryUrls.size() == 0 ? null : repositoryUrls.get(0);
- boolean canClone = ((primaryUrl.permission == null) || primaryUrl.permission.atLeast(AccessPermission.CLONE));
+ boolean canClone = primaryUrl != null && ((primaryUrl.permission == null) || primaryUrl.permission.atLeast(AccessPermission.CLONE));
if (repositoryUrls.size() == 0 || !canClone) {
// no urls, nothing to show.
add(new Label("repositoryUrlPanel").setVisible(false));
add(new Label("applicationMenusPanel").setVisible(false));
+ add(new Label("repositoryIndicators").setVisible(false));
return;
}
// display primary url
add(createPrimaryUrlPanel("repositoryUrlPanel", repository, repositoryUrls));
+
+ if (onlyUrls) {
+ add(new Label("repositoryIndicators").setVisible(false));
+ } else {
+ add(createRepositoryIndicators(repository));
+ }
boolean allowAppLinks = GitBlit.getBoolean(Keys.web.allowAppCloneLinks, true);
if (onlyUrls || !canClone || !allowAppLinks) {
@@ -155,7 +162,7 @@
}
// access restriction icon and tooltip
- if (isGitblitServingRepositories()) {
+ if (GitBlit.isServingRepositories()) {
switch (repository.accessRestriction) {
case NONE:
urlPanel.add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
@@ -173,10 +180,20 @@
getAccessRestrictions().get(repository.accessRestriction)));
break;
default:
- urlPanel.add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
+ if (repositoryUrls.size() == 1) {
+ // force left end cap to have some width
+ urlPanel.add(WicketUtils.newBlankIcon("accessRestrictionIcon"));
+ } else {
+ urlPanel.add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
+ }
}
} else {
- urlPanel.add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
+ if (repositoryUrls.size() == 1) {
+ // force left end cap to have some width
+ urlPanel.add(WicketUtils.newBlankIcon("accessRestrictionIcon"));
+ } else {
+ urlPanel.add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));
+ }
}
urlPanel.add(new Label("primaryUrl", primaryUrl.url).setRenderBodyOnly(true));
@@ -190,7 +207,7 @@
return urlPanel;
}
- protected Fragment createApplicationMenus(String wicketId, UserModel user, final RepositoryModel repository, List<RepositoryUrl> repositoryUrls) {
+ protected Fragment createApplicationMenus(String wicketId, UserModel user, final RepositoryModel repository, final List<RepositoryUrl> repositoryUrls) {
final List<GitClientApplication> displayedApps = new ArrayList<GitClientApplication>();
final String userAgent = ((WebClientInfo) GitBlitWebSession.get().getClientInfo()).getUserAgent();
@@ -200,14 +217,9 @@
displayedApps.add(app);
}
}
-
- GitClientApplication sparkleshare = getSparkleShareAppMenu(user, repository);
- if (sparkleshare != null) {
- displayedApps.add(sparkleshare);
- }
}
- final ListDataProvider<RepositoryUrl> urlsDp = new ListDataProvider<RepositoryUrl>(repositoryUrls);
+ final String baseURL = WicketUtils.getGitblitURL(RequestCycle.get().getRequest());
ListDataProvider<GitClientApplication> displayedAppsDp = new ListDataProvider<GitClientApplication>(displayedApps);
DataView<GitClientApplication> appMenus = new DataView<GitClientApplication>("appMenus", displayedAppsDp) {
private static final long serialVersionUID = 1L;
@@ -215,58 +227,90 @@
public void populateItem(final Item<GitClientApplication> item) {
final GitClientApplication clientApp = item.getModelObject();
+ // filter the urls for the client app
+ List<RepositoryUrl> urls = new ArrayList<RepositoryUrl>();
+ for (RepositoryUrl repoUrl : repositoryUrls) {
+ if (clientApp.minimumPermission == null || repoUrl.permission == null) {
+ // no minimum permission or external permissions, assume it is satisfactory
+ if (clientApp.supportsTransport(repoUrl.url)) {
+ urls.add(repoUrl);
+ }
+ } else if (repoUrl.permission.atLeast(clientApp.minimumPermission)) {
+ // repo url meets minimum permission requirement
+ if (clientApp.supportsTransport(repoUrl.url)) {
+ urls.add(repoUrl);
+ }
+ }
+ }
+
+ if (urls.size() == 0) {
+ // do not show this app menu because there are no urls
+ item.add(new Label("appMenu").setVisible(false));
+ return;
+ }
+
+ Fragment appMenu = new Fragment("appMenu", "appMenuFragment", this);
+ appMenu.setRenderBodyOnly(true);
+ item.add(appMenu);
+
// menu button
- item.add(new Label("applicationName", clientApp.name));
+ appMenu.add(new Label("applicationName", clientApp.name));
// application icon
Component img;
if (StringUtils.isEmpty(clientApp.icon)) {
img = WicketUtils.newClearPixel("applicationIcon").setVisible(false);
} else {
- img = WicketUtils.newImage("applicationIcon", clientApp.icon);
+ if (clientApp.icon.contains("://")) {
+ // external image
+ img = new ExternalImage("applicationIcon", clientApp.icon);
+ } else {
+ // context image
+ img = WicketUtils.newImage("applicationIcon", clientApp.icon);
+ }
}
- item.add(img);
+ appMenu.add(img);
// application menu title, may be a link
if (StringUtils.isEmpty(clientApp.productUrl)) {
- item.add(new Label("applicationTitle", clientApp.toString()));
+ appMenu.add(new Label("applicationTitle", clientApp.toString()));
} else {
- item.add(new LinkPanel("applicationTitle", null, clientApp.toString(), clientApp.productUrl, true));
+ appMenu.add(new LinkPanel("applicationTitle", null, clientApp.toString(), clientApp.productUrl, true));
}
// brief application description
if (StringUtils.isEmpty(clientApp.description)) {
- item.add(new Label("applicationDescription").setVisible(false));
+ appMenu.add(new Label("applicationDescription").setVisible(false));
} else {
- item.add(new Label("applicationDescription", clientApp.description));
+ appMenu.add(new Label("applicationDescription", clientApp.description));
}
// brief application legal info, copyright, license, etc
if (StringUtils.isEmpty(clientApp.legal)) {
- item.add(new Label("applicationLegal").setVisible(false));
+ appMenu.add(new Label("applicationLegal").setVisible(false));
} else {
- item.add(new Label("applicationLegal", clientApp.legal));
+ appMenu.add(new Label("applicationLegal", clientApp.legal));
}
// a nested repeater for all action items
+ ListDataProvider<RepositoryUrl> urlsDp = new ListDataProvider<RepositoryUrl>(urls);
DataView<RepositoryUrl> actionItems = new DataView<RepositoryUrl>("actionItems", urlsDp) {
private static final long serialVersionUID = 1L;
public void populateItem(final Item<RepositoryUrl> repoLinkItem) {
RepositoryUrl repoUrl = repoLinkItem.getModelObject();
-
Fragment fragment = new Fragment("actionItem", "actionFragment", this);
fragment.add(createPermissionBadge("permission", repoUrl));
if (!StringUtils.isEmpty(clientApp.cloneUrl)) {
// custom registered url
- String url = MessageFormat.format(clientApp.cloneUrl, repoUrl);
+ String url = substitute(clientApp.cloneUrl, repoUrl.url, baseURL);
fragment.add(new LinkPanel("content", "applicationMenuItem", getString("gb.clone") + " " + repoUrl.url, url));
repoLinkItem.add(fragment);
fragment.add(new Label("copyFunction").setVisible(false));
} else if (!StringUtils.isEmpty(clientApp.command)) {
// command-line
- String command = MessageFormat.format(clientApp.command, repoUrl);
+ String command = substitute(clientApp.command, repoUrl.url, baseURL);
Label content = new Label("content", command);
WicketUtils.setCssClass(content, "commandMenuItem");
fragment.add(content);
@@ -276,7 +320,7 @@
fragment.add(createCopyFragment(command));
}
}};
- item.add(actionItems);
+ appMenu.add(actionItems);
}
};
@@ -285,46 +329,8 @@
return applicationMenus;
}
- protected GitClientApplication getSparkleShareAppMenu(UserModel user, RepositoryModel repository) {
- String url = null;
- if (repository.isBare && repository.isSparkleshared()) {
- String username = null;
- if (UserModel.ANONYMOUS != user) {
- username = user.username;
- }
- if (isGitblitServingRepositories()) {
- // Gitblit as server
- // ensure user can rewind
- if (user.canRewindRef(repository)) {
- String baseURL = WicketUtils.getGitblitURL(RequestCycle.get().getRequest());
- url = SparkleShareInviteServlet.asLink(baseURL, repository.name, username);
- }
- } else {
- // Gitblit as viewer, assume RW+ permission
- String baseURL = WicketUtils.getGitblitURL(RequestCycle.get().getRequest());
- url = SparkleShareInviteServlet.asLink(baseURL, repository.name, username);
- }
- }
-
- // sparkleshare invite url
- if (!StringUtils.isEmpty(url)) {
- GitClientApplication app = new GitClientApplication();
- app.name = "SparkleShare";
- app.title = "SparkleShare\u2122";
- app.description = "an open source collaboration and sharing tool";
- app.legal = "released under the GPLv3 open source license";
- app.cloneUrl = url;
- app.platforms = new String [] { "windows", "macintosh", "linux" };
- app.productUrl = "http://sparkleshare.org";
- app.icon = "star_32x32.png";
- app.isActive = true;
- return app;
- }
- return null;
- }
-
- protected boolean isGitblitServingRepositories() {
- return GitBlit.getBoolean(Keys.git.enableGitServlet, true) || (GitBlit.getInteger(Keys.git.daemonPort, 0) > 0);
+ protected String substitute(String pattern, String repoUrl, String baseUrl) {
+ return pattern.replace("${repoUrl}", repoUrl).replace("${baseUrl}", baseUrl);
}
protected Label createPermissionBadge(String wicketId, RepositoryUrl repoUrl) {
@@ -420,4 +426,45 @@
}
return accessRestrictionsMap;
}
+
+ protected Component createRepositoryIndicators(RepositoryModel repository) {
+ Fragment fragment = new Fragment("repositoryIndicators", "indicatorsFragment", this);
+ if (repository.isBare) {
+ fragment.add(new Label("workingCopyIndicator").setVisible(false));
+ } else {
+ Fragment wc = new Fragment("workingCopyIndicator", "workingCopyFragment", this);
+ Label lbl = new Label("workingCopy", getString("gb.workingCopy"));
+ WicketUtils.setHtmlTooltip(lbl, getString("gb.workingCopyWarning"));
+ wc.add(lbl);
+ fragment.add(wc);
+ }
+
+ boolean allowForking = GitBlit.getBoolean(Keys.web.allowForking, true);
+ if (!allowForking || user == null || !user.isAuthenticated) {
+ // must be logged-in to fork, hide all fork controls
+ fragment.add(new Label("forksProhibitedIndicator").setVisible(false));
+ } else {
+ String fork = GitBlit.self().getFork(user.username, repository.name);
+ boolean hasFork = fork != null;
+ boolean canFork = user.canFork(repository);
+
+ if (hasFork || !canFork) {
+ if (user.canFork() && !repository.allowForks) {
+ // show forks prohibited indicator
+ Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", this);
+ Label lbl = new Label("forksProhibited", getString("gb.forksProhibited"));
+ WicketUtils.setHtmlTooltip(lbl, getString("gb.forksProhibitedWarning"));
+ wc.add(lbl);
+ fragment.add(wc);
+ } else {
+ // can not fork, no need for forks prohibited indicator
+ fragment.add(new Label("forksProhibitedIndicator").setVisible(false));
+ }
+ } else if (canFork) {
+ // can fork and we do not have one
+ fragment.add(new Label("forksProhibitedIndicator").setVisible(false));
+ }
+ }
+ return fragment;
+ }
}
--
Gitblit v1.9.1