private Set getNewCommits()

in git-server/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/GitMapFullPath.java [190:232]


  private Set<String> getNewCommits(@NotNull Repository db, @NotNull Map<String, Ref> oldRefs, @NotNull Map<String, Ref> newRefs) throws IOException {
    Set<ObjectId> updatedHeads = new HashSet<ObjectId>();
    Set<ObjectId> uninteresting = new HashSet<ObjectId>();
    for (Map.Entry<String, Ref> e : newRefs.entrySet()) {
      String refName = e.getKey();
      if (!refName.startsWith("refs/"))
        continue;
      Ref newRef = e.getValue();
      Ref oldRef = oldRefs.get(refName);
      if (oldRef == null || !oldRef.getObjectId().equals(newRef.getObjectId()))
        updatedHeads.add(newRef.getObjectId());
      if (oldRef != null)
        uninteresting.add(oldRef.getObjectId());
    }

    if (updatedHeads.isEmpty()) {
      // avoid expensive RevWalk.parseAny for uninteresting heads if there are no updated heads
      return Collections.emptySet();
    }

    RevWalk revWalk = new RevWalk(db);
    try {
      revWalk.sort(RevSort.TOPO);
      for (ObjectId id : updatedHeads) {
        RevObject obj = revWalk.parseAny(id);
        if (obj.getType() == Constants.OBJ_COMMIT)
          revWalk.markStart((RevCommit) obj);
      }
      for (ObjectId id : uninteresting) {
        RevObject obj = revWalk.parseAny(id);
        if (obj.getType() == Constants.OBJ_COMMIT)
          revWalk.markUninteresting((RevCommit) obj);
      }
      Set<String> newCommits = new HashSet<String>();
      RevCommit newCommit;
      while ((newCommit = revWalk.next()) != null) {
        newCommits.add(newCommit.name());
      }
      return newCommits;
    } finally {
      revWalk.dispose();
    }
  }