Florian Zschocke
2013-08-20 3a067e5b667bb30b7ddd18f7860358d725f01219
src/main/java/com/gitblit/git/ReceiveHook.java
@@ -36,15 +36,18 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.Constants;
import com.gitblit.Constants.AccessRestrictionType;
import com.gitblit.GitBlit;
import com.gitblit.Keys;
import com.gitblit.client.Translation;
import com.gitblit.models.RepositoryModel;
import com.gitblit.models.UserModel;
import com.gitblit.utils.ArrayUtils;
import com.gitblit.utils.ClientLogger;
import com.gitblit.utils.CommitCache;
import com.gitblit.utils.JGitUtils;
import com.gitblit.utils.PushLogUtils;
import com.gitblit.utils.RefLogUtils;
import com.gitblit.utils.StringUtils;
/**
@@ -136,18 +139,36 @@
         // identity of the merging user.
         boolean allRejected = false;
         for (ReceiveCommand cmd : commands) {
            String linearParent = null;
            try {
               List<RevCommit> commits = JGitUtils.getRevLog(rp.getRepository(), cmd.getOldId().name(), cmd.getNewId().name());
               for (RevCommit commit : commits) {
                  if (linearParent != null) {
                        if (!commit.getName().equals(linearParent)) {
                           // ignore: commit is right-descendant of a merge
                           continue;
                        }
                     }
                  // update expected next commit id
                  if (commit.getParentCount() == 0) {
                         linearParent = null;
                  } else {
                     linearParent = commit.getParents()[0].getId().getName();
                  }
                  PersonIdent committer = commit.getCommitterIdent();
                  if (!user.is(committer.getName(), committer.getEmailAddress())) {
                     String reason;
                     if (StringUtils.isEmpty(user.emailAddress)) {
                        // account does not have en email address
                        reason = MessageFormat.format("{0} by {1} <{2}> was not committed by {3} ({4})", commit.getId().name(), committer.getName(), StringUtils.isEmpty(committer.getEmailAddress()) ? "?":committer.getEmailAddress(), user.getDisplayName(), user.username);
                        // account does not have an email address
                        reason = MessageFormat.format("{0} by {1} <{2}> was not committed by {3} ({4})",
                              commit.getId().name(), committer.getName(), StringUtils.isEmpty(committer.getEmailAddress()) ? "?":committer.getEmailAddress(), user.getDisplayName(), user.username);
                     } else {
                        // account has an email address
                        reason = MessageFormat.format("{0} by {1} <{2}> was not committed by {3} ({4}) <{5}>", commit.getId().name(), committer.getName(), StringUtils.isEmpty(committer.getEmailAddress()) ? "?":committer.getEmailAddress(), user.getDisplayName(), user.username, user.emailAddress);
                        reason = MessageFormat.format("{0} by {1} <{2}> was not committed by {3} ({4}) <{5}>",
                              commit.getId().name(), committer.getName(), StringUtils.isEmpty(committer.getEmailAddress()) ? "?":committer.getEmailAddress(), user.getDisplayName(), user.username, user.emailAddress);
                     }
                     logger.warn(reason);
                     cmd.setResult(Result.REJECTED_OTHER_REASON, reason);
@@ -167,10 +188,27 @@
            return;
         }
      }
      // reset branch commit cache on REWIND and DELETE
      for (ReceiveCommand cmd : commands) {
         String ref = cmd.getRefName();
         if (ref.startsWith(Constants.R_HEADS)) {
            switch (cmd.getType()) {
            case UPDATE_NONFASTFORWARD:
            case DELETE:
               CommitCache.instance().clear(repository.name, ref);
               break;
            default:
               break;
            }
         }
      }
      Set<String> scripts = new LinkedHashSet<String>();
      scripts.addAll(GitBlit.self().getPreReceiveScriptsInherited(repository));
      scripts.addAll(repository.preReceiveScripts);
      if (!ArrayUtils.isEmpty(repository.preReceiveScripts)) {
         scripts.addAll(repository.preReceiveScripts);
      }
      runGroovy(repository, user, commands, rp, scripts);
      for (ReceiveCommand cmd : commands) {
         if (!Result.NOT_ATTEMPTED.equals(cmd.getResult())) {
@@ -253,7 +291,7 @@
      // update push log
      try {
         PushLogUtils.updatePushLog(user, rp.getRepository(), commands);
         RefLogUtils.updateRefLog(user, rp.getRepository(), commands);
         logger.debug(MessageFormat.format("{0} push log updated", repository.name));
      } catch (Exception e) {
         logger.error(MessageFormat.format("Failed to update {0} pushlog", repository.name), e);
@@ -262,7 +300,9 @@
      // run Groovy hook scripts 
      Set<String> scripts = new LinkedHashSet<String>();
      scripts.addAll(GitBlit.self().getPostReceiveScriptsInherited(repository));
      scripts.addAll(repository.postReceiveScripts);
      if (!ArrayUtils.isEmpty(repository.postReceiveScripts)) {
         scripts.addAll(repository.postReceiveScripts);
      }
      runGroovy(repository, user, commands, rp, scripts);
   }