From eb1405f736f2f98e14215774dd53eea9b9a77017 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Mon, 01 Oct 2012 20:45:19 -0400 Subject: [PATCH] Show fork links according to user permissions. Improve fork detection. --- src/com/gitblit/wicket/pages/RepositoryPage.java | 110 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 61 insertions(+), 49 deletions(-) diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java index a85d21e..8ca2b33 100644 --- a/src/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/com/gitblit/wicket/pages/RepositoryPage.java @@ -136,22 +136,12 @@ pages.put("branches", new PageRegistration("gb.branches", BranchesPage.class, params)); pages.put("tags", new PageRegistration("gb.tags", TagsPage.class, params)); pages.put("tree", new PageRegistration("gb.tree", TreePage.class, params)); + pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params)); // conditional links Repository r = getRepository(); RepositoryModel model = getRepositoryModel(); - // forks list button - if (StringUtils.isEmpty(model.originRepository)) { - if (!ArrayUtils.isEmpty(model.forks)) { - // this origin repository has forks - pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params)); - } - } else { - // this is a fork of another repository - pages.put("forks", new PageRegistration("gb.forks", ForksPage.class, params)); - } - // per-repository extra page links if (model.useTickets && TicgitUtils.getTicketsBranch(r) != null) { pages.put("tickets", new PageRegistration("gb.tickets", TicketsPage.class, params)); @@ -204,15 +194,29 @@ WicketUtils.newRepositoryParameter(repositoryName))); add(new Label("pageName", pageName).setRenderBodyOnly(true)); + UserModel user = GitBlitWebSession.get().getUser(); + // indicate origin repository RepositoryModel model = getRepositoryModel(); if (StringUtils.isEmpty(model.originRepository)) { add(new Label("originRepository").setVisible(false)); } else { - Fragment forkFrag = new Fragment("originRepository", "originFragment", this); - forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(model.originRepository), - SummaryPage.class, WicketUtils.newRepositoryParameter(model.originRepository))); - add(forkFrag); + RepositoryModel origin = GitBlit.self().getRepositoryModel(model.originRepository); + if (origin == null) { + // no origin repository + add(new Label("originRepository").setVisible(false)); + } else if (!user.canViewRepository(origin)) { + // show origin repository without link + Fragment forkFrag = new Fragment("originRepository", "originFragment", this); + forkFrag.add(new Label("originRepository", StringUtils.stripDotGit(model.originRepository))); + add(forkFrag); + } else { + // link to origin repository + Fragment forkFrag = new Fragment("originRepository", "originFragment", this); + forkFrag.add(new LinkPanel("originRepository", null, StringUtils.stripDotGit(model.originRepository), + SummaryPage.class, WicketUtils.newRepositoryParameter(model.originRepository))); + add(forkFrag); + } } if (getRepositoryModel().isBare) { @@ -224,33 +228,57 @@ wc.add(lbl); add(wc); } - - if (getRepositoryModel().allowForks) { + + // fork controls + if (user == null) { + // must be logged-in to fork, hide all fork controls + add(new ExternalLink("forkLink", "").setVisible(false)); + add(new ExternalLink("myForkLink", "").setVisible(false)); add(new Label("forksProhibitedIndicator").setVisible(false)); } else { - Fragment wc = new Fragment("forksProhibitedIndicator", "forksProhibitedFragment", this); - Label lbl = new Label("forksProhibited", getString("gb.forksProhibited")); - WicketUtils.setHtmlTooltip(lbl, getString("gb.forksProhibitedWarning")); - wc.add(lbl); - add(wc); - } - - UserModel user = GitBlitWebSession.get().getUser(); - - // fork button - if (user != null) { - final String clonedRepo = MessageFormat.format("~{0}/{1}.git", user.username, StringUtils.stripDotGit(StringUtils.getLastPathElement(model.name))); - boolean hasClone = GitBlit.self().hasRepository(clonedRepo) && !getRepositoryModel().name.equals(clonedRepo); - if (user.canForkRepository(model) && !hasClone) { + String fork = GitBlit.self().getFork(user.username, model.name); + boolean hasFork = fork != null; + boolean canFork = user.canForkRepository(model); + + if (hasFork || !canFork) { + // user not allowed to fork or fork already exists or repo forbids forking + add(new ExternalLink("forkLink", "").setVisible(false)); + + if (user.canFork && !model.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); + add(wc); + } else { + // can not fork, no need for forks prohibited indicator + add(new Label("forksProhibitedIndicator").setVisible(false)); + } + + if (hasFork && !fork.equals(model.name)) { + // user has fork, view my fork link + String url = getRequestCycle().urlFor(SummaryPage.class, WicketUtils.newRepositoryParameter(fork)).toString(); + add(new ExternalLink("myForkLink", url)); + } else { + // no fork, hide view my fork link + add(new ExternalLink("myForkLink", "").setVisible(false)); + } + } else if (canFork) { + // can fork and we do not have one + add(new Label("forksProhibitedIndicator").setVisible(false)); + add(new ExternalLink("myForkLink", "").setVisible(false)); Link<Void> forkLink = new Link<Void>("forkLink") { private static final long serialVersionUID = 1L; @Override public void onClick() { + UserModel user = GitBlitWebSession.get().getUser(); RepositoryModel model = getRepositoryModel(); + String asFork = MessageFormat.format("~{0}/{1}.git", user.username, StringUtils.stripDotGit(StringUtils.getLastPathElement(model.name))); if (GitBlit.self().fork(model, GitBlitWebSession.get().getUser())) { - throw new RedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(clonedRepo)); + throw new RedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(asFork)); } else { error(MessageFormat.format(getString("gb.repositoryForkFailed"), model)); } @@ -259,23 +287,7 @@ forkLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format( getString("gb.forkRepository"), getRepositoryModel()))); add(forkLink); - } else { - // user not allowed to fork or fork already exists or repo forbids forking - add(new ExternalLink("forkLink", "").setVisible(false)); } - - if (hasClone) { - // user has clone - String url = getRequestCycle().urlFor(SummaryPage.class, WicketUtils.newRepositoryParameter(clonedRepo)).toString(); - add(new ExternalLink("myForkLink", url)); - } else { - // user does not have clone - add(new ExternalLink("myForkLink", "").setVisible(false)); - } - } else { - // server prohibits forking - add(new ExternalLink("forkLink", "").setVisible(false)); - add(new ExternalLink("myForkLink", "").setVisible(false)); } super.setupPage(repositoryName, pageName); @@ -577,4 +589,4 @@ getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); } } -} +} \ No newline at end of file -- Gitblit v1.9.1