mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-08 14:35:45 +01:00
Fix NPE in dry run for missing branches
This commit is contained in:
@@ -62,12 +62,24 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
try {
|
try {
|
||||||
Repository repository = context.open();
|
Repository repository = context.open();
|
||||||
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true);
|
ResolveMerger merger = (ResolveMerger) MergeStrategy.RECURSIVE.newMerger(repository, true);
|
||||||
return new MergeDryRunCommandResult(merger.merge(repository.resolve(request.getBranchToMerge()), repository.resolve(request.getTargetBranch())));
|
return new MergeDryRunCommandResult(
|
||||||
|
merger.merge(
|
||||||
|
resolveRevisionOrThrowNotFound(repository, request.getBranchToMerge()),
|
||||||
|
resolveRevisionOrThrowNotFound(repository, request.getTargetBranch())));
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new InternalRepositoryException(context.getRepository(), "could not clone repository for merge", e);
|
throw new InternalRepositoryException(context.getRepository(), "could not clone repository for merge", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ObjectId resolveRevisionOrThrowNotFound(Repository repository, String revision) throws IOException {
|
||||||
|
ObjectId resolved = repository.resolve(revision);
|
||||||
|
if (resolved == null) {
|
||||||
|
throw notFound(entity("revision", revision).in(context.getRepository()));
|
||||||
|
} else {
|
||||||
|
return resolved;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class MergeWorker {
|
private class MergeWorker {
|
||||||
|
|
||||||
private final String target;
|
private final String target;
|
||||||
@@ -110,9 +122,6 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
private void checkOutTargetAsNewLocalBranch() throws IOException {
|
private void checkOutTargetAsNewLocalBranch() throws IOException {
|
||||||
try {
|
try {
|
||||||
ObjectId targetRevision = resolveRevision(target);
|
ObjectId targetRevision = resolveRevision(target);
|
||||||
if (targetRevision == null) {
|
|
||||||
throw notFound(entity("revision", target).in(context.getRepository()));
|
|
||||||
}
|
|
||||||
clone.checkout().setStartPoint(targetRevision.getName()).setName(target).setCreateBranch(true).call();
|
clone.checkout().setStartPoint(targetRevision.getName()).setName(target).setCreateBranch(true).call();
|
||||||
} catch (RefNotFoundException e) {
|
} catch (RefNotFoundException e) {
|
||||||
logger.debug("could not checkout target branch {} for merge as local branch", target, e);
|
logger.debug("could not checkout target branch {} for merge as local branch", target, e);
|
||||||
@@ -126,9 +135,6 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
MergeResult result;
|
MergeResult result;
|
||||||
try {
|
try {
|
||||||
ObjectId sourceRevision = resolveRevision(toMerge);
|
ObjectId sourceRevision = resolveRevision(toMerge);
|
||||||
if (sourceRevision == null) {
|
|
||||||
throw notFound(entity("revision", toMerge).in(context.getRepository()));
|
|
||||||
}
|
|
||||||
result = clone.merge()
|
result = clone.merge()
|
||||||
.setFastForward(FastForwardMode.NO_FF)
|
.setFastForward(FastForwardMode.NO_FF)
|
||||||
.setCommit(false) // we want to set the author manually
|
.setCommit(false) // we want to set the author manually
|
||||||
@@ -190,10 +196,10 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand
|
|||||||
return MergeCommandResult.failure(result.getConflicts().keySet());
|
return MergeCommandResult.failure(result.getConflicts().keySet());
|
||||||
}
|
}
|
||||||
|
|
||||||
private ObjectId resolveRevision(String branchToMerge) throws IOException {
|
private ObjectId resolveRevision(String revision) throws IOException {
|
||||||
ObjectId resolved = clone.getRepository().resolve(branchToMerge);
|
ObjectId resolved = clone.getRepository().resolve(revision);
|
||||||
if (resolved == null) {
|
if (resolved == null) {
|
||||||
return clone.getRepository().resolve("origin/" + branchToMerge);
|
return resolveRevisionOrThrowNotFound(clone.getRepository(), "origin/" + revision);
|
||||||
} else {
|
} else {
|
||||||
return resolved;
|
return resolved;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,12 +16,14 @@ import org.junit.After;
|
|||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import sonia.scm.NotFoundException;
|
||||||
import sonia.scm.repository.GitRepositoryHandler;
|
import sonia.scm.repository.GitRepositoryHandler;
|
||||||
import sonia.scm.repository.Person;
|
import sonia.scm.repository.Person;
|
||||||
import sonia.scm.repository.PreProcessorUtil;
|
import sonia.scm.repository.PreProcessorUtil;
|
||||||
import sonia.scm.repository.RepositoryManager;
|
import sonia.scm.repository.RepositoryManager;
|
||||||
import sonia.scm.repository.api.HookContextFactory;
|
import sonia.scm.repository.api.HookContextFactory;
|
||||||
import sonia.scm.repository.api.MergeCommandResult;
|
import sonia.scm.repository.api.MergeCommandResult;
|
||||||
|
import sonia.scm.repository.api.MergeDryRunCommandResult;
|
||||||
import sonia.scm.user.User;
|
import sonia.scm.user.User;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -220,6 +222,46 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase {
|
|||||||
assertThat(new String(contentOfFileB)).isEqualTo("b\ncontent from branch\n");
|
assertThat(new String(contentOfFileB)).isEqualTo("b\ncontent from branch\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotFoundException.class)
|
||||||
|
public void shouldHandleNotExistingSourceBranchInMerge() {
|
||||||
|
GitMergeCommand command = createCommand();
|
||||||
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setTargetBranch("mergeable");
|
||||||
|
request.setBranchToMerge("not_existing");
|
||||||
|
|
||||||
|
command.merge(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotFoundException.class)
|
||||||
|
public void shouldHandleNotExistingTargetBranchInMerge() {
|
||||||
|
GitMergeCommand command = createCommand();
|
||||||
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setTargetBranch("not_existing");
|
||||||
|
request.setBranchToMerge("master");
|
||||||
|
|
||||||
|
command.merge(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotFoundException.class)
|
||||||
|
public void shouldHandleNotExistingSourceBranchInDryRun() {
|
||||||
|
GitMergeCommand command = createCommand();
|
||||||
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setTargetBranch("mergeable");
|
||||||
|
request.setBranchToMerge("not_existing");
|
||||||
|
|
||||||
|
command.dryRun(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = NotFoundException.class)
|
||||||
|
public void shouldHandleNotExistingTargetBranchInDryRun() {
|
||||||
|
GitMergeCommand command = createCommand();
|
||||||
|
MergeCommandRequest request = new MergeCommandRequest();
|
||||||
|
request.setTargetBranch("not_existing");
|
||||||
|
request.setBranchToMerge("master");
|
||||||
|
|
||||||
|
command.dryRun(request);
|
||||||
|
}
|
||||||
|
|
||||||
private GitMergeCommand createCommand() {
|
private GitMergeCommand createCommand() {
|
||||||
return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory());
|
return new GitMergeCommand(createContext(), repository, new SimpleGitWorkdirFactory());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user