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/panels/RepositoriesPanel.java |  185 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 132 insertions(+), 53 deletions(-)

diff --git a/src/com/gitblit/wicket/panels/RepositoriesPanel.java b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
index f644546..d3b8ddb 100644
--- a/src/com/gitblit/wicket/panels/RepositoriesPanel.java
+++ b/src/com/gitblit/wicket/panels/RepositoriesPanel.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.wicket.Component;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.extensions.markup.html.repeater.data.sort.OrderByBorder;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -45,49 +46,61 @@
 import com.gitblit.GitBlit;
 import com.gitblit.Keys;
 import com.gitblit.SyndicationServlet;
+import com.gitblit.models.ProjectModel;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
-import com.gitblit.utils.ByteFormat;
 import com.gitblit.utils.StringUtils;
-import com.gitblit.utils.TimeUtils;
 import com.gitblit.wicket.GitBlitWebSession;
 import com.gitblit.wicket.WicketUtils;
+import com.gitblit.wicket.pages.BasePage;
 import com.gitblit.wicket.pages.EditRepositoryPage;
+import com.gitblit.wicket.pages.EmptyRepositoryPage;
+import com.gitblit.wicket.pages.ProjectPage;
+import com.gitblit.wicket.pages.RepositoriesPage;
 import com.gitblit.wicket.pages.SummaryPage;
+import com.gitblit.wicket.pages.UserPage;
 
 public class RepositoriesPanel extends BasePanel {
 
 	private static final long serialVersionUID = 1L;
 
-	public RepositoriesPanel(String wicketId, final boolean showAdmin,
-			List<RepositoryModel> models,
+	public RepositoriesPanel(String wicketId, final boolean showAdmin, final boolean showManagement,
+			List<RepositoryModel> models, boolean enableLinks,
 			final Map<AccessRestrictionType, String> accessRestrictionTranslations) {
 		super(wicketId);
 
-		final boolean linksActive;
+		final boolean linksActive = enableLinks;
 		final boolean showSize = GitBlit.getBoolean(Keys.web.showRepositorySizes, true);
 
 		final UserModel user = GitBlitWebSession.get().getUser();
-		if (models == null) {
-			linksActive = true;
-			models = GitBlit.self().getRepositoryModels(user);
-			final ByteFormat byteFormat = new ByteFormat();
-			if (showSize) {
-				for (RepositoryModel model : models) {
-					model.size = byteFormat.format(GitBlit.self().calculateSize(model));
-				}
-			}
-		} else {
-			// disable links if the repositories are already provided
-			// the repositories are most likely from a proposal
-			linksActive = false;
-		}
 
 		final IDataProvider<RepositoryModel> dp;
 
-		Fragment adminLinks = new Fragment("adminPanel", "adminLinks", this);
-		adminLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
-		add(adminLinks.setVisible(showAdmin));
+		Fragment managementLinks;
+		if (showAdmin) {
+			// user is admin
+			managementLinks = new Fragment("managementPanel", "adminLinks", this);
+			managementLinks.add(new Link<Void>("clearCache") {
+
+				private static final long serialVersionUID = 1L;
+
+				@Override
+				public void onClick() {
+					GitBlit.self().resetRepositoryListCache();
+					setResponsePage(RepositoriesPage.class);
+				}
+			}.setVisible(GitBlit.getBoolean(Keys.git.cacheRepositoryList, true)));
+			managementLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
+			add(managementLinks);
+		} else if (showManagement && user != null && user.canCreate()) {
+			// user can create personal repositories
+			managementLinks = new Fragment("managementPanel", "personalLinks", this);
+			managementLinks.add(new BookmarkablePageLink<Void>("newRepository", EditRepositoryPage.class));
+			add(managementLinks);
+		} else {
+			// user has no management permissions
+			add (new Label("managementPanel").setVisible(false));
+		}
 
 		if (GitBlit.getString(Keys.web.repositoryListType, "flat").equalsIgnoreCase("grouped")) {
 			List<RepositoryModel> rootRepositories = new ArrayList<RepositoryModel>();
@@ -114,10 +127,20 @@
 				roots.add(0, rootPath);
 				groups.put(rootPath, rootRepositories);
 			}
+						
+			Map<String, ProjectModel> projects = new HashMap<String, ProjectModel>();
+			for (ProjectModel project : GitBlit.self().getProjectModels(user, true)) {
+				projects.put(project.name, project);
+			}
 			List<RepositoryModel> groupedModels = new ArrayList<RepositoryModel>();
 			for (String root : roots) {
 				List<RepositoryModel> subModels = groups.get(root);
-				groupedModels.add(new GroupRepositoryModel(root, subModels.size()));
+				GroupRepositoryModel group = new GroupRepositoryModel(root, subModels.size());
+				if (projects.containsKey(root)) {
+					group.title = projects.get(root).title;
+					group.description = projects.get(root).description;
+				}
+				groupedModels.add(group);
 				Collections.sort(subModels);
 				groupedModels.addAll(subModels);
 			}
@@ -126,9 +149,13 @@
 			dp = new SortableRepositoriesProvider(models);
 		}
 
+		final String baseUrl = WicketUtils.getGitblitURL(getRequest());
+		final boolean showSwatch = GitBlit.getBoolean(Keys.web.repositoryListSwatches, true);
+		
 		DataView<RepositoryModel> dataView = new DataView<RepositoryModel>("row", dp) {
 			private static final long serialVersionUID = 1L;
 			int counter;
+			String currGroupName;
 
 			@Override
 			protected void onBeforeRender() {
@@ -139,37 +166,82 @@
 			public void populateItem(final Item<RepositoryModel> item) {
 				final RepositoryModel entry = item.getModelObject();
 				if (entry instanceof GroupRepositoryModel) {
+					GroupRepositoryModel groupRow = (GroupRepositoryModel) entry;
+					currGroupName = entry.name;
 					Fragment row = new Fragment("rowContent", "groupRepositoryRow", this);
 					item.add(row);
-					row.add(new Label("groupName", entry.toString()));
+					
+					String name = groupRow.name;
+					if (name.charAt(0) == '~') {
+						// user page
+						String username = name.substring(1);
+						UserModel user = GitBlit.self().getUserModel(username);
+						row.add(new LinkPanel("groupName", null, (user == null ? username : user.getDisplayName()) + " (" + groupRow.count + ")", UserPage.class, WicketUtils.newUsernameParameter(username)));
+						row.add(new Label("groupDescription", getString("gb.personalRepositories")));
+					} else {
+						// project page
+						row.add(new LinkPanel("groupName", null, groupRow.toString(), ProjectPage.class, WicketUtils.newProjectParameter(entry.name)));
+						row.add(new Label("groupDescription", entry.description == null ? "":entry.description));
+					}
 					WicketUtils.setCssClass(item, "group");
+					// reset counter so that first row is light background
+					counter = 0;
 					return;
 				}
 				Fragment row = new Fragment("rowContent", "repositoryRow", this);
 				item.add(row);
-				if (entry.hasCommits && linksActive) {
-					PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
-					row.add(new LinkPanel("repositoryName", "list", entry.name, SummaryPage.class,
-							pp));
-					row.add(new LinkPanel("repositoryDescription", "list", entry.description,
-							SummaryPage.class, pp));
+
+				// try to strip group name for less cluttered list
+				String repoName = entry.toString();
+				if (!StringUtils.isEmpty(currGroupName) && (repoName.indexOf('/') > -1)) {
+					repoName = repoName.substring(currGroupName.length() + 1);
+				}
+								
+				// repository swatch
+				Component swatch;
+				if (entry.isBare){
+					swatch = new Label("repositorySwatch", "&nbsp;").setEscapeModelStrings(false);
 				} else {
-					// new/empty repository OR proposed repository
-					row.add(new Label("repositoryName", entry.name));
+					swatch = new Label("repositorySwatch", "!");
+					WicketUtils.setHtmlTooltip(swatch, getString("gb.workingCopyWarning"));
+				}
+				WicketUtils.setCssBackground(swatch, entry.toString());
+				row.add(swatch);
+				swatch.setVisible(showSwatch);
+
+				if (linksActive) {
+					Class<? extends BasePage> linkPage;
+					if (entry.hasCommits) {
+						// repository has content
+						linkPage = SummaryPage.class;
+					} else {
+						// new/empty repository OR proposed repository
+						linkPage = EmptyRepositoryPage.class;
+					}
+
+					PageParameters pp = WicketUtils.newRepositoryParameter(entry.name);
+					row.add(new LinkPanel("repositoryName", "list", repoName, linkPage, pp));
+					row.add(new LinkPanel("repositoryDescription", "list", entry.description,
+							linkPage, pp));
+				} else {
+					// no links like on a federation page
+					row.add(new Label("repositoryName", repoName));
 					row.add(new Label("repositoryDescription", entry.description));
 				}
-
 				if (entry.hasCommits) {
 					// Existing repository
-					if (showSize) {
-						row.add(new Label("repositorySize", entry.size));
-					} else {
-						row.add(new Label("repositorySize").setVisible(false));
-					}
+					row.add(new Label("repositorySize", entry.size).setVisible(showSize));
 				} else {
 					// New repository
-					row.add(new Label("repositorySize", "<span class='empty'>(empty)</span>")
+					row.add(new Label("repositorySize", "<span class='empty'>(" + getString("gb.empty") + ")</span>")
 							.setEscapeModelStrings(false));
+				}
+
+				if (entry.isFork()) {
+					row.add(WicketUtils.newImage("forkIcon", "commit_divide_16x16.png",
+							getString("gb.isFork")));
+				} else {
+					row.add(WicketUtils.newClearPixel("forkIcon").setVisible(false));
 				}
 
 				if (entry.useTickets) {
@@ -219,20 +291,28 @@
 					row.add(WicketUtils.newBlankImage("accessRestrictionIcon"));
 				}
 
-				row.add(new Label("repositoryOwner", entry.owner));
+				String owner = entry.owner;
+				if (!StringUtils.isEmpty(owner)) {
+					UserModel ownerModel = GitBlit.self().getUserModel(owner);
+					if (ownerModel != null) {
+						owner = ownerModel.getDisplayName();
+					}
+				}
+				row.add(new Label("repositoryOwner", owner));
 
 				String lastChange;
 				if (entry.lastChange.getTime() == 0) {
 					lastChange = "--";
 				} else {
-					lastChange = TimeUtils.timeAgo(entry.lastChange);
+					lastChange = getTimeUtils().timeAgo(entry.lastChange);
 				}
 				Label lastChangeLabel = new Label("repositoryLastChange", lastChange);
 				row.add(lastChangeLabel);
-				WicketUtils.setCssClass(lastChangeLabel, TimeUtils.timeAgoCss(entry.lastChange));
+				WicketUtils.setCssClass(lastChangeLabel, getTimeUtils().timeAgoCss(entry.lastChange));
 
-				boolean showOwner = user != null && user.username.equalsIgnoreCase(entry.owner);
-				if (showAdmin) {
+				boolean showOwner = user != null && entry.isOwner(user.username);
+				boolean myPersonalRepository = showOwner && entry.isUsersPersonalRepository(user.username);
+				if (showAdmin || myPersonalRepository) {
 					Fragment repositoryLinks = new Fragment("repositoryLinks",
 							"repositoryAdminLinks", this);
 					repositoryLinks.add(new BookmarkablePageLink<Void>("editRepository",
@@ -245,20 +325,19 @@
 						@Override
 						public void onClick() {
 							if (GitBlit.self().deleteRepositoryModel(entry)) {
-								info(MessageFormat.format("Repository ''{0}'' deleted.", entry));
 								if (dp instanceof SortableRepositoriesProvider) {
+									info(MessageFormat.format(getString("gb.repositoryDeleted"), entry));
 									((SortableRepositoriesProvider) dp).remove(entry);
 								} else {
-									((RepositoriesProvider) dp).remove(entry);
+									setResponsePage(getPage().getClass(), getPage().getPageParameters());
 								}
 							} else {
-								error(MessageFormat.format("Failed to delete repository ''{0}''!",
-										entry));
+								error(MessageFormat.format(getString("gb.repositoryDeleteFailed"), entry));
 							}
 						}
 					};
 					deleteLink.add(new JavascriptEventConfirmation("onclick", MessageFormat.format(
-							"Delete repository \"{0}\"?", entry)));
+							getString("gb.deleteRepository"), entry)));
 					repositoryLinks.add(deleteLink);
 					row.add(repositoryLinks);
 				} else if (showOwner) {
@@ -271,9 +350,8 @@
 				} else {
 					row.add(new Label("repositoryLinks"));
 				}
-				row.add(new ExternalLink("syndication", SyndicationServlet.asLink(getRequest()
-						.getRelativePathPrefixToContextRoot(), entry.name, null, 0))
-						.setVisible(linksActive));
+				row.add(new ExternalLink("syndication", SyndicationServlet.asLink(baseUrl,
+						entry.name, null, 0)).setVisible(linksActive));
 				WicketUtils.setAlternatingBackground(item, counter);
 				counter++;
 			}
@@ -301,6 +379,7 @@
 		private static final long serialVersionUID = 1L;
 
 		int count;
+		String title;
 
 		GroupRepositoryModel(String name, int count) {
 			super(name, "", "", new Date(0));
@@ -309,7 +388,7 @@
 
 		@Override
 		public String toString() {
-			return name + " (" + count + ")";
+			return (StringUtils.isEmpty(title) ? name  : title) + " (" + count + ")";
 		}
 	}
 

--
Gitblit v1.9.1