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