Skip to content

Commit 12d7e3a

Browse files
chalstrickCode Review
authored andcommitted
Merge "Add open(File) and wrap(Repository) to Git"
2 parents 11e2e74 + 82372d3 commit 12d7e3a

File tree

2 files changed

+159
-1
lines changed

2 files changed

+159
-1
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
/*
2+
* Copyright (C) 2011, Christian Halstrick <[email protected]>
3+
* and other copyright owners as documented in the project's IP log.
4+
*
5+
* This program and the accompanying materials are made available
6+
* under the terms of the Eclipse Distribution License v1.0 which
7+
* accompanies this distribution, is reproduced below, and is
8+
* available at http://www.eclipse.org/org/documents/edl-v10.php
9+
*
10+
* All rights reserved.
11+
*
12+
* Redistribution and use in source and binary forms, with or
13+
* without modification, are permitted provided that the following
14+
* conditions are met:
15+
*
16+
* - Redistributions of source code must retain the above copyright
17+
* notice, this list of conditions and the following disclaimer.
18+
*
19+
* - Redistributions in binary form must reproduce the above
20+
* copyright notice, this list of conditions and the following
21+
* disclaimer in the documentation and/or other materials provided
22+
* with the distribution.
23+
*
24+
* - Neither the name of the Eclipse Foundation, Inc. nor the
25+
* names of its contributors may be used to endorse or promote
26+
* products derived from this software without specific prior
27+
* written permission.
28+
*
29+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
30+
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
31+
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32+
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
34+
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
35+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
36+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
38+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
41+
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42+
*/
43+
package org.eclipse.jgit.api;
44+
45+
import static org.junit.Assert.assertEquals;
46+
import static org.junit.Assert.fail;
47+
48+
import java.io.IOException;
49+
50+
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
51+
import org.eclipse.jgit.errors.RepositoryNotFoundException;
52+
import org.eclipse.jgit.lib.Repository;
53+
import org.eclipse.jgit.lib.RepositoryTestCase;
54+
import org.junit.Before;
55+
import org.junit.Test;
56+
57+
public class GitConstructionTest extends RepositoryTestCase {
58+
private Repository bareRepo;
59+
60+
@Override
61+
@Before
62+
public void setUp() throws Exception {
63+
super.setUp();
64+
Git git = new Git(db);
65+
git.commit().setMessage("initial commit").call();
66+
writeTrashFile("Test.txt", "Hello world");
67+
git.add().addFilepattern("Test.txt").call();
68+
git.commit().setMessage("Initial commit").call();
69+
70+
bareRepo = Git.cloneRepository().setBare(true)
71+
.setURI(db.getDirectory().toURI().toString()).call()
72+
.getRepository();
73+
}
74+
75+
@Test
76+
public void testWrap() {
77+
Git git = Git.wrap(db);
78+
assertEquals(1, git.branchList().call().size());
79+
80+
git = Git.wrap(bareRepo);
81+
assertEquals(1, git.branchList().setListMode(ListMode.ALL).call()
82+
.size());
83+
84+
try {
85+
Git.wrap(null);
86+
fail("Expected exception has not been thrown");
87+
} catch (NullPointerException e) {
88+
// should not get here
89+
}
90+
}
91+
92+
@Test
93+
public void testOpen() throws IOException {
94+
Git git = Git.open(db.getDirectory());
95+
assertEquals(1, git.branchList().call().size());
96+
97+
git = Git.open(bareRepo.getDirectory());
98+
assertEquals(1, git.branchList().setListMode(ListMode.ALL).call()
99+
.size());
100+
101+
git = Git.open(db.getWorkTree());
102+
assertEquals(1, git.branchList().setListMode(ListMode.ALL).call()
103+
.size());
104+
105+
try {
106+
Git.open(db.getObjectsDirectory());
107+
fail("Expected exception has not been thrown");
108+
} catch (RepositoryNotFoundException e) {
109+
// should not get here
110+
}
111+
}
112+
}

org.eclipse.jgit/src/org/eclipse/jgit/api/Git.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@
4343
*/
4444
package org.eclipse.jgit.api;
4545

46+
import java.io.File;
47+
import java.io.IOException;
48+
4649
import org.eclipse.jgit.lib.Repository;
50+
import org.eclipse.jgit.lib.RepositoryBuilder;
51+
import org.eclipse.jgit.lib.RepositoryCache;
52+
import org.eclipse.jgit.util.FS;
4753

4854
/**
4955
* Offers a "GitPorcelain"-like API to interact with a git repository.
@@ -79,6 +85,46 @@ public class Git {
7985
/** The git repository this class is interacting with */
8086
private final Repository repo;
8187

88+
/**
89+
* @param dir
90+
* the repository to open. May be either the GIT_DIR, or the
91+
* working tree directory that contains {@code .git}.
92+
* @return a {@link Git} object for the existing git repository
93+
* @throws IOException
94+
*/
95+
public static Git open(File dir) throws IOException {
96+
return open(dir, FS.DETECTED);
97+
}
98+
99+
/**
100+
* @param dir
101+
* the repository to open. May be either the GIT_DIR, or the
102+
* working tree directory that contains {@code .git}.
103+
* @param fs
104+
* filesystem abstraction to use when accessing the repository.
105+
* @return a {@link Git} object for the existing git repository
106+
* @throws IOException
107+
*/
108+
public static Git open(File dir, FS fs) throws IOException {
109+
RepositoryCache.FileKey key;
110+
111+
key = RepositoryCache.FileKey.lenient(dir, fs);
112+
return wrap(new RepositoryBuilder()
113+
.setFS(fs)
114+
.setGitDir(key.getFile())
115+
.setMustExist(true).build());
116+
}
117+
118+
/**
119+
* @param repo
120+
* the git repository this class is interacting with.
121+
* {@code null} is not allowed
122+
* @return a {@link Git} object for the existing git repository
123+
*/
124+
public static Git wrap(Repository repo) {
125+
return new Git(repo);
126+
}
127+
82128
/**
83129
* Returns a command object to execute a {@code clone} command
84130
*
@@ -88,7 +134,7 @@ public class Git {
88134
* @return a {@link CloneCommand} used to collect all optional parameters
89135
* and to finally execute the {@code clone} command
90136
*/
91-
static public CloneCommand cloneRepository() {
137+
public static CloneCommand cloneRepository() {
92138
return new CloneCommand();
93139
}
94140

0 commit comments

Comments
 (0)