From 99f359e07087d826fdb024e4d205c2cb645f1d2a Mon Sep 17 00:00:00 2001 From: saheba Date: Mon, 25 Mar 2013 21:32:53 +0100 Subject: [PATCH] +feature: automatic tagging of each push with an incremental revision number per repository --- src/com/gitblit/GitServlet.java | 40 +++++++++++++++- src/com/gitblit/utils/JGitUtils.java | 70 ++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 2 deletions(-) diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java index 77be963f..9c7fb425 100644 --- a/src/com/gitblit/GitServlet.java +++ b/src/com/gitblit/GitServlet.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.text.MessageFormat; import java.util.Collection; import java.util.Enumeration; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -32,7 +33,9 @@ import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.Part; +import org.eclipse.jgit.api.Git; import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory; import org.eclipse.jgit.http.server.resolver.DefaultUploadPackFactory; import org.eclipse.jgit.lib.PersonIdent; @@ -81,6 +84,11 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { private File groovyDir; + @Override + public void destroy() { + super.destroy(); + } + @Override public void init(ServletConfig config) throws ServletException { groovyDir = GitBlit.getGroovyScriptsFolder(); @@ -100,8 +108,9 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { @Override public ReceivePack create(HttpServletRequest req, Repository db) throws ServiceNotEnabledException, ServiceNotAuthorizedException { - // determine repository name from request + org.eclipse.jgit.http.server.glue.WrappedRequest wrreq = (org.eclipse.jgit.http.server.glue.WrappedRequest) req; + String repositoryName = req.getPathInfo().substring(1); repositoryName = GitFilter.getRepositoryName(repositoryName); @@ -163,6 +172,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { return up; } }); + super.init(new GitblitServletConfig(config)); } @@ -296,7 +306,33 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { UserModel user = getUserModel(rp); RepositoryModel repository = GitBlit.self().getRepositoryModel(repositoryName); - + + if (repository.useIncrementalRevisionNumbers) { + List allCommands = rp.getAllCommands(); + String cmds = ""; + for (ReceiveCommand receiveCommand : allCommands) { + cmds += receiveCommand.getType() + "_" + + receiveCommand.getResult() + "_" + + receiveCommand.getMessage() + ", "; + if (receiveCommand.getType().equals( + ReceiveCommand.Type.UPDATE) + && receiveCommand.getResult().equals( + ReceiveCommand.Result.OK)) { + String objectId = receiveCommand.getNewId().toString() + .replace("AnyObjectId[", "").replace("]", ""); + System.err.println("SHB id " + objectId); + System.err.println("SHB id " + + objectId.getBytes().length); + // if type=update and update was ok, autotag + boolean result = JGitUtils + .createIncrementalRevisionTag( + rp.getRepository(), objectId); + System.err.println("SHB res " + result); + } + } + System.err.println("SHB cmds: " + cmds); + } + // log ref changes for (ReceiveCommand cmd : commands) { if (Result.OK.equals(cmd.getResult())) { diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index 1f2ae943..4326700d 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -25,6 +25,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -33,6 +34,7 @@ import java.util.regex.Pattern; import org.eclipse.jgit.api.CloneCommand; import org.eclipse.jgit.api.FetchCommand; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.TagCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffEntry.ChangeType; @@ -80,6 +82,8 @@ import org.eclipse.jgit.util.io.DisabledOutputStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.gitblit.GitBlit; +import com.gitblit.Keys; import com.gitblit.models.GitNote; import com.gitblit.models.PathModel; import com.gitblit.models.PathModel.PathChangeModel; @@ -94,6 +98,7 @@ import com.gitblit.models.SubmoduleModel; */ public class JGitUtils { + private static final String REVISION_TAG_PREFIX = "rev_"; static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class); /** @@ -1687,7 +1692,72 @@ public class JGitUtils { } return list; } + + /** + * this method creates an incremental revision number as a tag according to + * the amount of already existing tags, which start with a defined prefix {@link REVISION_TAG_PREFIX} + * + * @param repository + * @param objectId + * @return true if operation was successful, otherwise false + */ + public static boolean createIncrementalRevisionTag(Repository repository, String objectId) { + boolean result = false; + Iterator> iterator = repository.getTags().entrySet().iterator(); + long revisionNumber = 1; + while (iterator.hasNext()) { + Entry entry = iterator.next(); + if (entry.getKey().startsWith(REVISION_TAG_PREFIX)) { + revisionNumber++; + } + } + result = createTag(repository,REVISION_TAG_PREFIX+revisionNumber,objectId); + return result; + } + /** + * creates a tag in a repository referring to the current head + * + * @param repository + * @param tag, the string label + * @return boolean, true if operation was successful, otherwise false + */ + public static boolean createTag(Repository repository, String tag) { + return createTag(repository, tag, null); + } + + /** + * creates a tag in a repository + * + * @param repository + * @param tag, the string label + * @param objectId, the ref the tag points towards + * @return boolean, true if operation was successful, otherwise false + */ + public static boolean createTag(Repository repository, String tag, + String objectId) { + try { + PersonIdent author = new PersonIdent("GitblitAutoTagPush", + "gitblit@localhost"); + + LOGGER.debug("createTag in repo: "+repository.getDirectory().getAbsolutePath()); + Git gitClient = Git.open(repository.getDirectory()); + TagCommand tagCommand = gitClient.tag(); + tagCommand.setTagger(author); + tagCommand.setMessage("autotag"); + if (objectId != null) { + RevObject revObj = getCommit(repository, objectId); + tagCommand.setObjectId(revObj); + } + tagCommand.setName(tag); + Ref call = tagCommand.call(); + return call != null ? true : false; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + /** * Create an orphaned branch in a repository. * -- 2.39.5