diff --git a/pom.xml b/pom.xml index 8f3a377..cd99ab0 100644 --- a/pom.xml +++ b/pom.xml @@ -23,6 +23,7 @@ 3.10.0 0.4.0 2.18.3 + 0.9.0 @@ -36,7 +37,11 @@ mon ${mon.version} - + + com.github.zafarkhaja + java-semver + ${java-semver.version} + org.projectlombok lombok diff --git a/src/main/java/net/kemitix/gitdb/GitDB.java b/src/main/java/net/kemitix/gitdb/GitDB.java index 4bad3f5..06c58e7 100644 --- a/src/main/java/net/kemitix/gitdb/GitDB.java +++ b/src/main/java/net/kemitix/gitdb/GitDB.java @@ -21,6 +21,7 @@ package net.kemitix.gitdb; +import com.github.zafarkhaja.semver.Version; import net.kemitix.gitdb.impl.LocalGitDB; import java.io.IOException; @@ -34,6 +35,12 @@ import java.util.Optional; */ public interface GitDB { + int MAJOR = 1; + int MINOR = 0; + int PATCH = 0; + + Version VERSION = Version.forIntegers(MAJOR, MINOR, PATCH); + /** * Initialise a new local gitdb. * @@ -71,4 +78,5 @@ public interface GitDB { * @throws IOException if there is an error accessing the branch name */ Optional branch(String name) throws IOException; + } diff --git a/src/main/java/net/kemitix/gitdb/GitDBBranch.java b/src/main/java/net/kemitix/gitdb/GitDBBranch.java index deeb3b4..9e53123 100644 --- a/src/main/java/net/kemitix/gitdb/GitDBBranch.java +++ b/src/main/java/net/kemitix/gitdb/GitDBBranch.java @@ -21,6 +21,8 @@ package net.kemitix.gitdb; +import com.github.zafarkhaja.semver.Version; + import java.io.IOException; import java.util.Optional; @@ -58,4 +60,14 @@ public interface GitDBBranch { * @throws IOException if there was an error removing the key/value */ GitDBBranch remove(String key) throws IOException; + + /** + * Returns the GitDB format for the current branch. + * + *

Different branches can have different versions.

+ * + * @return the format as per semantic versioning, i.e. "x.y.z" within an Optional + * @throws IOException error reading version + */ + Optional getFormatVersion() throws IOException; } diff --git a/src/main/java/net/kemitix/gitdb/impl/GitDBBranchImpl.java b/src/main/java/net/kemitix/gitdb/impl/GitDBBranchImpl.java index 65a828b..2f88ab1 100644 --- a/src/main/java/net/kemitix/gitdb/impl/GitDBBranchImpl.java +++ b/src/main/java/net/kemitix/gitdb/impl/GitDBBranchImpl.java @@ -21,6 +21,7 @@ package net.kemitix.gitdb.impl; +import com.github.zafarkhaja.semver.Version; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import net.kemitix.gitdb.GitDBBranch; @@ -99,6 +100,12 @@ class GitDBBranchImpl implements GitDBBranch { return this; } + @Override + public Optional getFormatVersion() throws IOException { + return gitDBRepo.readValue(branchRef, "GitDB.Version") + .map(Version::valueOf); + } + private String commitMessageForAdd(final String key, final String value) { return String.format("Add key [%s] = [%s]", key, value); } diff --git a/src/main/java/net/kemitix/gitdb/impl/InitGitDBRepo.java b/src/main/java/net/kemitix/gitdb/impl/InitGitDBRepo.java index 149a630..ee65fbd 100644 --- a/src/main/java/net/kemitix/gitdb/impl/InitGitDBRepo.java +++ b/src/main/java/net/kemitix/gitdb/impl/InitGitDBRepo.java @@ -21,6 +21,7 @@ package net.kemitix.gitdb.impl; +import net.kemitix.gitdb.GitDB; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.RepositoryCache; @@ -45,7 +46,7 @@ class InitGitDBRepo { private static final String INIT_USER = "GitDB"; private static final String INIT_EMAIL = "pcampbell@kemitix.net"; private static final String MASTER = "master"; - private static final String IS_GIT_DB = "isGitDB"; + private static final String GIT_DB_VERSION = "GitDB.Version"; private static final String REFS_HEADS_FORMAT = "refs/heads/%s"; /** @@ -65,8 +66,9 @@ class InitGitDBRepo { private void createInitialBranchOnMaster(final Repository repository) throws IOException { final GitDBRepo repo = new GitDBRepo(repository); - final ObjectId objectId = repo.insertBlob(new byte[0]); - final ObjectId treeId = repo.insertNewTree(IS_GIT_DB, objectId); + final ObjectId objectId = + repo.insertBlob(GitDB.VERSION.toString().getBytes(StandardCharsets.UTF_8)); + final ObjectId treeId = repo.insertNewTree(GIT_DB_VERSION, objectId); final ObjectId commitId = repo.initialCommit(treeId, INIT_MESSAGE, INIT_USER, INIT_EMAIL); createBranch(repository, commitId, MASTER); } diff --git a/src/test/java/net/kemitix/gitdb/test/GitDBTest.java b/src/test/java/net/kemitix/gitdb/test/GitDBTest.java index d72517b..dec963d 100644 --- a/src/test/java/net/kemitix/gitdb/test/GitDBTest.java +++ b/src/test/java/net/kemitix/gitdb/test/GitDBTest.java @@ -1,5 +1,6 @@ package net.kemitix.gitdb.test; +import com.github.zafarkhaja.semver.Version; import net.kemitix.gitdb.GitDB; import net.kemitix.gitdb.GitDBBranch; import net.kemitix.gitdb.InvalidRepositoryException; @@ -213,6 +214,18 @@ class GitDBTest implements WithAssertions { return branchOptional.get(); } + // When getting the format version it matches expected + @Test + void getVersionFormat_thenFormatIsSet() throws IOException { + //given + final GitDBBranch gitDBBranch = gitDBBranch(); + //when + final Optional formatVersion = gitDBBranch.getFormatVersion(); + //then + assertThat(formatVersion).contains(GitDB.VERSION); + assertThat(formatVersion.get()).isNotSameAs(GitDB.VERSION); + } + // When putting a key/value pair then a GitDbBranch is returned @Test void putValue_thenReturnUpdatedGitDBBranch() throws IOException {