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();
}
}