saheba
2013-03-25 99f359e07087d826fdb024e4d205c2cb645f1d2a
+feature: automatic tagging of each push with an incremental revision number per repository
2 files modified
110 ■■■■■ changed files
src/com/gitblit/GitServlet.java 40 ●●●●● patch | view | raw | blame | history
src/com/gitblit/utils/JGitUtils.java 70 ●●●●● patch | view | raw | blame | history
src/com/gitblit/GitServlet.java
@@ -23,6 +23,7 @@
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.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 @@
    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 @@
            @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 @@
                return up;
            }
        });
        super.init(new GitblitServletConfig(config));
    }
@@ -296,7 +306,33 @@
            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())) {
src/com/gitblit/utils/JGitUtils.java
@@ -25,6 +25,7 @@
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 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.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 @@
 */
public class JGitUtils {
    private static final String REVISION_TAG_PREFIX = "rev_";
    static final Logger LOGGER = LoggerFactory.getLogger(JGitUtils.class);
    /**
@@ -1687,8 +1692,73 @@
        }
        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