From 27ae9095639bb228a1b7ff86a3ebe4264abf05be Mon Sep 17 00:00:00 2001
From: mschaefers <mschaefers@scoop-gmbh.de>
Date: Thu, 29 Nov 2012 12:33:09 -0500
Subject: [PATCH] feature: when using LdapUserService one can configure Gitblit to fetch all users from ldap that can possibly login. This allows to see newly generated LDAP users instantly in Gitblit. By now an LDAP user had to log in once to appear in GitBlit.

---
 src/com/gitblit/wicket/pages/ForksPage.java |  170 ++++++++++++++++++++++++++++++--------------------------
 1 files changed, 91 insertions(+), 79 deletions(-)

diff --git a/src/com/gitblit/wicket/pages/ForksPage.java b/src/com/gitblit/wicket/pages/ForksPage.java
index 54c2c82..6155f3e 100644
--- a/src/com/gitblit/wicket/pages/ForksPage.java
+++ b/src/com/gitblit/wicket/pages/ForksPage.java
@@ -15,6 +15,7 @@
  */
 package com.gitblit.wicket.pages;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -28,9 +29,9 @@
 
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
+import com.gitblit.models.ForkModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
-import com.gitblit.utils.ArrayUtils;
 import com.gitblit.utils.StringUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
@@ -42,103 +43,114 @@
 	public ForksPage(PageParameters params) {
 		super(params);
 		
-		UserModel user = GitBlitWebSession.get().getUser();
-		RepositoryModel model = getRepositoryModel();
-		RepositoryModel origin = model;
-		List<String> list;
-		if (ArrayUtils.isEmpty(model.forks)) {
-			if (!StringUtils.isEmpty(model.originRepository)) {
-				// try origin repository
-				origin = GitBlit.self().getRepositoryModel(model.originRepository);
-			}
-			if (origin == null || origin.forks == null) {
-				list = new ArrayList<String>();
-			} else {
-				list = new ArrayList<String>(origin.forks);
-			}
-		} else {
-			// this repository has forks
-			list = new ArrayList<String>(model.forks);
-		}
+		final RepositoryModel pageRepository = getRepositoryModel();
 		
-		if (origin.isPersonalRepository()) {
-			// personal repository
-			UserModel originUser = GitBlit.self().getUserModel(origin.projectPath.substring(1));
-			PersonIdent ident = new PersonIdent(originUser.getDisplayName(), originUser.emailAddress);
-			add(new GravatarImage("forkSourceAvatar", ident, 20));
-			add(new Label("forkSourceSwatch").setVisible(false));
-			add(new LinkPanel("forkSourceProject", null, originUser.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(originUser.username)));
-		} else {
-			// standard repository
-			add(new GravatarImage("forkSourceAvatar", new PersonIdent("", ""), 20).setVisible(false));
-			Component swatch;
-			if (origin.isBare){
-				swatch = new Label("forkSourceSwatch", "&nbsp;").setEscapeModelStrings(false);
-			} else {
-				swatch = new Label("forkSourceSwatch", "!");
-				WicketUtils.setHtmlTooltip(swatch, getString("gb.workingCopyWarning"));
-			}
-			WicketUtils.setCssBackground(swatch, origin.toString());
-			add(swatch);
-			final boolean showSwatch = GitBlit.getBoolean(Keys.web.repositoryListSwatches, true);
-			swatch.setVisible(showSwatch);
-			
-			String projectName = origin.projectPath;
-			if (StringUtils.isEmpty(projectName)) {
-				projectName = GitBlit.getString(Keys.web.repositoryRootGroupName, "main");
-			}
-			add(new LinkPanel("forkSourceProject", null, projectName, ProjectPage.class, WicketUtils.newProjectParameter(origin.projectPath)));
-		}
+		ForkModel root = GitBlit.self().getForkNetwork(pageRepository.name);
+		List<FlatFork> network = flatten(root);
 		
-		String source = StringUtils.getLastPathElement(origin.name);
-		if (user != null && user.canViewRepository(origin)) {
-			// user can view the origin
-			add(new LinkPanel("forkSource", null, StringUtils.stripDotGit(source), SummaryPage.class, WicketUtils.newRepositoryParameter(origin.name)));
-		} else {
-			// user can not view the origin
-			add(new Label("forkSource", StringUtils.stripDotGit(source)));
-		}
-
-		// only display user-accessible forks
-		List<RepositoryModel> forks = new ArrayList<RepositoryModel>();
-		for (String aFork : list) {
-			RepositoryModel fork = GitBlit.self().getRepositoryModel(user, aFork);
-			if (fork != null) {
-				forks.add(fork);
-			}
-		}
-		
-		ListDataProvider<RepositoryModel> forksDp = new ListDataProvider<RepositoryModel>(forks);
-		DataView<RepositoryModel> forksList = new DataView<RepositoryModel>("fork", forksDp) {
+		ListDataProvider<FlatFork> forksDp = new ListDataProvider<FlatFork>(network);
+		DataView<FlatFork> forksList = new DataView<FlatFork>("fork", forksDp) {
 			private static final long serialVersionUID = 1L;
 
-			public void populateItem(final Item<RepositoryModel> item) {
-				RepositoryModel fork = item.getModelObject();
+			public void populateItem(final Item<FlatFork> item) {
+				FlatFork fork = item.getModelObject();
+				RepositoryModel repository = fork.repository;
 				
-				if (fork.isPersonalRepository()) {
-					UserModel user = GitBlit.self().getUserModel(fork.projectPath.substring(1));
+				if (repository.isPersonalRepository()) {
+					UserModel user = GitBlit.self().getUserModel(repository.projectPath.substring(1));
 					PersonIdent ident = new PersonIdent(user.getDisplayName(), user.emailAddress);
 					item.add(new GravatarImage("anAvatar", ident, 20));
-					item.add(new LinkPanel("aProject", null, user.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(user.username)));
+					if (pageRepository.equals(repository)) {
+						// do not link to self
+						item.add(new Label("aProject", user.getDisplayName()));
+					} else {
+						item.add(new LinkPanel("aProject", null, user.getDisplayName(), UserPage.class, WicketUtils.newUsernameParameter(user.username)));
+					}
 				} else {
-					PersonIdent ident = new PersonIdent(fork.name, fork.name);
-					item.add(new GravatarImage("anAvatar", ident, 20));
-					item.add(new LinkPanel("aProject", null, fork.projectPath, ProjectPage.class, WicketUtils.newProjectParameter(fork.projectPath)));
+					Component swatch;
+					if (repository.isBare){
+						swatch = new Label("anAvatar", "&nbsp;").setEscapeModelStrings(false);
+					} else {
+						swatch = new Label("anAvatar", "!");
+						WicketUtils.setHtmlTooltip(swatch, getString("gb.workingCopyWarning"));
+					}
+					WicketUtils.setCssClass(swatch,  "repositorySwatch");
+					WicketUtils.setCssBackground(swatch, repository.toString());
+					item.add(swatch);
+					String projectName = repository.projectPath;
+					if (StringUtils.isEmpty(projectName)) {
+						projectName = GitBlit.getString(Keys.web.repositoryRootGroupName, "main");
+					}
+					if (pageRepository.equals(repository)) {
+						// do not link to self
+						item.add(new Label("aProject", projectName));
+					} else {
+						item.add(new LinkPanel("aProject", null, projectName, ProjectPage.class, WicketUtils.newProjectParameter(projectName)));
+					}
 				}
 				
-				String repo = StringUtils.getLastPathElement(fork.name);
-				item.add(new LinkPanel("aFork", null, StringUtils.stripDotGit(repo), SummaryPage.class, WicketUtils.newRepositoryParameter(fork.name)));
+				String repo = StringUtils.getLastPathElement(repository.name);
+				UserModel user = GitBlitWebSession.get().getUser();
+				if (user == null) {
+					user = UserModel.ANONYMOUS;
+				}
+				if (user.canView(repository)) {
+					if (pageRepository.equals(repository)) {
+						// do not link to self
+						item.add(new Label("aFork", StringUtils.stripDotGit(repo)));
+					} else {
+						item.add(new LinkPanel("aFork", null, StringUtils.stripDotGit(repo), SummaryPage.class, WicketUtils.newRepositoryParameter(repository.name)));
+					}
+					item.add(WicketUtils.createDateLabel("lastChange", repository.lastChange, getTimeZone(), getTimeUtils()));
+				} else {
+					item.add(new Label("aFork", repo));
+					item.add(new Label("lastChange").setVisible(false));
+				}
 				
-				WicketUtils.setCssStyle(item, "margin-left:25px;");
+				WicketUtils.setCssStyle(item, "margin-left:" + (32*fork.level) + "px;");
+				if (fork.level == 0) {
+					WicketUtils.setCssClass(item, "forkSource");
+				} else {
+					WicketUtils.setCssClass(item,  "forkEntry");
+				}
 			}
 		};
 		
 		add(forksList);
-
 	}
 
 	@Override
 	protected String getPageName() {
 		return getString("gb.forks");
 	}
+	
+	protected List<FlatFork> flatten(ForkModel root) {
+		List<FlatFork> list = new ArrayList<FlatFork>();
+		list.addAll(flatten(root, 0));
+		return list;
+	}
+	
+	protected List<FlatFork> flatten(ForkModel node, int level) {
+		List<FlatFork> list = new ArrayList<FlatFork>();
+		list.add(new FlatFork(node.repository, level));
+		if (!node.isLeaf()) {
+			for (ForkModel fork : node.forks) {
+				list.addAll(flatten(fork, level + 1));
+			}
+		}
+		return list;
+	}
+	
+	private class FlatFork implements Serializable {
+		
+		private static final long serialVersionUID = 1L;
+
+		public final RepositoryModel repository;
+		public final int level;
+		
+		public FlatFork(RepositoryModel repository, int level) {
+			this.repository = repository;
+			this.level = level;
+		}
+	}
 }

--
Gitblit v1.9.1