Merge branch 'stable-1.3'
* stable-1.3: Prepare post 1.3.0.201202121842-rc4 builds JGit 1.3.0.201202121842-rc4 Support gitdir references in working tree .git file Support committing submodule updates Update iplog tool's README Change-Id: Id70f4d4b059b03d4fa6fbd9137b81a337e9c48e8 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
commit
de48250da5
|
@ -11,19 +11,19 @@
|
||||||
# $JGIT_BASE/.eclipse_iplog
|
# $JGIT_BASE/.eclipse_iplog
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
# Prepare:
|
# Prepare:
|
||||||
# jgit work tree base dir
|
# jgit executable (assuming jgit mvn build is up to date)
|
||||||
export JGIT_BASE="c:/data/ide/helios/jgit"
|
export jgit="~/src/git/jgit/org.eclipse.jgit.pgm/target/jgit"
|
||||||
|
|
||||||
# repository work dir root path
|
# repository work dir root path
|
||||||
export WORK_DIR="c:/data/ide/helios/jgit"
|
export WORK_DIR="~/src/git/jgit/"
|
||||||
|
|
||||||
# cd to repository work dir root path (for jgit this is identical to $JGIT_BASE)
|
# cd to repository work dir root path
|
||||||
cd $WORK_DIR
|
cd $WORK_DIR
|
||||||
|
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
# Update the CQ list:
|
# Update the CQ list:
|
||||||
# - this command updates file .eclipse_iplog
|
# - this command updates file .eclipse_iplog
|
||||||
java -jar $JGIT_BASE/org.eclipse.jgit.pgm/target/jgit-cli.jar eclipse-ipzilla
|
jgit eclipse-ipzilla
|
||||||
|
|
||||||
# - if there are any updates 'git commit' them
|
# - if there are any updates 'git commit' them
|
||||||
git add .eclipse_iplog
|
git add .eclipse_iplog
|
||||||
|
@ -49,6 +49,6 @@ ssh -p 29418 username@egit.eclipse.org gerrit gsql --format PRETTY
|
||||||
# options:
|
# options:
|
||||||
# -- version : the project version the iplog is to be generated for
|
# -- version : the project version the iplog is to be generated for
|
||||||
# - o : the output file
|
# - o : the output file
|
||||||
java -jar $JGIT_BASE/org.eclipse.jgit.pgm/target/jgit-cli.jar eclipse-iplog --version=0.8.0 -o jgit-0.8.0.xml
|
jgit eclipse-iplog --version=1.3.0 -o $WORK_DIR/jgit-1.3.0.xml
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,15 +44,25 @@
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.diff.DiffEntry;
|
||||||
import org.eclipse.jgit.lib.ConfigConstants;
|
import org.eclipse.jgit.lib.ConfigConstants;
|
||||||
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.FileMode;
|
import org.eclipse.jgit.lib.FileMode;
|
||||||
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
import org.eclipse.jgit.lib.RefUpdate;
|
||||||
|
import org.eclipse.jgit.lib.RefUpdate.Result;
|
||||||
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.lib.RepositoryTestCase;
|
import org.eclipse.jgit.lib.RepositoryTestCase;
|
||||||
import org.eclipse.jgit.lib.StoredConfig;
|
import org.eclipse.jgit.lib.StoredConfig;
|
||||||
import org.eclipse.jgit.revwalk.RevCommit;
|
import org.eclipse.jgit.revwalk.RevCommit;
|
||||||
|
import org.eclipse.jgit.submodule.SubmoduleWalk;
|
||||||
import org.eclipse.jgit.treewalk.TreeWalk;
|
import org.eclipse.jgit.treewalk.TreeWalk;
|
||||||
|
import org.eclipse.jgit.treewalk.filter.TreeFilter;
|
||||||
import org.eclipse.jgit.util.FS;
|
import org.eclipse.jgit.util.FS;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -152,4 +162,100 @@ public boolean canExecute(File f) {
|
||||||
assertNotNull(walk);
|
assertNotNull(walk);
|
||||||
assertEquals(FileMode.EXECUTABLE_FILE, walk.getFileMode(0));
|
assertEquals(FileMode.EXECUTABLE_FILE, walk.getFileMode(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void commitNewSubmodule() throws Exception {
|
||||||
|
Git git = new Git(db);
|
||||||
|
writeTrashFile("file.txt", "content");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
RevCommit commit = git.commit().setMessage("create file").call();
|
||||||
|
|
||||||
|
SubmoduleAddCommand command = new SubmoduleAddCommand(db);
|
||||||
|
String path = "sub";
|
||||||
|
command.setPath(path);
|
||||||
|
String uri = db.getDirectory().toURI().toString();
|
||||||
|
command.setURI(uri);
|
||||||
|
Repository repo = command.call();
|
||||||
|
assertNotNull(repo);
|
||||||
|
|
||||||
|
SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
|
||||||
|
assertTrue(generator.next());
|
||||||
|
assertEquals(path, generator.getPath());
|
||||||
|
assertEquals(commit, generator.getObjectId());
|
||||||
|
assertEquals(uri, generator.getModulesUrl());
|
||||||
|
assertEquals(path, generator.getModulesPath());
|
||||||
|
assertEquals(uri, generator.getConfigUrl());
|
||||||
|
assertNotNull(generator.getRepository());
|
||||||
|
assertEquals(commit, repo.resolve(Constants.HEAD));
|
||||||
|
|
||||||
|
RevCommit submoduleCommit = git.commit().setMessage("submodule add")
|
||||||
|
.setOnly(path).call();
|
||||||
|
assertNotNull(submoduleCommit);
|
||||||
|
TreeWalk walk = new TreeWalk(db);
|
||||||
|
walk.addTree(commit.getTree());
|
||||||
|
walk.addTree(submoduleCommit.getTree());
|
||||||
|
walk.setFilter(TreeFilter.ANY_DIFF);
|
||||||
|
List<DiffEntry> diffs = DiffEntry.scan(walk);
|
||||||
|
assertEquals(1, diffs.size());
|
||||||
|
DiffEntry subDiff = diffs.get(0);
|
||||||
|
assertEquals(FileMode.MISSING, subDiff.getOldMode());
|
||||||
|
assertEquals(FileMode.GITLINK, subDiff.getNewMode());
|
||||||
|
assertEquals(ObjectId.zeroId(), subDiff.getOldId().toObjectId());
|
||||||
|
assertEquals(commit, subDiff.getNewId().toObjectId());
|
||||||
|
assertEquals(path, subDiff.getNewPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void commitSubmoduleUpdate() throws Exception {
|
||||||
|
Git git = new Git(db);
|
||||||
|
writeTrashFile("file.txt", "content");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
RevCommit commit = git.commit().setMessage("create file").call();
|
||||||
|
writeTrashFile("file.txt", "content2");
|
||||||
|
git.add().addFilepattern("file.txt").call();
|
||||||
|
RevCommit commit2 = git.commit().setMessage("edit file").call();
|
||||||
|
|
||||||
|
SubmoduleAddCommand command = new SubmoduleAddCommand(db);
|
||||||
|
String path = "sub";
|
||||||
|
command.setPath(path);
|
||||||
|
String uri = db.getDirectory().toURI().toString();
|
||||||
|
command.setURI(uri);
|
||||||
|
Repository repo = command.call();
|
||||||
|
assertNotNull(repo);
|
||||||
|
|
||||||
|
SubmoduleWalk generator = SubmoduleWalk.forIndex(db);
|
||||||
|
assertTrue(generator.next());
|
||||||
|
assertEquals(path, generator.getPath());
|
||||||
|
assertEquals(commit2, generator.getObjectId());
|
||||||
|
assertEquals(uri, generator.getModulesUrl());
|
||||||
|
assertEquals(path, generator.getModulesPath());
|
||||||
|
assertEquals(uri, generator.getConfigUrl());
|
||||||
|
assertNotNull(generator.getRepository());
|
||||||
|
assertEquals(commit2, repo.resolve(Constants.HEAD));
|
||||||
|
|
||||||
|
RevCommit submoduleAddCommit = git.commit().setMessage("submodule add")
|
||||||
|
.setOnly(path).call();
|
||||||
|
assertNotNull(submoduleAddCommit);
|
||||||
|
|
||||||
|
RefUpdate update = repo.updateRef(Constants.HEAD);
|
||||||
|
update.setNewObjectId(commit);
|
||||||
|
assertEquals(Result.FORCED, update.forceUpdate());
|
||||||
|
|
||||||
|
RevCommit submoduleEditCommit = git.commit()
|
||||||
|
.setMessage("submodule add").setOnly(path).call();
|
||||||
|
assertNotNull(submoduleEditCommit);
|
||||||
|
TreeWalk walk = new TreeWalk(db);
|
||||||
|
walk.addTree(submoduleAddCommit.getTree());
|
||||||
|
walk.addTree(submoduleEditCommit.getTree());
|
||||||
|
walk.setFilter(TreeFilter.ANY_DIFF);
|
||||||
|
List<DiffEntry> diffs = DiffEntry.scan(walk);
|
||||||
|
assertEquals(1, diffs.size());
|
||||||
|
DiffEntry subDiff = diffs.get(0);
|
||||||
|
assertEquals(FileMode.GITLINK, subDiff.getOldMode());
|
||||||
|
assertEquals(FileMode.GITLINK, subDiff.getNewMode());
|
||||||
|
assertEquals(commit2, subDiff.getOldId().toObjectId());
|
||||||
|
assertEquals(commit, subDiff.getNewId().toObjectId());
|
||||||
|
assertEquals(path, subDiff.getNewPath());
|
||||||
|
assertEquals(path, subDiff.getOldPath());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,10 +44,12 @@
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileWriter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.eclipse.jgit.dircache.DirCache;
|
import org.eclipse.jgit.dircache.DirCache;
|
||||||
|
@ -58,7 +60,9 @@
|
||||||
import org.eclipse.jgit.lib.Constants;
|
import org.eclipse.jgit.lib.Constants;
|
||||||
import org.eclipse.jgit.lib.FileMode;
|
import org.eclipse.jgit.lib.FileMode;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.lib.RepositoryTestCase;
|
import org.eclipse.jgit.lib.RepositoryTestCase;
|
||||||
|
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
|
||||||
import org.eclipse.jgit.treewalk.filter.PathFilter;
|
import org.eclipse.jgit.treewalk.filter.PathFilter;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@ -97,8 +101,6 @@ public void apply(DirCacheEntry ent) {
|
||||||
assertEquals(path, gen.getPath());
|
assertEquals(path, gen.getPath());
|
||||||
assertEquals(id, gen.getObjectId());
|
assertEquals(id, gen.getObjectId());
|
||||||
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
||||||
assertEquals(new File(db.getWorkTree(), path + File.separatorChar
|
|
||||||
+ Constants.DOT_GIT), gen.getGitDirectory());
|
|
||||||
assertNull(gen.getConfigUpdate());
|
assertNull(gen.getConfigUpdate());
|
||||||
assertNull(gen.getConfigUrl());
|
assertNull(gen.getConfigUrl());
|
||||||
assertNull(gen.getModulesPath());
|
assertNull(gen.getModulesPath());
|
||||||
|
@ -108,6 +110,101 @@ public void apply(DirCacheEntry ent) {
|
||||||
assertFalse(gen.next());
|
assertFalse(gen.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void repositoryWithRootLevelSubmoduleAbsoluteRef()
|
||||||
|
throws IOException, ConfigInvalidException {
|
||||||
|
final ObjectId id = ObjectId
|
||||||
|
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
|
||||||
|
final String path = "sub";
|
||||||
|
File dotGit = new File(db.getWorkTree(), path + File.separatorChar
|
||||||
|
+ Constants.DOT_GIT);
|
||||||
|
if (!dotGit.getParentFile().exists())
|
||||||
|
dotGit.getParentFile().mkdirs();
|
||||||
|
|
||||||
|
File modulesGitDir = new File(db.getDirectory(), "modules"
|
||||||
|
+ File.separatorChar + path);
|
||||||
|
new FileWriter(dotGit).append(
|
||||||
|
"gitdir: " + modulesGitDir.getAbsolutePath()).close();
|
||||||
|
FileRepositoryBuilder builder = new FileRepositoryBuilder();
|
||||||
|
builder.setWorkTree(new File(db.getWorkTree(), path));
|
||||||
|
builder.build().create();
|
||||||
|
|
||||||
|
DirCache cache = db.lockDirCache();
|
||||||
|
DirCacheEditor editor = cache.editor();
|
||||||
|
editor.add(new PathEdit(path) {
|
||||||
|
|
||||||
|
public void apply(DirCacheEntry ent) {
|
||||||
|
ent.setFileMode(FileMode.GITLINK);
|
||||||
|
ent.setObjectId(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
editor.commit();
|
||||||
|
|
||||||
|
SubmoduleWalk gen = SubmoduleWalk.forIndex(db);
|
||||||
|
assertTrue(gen.next());
|
||||||
|
assertEquals(path, gen.getPath());
|
||||||
|
assertEquals(id, gen.getObjectId());
|
||||||
|
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
||||||
|
assertNull(gen.getConfigUpdate());
|
||||||
|
assertNull(gen.getConfigUrl());
|
||||||
|
assertNull(gen.getModulesPath());
|
||||||
|
assertNull(gen.getModulesUpdate());
|
||||||
|
assertNull(gen.getModulesUrl());
|
||||||
|
Repository subRepo = gen.getRepository();
|
||||||
|
assertNotNull(subRepo);
|
||||||
|
assertEquals(modulesGitDir, subRepo.getDirectory());
|
||||||
|
assertEquals(new File(db.getWorkTree(), path), subRepo.getWorkTree());
|
||||||
|
assertFalse(gen.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void repositoryWithRootLevelSubmoduleRelativeRef()
|
||||||
|
throws IOException, ConfigInvalidException {
|
||||||
|
final ObjectId id = ObjectId
|
||||||
|
.fromString("abcd1234abcd1234abcd1234abcd1234abcd1234");
|
||||||
|
final String path = "sub";
|
||||||
|
File dotGit = new File(db.getWorkTree(), path + File.separatorChar
|
||||||
|
+ Constants.DOT_GIT);
|
||||||
|
if (!dotGit.getParentFile().exists())
|
||||||
|
dotGit.getParentFile().mkdirs();
|
||||||
|
|
||||||
|
File modulesGitDir = new File(db.getDirectory(), "modules"
|
||||||
|
+ File.separatorChar + path);
|
||||||
|
new FileWriter(dotGit).append(
|
||||||
|
"gitdir: " + "../" + Constants.DOT_GIT + "/modules/" + path)
|
||||||
|
.close();
|
||||||
|
FileRepositoryBuilder builder = new FileRepositoryBuilder();
|
||||||
|
builder.setWorkTree(new File(db.getWorkTree(), path));
|
||||||
|
builder.build().create();
|
||||||
|
|
||||||
|
DirCache cache = db.lockDirCache();
|
||||||
|
DirCacheEditor editor = cache.editor();
|
||||||
|
editor.add(new PathEdit(path) {
|
||||||
|
|
||||||
|
public void apply(DirCacheEntry ent) {
|
||||||
|
ent.setFileMode(FileMode.GITLINK);
|
||||||
|
ent.setObjectId(id);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
editor.commit();
|
||||||
|
|
||||||
|
SubmoduleWalk gen = SubmoduleWalk.forIndex(db);
|
||||||
|
assertTrue(gen.next());
|
||||||
|
assertEquals(path, gen.getPath());
|
||||||
|
assertEquals(id, gen.getObjectId());
|
||||||
|
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
||||||
|
assertNull(gen.getConfigUpdate());
|
||||||
|
assertNull(gen.getConfigUrl());
|
||||||
|
assertNull(gen.getModulesPath());
|
||||||
|
assertNull(gen.getModulesUpdate());
|
||||||
|
assertNull(gen.getModulesUrl());
|
||||||
|
Repository subRepo = gen.getRepository();
|
||||||
|
assertNotNull(subRepo);
|
||||||
|
assertEquals(modulesGitDir, subRepo.getDirectory());
|
||||||
|
assertEquals(new File(db.getWorkTree(), path), subRepo.getWorkTree());
|
||||||
|
assertFalse(gen.next());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void repositoryWithNestedSubmodule() throws IOException,
|
public void repositoryWithNestedSubmodule() throws IOException,
|
||||||
ConfigInvalidException {
|
ConfigInvalidException {
|
||||||
|
@ -130,8 +227,6 @@ public void apply(DirCacheEntry ent) {
|
||||||
assertEquals(path, gen.getPath());
|
assertEquals(path, gen.getPath());
|
||||||
assertEquals(id, gen.getObjectId());
|
assertEquals(id, gen.getObjectId());
|
||||||
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
assertEquals(new File(db.getWorkTree(), path), gen.getDirectory());
|
||||||
assertEquals(new File(db.getWorkTree(), path + File.separatorChar
|
|
||||||
+ Constants.DOT_GIT), gen.getGitDirectory());
|
|
||||||
assertNull(gen.getConfigUpdate());
|
assertNull(gen.getConfigUpdate());
|
||||||
assertNull(gen.getConfigUrl());
|
assertNull(gen.getConfigUrl());
|
||||||
assertNull(gen.getModulesPath());
|
assertNull(gen.getModulesPath());
|
||||||
|
|
|
@ -234,6 +234,7 @@ invalidChannel=Invalid channel {0}
|
||||||
invalidCharacterInBase64Data=Invalid character in Base64 data.
|
invalidCharacterInBase64Data=Invalid character in Base64 data.
|
||||||
invalidCommitParentNumber=Invalid commit parent number
|
invalidCommitParentNumber=Invalid commit parent number
|
||||||
invalidEncryption=Invalid encryption
|
invalidEncryption=Invalid encryption
|
||||||
|
invalidGitdirRef = Invalid .git reference in file ''{0}''
|
||||||
invalidGitType=invalid git type: {0}
|
invalidGitType=invalid git type: {0}
|
||||||
invalidId=Invalid id {0}
|
invalidId=Invalid id {0}
|
||||||
invalidIdLength=Invalid id length {0}; should be {1}
|
invalidIdLength=Invalid id length {0}; should be {1}
|
||||||
|
|
|
@ -294,6 +294,7 @@ public static JGitText get() {
|
||||||
/***/ public String invalidCharacterInBase64Data;
|
/***/ public String invalidCharacterInBase64Data;
|
||||||
/***/ public String invalidCommitParentNumber;
|
/***/ public String invalidCommitParentNumber;
|
||||||
/***/ public String invalidEncryption;
|
/***/ public String invalidEncryption;
|
||||||
|
/***/ public String invalidGitdirRef;
|
||||||
/***/ public String invalidGitType;
|
/***/ public String invalidGitType;
|
||||||
/***/ public String invalidId;
|
/***/ public String invalidId;
|
||||||
/***/ public String invalidIdLength;
|
/***/ public String invalidIdLength;
|
||||||
|
|
|
@ -351,12 +351,9 @@ private DirCache createTemporaryIndex(ObjectId headId, DirCache index)
|
||||||
if (objectExists) {
|
if (objectExists) {
|
||||||
dcEntry.setObjectId(fTree.getEntryObjectId());
|
dcEntry.setObjectId(fTree.getEntryObjectId());
|
||||||
} else {
|
} else {
|
||||||
if (FileMode.GITLINK.equals(dcEntry.getFileMode())) {
|
if (FileMode.GITLINK.equals(dcEntry.getFileMode()))
|
||||||
// Do not check the content of submodule entries
|
dcEntry.setObjectId(fTree.getEntryObjectId());
|
||||||
// Use the old entry information instead.
|
else {
|
||||||
dcEntry.copyMetaData(index.getEntry(dcEntry
|
|
||||||
.getPathString()));
|
|
||||||
} else {
|
|
||||||
// insert object
|
// insert object
|
||||||
if (inserter == null)
|
if (inserter == null)
|
||||||
inserter = repo.newObjectInserter();
|
inserter = repo.newObjectInserter();
|
||||||
|
|
|
@ -69,6 +69,8 @@
|
||||||
import org.eclipse.jgit.storage.file.FileRepository;
|
import org.eclipse.jgit.storage.file.FileRepository;
|
||||||
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
|
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
|
||||||
import org.eclipse.jgit.util.FS;
|
import org.eclipse.jgit.util.FS;
|
||||||
|
import org.eclipse.jgit.util.IO;
|
||||||
|
import org.eclipse.jgit.util.RawParseUtils;
|
||||||
import org.eclipse.jgit.util.SystemReader;
|
import org.eclipse.jgit.util.SystemReader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -85,6 +87,19 @@
|
||||||
* @see FileRepositoryBuilder
|
* @see FileRepositoryBuilder
|
||||||
*/
|
*/
|
||||||
public class BaseRepositoryBuilder<B extends BaseRepositoryBuilder, R extends Repository> {
|
public class BaseRepositoryBuilder<B extends BaseRepositoryBuilder, R extends Repository> {
|
||||||
|
private static boolean isSymRef(byte[] ref) {
|
||||||
|
if (ref.length < 9)
|
||||||
|
return false;
|
||||||
|
return /**/ref[0] == 'g' //
|
||||||
|
&& ref[1] == 'i' //
|
||||||
|
&& ref[2] == 't' //
|
||||||
|
&& ref[3] == 'd' //
|
||||||
|
&& ref[4] == 'i' //
|
||||||
|
&& ref[5] == 'r' //
|
||||||
|
&& ref[6] == ':' //
|
||||||
|
&& ref[7] == ' ';
|
||||||
|
}
|
||||||
|
|
||||||
private FS fs;
|
private FS fs;
|
||||||
|
|
||||||
private File gitDir;
|
private File gitDir;
|
||||||
|
@ -546,10 +561,37 @@ protected void requireGitDirOrWorkTree() {
|
||||||
* the repository could not be accessed
|
* the repository could not be accessed
|
||||||
*/
|
*/
|
||||||
protected void setupGitDir() throws IOException {
|
protected void setupGitDir() throws IOException {
|
||||||
// No gitDir? Try to assume its under the workTree.
|
// No gitDir? Try to assume its under the workTree or a ref to another
|
||||||
//
|
// location
|
||||||
if (getGitDir() == null && getWorkTree() != null)
|
if (getGitDir() == null && getWorkTree() != null) {
|
||||||
setGitDir(new File(getWorkTree(), DOT_GIT));
|
File dotGit = new File(getWorkTree(), DOT_GIT);
|
||||||
|
if (!dotGit.isFile())
|
||||||
|
setGitDir(dotGit);
|
||||||
|
else {
|
||||||
|
byte[] content = IO.readFully(dotGit);
|
||||||
|
if (!isSymRef(content))
|
||||||
|
throw new IOException(MessageFormat.format(
|
||||||
|
JGitText.get().invalidGitdirRef,
|
||||||
|
dotGit.getAbsolutePath()));
|
||||||
|
int pathStart = 8;
|
||||||
|
int lineEnd = RawParseUtils.nextLF(content, pathStart);
|
||||||
|
if (content[lineEnd - 1] == '\n')
|
||||||
|
lineEnd--;
|
||||||
|
if (lineEnd == pathStart)
|
||||||
|
throw new IOException(MessageFormat.format(
|
||||||
|
JGitText.get().invalidGitdirRef,
|
||||||
|
dotGit.getAbsolutePath()));
|
||||||
|
|
||||||
|
String gitdirPath = RawParseUtils.decode(content, pathStart,
|
||||||
|
lineEnd);
|
||||||
|
File gitdirFile = new File(gitdirPath);
|
||||||
|
if (gitdirFile.isAbsolute())
|
||||||
|
setGitDir(gitdirFile);
|
||||||
|
else
|
||||||
|
setGitDir(new File(getWorkTree(), gitdirPath)
|
||||||
|
.getCanonicalFile());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -155,27 +155,32 @@ public static File getSubmoduleDirectory(final Repository parent,
|
||||||
*/
|
*/
|
||||||
public static Repository getSubmoduleRepository(final Repository parent,
|
public static Repository getSubmoduleRepository(final Repository parent,
|
||||||
final String path) throws IOException {
|
final String path) throws IOException {
|
||||||
File directory = getSubmoduleGitDirectory(parent, path);
|
return getSubmoduleRepository(parent.getWorkTree(), path);
|
||||||
if (!directory.isDirectory())
|
|
||||||
return null;
|
|
||||||
try {
|
|
||||||
return new RepositoryBuilder().setMustExist(true)
|
|
||||||
.setFS(FS.DETECTED).setGitDir(directory).build();
|
|
||||||
} catch (RepositoryNotFoundException e) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the .git directory for a repository submodule path
|
* Get submodule repository at path
|
||||||
*
|
*
|
||||||
* @param parent
|
* @param parent
|
||||||
* @param path
|
* @param path
|
||||||
* @return .git for submodule repository
|
* @return repository or null if repository doesn't exist
|
||||||
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static File getSubmoduleGitDirectory(final Repository parent,
|
public static Repository getSubmoduleRepository(final File parent,
|
||||||
final String path) {
|
final String path) throws IOException {
|
||||||
return new File(getSubmoduleDirectory(parent, path), Constants.DOT_GIT);
|
File subWorkTree = new File(parent, path);
|
||||||
|
if (!subWorkTree.isDirectory())
|
||||||
|
return null;
|
||||||
|
File workTree = new File(parent, path);
|
||||||
|
try {
|
||||||
|
return new RepositoryBuilder() //
|
||||||
|
.setMustExist(true) //
|
||||||
|
.setFS(FS.DETECTED) //
|
||||||
|
.setWorkTree(workTree) //
|
||||||
|
.build();
|
||||||
|
} catch (RepositoryNotFoundException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -348,15 +353,6 @@ public File getDirectory() {
|
||||||
return getSubmoduleDirectory(repository, path);
|
return getSubmoduleDirectory(repository, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the .git directory for the current submodule entry
|
|
||||||
*
|
|
||||||
* @return .git for submodule repository
|
|
||||||
*/
|
|
||||||
public File getGitDirectory() {
|
|
||||||
return getSubmoduleGitDirectory(repository, path);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advance to next submodule in the index tree.
|
* Advance to next submodule in the index tree.
|
||||||
*
|
*
|
||||||
|
@ -466,20 +462,9 @@ public String getModulesUpdate() throws IOException, ConfigInvalidException {
|
||||||
ConfigConstants.CONFIG_KEY_UPDATE);
|
ConfigConstants.CONFIG_KEY_UPDATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the current submodule entry have a .git directory in the parent
|
|
||||||
* repository's working tree?
|
|
||||||
*
|
|
||||||
* @return true if .git directory exists, false otherwise
|
|
||||||
*/
|
|
||||||
public boolean hasGitDirectory() {
|
|
||||||
return getGitDirectory().isDirectory();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get repository for current submodule entry
|
* Get repository for current submodule entry
|
||||||
*
|
*
|
||||||
* @see #hasGitDirectory()
|
|
||||||
* @return repository or null if non-existent
|
* @return repository or null if non-existent
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -159,7 +159,7 @@ static public class FileEntry extends Entry {
|
||||||
file = f;
|
file = f;
|
||||||
|
|
||||||
if (f.isDirectory()) {
|
if (f.isDirectory()) {
|
||||||
if (new File(f, Constants.DOT_GIT).isDirectory())
|
if (new File(f, Constants.DOT_GIT).exists())
|
||||||
mode = FileMode.GITLINK;
|
mode = FileMode.GITLINK;
|
||||||
else
|
else
|
||||||
mode = FileMode.TREE;
|
mode = FileMode.TREE;
|
||||||
|
|
|
@ -76,7 +76,7 @@
|
||||||
import org.eclipse.jgit.lib.FileMode;
|
import org.eclipse.jgit.lib.FileMode;
|
||||||
import org.eclipse.jgit.lib.ObjectId;
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
import org.eclipse.jgit.lib.Repository;
|
import org.eclipse.jgit.lib.Repository;
|
||||||
import org.eclipse.jgit.lib.RepositoryBuilder;
|
import org.eclipse.jgit.submodule.SubmoduleWalk;
|
||||||
import org.eclipse.jgit.util.FS;
|
import org.eclipse.jgit.util.FS;
|
||||||
import org.eclipse.jgit.util.IO;
|
import org.eclipse.jgit.util.IO;
|
||||||
import org.eclipse.jgit.util.io.EolCanonicalizingInputStream;
|
import org.eclipse.jgit.util.io.EolCanonicalizingInputStream;
|
||||||
|
@ -280,18 +280,16 @@ protected byte[] idSubmodule(Entry e) {
|
||||||
* @return non-null submodule id
|
* @return non-null submodule id
|
||||||
*/
|
*/
|
||||||
protected byte[] idSubmodule(File directory, Entry e) {
|
protected byte[] idSubmodule(File directory, Entry e) {
|
||||||
final String gitDirPath = e.getName() + "/" + Constants.DOT_GIT;
|
|
||||||
final File submoduleGitDir = new File(directory, gitDirPath);
|
|
||||||
if (!submoduleGitDir.isDirectory())
|
|
||||||
return zeroid;
|
|
||||||
final Repository submoduleRepo;
|
final Repository submoduleRepo;
|
||||||
try {
|
try {
|
||||||
FS fs = repository != null ? repository.getFS() : FS.DETECTED;
|
submoduleRepo = SubmoduleWalk.getSubmoduleRepository(directory,
|
||||||
submoduleRepo = new RepositoryBuilder().setGitDir(submoduleGitDir)
|
e.getName());
|
||||||
.setMustExist(true).setFS(fs).build();
|
|
||||||
} catch (IOException exception) {
|
} catch (IOException exception) {
|
||||||
return zeroid;
|
return zeroid;
|
||||||
}
|
}
|
||||||
|
if (submoduleRepo == null)
|
||||||
|
return zeroid;
|
||||||
|
|
||||||
final ObjectId head;
|
final ObjectId head;
|
||||||
try {
|
try {
|
||||||
head = submoduleRepo.resolve(Constants.HEAD);
|
head = submoduleRepo.resolve(Constants.HEAD);
|
||||||
|
|
Loading…
Reference in New Issue