Вот как найти изменения коммита на основе всех родительских коммитов
var tree = new TreeWalk(repository)
tree.addTree(commit.getTree)
commit.getParents foreach {
parent => tree.addTree(parent.getTree)
}
tree.setFilter(TreeFilter.ANY_DIFF)
(скалярный код)
Обратите внимание, что TreeFilter.ANY_DIFF работает для одного обходчика дерева и возвращает все элементы, доступные в корневом коммите.
Затем вам нужно будет выполнить итерацию по дереву, чтобы увидеть, находится ли ваш файл в заданной дельте (это довольно просто).
while (tree.next)
if (tree.getDepth == cleanPath.size) {
// we are at the right level, do what you want
} else {
if (tree.isSubtree &&
name == cleanPath(tree.getDepth)) {
tree.enterSubtree
}
}
}
(cleanPath - это путь чистого репо, разделенный на '/')
Теперь поместите этот код в цикл RevWalk.next, и вы получите коммиты и файлы, измененные коммитом.
Возможно, вы захотите использовать фильтр, отличный от ANY_DIFF, поскольку ANY_DIFF имеет значение true, если одно дерево отличается. Это немного нелогично в случае слияния, когда BLOB-объект не изменился по сравнению со всеми родительскими деревьями. Итак, вот ядро ALL_DIFF, в котором будут отображаться только элементы, отличающиеся от всех родительских деревьев:
override def include(walker: TreeWalk): Boolean = {
val n = walker.getTreeCount();
if (n == 1) {
return true;
}
val m = walker.getRawMode(0)
var i = 1
while (i < n) {
if (walker.getRawMode(i) == m && walker.idEqual(i, 0)) {
return false
}
i += 1
}
true
}
(код Scala, полученный из AnyDiffFilter)