Implement delete for git

This commit is contained in:
Rene Pfeuffer
2019-09-04 10:31:01 +02:00
parent 379c58d3a9
commit c37ed20303
4 changed files with 67 additions and 8 deletions

View File

@@ -8,7 +8,7 @@ public interface ModifyCommand {
String execute(ModifyCommandRequest request); String execute(ModifyCommandRequest request);
interface Worker { interface Worker {
void delete(String toBeDeleted); void delete(String toBeDeleted) throws IOException;
void create(String toBeCreated, File file, boolean overwrite) throws IOException; void create(String toBeCreated, File file, boolean overwrite) throws IOException;

View File

@@ -89,7 +89,7 @@ public class ModifyCommandRequest implements Resetable, Validateable {
} }
@Override @Override
public void execute(ModifyCommand.Worker worker) { public void execute(ModifyCommand.Worker worker) throws IOException {
worker.delete(path); worker.delete(path);
} }
} }

View File

@@ -7,6 +7,7 @@ import org.eclipse.jgit.revwalk.RevCommit;
import sonia.scm.BadRequestException; import sonia.scm.BadRequestException;
import sonia.scm.ConcurrentModificationException; import sonia.scm.ConcurrentModificationException;
import sonia.scm.ContextEntry; import sonia.scm.ContextEntry;
import sonia.scm.NotFoundException;
import sonia.scm.repository.GitWorkdirFactory; import sonia.scm.repository.GitWorkdirFactory;
import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
@@ -15,6 +16,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.FileAlreadyExistsException; import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Optional; import java.util.Optional;
@@ -76,11 +78,7 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman
try { try {
Files.copy(file.toPath(), targetFile); Files.copy(file.toPath(), targetFile);
} catch (FileAlreadyExistsException e) { } catch (FileAlreadyExistsException e) {
ContextEntry.ContextBuilder contextBuilder = entity("file", toBeCreated); throw alreadyExists(createFileContext(toBeCreated));
if (!StringUtils.isEmpty(request.getBranch())) {
contextBuilder.in("branch", request.getBranch());
}
throw alreadyExists(contextBuilder.in(context.getRepository()));
} }
} }
try { try {
@@ -91,8 +89,27 @@ public class GitModifyCommand extends AbstractGitCommand implements ModifyComman
} }
@Override @Override
public void delete(String toBeDeleted) { public void delete(String toBeDeleted) throws IOException {
Path fileToBeDeleted = new File(workDir, toBeDeleted).toPath();
try {
Files.delete(fileToBeDeleted);
} catch (NoSuchFileException e) {
throw NotFoundException.notFound(createFileContext(toBeDeleted));
}
try {
getClone().rm().addFilepattern(toBeDeleted).call();
} catch (GitAPIException e) {
throwInternalRepositoryException("could not remove file from index", e);
}
}
private ContextEntry.ContextBuilder createFileContext(String toBeDeleted) {
ContextEntry.ContextBuilder contextBuilder = entity("file", toBeDeleted);
if (!StringUtils.isEmpty(request.getBranch())) {
contextBuilder.in("branch", request.getBranch());
}
contextBuilder.in(context.getRepository());
return contextBuilder;
} }
@Override @Override

View File

@@ -16,6 +16,7 @@ import org.junit.rules.TemporaryFolder;
import sonia.scm.AlreadyExistsException; import sonia.scm.AlreadyExistsException;
import sonia.scm.BadRequestException; import sonia.scm.BadRequestException;
import sonia.scm.ConcurrentModificationException; import sonia.scm.ConcurrentModificationException;
import sonia.scm.NotFoundException;
import sonia.scm.repository.Person; import sonia.scm.repository.Person;
import sonia.scm.repository.util.WorkdirProvider; import sonia.scm.repository.util.WorkdirProvider;
@@ -156,6 +157,47 @@ public class GitModifyCommandTest extends AbstractGitCommandTestBase {
command.execute(request); command.execute(request);
} }
@Test
public void shouldDeleteExistingFile() throws IOException, GitAPIException {
GitModifyCommand command = createCommand();
ModifyCommandRequest request = new ModifyCommandRequest();
request.setCommitMessage("test commit");
request.addRequest(new ModifyCommandRequest.DeleteFileRequest("a.txt"));
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
command.execute(request);
TreeAssertions assertions = canonicalTreeParser -> assertThat(canonicalTreeParser.findFile("a.txt")).isFalse();
assertInTree(assertions);
}
@Test(expected = NotFoundException.class)
public void shouldThrowNotFoundExceptionWhenFileToDeleteDoesNotExist() {
GitModifyCommand command = createCommand();
ModifyCommandRequest request = new ModifyCommandRequest();
request.setCommitMessage("test commit");
request.addRequest(new ModifyCommandRequest.DeleteFileRequest("no/such/file"));
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
command.execute(request);
}
@Test(expected = NotFoundException.class)
public void shouldThrowNotFoundExceptionWhenBranchDoesNotExist() {
GitModifyCommand command = createCommand();
ModifyCommandRequest request = new ModifyCommandRequest();
request.setBranch("does-not-exist");
request.setCommitMessage("test commit");
request.addRequest(new ModifyCommandRequest.DeleteFileRequest("a.txt"));
request.setAuthor(new Person("Dirk Gently", "dirk@holistic.det"));
command.execute(request);
}
private void assertInTree(TreeAssertions assertions) throws IOException, GitAPIException { private void assertInTree(TreeAssertions assertions) throws IOException, GitAPIException {
try (Git git = new Git(createContext().open())) { try (Git git = new Git(createContext().open())) {
RevCommit lastCommit = getLastCommit(git); RevCommit lastCommit = getLastCommit(git);