From 0f47b2f605ed4119a6042b72d3499b223f40ec90 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Mon, 01 Apr 2013 17:41:22 -0400
Subject: [PATCH] Revised incremental push tags feature

---
 src/main/java/com/gitblit/GitServlet.java |   58 +++++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/gitblit/GitServlet.java b/src/main/java/com/gitblit/GitServlet.java
index cb47b32..b64e44e 100644
--- a/src/main/java/com/gitblit/GitServlet.java
+++ b/src/main/java/com/gitblit/GitServlet.java
@@ -23,7 +23,6 @@
 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;
@@ -33,9 +32,7 @@
 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;
@@ -55,6 +52,7 @@
 import org.slf4j.LoggerFactory;
 
 import com.gitblit.Constants.AccessRestrictionType;
+import com.gitblit.client.Translation;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.models.UserModel;
 import com.gitblit.utils.ClientLogger;
@@ -297,26 +295,41 @@
 				return;
 			}
 
-			UserModel user = getUserModel(rp);
+			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)) {
-						// if type=update and update was ok, autotag
-						String objectId = receiveCommand.getNewId().toString()
-								.replace("AnyObjectId[", "").replace("]", "");
-						boolean result = JGitUtils
-								.createIncrementalRevisionTag(
-										rp.getRepository(), objectId);						
+			if (repository.useIncrementalPushTags) {
+				// tag each pushed branch tip
+				String emailAddress = user.emailAddress == null ? rp.getRefLogIdent().getEmailAddress() : user.emailAddress;
+				PersonIdent userIdent = new PersonIdent(user.getDisplayName(), emailAddress);
+
+				for (ReceiveCommand cmd : commands) {
+					if (!cmd.getRefName().startsWith("refs/heads/")) {
+						// only tag branch ref changes
+						continue;
+					}
+					
+					if (!ReceiveCommand.Type.DELETE.equals(cmd.getType())
+							&& ReceiveCommand.Result.OK.equals(cmd.getResult())) {
+						String objectId = cmd.getNewId().getName();
+						String branch = cmd.getRefName().substring("refs/heads/".length());
+						// get translation based on the server's locale setting
+						String template = Translation.get("gb.incrementalPushTagMessage");
+						String msg = MessageFormat.format(template, branch);
+						String prefix;
+						if (StringUtils.isEmpty(repository.incrementalPushTagPrefix)) {
+							prefix = GitBlit.getString(Keys.git.defaultIncrementalPushTagPrefix, "r");
+						} else {
+							prefix = repository.incrementalPushTagPrefix;
+						}
+						
+						JGitUtils.createIncrementalRevisionTag(
+									rp.getRepository(),
+									objectId,
+									userIdent,
+									prefix,
+									"0",
+									msg);
 					}
 				}				
 			}
@@ -332,6 +345,9 @@
 					case CREATE:
 						logger.info(MessageFormat.format("{0} CREATED {1} in {2}", user.username, cmd.getRefName(), repository.name));
 						break;
+					case UPDATE:
+						logger.info(MessageFormat.format("{0} UPDATED {1} in {2} (from {3} to {4})", user.username, cmd.getRefName(), repository.name, cmd.getOldId().name(), cmd.getNewId().name()));
+						break;
 					case UPDATE_NONFASTFORWARD:
 						logger.info(MessageFormat.format("{0} UPDATED NON-FAST-FORWARD {1} in {2} (from {3} to {4})", user.username, cmd.getRefName(), repository.name, cmd.getOldId().name(), cmd.getNewId().name()));
 						break;

--
Gitblit v1.9.1