Add setTargetBranch in RepoCommand.

This will allow us to write the super project in a branch other than
master.

Change-Id: I578ed9ecbc6423416239e31ad644531dae9fb5c3
Signed-off-by: Yuxuan 'fishy' Wang <fishywang@google.com>
This commit is contained in:
Yuxuan 'fishy' Wang 2015-07-09 22:12:28 -07:00
parent 37a1e4beaa
commit 217b2a7cc5
2 changed files with 86 additions and 44 deletions

View File

@ -241,9 +241,9 @@ public void testRepoManifestCopyFile() throws Exception {
@Test @Test
public void testBareRepo() throws Exception { public void testBareRepo() throws Exception {
Repository remoteDb = createBareRepository(); try (
Repository tempDb = createWorkRepository(); Repository remoteDb = createBareRepository();
try { Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
xmlContent xmlContent
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
@ -280,9 +280,6 @@ public void testBareRepo() throws Exception {
String remote = defaultDb.resolve(Constants.HEAD).name(); String remote = defaultDb.resolve(Constants.HEAD).name();
assertEquals("The gitlink should be the same as remote head", assertEquals("The gitlink should be the same as remote head",
remote, gitlink); remote, gitlink);
} finally {
tempDb.close();
remoteDb.close();
} }
} }
@ -366,9 +363,9 @@ public void testRevisionTag() throws Exception {
@Test @Test
public void testRevisionBare() throws Exception { public void testRevisionBare() throws Exception {
Repository remoteDb = createBareRepository(); try (
Repository tempDb = createWorkRepository(); Repository remoteDb = createBareRepository();
try { Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") xmlContent.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
.append("<manifest>") .append("<manifest>")
@ -393,17 +390,14 @@ public void testRevisionBare() throws Exception {
localDb.close(); localDb.close();
assertEquals("The gitlink is same as remote head", assertEquals("The gitlink is same as remote head",
oldCommitId.name(), gitlink); oldCommitId.name(), gitlink);
} finally {
tempDb.close();
remoteDb.close();
} }
} }
@Test @Test
public void testCopyFileBare() throws Exception { public void testCopyFileBare() throws Exception {
Repository remoteDb = createBareRepository(); try (
Repository tempDb = createWorkRepository(); Repository remoteDb = createBareRepository();
try { Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
xmlContent xmlContent
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
@ -435,17 +429,14 @@ public void testCopyFileBare() throws Exception {
reader.close(); reader.close();
assertEquals("The Hello file should have expected content", assertEquals("The Hello file should have expected content",
"branch world", content); "branch world", content);
} finally {
tempDb.close();
remoteDb.close();
} }
} }
@Test @Test
public void testReplaceManifestBare() throws Exception { public void testReplaceManifestBare() throws Exception {
Repository remoteDb = createBareRepository(); try (
Repository tempDb = createWorkRepository(); Repository remoteDb = createBareRepository();
try { Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
xmlContent xmlContent
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
@ -512,17 +503,14 @@ public void testReplaceManifestBare() throws Exception {
reader.close(); reader.close();
assertTrue("The bar submodule should exist", bar); assertTrue("The bar submodule should exist", bar);
assertFalse("The foo submodule shouldn't exist", foo); assertFalse("The foo submodule shouldn't exist", foo);
} finally {
tempDb.close();
remoteDb.close();
} }
} }
@Test @Test
public void testRemoveOverlappingBare() throws Exception { public void testRemoveOverlappingBare() throws Exception {
Repository remoteDb = createBareRepository(); try (
Repository tempDb = createWorkRepository(); Repository remoteDb = createBareRepository();
try { Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder(); StringBuilder xmlContent = new StringBuilder();
xmlContent xmlContent
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
@ -571,9 +559,6 @@ public void testRemoveOverlappingBare() throws Exception {
assertTrue("The foo submodule should exist", foo); assertTrue("The foo submodule should exist", foo);
assertFalse("The foo/bar submodule shouldn't exist", foobar); assertFalse("The foo/bar submodule shouldn't exist", foobar);
assertTrue("The a submodule should exist", a); assertTrue("The a submodule should exist", a);
} finally {
tempDb.close();
remoteDb.close();
} }
} }
@ -671,6 +656,42 @@ public void testRemoteAlias() throws Exception {
assertTrue("We should have foo", file.exists()); assertTrue("We should have foo", file.exists());
} }
@Test
public void testTargetBranch() throws Exception {
try (
Repository remoteDb1 = createBareRepository();
Repository remoteDb2 = createBareRepository();
Repository tempDb = createWorkRepository()) {
StringBuilder xmlContent = new StringBuilder();
xmlContent
.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
.append("<manifest>")
.append("<remote name=\"remote1\" fetch=\".\" />")
.append("<default revision=\"master\" remote=\"remote1\" />")
.append("<project path=\"foo\" name=\"").append(defaultUri)
.append("\" />").append("</manifest>");
JGitTestUtil.writeTrashFile(tempDb, "manifest.xml",
xmlContent.toString());
RepoCommand command = new RepoCommand(remoteDb1);
command
.setPath(tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
.setURI(rootUri)
.setTargetBranch("test")
.call();
ObjectId branchId = remoteDb1.resolve(
Constants.R_HEADS + "test^{tree}");
command = new RepoCommand(remoteDb2);
command
.setPath(tempDb.getWorkTree().getAbsolutePath() + "/manifest.xml")
.setURI(rootUri)
.call();
ObjectId defaultId = remoteDb2.resolve(Constants.HEAD + "^{tree}");
assertEquals(
"The tree id of branch db and default db should be the same",
branchId, defaultId);
}
}
private void resolveRelativeUris() { private void resolveRelativeUris() {
// Find the longest common prefix ends with "/" as rootUri. // Find the longest common prefix ends with "/" as rootUri.
defaultUri = defaultDb.getDirectory().toURI().toString(); defaultUri = defaultDb.getDirectory().toURI().toString();

View File

@ -105,6 +105,7 @@ public class RepoCommand extends GitCommand<RevCommit> {
private String uri; private String uri;
private String groups; private String groups;
private String branch; private String branch;
private String targetBranch = Constants.HEAD;
private PersonIdent author; private PersonIdent author;
private RemoteReader callback; private RemoteReader callback;
private InputStream inputStream; private InputStream inputStream;
@ -224,27 +225,27 @@ private static class RemoteUnavailableException extends GitAPIException {
/** /**
* @param repo * @param repo
*/ */
public RepoCommand(final Repository repo) { public RepoCommand(Repository repo) {
super(repo); super(repo);
} }
/** /**
* Set path to the manifest XML file. * Set path to the manifest XML file.
* * <p>
* Calling {@link #setInputStream} will ignore the path set here. * Calling {@link #setInputStream} will ignore the path set here.
* *
* @param path * @param path
* (with <code>/</code> as separator) * (with <code>/</code> as separator)
* @return this command * @return this command
*/ */
public RepoCommand setPath(final String path) { public RepoCommand setPath(String path) {
this.path = path; this.path = path;
return this; return this;
} }
/** /**
* Set the input stream to the manifest XML. * Set the input stream to the manifest XML.
* * <p>
* Setting inputStream will ignore the path set. It will be closed in * Setting inputStream will ignore the path set. It will be closed in
* {@link #call}. * {@link #call}.
* *
@ -252,7 +253,7 @@ public RepoCommand setPath(final String path) {
* @return this command * @return this command
* @since 3.5 * @since 3.5
*/ */
public RepoCommand setInputStream(final InputStream inputStream) { public RepoCommand setInputStream(InputStream inputStream) {
this.inputStream = inputStream; this.inputStream = inputStream;
return this; return this;
} }
@ -263,7 +264,7 @@ public RepoCommand setInputStream(final InputStream inputStream) {
* @param uri * @param uri
* @return this command * @return this command
*/ */
public RepoCommand setURI(final String uri) { public RepoCommand setURI(String uri) {
this.uri = uri; this.uri = uri;
return this; return this;
} }
@ -274,14 +275,14 @@ public RepoCommand setURI(final String uri) {
* @param groups groups separated by comma, examples: default|all|G1,-G2,-G3 * @param groups groups separated by comma, examples: default|all|G1,-G2,-G3
* @return this command * @return this command
*/ */
public RepoCommand setGroups(final String groups) { public RepoCommand setGroups(String groups) {
this.groups = groups; this.groups = groups;
return this; return this;
} }
/** /**
* Set default branch. * Set default branch.
* * <p>
* This is generally the name of the branch the manifest file was in. If * This is generally the name of the branch the manifest file was in. If
* there's no default revision (branch) specified in manifest and no * there's no default revision (branch) specified in manifest and no
* revision specified in project, this branch will be used. * revision specified in project, this branch will be used.
@ -289,11 +290,29 @@ public RepoCommand setGroups(final String groups) {
* @param branch * @param branch
* @return this command * @return this command
*/ */
public RepoCommand setBranch(final String branch) { public RepoCommand setBranch(String branch) {
this.branch = branch; this.branch = branch;
return this; return this;
} }
/**
* Set target branch.
* <p>
* This is the target branch of the super project to be updated. If not set,
* default is HEAD.
* <p>
* For non-bare repositories, HEAD will always be used and this will be
* ignored.
*
* @param branch
* @return this command
* @since 4.1
*/
public RepoCommand setTargetBranch(String branch) {
this.targetBranch = Constants.R_HEADS + branch;
return this;
}
/** /**
* The progress monitor associated with the clone operation. By default, * The progress monitor associated with the clone operation. By default,
* this is set to <code>NullProgressMonitor</code> * this is set to <code>NullProgressMonitor</code>
@ -309,7 +328,7 @@ public RepoCommand setProgressMonitor(final ProgressMonitor monitor) {
/** /**
* Set the author/committer for the bare repository commit. * Set the author/committer for the bare repository commit.
* * <p>
* For non-bare repositories, the current user will be used and this will be * For non-bare repositories, the current user will be used and this will be
* ignored. * ignored.
* *
@ -445,7 +464,7 @@ public RevCommit call() throws GitAPIException {
ObjectId treeId = index.writeTree(inserter); ObjectId treeId = index.writeTree(inserter);
// Create a Commit object, populate it and write it // Create a Commit object, populate it and write it
ObjectId headId = repo.resolve(Constants.HEAD + "^{commit}"); //$NON-NLS-1$ ObjectId headId = repo.resolve(targetBranch + "^{commit}"); //$NON-NLS-1$
CommitBuilder commit = new CommitBuilder(); CommitBuilder commit = new CommitBuilder();
commit.setTreeId(treeId); commit.setTreeId(treeId);
if (headId != null) if (headId != null)
@ -457,7 +476,7 @@ public RevCommit call() throws GitAPIException {
ObjectId commitId = inserter.insert(commit); ObjectId commitId = inserter.insert(commit);
inserter.flush(); inserter.flush();
RefUpdate ru = repo.updateRef(Constants.HEAD); RefUpdate ru = repo.updateRef(targetBranch);
ru.setNewObjectId(commitId); ru.setNewObjectId(commitId);
ru.setExpectedOldObjectId(headId != null ? headId : ObjectId.zeroId()); ru.setExpectedOldObjectId(headId != null ? headId : ObjectId.zeroId());
Result rc = ru.update(rw); Result rc = ru.update(rw);
@ -471,12 +490,14 @@ public RevCommit call() throws GitAPIException {
case REJECTED: case REJECTED:
case LOCK_FAILURE: case LOCK_FAILURE:
throw new ConcurrentRefUpdateException( throw new ConcurrentRefUpdateException(
JGitText.get().couldNotLockHEAD, ru.getRef(), MessageFormat.format(
JGitText.get().cannotLock, targetBranch),
ru.getRef(),
rc); rc);
default: default:
throw new JGitInternalException(MessageFormat.format( throw new JGitInternalException(MessageFormat.format(
JGitText.get().updatingRefFailed, JGitText.get().updatingRefFailed,
Constants.HEAD, commitId.name(), rc)); targetBranch, commitId.name(), rc));
} }
return rw.parseCommit(commitId); return rw.parseCommit(commitId);