当我使用RevFilter时,我的RevWalk没有选择任何提交

时间:2015-01-20 23:11:10

标签: java jgit

我使用jGit遍历存储库中的提交。当我单独使用RevWalk类时,我会回到存储库中的所有提交。但是当我使用revWalk.setFilter()添加过滤器时,我不再获得任何提交,即使我确信存在符合我的过滤条件的提交。

这是我的代码:

   RevWalk walk = new RevWalk(repo);
   // These two lines give me trouble:
   // RevFilter filter = CommitTimeRevFilter.between(sinceDate, untilDate);
   // walk.setRevFilter(filter);

    Ref head = repo.getRef("refs/heads/master");
    RevCommit headCommit = walk.parseCommit(head.getObjectId());
    // omitting some exception handling for conciseness
    walk.markStart(headCommit);

    List<MyCommitPOCO> commits  = new LinkedList<>();

    for(RevCommit commit : walk) {
        MyCommitPOCO processedCommit = processRevCommit(commit);
        commits.add(processedCommit);
    }

    walk.dispose();

    return commits;

当我运行此代码而没有顶部注释掉的两行时,for循环迭代walk提交处理我的存储库中的每次提交,这是我所期望的。但是,当我使用RevFilter取消注释行时,for循环不会迭代甚至单个提交,这对我来说似乎并不合适。我已经尝试使用sinceDateuntilDate的多个值来运行程序,我知道这些值适用于我尝试使用的存储库,但没有尝试过我和#39已经成功了。

为什么我的RevWalk让我在使用RevFilter时对任何提交进行迭代?当我取消注释时导致问题的两行代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

我发现CommitTimeRevFilter按预期工作。您是否已调试代码以查看所需的提交是否到达过滤器代码?

以下是可作为起点的测试。它执行四次提交,时间戳为1,2,3,4秒,然后使用带有时间过滤器的RevWalk来收集第二个和第二个之间的时间戳:

public class RevWalkFilterLearningTest {

  @Rule
  public final TemporaryFolder tempFolder = new TemporaryFolder();

  private Git git;

  @Test
  public void testTimeFilter() throws Exception {
    commit( 1000 );
    commit( 2000 );
    commit( 3000 );
    commit( 4000 );
    RevWalk revWalk = new RevWalk( git.getRepository() );
    RevFilter filter = CommitTimeRevFilter.between( new Date( 2000 ), new Date( 3000 ) );
    revWalk.setRevFilter( filter );
    Ref headRef = git.getRepository().getRef( Constants.HEAD );
    RevCommit headCommit = revWalk.parseCommit( headRef.getObjectId() );
    revWalk.markStart( headCommit );

    int count = 0;
    for( RevCommit revCommit : revWalk ) {
      count++;
    }

    assertEquals( 2, count );
  }

  private void commit( int time ) throws Exception {
    PersonIdent committer = new PersonIdent( "committer", "committer@example.com" );
    git.commit().setCommitter( new PersonIdent( committer, new Date( time ) ) ).setMessage( "msg" ).call();
  }

  @Before
  public void setUp() throws GitAPIException {
    git = Git.init().setDirectory( tempFolder.getRoot() ).call();
  }

  @After
  public void tearDown() {
    git.close();
  }
}