saheba
2013-03-25 2a8a74bedafdb56b7e7edcb42642dc1eb5e54fff
src/com/gitblit/GitServlet.java
@@ -18,15 +18,12 @@
import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
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;
@@ -36,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;
@@ -84,13 +83,13 @@
   private GroovyScriptEngine gse;
   private File groovyDir;
   @Override
   public void init(ServletConfig config) throws ServletException {
      groovyDir = GitBlit.getGroovyScriptsFolder();
      try {
         // set Grape root
         File grapeRoot = new File(GitBlit.getString(Keys.groovy.grapeFolder, "groovy/grape")).getAbsoluteFile();
         File grapeRoot = GitBlit.getFileOrFolder(Keys.groovy.grapeFolder, "${baseFolder}/groovy/grape").getAbsoluteFile();
         grapeRoot.mkdirs();
         System.setProperty("grape.root", grapeRoot.getAbsolutePath());
         
@@ -104,7 +103,6 @@
         @Override
         public ReceivePack create(HttpServletRequest req, Repository db)
               throws ServiceNotEnabledException, ServiceNotAuthorizedException {
            // determine repository name from request
            String repositoryName = req.getPathInfo().substring(1);
            repositoryName = GitFilter.getRepositoryName(repositoryName);
@@ -167,6 +165,7 @@
            return up;
         }
      });
      super.init(new GitblitServletConfig(config));
   }
@@ -284,9 +283,6 @@
                     .getName(), cmd.getResult(), cmd.getMessage()));
            }
         }
         // Experimental
         // runNativeScript(rp, "hooks/pre-receive", commands);
      }
      /**
@@ -303,7 +299,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())) {
@@ -325,17 +347,18 @@
         }
         // update push log
         PushLogUtils.updatePushLog(user, rp.getRepository(), commands);
         logger.info(MessageFormat.format("{0} push log updated", repository.name));
         try {
            PushLogUtils.updatePushLog(user, rp.getRepository(), commands);
            logger.info(MessageFormat.format("{0} push log updated", repository.name));
         } catch (Exception e) {
            logger.error(MessageFormat.format("Failed to update {0} pushlog", repository.name), e);
         }
         
         // 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);
      }
      /**
@@ -404,77 +427,6 @@
            } catch (Exception e) {
               logger.error(
                     MessageFormat.format("Failed to execute Groovy script {0}", script), e);
            }
         }
      }
      /**
       * Runs the native push hook script.
       *
       * http://book.git-scm.com/5_git_hooks.html
       * http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/
       *
       * @param rp
       * @param script
       * @param commands
       */
      @SuppressWarnings("unused")
      protected void runNativeScript(ReceivePack rp, String script,
            Collection<ReceiveCommand> commands) {
         Repository repository = rp.getRepository();
         File scriptFile = new File(repository.getDirectory(), script);
         int resultCode = 0;
         if (scriptFile.exists()) {
            try {
               logger.debug("executing " + scriptFile);
               Process process = Runtime.getRuntime().exec(scriptFile.getAbsolutePath(), null,
                     repository.getDirectory());
               BufferedReader reader = new BufferedReader(new InputStreamReader(
                     process.getInputStream()));
               BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                     process.getOutputStream()));
               for (ReceiveCommand command : commands) {
                  switch (command.getType()) {
                  case UPDATE:
                     // updating a ref
                     writer.append(MessageFormat.format("{0} {1} {2}\n", command.getOldId()
                           .getName(), command.getNewId().getName(), command.getRefName()));
                     break;
                  case CREATE:
                     // new ref
                     // oldrev hard-coded to 40? weird.
                     writer.append(MessageFormat.format("40 {0} {1}\n", command.getNewId()
                           .getName(), command.getRefName()));
                     break;
                  }
               }
               resultCode = process.waitFor();
               // read and buffer stdin
               // this is supposed to be piped back to the git client.
               // not sure how to do that right now.
               StringBuilder sb = new StringBuilder();
               String line = null;
               while ((line = reader.readLine()) != null) {
                  sb.append(line).append('\n');
               }
               logger.debug(sb.toString());
            } catch (Throwable e) {
               resultCode = -1;
               logger.error(
                     MessageFormat.format("Failed to execute {0}",
                           scriptFile.getAbsolutePath()), e);
            }
         }
         // reject push
         if (resultCode != 0) {
            for (ReceiveCommand command : commands) {
               command.setResult(Result.REJECTED_OTHER_REASON, MessageFormat.format(
                     "Native script {0} rejected push or failed",
                     scriptFile.getAbsolutePath()));
            }
         }
      }