Я пытаюсь реализовать RevFilter
для использования через RevWalk#setRevFilter()
. В следующем, что я пробовал:Как определить «промежуточный» JGit RevFilter?
private class InBetweenRevFilter extends RevFilter {
private AnyObjectId end;
private AnyObjectId begin;
public InBetweenRevFilter(AnyObjectId begin, AnyObjectId end) {
this.begin = begin;
this.end = end;
}
@Override
public RevFilter clone() {
return this;
}
@Override
public boolean include(RevWalk walker, RevCommit c)
throws StopWalkException, MissingObjectException,
IncorrectObjectTypeException, IOException {
RevCommit from = walker.parseCommit(begin);
RevCommit to = walker.parseCommit(end);
return (walker.isMergedInto(from, c) && walker.isMergedInto(c, to));
}
}
Результат фильтра должен быть коммит толкнул после begin
и перед end
. Проблема в том, что когда я устанавливаю этот фильтр, RevWalk.next()
возвращает только фиксацию, помеченную как начальную точку с RevWalk.markStart(RevCommit c)
. В дальнейшем, я покажу шоу, как я пытался использовать фильтр:
RevWalk walk = new RevWalk(getRepository());
RevCommit beginCommit = walk.parseCommit(getRepository().resolve(start));
RevCommit endCommit = walk.parseCommit(getRepository().resolve(end));
walk.setRevFilter(new InBetweenRevFilter(beginCommit.getId(), endCommit.getId()));
walk.markStart(endCommit);
for (RevCommit rev : walk) {
System.out.println(rev.getFullMessage());
}
walk.close();
В этом примере, только сообщение от endCommit
напечатанного в консоли. Есть ли другой способ сделать это? Или, что я пропущу или сделал не так?
Сейчас я использую рекурсию, чтобы ходить по дереву в качестве временного решения. Но я хотел бы более сложный. Любая помощь будет оценена по достоинству. –