View Javadoc
1   /*
2    * Copyright (C) 2012, Christian Halstrick <christian.halstrick@sap.com> and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  
11  package org.eclipse.jgit.internal.storage.file;
12  
13  import static org.junit.Assert.assertTrue;
14  
15  import java.util.Collections;
16  
17  import org.eclipse.jgit.junit.TestRepository.CommitBuilder;
18  import org.eclipse.jgit.lib.ObjectId;
19  import org.eclipse.jgit.lib.RefUpdate;
20  import org.eclipse.jgit.merge.MergeStrategy;
21  import org.eclipse.jgit.merge.Merger;
22  import org.eclipse.jgit.revwalk.RevCommit;
23  import org.eclipse.jgit.revwalk.RevTree;
24  import org.junit.Test;
25  
26  public class GcBranchPrunedTest extends GcTestCase {
27  
28  	@Test
29  	public void branch_historyNotPruned() throws Exception {
30  		RevCommit tip = commitChain(10);
31  		tr.branch("b").update(tip);
32  		gc.setExpireAgeMillis(0);
33  		fsTick();
34  		gc.prune(Collections.<ObjectId> emptySet());
35  		do {
36  			assertTrue(repo.getObjectDatabase().has(tip));
37  			tr.parseBody(tip);
38  			RevTree t = tip.getTree();
39  			assertTrue(repo.getObjectDatabase().has(t));
40  			assertTrue(repo.getObjectDatabase().has(tr.get(t, "a")));
41  			tip = tip.getParentCount() > 0 ? tip.getParent(0) : null;
42  		} while (tip != null);
43  	}
44  
45  	@Test
46  	public void deleteBranch_historyPruned() throws Exception {
47  		RevCommit tip = commitChain(10);
48  		tr.branch("b").update(tip);
49  		RefUpdate update = repo.updateRef("refs/heads/b");
50  		update.setForceUpdate(true);
51  		update.delete();
52  		gc.setExpireAgeMillis(0);
53  		fsTick();
54  		gc.prune(Collections.<ObjectId> emptySet());
55  		assertTrue(gc.getStatistics().numberOfLooseObjects == 0);
56  	}
57  
58  	@Test
59  	public void deleteMergedBranch_historyNotPruned() throws Exception {
60  		RevCommit parent = tr.commit().create();
61  		RevCommit b1Tip = tr.branch("b1").commit().parent(parent).add("x", "x")
62  				.create();
63  		RevCommit b2Tip = tr.branch("b2").commit().parent(parent).add("y", "y")
64  				.create();
65  
66  		// merge b1Tip and b2Tip and update refs/heads/b1 to the merge commit
67  		Merger merger = MergeStrategy.SIMPLE_TWO_WAY_IN_CORE.newMerger(repo);
68  		merger.merge(b1Tip, b2Tip);
69  		CommitBuilder cb = tr.commit();
70  		cb.parent(b1Tip).parent(b2Tip);
71  		cb.setTopLevelTree(merger.getResultTreeId());
72  		RevCommit mergeCommit = cb.create();
73  		RefUpdate u = repo.updateRef("refs/heads/b1");
74  		u.setNewObjectId(mergeCommit);
75  		u.update();
76  
77  		RefUpdate update = repo.updateRef("refs/heads/b2");
78  		update.setForceUpdate(true);
79  		update.delete();
80  
81  		gc.setExpireAgeMillis(0);
82  		fsTick();
83  		gc.prune(Collections.<ObjectId> emptySet());
84  		assertTrue(repo.getObjectDatabase().has(b2Tip));
85  	}
86  }