View Javadoc
1   /*
2    * Copyright (C) 2011, Garmin International
3    * Copyright (C) 2011, Jesse Greenwald <jesse.greenwald@gmail.com>
4    * and other copyright owners as documented in the project's IP log.
5    *
6    * This program and the accompanying materials are made available
7    * under the terms of the Eclipse Distribution License v1.0 which
8    * accompanies this distribution, is reproduced below, and is
9    * available at http://www.eclipse.org/org/documents/edl-v10.php
10   *
11   * All rights reserved.
12   *
13   * Redistribution and use in source and binary forms, with or
14   * without modification, are permitted provided that the following
15   * conditions are met:
16   *
17   * - Redistributions of source code must retain the above copyright
18   *   notice, this list of conditions and the following disclaimer.
19   *
20   * - Redistributions in binary form must reproduce the above
21   *   copyright notice, this list of conditions and the following
22   *   disclaimer in the documentation and/or other materials provided
23   *   with the distribution.
24   *
25   * - Neither the name of the Eclipse Foundation, Inc. nor the
26   *   names of its contributors may be used to endorse or promote
27   *   products derived from this software without specific prior
28   *   written permission.
29   *
30   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
31   * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
32   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
33   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
34   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
35   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
37   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
39   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
42   * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43   */
44  
45  package org.eclipse.jgit.revwalk;
46  
47  import static org.junit.Assert.assertNotNull;
48  import static org.junit.Assert.assertTrue;
49  
50  import java.io.IOException;
51  import java.util.concurrent.atomic.AtomicBoolean;
52  
53  import org.eclipse.jgit.errors.IncorrectObjectTypeException;
54  import org.eclipse.jgit.errors.MissingObjectException;
55  import org.eclipse.jgit.errors.StopWalkException;
56  import org.eclipse.jgit.revwalk.filter.RevFilter;
57  import org.junit.Test;
58  
59  public class RevWalkResetTest extends RevWalkTestCase {
60  
61  	@Test
62  	public void testRevFilterReceivesParsedCommits() throws Exception {
63  		final RevCommit a = commit();
64  		final RevCommit b = commit(a);
65  		final RevCommit c = commit(b);
66  
67  		final AtomicBoolean filterRan = new AtomicBoolean();
68  		RevFilter testFilter = new RevFilter() {
69  
70  			@Override
71  			public boolean include(RevWalk walker, RevCommit cmit)
72  					throws StopWalkException, MissingObjectException,
73  					IncorrectObjectTypeException, IOException {
74  				assertNotNull("commit is parsed", cmit.getRawBuffer());
75  				filterRan.set(true);
76  				return true;
77  			}
78  
79  			@Override
80  			public RevFilter clone() {
81  				return this;
82  			}
83  
84  			@Override
85  			public boolean requiresCommitBody() {
86  				return true;
87  			}
88  		};
89  
90  		// Do an initial run through the walk
91  		filterRan.set(false);
92  		rw.setRevFilter(testFilter);
93  		markStart(c);
94  		rw.markUninteresting(b);
95  		for (RevCommit cmit = rw.next(); cmit != null; cmit = rw.next()) {
96  			// Don't dispose the body here, because we want to test the effect
97  			// of marking 'b' as uninteresting.
98  		}
99  		assertTrue("filter ran", filterRan.get());
100 
101 		// Run through the walk again, this time disposing of all commits.
102 		filterRan.set(false);
103 		rw.reset();
104 		markStart(c);
105 		for (RevCommit cmit = rw.next(); cmit != null; cmit = rw.next()) {
106 			cmit.disposeBody();
107 		}
108 		assertTrue("filter ran", filterRan.get());
109 
110 		// Do the third run through the reused walk. Test that the explicitly
111 		// disposed commits are parsed on this walk.
112 		filterRan.set(false);
113 		rw.reset();
114 		markStart(c);
115 		for (RevCommit cmit = rw.next(); cmit != null; cmit = rw.next()) {
116 			// spin through the walk.
117 		}
118 		assertTrue("filter ran", filterRan.get());
119 
120 	}
121 }