diff --git a/pom.xml b/pom.xml index 929f227..8f3a377 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ 5.2.0 3.10.0 0.4.0 + 2.18.3 @@ -59,6 +60,12 @@ junit-jupiter-engine runtime + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + diff --git a/src/main/java/net/kemitix/gitdb/GitDB.java b/src/main/java/net/kemitix/gitdb/GitDB.java index 201f326..25d5302 100644 --- a/src/main/java/net/kemitix/gitdb/GitDB.java +++ b/src/main/java/net/kemitix/gitdb/GitDB.java @@ -22,9 +22,8 @@ package net.kemitix.gitdb; import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.InitCommand; -import org.eclipse.jgit.api.errors.GitAPIException; +import java.nio.file.NotDirectoryException; import java.nio.file.Path; /** @@ -39,12 +38,10 @@ public interface GitDB { * * @param dbDir the path to initialise the local repo in * @return a GitDB instance for the created local gitdb - * @throws GitAPIException if there is an error initialising the Git repo + * @throws NotDirectoryException if {@code dbDir} it is not a directory */ - static GitDB initLocal(final Path dbDir) throws GitAPIException { - final InitCommand initCommand = Git.init().setGitDir(dbDir.toFile()).setBare(true); - final Git git = initCommand.call(); - return new GitDBLocal(git); + static GitDB initLocal(final Path dbDir) throws NotDirectoryException { + return new GitDBLocal(Git.init(), dbDir.toFile()); } } diff --git a/src/main/java/net/kemitix/gitdb/GitDBLocal.java b/src/main/java/net/kemitix/gitdb/GitDBLocal.java index df29913..290bccd 100644 --- a/src/main/java/net/kemitix/gitdb/GitDBLocal.java +++ b/src/main/java/net/kemitix/gitdb/GitDBLocal.java @@ -21,19 +21,42 @@ package net.kemitix.gitdb; -import lombok.RequiredArgsConstructor; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.InitCommand; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.api.errors.JGitInternalException; + +import java.io.File; +import java.nio.file.NotDirectoryException; /** * Implementation of GitDB for working with a local Repo. * * @author Paul Campbell (pcampbell@kemitix.net) */ -@RequiredArgsConstructor + class GitDBLocal implements GitDB { private final Git git; + /** + * Constructors a new instance of this class. + * + * @param initCommand a JGit InitCommand + * @param dbDir the path to instantiate the git repo in + * @throws NotDirectoryException if {@code dbDir} it is not a directory + */ + @SuppressWarnings("avoidhidingcauseexception") + GitDBLocal(final InitCommand initCommand, final File dbDir) throws NotDirectoryException { + try { + this.git = initCommand.setGitDir(dbDir).setBare(true).call(); + } catch (JGitInternalException e) { + throw new NotDirectoryException(dbDir.toString()); + } catch (GitAPIException e) { + throw new UnexpectedGitDbException("Unhandled Git API Exception", e); + } + } + // @Override // @SneakyThrows // public T get(Branch branch, Key key, Class type) { diff --git a/src/main/java/net/kemitix/gitdb/UnexpectedGitDbException.java b/src/main/java/net/kemitix/gitdb/UnexpectedGitDbException.java new file mode 100644 index 0000000..a6a32d8 --- /dev/null +++ b/src/main/java/net/kemitix/gitdb/UnexpectedGitDbException.java @@ -0,0 +1,45 @@ +/* + The MIT License (MIT) + + Copyright (c) 2018 Paul Campbell + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies + or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.kemitix.gitdb; + +/** + * Unchecked exception thrown when JGit throws a an unexpected exception. + * + * @author Paul Campbell (pcampbell@kemitix.net) + */ +public class UnexpectedGitDbException extends RuntimeException { + + /** + * Constructs an instance of this class. + * + * @param message the detail message. The detail message is saved for + * later retrieval by the {@link #getMessage()} method. + * @param cause the cause (which is saved for later retrieval by the + * {@link #getCause()} method). (A null value is + * permitted, and indicates that the cause is nonexistent or + * unknown.) + */ + public UnexpectedGitDbException(final String message, final Throwable cause) { + super(message, cause); + } + +} diff --git a/src/test/java/net/kemitix/gitdb/GitDBTest.java b/src/test/java/net/kemitix/gitdb/GitDBTest.java index f391bf7..325c812 100644 --- a/src/test/java/net/kemitix/gitdb/GitDBTest.java +++ b/src/test/java/net/kemitix/gitdb/GitDBTest.java @@ -1,17 +1,24 @@ package net.kemitix.gitdb; +import org.assertj.core.api.WithAssertions; +import org.eclipse.jgit.api.InitCommand; import org.eclipse.jgit.api.errors.GitAPIException; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import java.io.IOException; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; +import java.nio.file.*; import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.*; -class GitDBTest { +@ExtendWith(MockitoExtension.class) +class GitDBTest implements WithAssertions { // private final Branch master = Branch.name("master"); // private final Message message = Message.message(UUID.randomUUID().toString()); @@ -20,13 +27,13 @@ class GitDBTest { // When initialising a repo in a dir that doesn't exist then a bare repo is created @Test - void initRepo_whenDirNotExist_thenCreateBareRepo() throws IOException, GitAPIException { + void initRepo_whenDirNotExist_thenCreateBareRepo() throws IOException { //given final Path dir = dirDoesNotExist(); //when - final GitDB gitdb = GitDB.initLocal(dir); + final GitDB gitDB = GitDB.initLocal(dir); //then - assertThat(gitdb).isNotNull(); + assertThat(gitDB).isNotNull(); assertThatIsBareRepo(dir); } @@ -52,19 +59,43 @@ class GitDBTest { return directory; } + // When initialising a repo and an unexpected error occurs then an exception is thrown + @Test + void initRepo_whenUnexpectedError_thenThrowException() throws IOException, GitAPIException { + //given + final Path dbDir = dirDoesNotExist(); + final InitCommand initCommand = spy(InitCommand.class); + given(initCommand.call()).willThrow(mock(GitAPIException.class)); + //then + assertThatExceptionOfType(UnexpectedGitDbException.class) + .isThrownBy(() -> new GitDBLocal(initCommand, dbDir.toFile())) + .withMessageContaining("Unhandled Git API Exception"); + } + // When initialising a repo in a dir that is a file then an exception is thrown @Test - void initRepo_whenDirIsFile_thenThrowException() { + void initRepo_whenDirIsFile_thenThrowException() throws IOException { + //given + final Path dir = fileExists(); + //then + assertThatExceptionOfType(NotDirectoryException.class) + .isThrownBy(() -> GitDB.initLocal(dir)) + .withMessageContaining(dir.toString()); + } + + private Path fileExists() throws IOException { + return Files.createTempFile("gitdb", "file"); } // When initialising a repo in a dir is exists then an exception is thrown - @Test - void initRepo_whenDirExists_thenThrowException() { - } + //@Test + //void initRepo_whenDirExists_thenThrowException() { + //} - // When opening a repo in a dir that doesn't exist then an exception is thrown - // When opening a repo in a dir that is a file then an exception is thrown // When opening a repo in a dir that is not a bare repo then an exception is thrown + // When opening a repo in a dir that is a file then an exception is thrown + // When opening a repo in a dir that doesn't exist then an exception is thrown + // When opening a repo in a dir that is a bare repo then GitDb is returned // Given a valid GitDb handle