View Javadoc
1   /*
2    * Copyright (C) 2011, Garmin International
3    * Copyright (C) 2011, Jesse Greenwald <jesse.greenwald@gmail.com> and others
4    *
5    * This program and the accompanying materials are made available under the
6    * terms of the Eclipse Distribution License v. 1.0 which is available at
7    * https://www.eclipse.org/org/documents/edl-v10.php.
8    *
9    * SPDX-License-Identifier: BSD-3-Clause
10   */
11  
12  package org.eclipse.jgit.treewalk;
13  
14  import static org.junit.Assert.assertEquals;
15  
16  import org.eclipse.jgit.dircache.DirCache;
17  import org.eclipse.jgit.dircache.DirCacheBuilder;
18  import org.eclipse.jgit.dircache.DirCacheEntry;
19  import org.eclipse.jgit.junit.RepositoryTestCase;
20  import org.eclipse.jgit.lib.FileMode;
21  import org.eclipse.jgit.lib.ObjectId;
22  import org.eclipse.jgit.lib.ObjectInserter;
23  import org.eclipse.jgit.lib.ObjectReader;
24  import org.junit.Test;
25  
26  public class ForPathTest extends RepositoryTestCase {
27  
28  	private static final FileMode SYMLINK = FileMode.SYMLINK;
29  
30  	private static final FileMode REGULAR_FILE = FileMode.REGULAR_FILE;
31  
32  	private static final FileMode EXECUTABLE_FILE = FileMode.EXECUTABLE_FILE;
33  
34  	@Test
35  	public void testFindObjects() throws Exception {
36  		final DirCache tree0 = DirCache.newInCore();
37  		final DirCacheBuilder b0 = tree0.builder();
38  		try (ObjectReader or = db.newObjectReader();
39  				ObjectInserter oi = db.newObjectInserter()) {
40  
41  			DirCacheEntry aDotB = createEntry("a.b", EXECUTABLE_FILE);
42  			b0.add(aDotB);
43  			DirCacheEntry aSlashB = createEntry("a/b", REGULAR_FILE);
44  			b0.add(aSlashB);
45  			DirCacheEntry aSlashCSlashD = createEntry("a/c/d", REGULAR_FILE);
46  			b0.add(aSlashCSlashD);
47  			DirCacheEntry aZeroB = createEntry("a0b", SYMLINK);
48  			b0.add(aZeroB);
49  			b0.finish();
50  			assertEquals(4, tree0.getEntryCount());
51  			ObjectId tree = tree0.writeTree(oi);
52  
53  			// Find the directories that were implicitly created above.
54  			ObjectId a = null;
55  			ObjectId aSlashC = null;
56  			try (TreeWalk tw = new TreeWalk(or)) {
57  				tw.addTree(tree);
58  				while (tw.next()) {
59  					if (tw.getPathString().equals("a")) {
60  						a = tw.getObjectId(0);
61  						tw.enterSubtree();
62  						while (tw.next()) {
63  							if (tw.getPathString().equals("a/c")) {
64  								aSlashC = tw.getObjectId(0);
65  								break;
66  							}
67  						}
68  						break;
69  					}
70  				}
71  			}
72  
73  			assertEquals(a, TreeWalk.forPath(or, "a", tree).getObjectId(0));
74  			assertEquals(a, TreeWalk.forPath(or, "a/", tree).getObjectId(0));
75  			assertEquals(null, TreeWalk.forPath(or, "/a", tree));
76  			assertEquals(null, TreeWalk.forPath(or, "/a/", tree));
77  
78  			assertEquals(aDotB.getObjectId(),
79  					TreeWalk.forPath(or, "a.b", tree).getObjectId(0));
80  			assertEquals(null, TreeWalk.forPath(or, "/a.b", tree));
81  			assertEquals(null, TreeWalk.forPath(or, "/a.b/", tree));
82  			assertEquals(aDotB.getObjectId(),
83  					TreeWalk.forPath(or, "a.b/", tree).getObjectId(0));
84  
85  			assertEquals(aZeroB.getObjectId(),
86  					TreeWalk.forPath(or, "a0b", tree).getObjectId(0));
87  
88  			assertEquals(aSlashB.getObjectId(),
89  					TreeWalk.forPath(or, "a/b", tree).getObjectId(0));
90  			assertEquals(aSlashB.getObjectId(),
91  					TreeWalk.forPath(or, "b", a).getObjectId(0));
92  
93  			assertEquals(aSlashC,
94  					TreeWalk.forPath(or, "a/c", tree).getObjectId(0));
95  			assertEquals(aSlashC, TreeWalk.forPath(or, "c", a).getObjectId(0));
96  
97  			assertEquals(aSlashCSlashD.getObjectId(),
98  					TreeWalk.forPath(or, "a/c/d", tree).getObjectId(0));
99  			assertEquals(aSlashCSlashD.getObjectId(),
100 					TreeWalk.forPath(or, "c/d", a).getObjectId(0));
101 		}
102 	}
103 
104 }