From f8bb95d50ad925ab16a0a167bc553f036434a2d7 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Sat, 05 Jan 2013 15:04:40 -0500
Subject: [PATCH] Draft mechanism to record a push log as a hidden orphan branch

---
 src/com/gitblit/GitServlet.java |   55 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 50 insertions(+), 5 deletions(-)

diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java
index 94a51be..05f38b9 100644
--- a/src/com/gitblit/GitServlet.java
+++ b/src/com/gitblit/GitServlet.java
@@ -29,6 +29,7 @@
 import java.util.Enumeration;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 import javax.servlet.ServletConfig;
@@ -37,7 +38,9 @@
 import javax.servlet.http.HttpServletRequest;
 
 import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
+import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory;
 import org.eclipse.jgit.lib.PersonIdent;
+import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.transport.PostReceiveHook;
@@ -45,6 +48,8 @@
 import org.eclipse.jgit.transport.ReceiveCommand;
 import org.eclipse.jgit.transport.ReceiveCommand.Result;
 import org.eclipse.jgit.transport.ReceivePack;
+import org.eclipse.jgit.transport.RefFilter;
+import org.eclipse.jgit.transport.UploadPack;
 import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
 import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
 import org.slf4j.Logger;
@@ -55,7 +60,9 @@
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.ClientLogger;
 import com.gitblit.utils.HttpUtils;
+import com.gitblit.utils.IssueUtils;
 import com.gitblit.utils.JGitUtils;
+import com.gitblit.utils.PushLogUtils;
 import com.gitblit.utils.StringUtils;
 
 /**
@@ -129,6 +136,35 @@
 				}
 				
 				return rp;
+			}
+		});
+		
+		// override the default upload pack to exclude gitblit refs
+		setUploadPackFactory(new DefaultUploadPackFactory() {
+			@Override
+			public UploadPack create(final HttpServletRequest req, final Repository db)
+					throws ServiceNotEnabledException, ServiceNotAuthorizedException {
+				UploadPack up = super.create(req, db);
+				RefFilter refFilter = new RefFilter() {
+					@Override
+					public Map<String, Ref> filter(Map<String, Ref> refs) {
+						// admin accounts can access all refs 
+						UserModel user = GitBlit.self().authenticate(req);
+						if (user == null) {
+							user = UserModel.ANONYMOUS;
+						}
+						if (user.canAdmin()) {
+							return refs;
+						}
+
+						// normal users can not clone gitblit refs
+						refs.remove(IssueUtils.GB_ISSUES);
+						refs.remove(PushLogUtils.GB_PUSHES);
+						return refs;
+					}
+				};
+				up.setRefFilter(refFilter);
+				return up;
 			}
 		});
 		super.init(new GitblitServletConfig(config));
@@ -264,12 +300,11 @@
 				logger.info("skipping post-receive hooks, no refs created, updated, or removed");
 				return;
 			}
-			RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName);
-			Set<String> scripts = new LinkedHashSet<String>();
-			scripts.addAll(GitBlit.self().getPostReceiveScriptsInherited(repository));
-			scripts.addAll(repository.postReceiveScripts);
+
 			UserModel user = getUserModel(rp);
-			runGroovy(repository, user, commands, rp, scripts);
+			RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName);
+
+			// log ref changes
 			for (ReceiveCommand cmd : commands) {
 				if (Result.OK.equals(cmd.getResult())) {
 					// add some logging for important ref changes
@@ -288,6 +323,16 @@
 					}
 				}
 			}
+
+			// update push log
+			PushLogUtils.updatePushLog(user, rp.getRepository(), commands);
+			logger.info(MessageFormat.format("{0} push log updated", repository.name));
+			
+			// run Groovy hook scripts 
+			Set<String> scripts = new LinkedHashSet<String>();
+			scripts.addAll(GitBlit.self().getPostReceiveScriptsInherited(repository));
+			scripts.addAll(repository.postReceiveScripts);
+			runGroovy(repository, user, commands, rp, scripts);
 			
 			// Experimental
 			// runNativeScript(rp, "hooks/post-receive", commands);

--
Gitblit v1.9.1