]> source.dussan.org Git - gitblit.git/commitdiff
Improved the repository url panel and show git daemon url, appropriately
authorJames Moger <james.moger@gitblit.com>
Fri, 3 May 2013 01:37:58 +0000 (21:37 -0400)
committerJames Moger <james.moger@gitblit.com>
Fri, 3 May 2013 01:37:58 +0000 (21:37 -0400)
This will probably be refined some more to merge the http/https and git urls
into a single url panel.

src/main/java/com/gitblit/wicket/GitBlitWebApp.properties
src/main/java/com/gitblit/wicket/pages/BasePage.java
src/main/java/com/gitblit/wicket/pages/EmptyRepositoryPage.java
src/main/java/com/gitblit/wicket/pages/ProjectPage.html
src/main/java/com/gitblit/wicket/pages/SummaryPage.html
src/main/java/com/gitblit/wicket/pages/SummaryPage.java
src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.html [new file with mode: 0644]
src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.java [new file with mode: 0644]
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.html
src/main/java/com/gitblit/wicket/panels/ProjectRepositoryPanel.java
src/main/resources/gitblit.css

index f2d4a36cf4c7dc9369321acaa949de107b226e89..aa5a415a2c98142f0172b1bd5275e38df8295e62 100644 (file)
@@ -445,7 +445,10 @@ gb.isSparkleshared = repository is Sparkleshared
 gb.owners = owners\r
 gb.sessionEnded = Session has been closed\r
 gb.closeBrowser = Please close the browser to properly end the session.\r
-gb.doesNotExistInTree = {0} does not exist in tree {1}
+gb.doesNotExistInTree = {0} does not exist in tree {1}\r
 gb.enableIncrementalPushTags = enable incremental push tags\r
 gb.useIncrementalPushTagsDescription = on push, automatically tag each branch tip with an incremental revision number\r
-gb.incrementalPushTagMessage = Auto-tagged [{0}] branch on push
\ No newline at end of file
+gb.incrementalPushTagMessage = Auto-tagged [{0}] branch on push\r
+gb.externalPermissions = {0} access permissions for {1} are externally maintained\r
+gb.viewAccess = You do not have Gitblit read or write access\r
+gb.yourProtocolPermissionIs = Your {0} access permission for {1} is {2}
\ No newline at end of file
index bb7d8c9ef69e16223fe864402845cad07bc246c2..b2dcce3f7a85b77d2cda5ae3a7a06d1e4c9d409c 100644 (file)
@@ -32,6 +32,7 @@ import java.util.regex.Pattern;
 import javax.servlet.http.HttpServletRequest;\r
 \r
 import org.apache.wicket.Application;\r
+import org.apache.wicket.Component;\r
 import org.apache.wicket.MarkupContainer;\r
 import org.apache.wicket.PageParameters;\r
 import org.apache.wicket.RedirectToUrlException;\r
@@ -44,6 +45,7 @@ import org.apache.wicket.markup.html.link.ExternalLink;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;\r
 import org.apache.wicket.markup.html.panel.Fragment;\r
 import org.apache.wicket.protocol.http.RequestUtils;\r
+import org.apache.wicket.protocol.http.WebRequest;\r
 import org.apache.wicket.protocol.http.servlet.ServletWebRequest;\r
 import org.slf4j.Logger;\r
 import org.slf4j.LoggerFactory;\r
@@ -63,6 +65,7 @@ import com.gitblit.utils.StringUtils;
 import com.gitblit.utils.TimeUtils;\r
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
+import com.gitblit.wicket.panels.DetailedRepositoryUrlPanel;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 \r
 public abstract class BasePage extends SessionPage {\r
@@ -270,6 +273,45 @@ public abstract class BasePage extends SessionPage {
                return sb.toString();\r
        }\r
        \r
+       protected Component createGitDaemonUrlPanel(String wicketId, UserModel user, RepositoryModel repository) {\r
+               int gitDaemonPort = GitBlit.getInteger(Keys.git.daemonPort, 0);\r
+               if (gitDaemonPort > 0 && user.canClone(repository)) {\r
+                       String servername = ((WebRequest) getRequest()).getHttpServletRequest().getServerName();\r
+                       String gitDaemonUrl;\r
+                       if (gitDaemonPort == 9418) {\r
+                               // standard port\r
+                               gitDaemonUrl = MessageFormat.format("git://{0}/{1}", servername, repository.name);\r
+                       } else {\r
+                               // non-standard port\r
+                               gitDaemonUrl = MessageFormat.format("git://{0}:{1,number,0}/{2}", servername, gitDaemonPort, repository.name);\r
+                       }\r
+                       \r
+                       AccessPermission gitDaemonPermission = user.getRepositoryPermission(repository).permission;;\r
+                       if (gitDaemonPermission.atLeast(AccessPermission.CLONE)) {\r
+                               if (repository.accessRestriction.atLeast(AccessRestrictionType.CLONE)) {\r
+                                       // can not authenticate clone via anonymous git protocol\r
+                                       gitDaemonPermission = AccessPermission.NONE;\r
+                               } else if (repository.accessRestriction.atLeast(AccessRestrictionType.PUSH)) {\r
+                                       // can not authenticate push via anonymous git protocol\r
+                                       gitDaemonPermission = AccessPermission.CLONE;\r
+                               } else {\r
+                                       // normal user permission\r
+                               }\r
+                       }\r
+                       \r
+                       if (AccessPermission.NONE.equals(gitDaemonPermission)) {\r
+                               // repository prohibits all anonymous access\r
+                               return new Label(wicketId).setVisible(false);\r
+                       } else {\r
+                               // repository allows some form of anonymous access\r
+                               return new DetailedRepositoryUrlPanel(wicketId, getLocalizer(), this, repository.name, gitDaemonUrl, gitDaemonPermission);\r
+                       }\r
+               } else {\r
+                       // git daemon is not running\r
+                       return new Label(wicketId).setVisible(false);\r
+               }\r
+       }\r
+       \r
        protected List<ProjectModel> getProjectModels() {\r
                final UserModel user = GitBlitWebSession.get().getUser();\r
                List<ProjectModel> projects = GitBlit.self().getProjectModels(user, true);\r
index cccf8a69cfe82001de72625436bbc7dbd0ee2753..a2264c44d48206d275b59a74aa09e4462c17b0a1 100644 (file)
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.wicket.PageParameters;\r
 import org.apache.wicket.markup.html.basic.Label;\r
 \r
+import com.gitblit.Constants.AccessPermission;\r
 import com.gitblit.GitBlit;\r
 import com.gitblit.Keys;\r
 import com.gitblit.models.RepositoryModel;\r
@@ -30,7 +31,7 @@ import com.gitblit.utils.ArrayUtils;
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.GitblitRedirectException;\r
 import com.gitblit.wicket.WicketUtils;\r
-import com.gitblit.wicket.panels.RepositoryUrlPanel;\r
+import com.gitblit.wicket.panels.DetailedRepositoryUrlPanel;\r
 \r
 public class EmptyRepositoryPage extends RootPage {\r
 \r
@@ -59,11 +60,16 @@ public class EmptyRepositoryPage extends RootPage {
                        repositoryUrls.add(getRepositoryUrl(repository));\r
                }\r
                UserModel user = GitBlitWebSession.get().getUser();\r
-               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(repositoryName, user == null ? "" : user.username));\r
+               if (user == null) {\r
+                       user = UserModel.ANONYMOUS;\r
+               }\r
+               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(repositoryName, UserModel.ANONYMOUS.equals(user) ? "" : user.username));\r
                \r
                String primaryUrl = ArrayUtils.isEmpty(repositoryUrls) ? "" : repositoryUrls.get(0);\r
+               AccessPermission accessPermission = user.getRepositoryPermission(repository).permission;\r
+               \r
                add(new Label("repository", repositoryName));\r
-               add(new RepositoryUrlPanel("pushurl", primaryUrl));\r
+               add(new DetailedRepositoryUrlPanel("pushurl", getLocalizer(), this, repository.name, primaryUrl, accessPermission));\r
                add(new Label("cloneSyntax", MessageFormat.format("git clone {0}", repositoryUrls.get(0))));\r
                add(new Label("remoteSyntax", MessageFormat.format("git remote add gitblit {0}\ngit push gitblit master", primaryUrl)));\r
        }\r
index 3e73ba52a26d2623e2a8fa2ee0a45159ab883ba1..6c16195910379148d6b7e952300ea890a745baaf 100644 (file)
@@ -38,7 +38,7 @@
                                        </div>\r
                                </div>\r
                                <div class="row">\r
-                                       <div class="span6" style="border-bottom:1px solid #eee;" wicket:id="repositoryList">\r
+                                       <div class="span6" wicket:id="repositoryList">\r
                                                <span wicket:id="repository"></span>\r
                                        </div>\r
                                </div>                          \r
index 3e85df99e611056b6df05ce5186db6769ea72dae..a751d1f0d146925e02777da3a1c52fa15e270be4 100644 (file)
                                <tr><th><wicket:message key="gb.owners">[owner]</wicket:message></th><td><span wicket:id="repositoryOwners"><span wicket:id="owner"></span><span wicket:id="comma"></span></span></td></tr>\r
                                <tr><th><wicket:message key="gb.lastChange">[last change]</wicket:message></th><td><span wicket:id="repositoryLastChange">[repository last change]</span></td></tr>\r
                                <tr><th><wicket:message key="gb.stats">[stats]</wicket:message></th><td><span wicket:id="branchStats">[branch stats]</span> <span class="link"><a wicket:id="metrics"><wicket:message key="gb.metrics">[metrics]</wicket:message></a></span></td></tr>\r
-                               <tr><th style="vertical-align:top;"><wicket:message key="gb.repositoryUrl">[URL]</wicket:message>&nbsp;<img style="vertical-align: top;padding-left:3px;" wicket:id="accessRestrictionIcon" /></th><td><span wicket:id="repositoryCloneUrl">[repository clone url]</span><div wicket:id="otherUrls"></div></td></tr>\r
+                               <tr><th style="vertical-align:top;padding-top:4px;"><wicket:message key="gb.repositoryUrl">[URL]</wicket:message>&nbsp;<img style="vertical-align: top;padding-left:3px;" wicket:id="accessRestrictionIcon" /></th>\r
+                                   <td style="padding-top:4px;">\r
+                                       <div wicket:id="repositoryPrimaryUrl">[repository primary url]</div>\r
+                                       <div wicket:id="repositoryGitDaemonUrl">[repository git daemon url]</div>\r
+                                       <div wicket:id="otherUrls" >\r
+                                               <div wicket:id="otherUrl" style="padding-top:10px"></div>\r
+                                       </div>\r
+                                   </td>\r
+                               </tr>\r
                        </table>\r
                </div>\r
        </div>\r
index d68add0f082a58278ca1d72982c0b8f5ba5dc802..863974b345fe183d2b19c5383c028711ff69f740 100644 (file)
@@ -42,6 +42,7 @@ import org.wicketstuff.googlecharts.LineStyle;
 import org.wicketstuff.googlecharts.MarkerType;\r
 import org.wicketstuff.googlecharts.ShapeMarker;\r
 \r
+import com.gitblit.Constants.AccessPermission;\r
 import com.gitblit.Constants.AccessRestrictionType;\r
 import com.gitblit.GitBlit;\r
 import com.gitblit.Keys;\r
@@ -56,9 +57,9 @@ import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;\r
 import com.gitblit.wicket.WicketUtils;\r
 import com.gitblit.wicket.panels.BranchesPanel;\r
+import com.gitblit.wicket.panels.DetailedRepositoryUrlPanel;\r
 import com.gitblit.wicket.panels.LinkPanel;\r
 import com.gitblit.wicket.panels.LogPanel;\r
-import com.gitblit.wicket.panels.RepositoryUrlPanel;\r
 import com.gitblit.wicket.panels.TagsPanel;\r
 \r
 public class SummaryPage extends RepositoryPage {\r
@@ -73,8 +74,11 @@ public class SummaryPage extends RepositoryPage {
                int numberRefs = GitBlit.getInteger(Keys.web.summaryRefsCount, 5);\r
 \r
                Repository r = getRepository();\r
-               RepositoryModel model = getRepositoryModel();\r
+               final RepositoryModel model = getRepositoryModel();\r
                UserModel user = GitBlitWebSession.get().getUser();\r
+               if (user == null) {\r
+                       user = UserModel.ANONYMOUS;\r
+               }\r
 \r
                List<Metric> metrics = null;\r
                Metric metricsTotal = null;\r
@@ -124,7 +128,9 @@ public class SummaryPage extends RepositoryPage {
 \r
                List<String> repositoryUrls = new ArrayList<String>();\r
 \r
-               if (GitBlit.getBoolean(Keys.git.enableGitServlet, true)) {\r
+               AccessPermission accessPermission = null;\r
+               if (GitBlit.getBoolean(Keys.git.enableGitServlet, true)) {                      \r
+                       accessPermission = user.getRepositoryPermission(model).permission;\r
                        AccessRestrictionType accessRestriction = getRepositoryModel().accessRestriction;\r
                        switch (accessRestriction) {\r
                        case NONE:\r
@@ -150,13 +156,27 @@ public class SummaryPage extends RepositoryPage {
                } else {\r
                        add(WicketUtils.newClearPixel("accessRestrictionIcon").setVisible(false));\r
                }\r
-               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(repositoryName, user == null ? "" : user.username));\r
+               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(repositoryName, UserModel.ANONYMOUS.equals(user) ? "" : user.username));\r
                \r
                String primaryUrl = ArrayUtils.isEmpty(repositoryUrls) ? "" : repositoryUrls.remove(0);\r
-               add(new RepositoryUrlPanel("repositoryCloneUrl", primaryUrl));\r
+               add(new DetailedRepositoryUrlPanel("repositoryPrimaryUrl", getLocalizer(), this, model.name, primaryUrl, accessPermission));\r
+\r
+               Component gitDaemonUrlPanel = createGitDaemonUrlPanel("repositoryGitDaemonUrl", user, model);\r
+               if (!StringUtils.isEmpty(primaryUrl) && gitDaemonUrlPanel instanceof DetailedRepositoryUrlPanel) {\r
+                       WicketUtils.setCssStyle(gitDaemonUrlPanel, "padding-top: 10px");\r
+               }\r
+               add(gitDaemonUrlPanel);\r
+               \r
+               ListDataProvider<String> urls = new ListDataProvider<String>(repositoryUrls);\r
+               DataView<String> otherUrlsView = new DataView<String>("otherUrls", urls) {\r
+                       private static final long serialVersionUID = 1L;\r
 \r
-               add(new Label("otherUrls", StringUtils.flattenStrings(repositoryUrls, "<br/>"))\r
-               .setEscapeModelStrings(false));\r
+                       public void populateItem(final Item<String> item) {\r
+                               final String url = item.getModelObject();\r
+                               item.add(new DetailedRepositoryUrlPanel("otherUrl", getLocalizer(), this, model.name, url));\r
+                       }\r
+               };\r
+               add(otherUrlsView);\r
 \r
                add(new LogPanel("commitsPanel", repositoryName, getRepositoryModel().HEAD, r, numberCommits, 0, getRepositoryModel().showRemoteBranches));\r
                add(new TagsPanel("tagsPanel", repositoryName, r, numberRefs).hideIfEmpty());\r
diff --git a/src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.html b/src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.html
new file mode 100644 (file)
index 0000000..e671435
--- /dev/null
@@ -0,0 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
+<html xmlns="http://www.w3.org/1999/xhtml"  \r
+      xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.3-strict.dtd"  \r
+      xml:lang="en"  \r
+      lang="en"> \r
+\r
+<wicket:panel>\r
+       <span wicket:id="urlPanel"></span>\r
+    \r
+    <!--  Repository url panel -->\r
+    <wicket:fragment wicket:id="repositoryUrlPanel">\r
+       <span class="repositoryUrlContainer">\r
+                       <span wicket:id="repositoryProtocol" class="repositoryUrlEndCap">[protocol]</span>\r
+                       <span class="repositoryUrl">\r
+                               <span wicket:id="repositoryUrl">[repository url]</span>\r
+                               <span class="hidden-phone hidden-tablet" wicket:id="copyFunction"></span>\r
+                       </span>\r
+                       <span class="hidden-phone hidden-tablet repositoryUrlEndCap" wicket:id="repositoryUrlPermission">[repository url permission]</span>\r
+               </span>\r
+       </wicket:fragment>\r
+       \r
+    <!-- Plain JavaScript manual copy & paste -->\r
+    <wicket:fragment wicket:id="jsPanel">\r
+       <span style="vertical-align:baseline;">\r
+               <img wicket:id="copyIcon" wicket:message="title:gb.copyToClipboard"></img>\r
+       </span>\r
+    </wicket:fragment>\r
+    \r
+    <!-- flash-based button-press copy & paste -->\r
+    <wicket:fragment wicket:id="clippyPanel">\r
+               <object wicket:message="title:gb.copyToClipboard" style="vertical-align:middle;"\r
+                       wicket:id="clippy"\r
+                       width="14" \r
+                       height="14"\r
+                       bgcolor="#ffffff" \r
+                       quality="high"\r
+                       wmode="transparent"\r
+                       scale="noscale"\r
+                       allowScriptAccess="always"></object>\r
+       </wicket:fragment>\r
+</wicket:panel>\r
+</html>
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.java b/src/main/java/com/gitblit/wicket/panels/DetailedRepositoryUrlPanel.java
new file mode 100644 (file)
index 0000000..afeee1d
--- /dev/null
@@ -0,0 +1,115 @@
+/*\r
+ * Copyright 2013 gitblit.com.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *     http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+package com.gitblit.wicket.panels;\r
+\r
+import java.text.MessageFormat;\r
+\r
+import org.apache.wicket.Component;\r
+import org.apache.wicket.Localizer;\r
+import org.apache.wicket.markup.html.basic.Label;\r
+import org.apache.wicket.markup.html.image.ContextImage;\r
+import org.apache.wicket.markup.html.panel.Fragment;\r
+\r
+import com.gitblit.Constants.AccessPermission;\r
+import com.gitblit.GitBlit;\r
+import com.gitblit.Keys;\r
+import com.gitblit.utils.StringUtils;\r
+import com.gitblit.wicket.WicketUtils;\r
+\r
+public class DetailedRepositoryUrlPanel extends BasePanel {\r
+\r
+       private static final long serialVersionUID = 1L;\r
+       public DetailedRepositoryUrlPanel(String wicketId, Localizer localizer, Component parent, String repository, String url) {\r
+               this(wicketId, localizer, parent, repository, url, null);\r
+       }\r
+       \r
+       public DetailedRepositoryUrlPanel(String wicketId, Localizer localizer, Component parent, String repository, String url, AccessPermission ap) {\r
+               super(wicketId);\r
+               \r
+               String protocol = url.substring(0, url.indexOf(':'));\r
+               String note;\r
+               String permission;\r
+               \r
+               if (ap == null) {\r
+                       note = MessageFormat.format(localizer.getString("gb.externalPermissions", parent), protocol, repository);\r
+                       permission = "";\r
+               } else {\r
+                       note = null;\r
+                       permission = ap.toString();\r
+                       String key;\r
+                       switch (ap) {\r
+                               case OWNER:\r
+                               case REWIND:\r
+                                       key = "gb.rewindPermission";\r
+                                       break;\r
+                               case DELETE:\r
+                                       key = "gb.deletePermission";\r
+                                       break;\r
+                               case CREATE:\r
+                                       key = "gb.createPermission";\r
+                                       break;\r
+                               case PUSH:\r
+                                       key = "gb.pushPermission";\r
+                                       break;\r
+                               case CLONE:\r
+                                       key = "gb.clonePermission";\r
+                                       break;\r
+                               default:\r
+                                       key = null;\r
+                                       note = localizer.getString("gb.viewAccess", parent);\r
+                                       break;\r
+                       }\r
+                       \r
+                       if (note == null) {\r
+                               String pattern = localizer.getString(key, parent);\r
+                               String description = MessageFormat.format(pattern, permission);\r
+                               String permissionPattern = localizer.getString("gb.yourProtocolPermissionIs", parent);\r
+                               note = MessageFormat.format(permissionPattern, protocol.toUpperCase(), repository, description);\r
+                       }\r
+               }\r
+               \r
+               if (!StringUtils.isEmpty(url) && ((ap == null) || ap.atLeast(AccessPermission.CLONE))) {\r
+                       // valid repository url\r
+                       Fragment fragment = new Fragment("urlPanel", "repositoryUrlPanel", this);\r
+                       add(fragment);\r
+                       fragment.add(WicketUtils.setHtmlTooltip(new Label("repositoryProtocol", protocol + "://"), note));\r
+                       fragment.add(new Label("repositoryUrl", url.substring(url.indexOf("://") + 3)));\r
+                       fragment.add(WicketUtils.setHtmlTooltip(new Label("repositoryUrlPermission", permission), note));\r
+\r
+                       if (StringUtils.isEmpty(url)) {\r
+                               fragment.add(new Label("copyFunction").setVisible(false));\r
+                       } else if (GitBlit.getBoolean(Keys.web.allowFlashCopyToClipboard, true)) {\r
+                               // clippy: flash-based copy & paste\r
+                               Fragment copyFragment = new Fragment("copyFunction", "clippyPanel", this);\r
+                               String baseUrl = WicketUtils.getGitblitURL(getRequest());\r
+                               ShockWaveComponent clippy = new ShockWaveComponent("clippy", baseUrl + "/clippy.swf");\r
+                               clippy.setValue("flashVars", "text=" + StringUtils.encodeURL(url));\r
+                               copyFragment.add(clippy);\r
+                               fragment.add(copyFragment);\r
+                       } else {\r
+                               // javascript: manual copy & paste with modal browser prompt dialog\r
+                               Fragment copyFragment = new Fragment("copyFunction", "jsPanel", this);\r
+                               ContextImage img = WicketUtils.newImage("copyIcon", "clippy.png");\r
+                               img.add(new JavascriptTextPrompt("onclick", "Copy to Clipboard (Ctrl+C, Enter)", url));\r
+                               copyFragment.add(img);\r
+                               fragment.add(copyFragment);\r
+                       }\r
+               } else {\r
+                       // no Git url, there may be a message\r
+                       add(new Label("urlPanel", MessageFormat.format("<i>{0}</i>", note)).setEscapeModelStrings(false).setVisible(!StringUtils.isEmpty(note)));\r
+               }\r
+       }\r
+}\r
index 9b621d5a32917c73df6badbea30104035fc3b131..e67e6416f2d8d47073c20bf78c4fca7131e9858d 100644 (file)
@@ -72,7 +72,7 @@
                                        <span style="font-size:0.8em;" wicket:id="repositorySize">[repository size]</span>\r
                                </div>\r
         \r
-                               <div class="hidden-phone hidden-tablet" wicket:id="repositoryCloneUrl">[repository clone url]</div>\r
+                               <div class="hidden-phone hidden-tablet" style="padding-top: 5px;" wicket:id="repositoryPrimaryUrl">[repository primary url]</div>\r
                        </div>\r
                </div>\r
        </div>\r
index f2b56e1768752582f6fa2f5334766ea6992157e6..822a9b21cc036b3808032bb3b799d428cd5fc1d7 100644 (file)
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.link.ExternalLink;
 import org.apache.wicket.markup.html.link.Link;\r
 import org.apache.wicket.markup.html.panel.Fragment;\r
 \r
+import com.gitblit.Constants.AccessPermission;\r
 import com.gitblit.Constants.AccessRestrictionType;\r
 import com.gitblit.GitBlit;\r
 import com.gitblit.Keys;\r
@@ -221,9 +222,10 @@ public class ProjectRepositoryPanel extends BasePanel {
                        // add the Gitblit repository url\r
                        repositoryUrls.add(BasePage.getRepositoryUrl(entry));\r
                }\r
-               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(entry.name, user == null ? "" : user.username));\r
+               repositoryUrls.addAll(GitBlit.self().getOtherCloneUrls(entry.name, UserModel.ANONYMOUS.equals(user) ? "" : user.username));\r
 \r
+               AccessPermission ap = user.getRepositoryPermission(entry).permission;\r
                String primaryUrl = ArrayUtils.isEmpty(repositoryUrls) ? "" : repositoryUrls.remove(0);\r
-               add(new RepositoryUrlPanel("repositoryCloneUrl", primaryUrl));\r
+               add(new DetailedRepositoryUrlPanel("repositoryPrimaryUrl",localizer, parent, entry.name, primaryUrl, ap));\r
        }\r
 }\r
index 811b08a52fc5739ea2ace09a0a2c030862bfef62..c93f6a694d15a8ac24bac8edd653f9fdd8116419 100644 (file)
@@ -179,6 +179,30 @@ navbar div>ul .menu-dropdown li a:hover,.nav .menu-dropdown li a:hover,.navbar d
        vertical-align: middle;\r
 }\r
 \r
+span.repositoryUrlContainer {\r
+       color: black;\r
+       background-color: #eee; \r
+       padding: 4px;\r
+       border: 1px solid #ccc;\r
+       border-radius: 3px \r
+}\r
+\r
+span.repositoryUrlEndCap {     \r
+       padding: 4px;\r
+       font-weight: bold;\r
+       font-size: 0.85em;\r
+       font-family:menlo,consolas,monospace;\r
+}\r
+\r
+span.repositoryUrl {\r
+       font-size: 1em;\r
+       padding: 4px;\r
+       color: blue;\r
+       background-color: #fff;\r
+       border-left: 1px solid #ccc;\r
+       border-right: 1px solid #ccc;\r
+}\r
+\r
 div.odd {\r
        \r
 }\r