Add parameter to check current revision to prevent conflicts

This commit is contained in:
Rene Pfeuffer
2019-09-03 10:36:23 +02:00
parent 695457e949
commit 379c58d3a9
5 changed files with 48 additions and 11 deletions

View File

@@ -240,6 +240,10 @@ class AbstractGitCommand
logger.debug("pushed changes");
}
Ref getCurrentRevision() throws IOException {
return getClone().getRepository().getRefDatabase().findRef("HEAD");
}
private Person determineAuthor(Person author) {
if (author == null) {
Subject subject = SecurityUtils.getSubject();

View File

@@ -5,6 +5,7 @@ import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.BadRequestException;
import sonia.scm.ConcurrentModificationException;
import sonia.scm.ContextEntry;
import sonia.scm.repository.GitWorkdirFactory;
import sonia.scm.repository.InternalRepositoryException;
@@ -51,6 +52,11 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman
if (!StringUtils.isEmpty(request.getBranch())) {
checkOutBranch(request.getBranch());
}
if (!StringUtils.isEmpty(request.getExpectedRevision())) {
if (!request.getExpectedRevision().equals(getCurrentRevision().getName())) {
throw new ConcurrentModificationException("branch", request.getBranch() == null? "default": request.getBranch());
}
}
for (ModifyCommandRequest.PartialRequest r : request.getRequests()) {
r.execute(this);
}

View File

@@ -15,6 +15,7 @@ import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import sonia.scm.AlreadyExistsException;
import sonia.scm.BadRequestException;
import sonia.scm.ConcurrentModificationException;
import sonia.scm.repository.Person;
import sonia.scm.repository.util.WorkdirProvider;
@@ -56,7 +57,7 @@ public class GitModifyCommandTest extends AbstractGitCommandTestBase {
}
@Test
public void shouldCreateCommitOnSelectedBranch() throws IOException, GitAPIException {
public void shouldCreateCommitOnSelectedBranch() throws IOException {
File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile();
GitModifyCommand command = createCommand();
@@ -95,7 +96,7 @@ public class GitModifyCommandTest extends AbstractGitCommandTestBase {
}
@Test(expected = AlreadyExistsException.class)
public void shouldFailIfOverwritingExistingFileWithoutOverwriteFlag() throws IOException, GitAPIException {
public void shouldFailIfOverwritingExistingFileWithoutOverwriteFlag() throws IOException {
File newFile = Files.write(temporaryFolder.newFile().toPath(), "new content".getBytes()).toFile();
GitModifyCommand command = createCommand();
@@ -140,6 +141,21 @@ public class GitModifyCommandTest extends AbstractGitCommandTestBase {
command.execute(request);
}
@Test(expected = ConcurrentModificationException.class)
public void shouldFailBranchDoesNotHaveExpectedRevision() throws IOException {
File newFile = Files.write(temporaryFolder.newFile().toPath(), "irrelevant\n".getBytes()).toFile();
GitModifyCommand command = createCommand();
ModifyCommandRequest request = new ModifyCommandRequest();
request.setCommitMessage("test commit");
request.addRequest(new ModifyCommandRequest.CreateFileRequest("irrelevant", newFile, true));
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
request.setExpectedRevision("abc");
command.execute(request);
}
private void assertInTree(TreeAssertions assertions) throws IOException, GitAPIException {
try (Git git = new Git(createContext().open())) {
RevCommit lastCommit = getLastCommit(git);