summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsaheba <mail@saheba.net>2013-03-25 21:32:53 +0100
committersaheba <mail@saheba.net>2013-03-25 21:32:53 +0100
commit99f359e07087d826fdb024e4d205c2cb645f1d2a (patch)
tree6a6ee318d5a76285fcdf76e6baa86423bf3985f3
parent3eb83d71a5a1ed8385a606c7bdede066b1a00d72 (diff)
downloadgitblit-99f359e07087d826fdb024e4d205c2cb645f1d2a.tar.gz
gitblit-99f359e07087d826fdb024e4d205c2cb645f1d2a.zip
+feature: automatic tagging of each push with an incremental revision number per repository
-rw-r--r--src/com/gitblit/GitServlet.java40
-rw-r--r--src/com/gitblit/utils/JGitUtils.java70
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;
@@ -82,6 +85,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();
try {
@@ -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<ReceiveCommand> 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,8 +1692,73 @@ 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<Entry<String, Ref>> iterator = repository.getTags().entrySet().iterator();
+ long revisionNumber = 1;
+ while (iterator.hasNext()) {
+ Entry<String, Ref> 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.
*
* @param repository