From f22a0633d08e38ac4bf92b5165a708e11b4d6598 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 03 Oct 2012 17:31:37 -0400 Subject: [PATCH] Implemented support for toggling User.canFork in Manager --- src/com/gitblit/wicket/pages/RepositoryPage.java | 135 ++++++++++++++++++++++---------------------- 1 files changed, 67 insertions(+), 68 deletions(-) diff --git a/src/com/gitblit/wicket/pages/RepositoryPage.java b/src/com/gitblit/wicket/pages/RepositoryPage.java index a85d21e..2afc2c4 100644 --- a/src/com/gitblit/wicket/pages/RepositoryPage.java +++ b/src/com/gitblit/wicket/pages/RepositoryPage.java @@ -28,12 +28,10 @@ import org.apache.wicket.Component; import org.apache.wicket.PageParameters; -import org.apache.wicket.RedirectException; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.ExternalLink; -import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; @@ -62,7 +60,6 @@ import com.gitblit.wicket.PageRegistration.OtherPageLink; import com.gitblit.wicket.SessionlessForm; import com.gitblit.wicket.WicketUtils; -import com.gitblit.wicket.panels.BasePanel.JavascriptEventConfirmation; import com.gitblit.wicket.panels.LinkPanel; import com.gitblit.wicket.panels.NavigationPanel; import com.gitblit.wicket.panels.RefsPanel; @@ -136,22 +133,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)); @@ -181,6 +168,10 @@ } return pages; } + + protected boolean allowForkControls() { + return true; + } @Override protected void setupPage(String repositoryName, String pageName) { @@ -204,15 +195,32 @@ WicketUtils.newRepositoryParameter(repositoryName))); add(new Label("pageName", pageName).setRenderBodyOnly(true)); + UserModel user = GitBlitWebSession.get().getUser(); + if (user == null) { + user = UserModel.ANONYMOUS; + } + // 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,58 +232,49 @@ wc.add(lbl); add(wc); } - - if (getRepositoryModel().allowForks) { - 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) { - Link<Void> forkLink = new Link<Void>("forkLink") { - private static final long serialVersionUID = 1L; - - @Override - public void onClick() { - RepositoryModel model = getRepositoryModel(); - if (GitBlit.self().fork(model, GitBlitWebSession.get().getUser())) { - throw new RedirectException(SummaryPage.class, WicketUtils.newRepositoryParameter(clonedRepo)); - } else { - error(MessageFormat.format(getString("gb.repositoryForkFailed"), model)); - } - } - }; - 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 + // fork controls + if (!allowForkControls() || user == null || !user.isAuthenticated) { + // 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 { + 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)); + String url = getRequestCycle().urlFor(ForkPage.class, WicketUtils.newRepositoryParameter(model.name)).toString(); + add(new ExternalLink("forkLink", url)); + } } super.setupPage(repositoryName, pageName); @@ -577,4 +576,4 @@ getRequestCycle().setRequestTarget(new RedirectRequestTarget(absoluteUrl)); } } -} +} \ No newline at end of file -- Gitblit v1.9.1