Allow programmatic remote configuration for PullCommand
Also imply remoteBranchName to match current branch name if it wasn't configured in branch configuration. Bug: 424812 Change-Id: Id852cedaefb2a537b6aa3c330b9861efad052f11 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
parent
7bb7299e8a
commit
1eae309723
|
@ -232,6 +232,71 @@ public void testPullEmptyRepository() throws Exception {
|
||||||
Git.wrap(empty).pull().call();
|
Git.wrap(empty).pull().call();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPullMergeProgrammaticConfiguration() throws Exception {
|
||||||
|
// create another commit on another branch in source
|
||||||
|
source.checkout().setCreateBranch(true).setName("other").call();
|
||||||
|
sourceFile = new File(db.getWorkTree(), "file2.txt");
|
||||||
|
writeToFile(sourceFile, "content");
|
||||||
|
source.add().addFilepattern("file2.txt").call();
|
||||||
|
RevCommit sourceCommit = source.commit()
|
||||||
|
.setMessage("source commit on branch other").call();
|
||||||
|
|
||||||
|
File targetFile2 = new File(dbTarget.getWorkTree(), "OtherFile.txt");
|
||||||
|
writeToFile(targetFile2, "Unconflicting change");
|
||||||
|
target.add().addFilepattern("OtherFile.txt").call();
|
||||||
|
RevCommit targetCommit = target.commit()
|
||||||
|
.setMessage("Unconflicting change in local").call();
|
||||||
|
|
||||||
|
PullResult res = target.pull().setRemote("origin")
|
||||||
|
.setRemoteBranchName("other")
|
||||||
|
.setRebase(false).call();
|
||||||
|
|
||||||
|
MergeResult mergeResult = res.getMergeResult();
|
||||||
|
ObjectId[] mergedCommits = mergeResult.getMergedCommits();
|
||||||
|
assertEquals(targetCommit.getId(), mergedCommits[0]);
|
||||||
|
assertEquals(sourceCommit.getId(), mergedCommits[1]);
|
||||||
|
RevCommit mergeCommit = new RevWalk(dbTarget).parseCommit(mergeResult
|
||||||
|
.getNewHead());
|
||||||
|
String message = "Merge branch 'other' of "
|
||||||
|
+ db.getWorkTree().getAbsolutePath();
|
||||||
|
assertEquals(message, mergeCommit.getShortMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPullMergeProgrammaticConfigurationImpliedTargetBranch()
|
||||||
|
throws Exception {
|
||||||
|
// create another commit on another branch in source
|
||||||
|
source.checkout().setCreateBranch(true).setName("other").call();
|
||||||
|
sourceFile = new File(db.getWorkTree(), "file2.txt");
|
||||||
|
writeToFile(sourceFile, "content");
|
||||||
|
source.add().addFilepattern("file2.txt").call();
|
||||||
|
RevCommit sourceCommit = source.commit()
|
||||||
|
.setMessage("source commit on branch other").call();
|
||||||
|
|
||||||
|
target.checkout().setCreateBranch(true).setName("other").call();
|
||||||
|
File targetFile2 = new File(dbTarget.getWorkTree(), "OtherFile.txt");
|
||||||
|
writeToFile(targetFile2, "Unconflicting change");
|
||||||
|
target.add().addFilepattern("OtherFile.txt").call();
|
||||||
|
RevCommit targetCommit = target.commit()
|
||||||
|
.setMessage("Unconflicting change in local").call();
|
||||||
|
|
||||||
|
// the source branch "other" matching the target branch should be
|
||||||
|
// implied
|
||||||
|
PullResult res = target.pull().setRemote("origin").setRebase(false)
|
||||||
|
.call();
|
||||||
|
|
||||||
|
MergeResult mergeResult = res.getMergeResult();
|
||||||
|
ObjectId[] mergedCommits = mergeResult.getMergedCommits();
|
||||||
|
assertEquals(targetCommit.getId(), mergedCommits[0]);
|
||||||
|
assertEquals(sourceCommit.getId(), mergedCommits[1]);
|
||||||
|
RevCommit mergeCommit = new RevWalk(dbTarget).parseCommit(mergeResult
|
||||||
|
.getNewHead());
|
||||||
|
String message = "Merge branch 'other' of "
|
||||||
|
+ db.getWorkTree().getAbsolutePath() + " into other";
|
||||||
|
assertEquals(message, mergeCommit.getShortMessage());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
|
|
|
@ -82,6 +82,10 @@ public class PullCommand extends TransportCommand<PullCommand, PullResult> {
|
||||||
|
|
||||||
private PullRebaseMode pullRebaseMode = PullRebaseMode.USE_CONFIG;
|
private PullRebaseMode pullRebaseMode = PullRebaseMode.USE_CONFIG;
|
||||||
|
|
||||||
|
private String remote;
|
||||||
|
|
||||||
|
private String remoteBranchName;
|
||||||
|
|
||||||
private enum PullRebaseMode {
|
private enum PullRebaseMode {
|
||||||
USE_CONFIG,
|
USE_CONFIG,
|
||||||
REBASE,
|
REBASE,
|
||||||
|
@ -177,19 +181,22 @@ public PullResult call() throws GitAPIException,
|
||||||
JGitText.get().cannotPullOnARepoWithState, repo
|
JGitText.get().cannotPullOnARepoWithState, repo
|
||||||
.getRepositoryState().name()));
|
.getRepositoryState().name()));
|
||||||
|
|
||||||
|
Config repoConfig = repo.getConfig();
|
||||||
|
if (remote == null) {
|
||||||
// get the configured remote for the currently checked out branch
|
// get the configured remote for the currently checked out branch
|
||||||
// stored in configuration key branch.<branch name>.remote
|
// stored in configuration key branch.<branch name>.remote
|
||||||
Config repoConfig = repo.getConfig();
|
remote = repoConfig.getString(
|
||||||
String remote = repoConfig.getString(
|
|
||||||
ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
|
ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
|
||||||
ConfigConstants.CONFIG_KEY_REMOTE);
|
ConfigConstants.CONFIG_KEY_REMOTE);
|
||||||
|
}
|
||||||
if (remote == null)
|
if (remote == null)
|
||||||
// fall back to default remote
|
// fall back to default remote
|
||||||
remote = Constants.DEFAULT_REMOTE_NAME;
|
remote = Constants.DEFAULT_REMOTE_NAME;
|
||||||
|
|
||||||
|
if (remoteBranchName == null)
|
||||||
// get the name of the branch in the remote repository
|
// get the name of the branch in the remote repository
|
||||||
// stored in configuration key branch.<branch name>.merge
|
// stored in configuration key branch.<branch name>.merge
|
||||||
String remoteBranchName = repoConfig.getString(
|
remoteBranchName = repoConfig.getString(
|
||||||
ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
|
ConfigConstants.CONFIG_BRANCH_SECTION, branchName,
|
||||||
ConfigConstants.CONFIG_KEY_MERGE);
|
ConfigConstants.CONFIG_KEY_MERGE);
|
||||||
|
|
||||||
|
@ -211,12 +218,8 @@ public PullResult call() throws GitAPIException,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (remoteBranchName == null) {
|
if (remoteBranchName == null)
|
||||||
String missingKey = ConfigConstants.CONFIG_BRANCH_SECTION + DOT
|
remoteBranchName = branchName;
|
||||||
+ branchName + DOT + ConfigConstants.CONFIG_KEY_MERGE;
|
|
||||||
throw new InvalidConfigurationException(MessageFormat.format(
|
|
||||||
JGitText.get().missingConfigurationForKey, missingKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean isRemote = !remote.equals("."); //$NON-NLS-1$
|
final boolean isRemote = !remote.equals("."); //$NON-NLS-1$
|
||||||
String remoteUri;
|
String remoteUri;
|
||||||
|
@ -309,4 +312,53 @@ public PullResult call() throws GitAPIException,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The remote (uri or name) to be used for the pull operation. If no remote
|
||||||
|
* is set, the branch's configuration will be used. If the branch
|
||||||
|
* configuration is missing the default value of
|
||||||
|
* <code>Constants.DEFAULT_REMOTE_NAME</code> will be used.
|
||||||
|
*
|
||||||
|
* @see Constants#DEFAULT_REMOTE_NAME
|
||||||
|
* @param remote
|
||||||
|
* @return {@code this}
|
||||||
|
* @since 3.3
|
||||||
|
*/
|
||||||
|
public PullCommand setRemote(String remote) {
|
||||||
|
checkCallable();
|
||||||
|
this.remote = remote;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The remote branch name to be used for the pull operation. If no
|
||||||
|
* remoteBranchName is set, the branch's configuration will be used. If the
|
||||||
|
* branch configuration is missing the remote branch with the same name as
|
||||||
|
* the current branch is used.
|
||||||
|
*
|
||||||
|
* @param remoteBranchName
|
||||||
|
* @return {@code this}
|
||||||
|
* @since 3.3
|
||||||
|
*/
|
||||||
|
public PullCommand setRemoteBranchName(String remoteBranchName) {
|
||||||
|
checkCallable();
|
||||||
|
this.remoteBranchName = remoteBranchName;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the remote used for the pull operation if it was set explicitly
|
||||||
|
* @since 3.3
|
||||||
|
*/
|
||||||
|
public String getRemote() {
|
||||||
|
return remote;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the remote branch name used for the pull operation if it was set
|
||||||
|
* explicitly
|
||||||
|
* @since 3.3
|
||||||
|
*/
|
||||||
|
public String getRemoteBranchName() {
|
||||||
|
return remoteBranchName;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue