Extract InitGitDBRepo.create()
This commit is contained in:
parent
2246513bee
commit
837032b205
2 changed files with 114 additions and 68 deletions
|
@ -24,14 +24,8 @@ package net.kemitix.gitdb;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.eclipse.jgit.api.Git;
|
import org.eclipse.jgit.api.Git;
|
||||||
import org.eclipse.jgit.lib.*;
|
import org.eclipse.jgit.lib.*;
|
||||||
import org.eclipse.jgit.util.FS;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.nio.file.DirectoryNotEmptyException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.NotDirectoryException;
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
@ -43,14 +37,8 @@ import java.util.Optional;
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
class GitDBLocal implements GitDB {
|
class GitDBLocal implements GitDB {
|
||||||
|
|
||||||
private static final String INIT_MESSAGE = "Initialise GitDB v1";
|
|
||||||
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 NOT_A_BARE_REPO = "Not a bare repo";
|
private static final String NOT_A_BARE_REPO = "Not a bare repo";
|
||||||
private static final String ERROR_OPENING_REPOSITORY = "Error opening repository";
|
private static final String ERROR_OPENING_REPOSITORY = "Error opening repository";
|
||||||
private static final String REFS_HEADS_FORMAT = "refs/heads/%s";
|
|
||||||
|
|
||||||
private final Repository repository;
|
private final Repository repository;
|
||||||
private final String userName;
|
private final String userName;
|
||||||
|
@ -94,65 +82,10 @@ class GitDBLocal implements GitDB {
|
||||||
final String userName,
|
final String userName,
|
||||||
final String userEmailAddress
|
final String userEmailAddress
|
||||||
) throws IOException {
|
) throws IOException {
|
||||||
initRepo(validDbDir(dbDir.toFile()));
|
InitGitDBRepo.create(dbDir);
|
||||||
return open(dbDir, userName, userEmailAddress);
|
return open(dbDir, userName, userEmailAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static File validDbDir(final File dbDir) throws IOException {
|
|
||||||
verifyIsNotAFile(dbDir);
|
|
||||||
if (dbDir.exists()) {
|
|
||||||
verifyIsEmpty(dbDir);
|
|
||||||
}
|
|
||||||
return dbDir;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void verifyIsEmpty(final File dbDir) throws IOException {
|
|
||||||
if (Files.newDirectoryStream(dbDir.toPath()).iterator().hasNext()) {
|
|
||||||
throw new DirectoryNotEmptyException(dbDir.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void verifyIsNotAFile(final File dbDir) throws NotDirectoryException {
|
|
||||||
if (dbDir.isFile()) {
|
|
||||||
throw new NotDirectoryException(dbDir.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void initRepo(final File dbDir) throws IOException {
|
|
||||||
dbDir.mkdirs();
|
|
||||||
final Repository repository = RepositoryCache.FileKey.exact(dbDir, FS.DETECTED).open(false);
|
|
||||||
repository.create(true);
|
|
||||||
createInitialBranchOnMaster(repository);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createInitialBranchOnMaster(final Repository repository) throws IOException {
|
|
||||||
final GitDBRepo repo = GitDBRepo.in(repository);
|
|
||||||
final ObjectId objectId = repo.insertBlob(new byte[0]);
|
|
||||||
final ObjectId treeId = repo.insertNewTree(IS_GIT_DB, objectId);
|
|
||||||
final ObjectId commitId = repo.insertCommit(treeId, INIT_MESSAGE, INIT_USER, INIT_EMAIL, ObjectId.zeroId());
|
|
||||||
createBranch(repository, commitId, MASTER);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void createBranch(
|
|
||||||
final Repository repository,
|
|
||||||
final ObjectId commitId,
|
|
||||||
final String branchName
|
|
||||||
) throws IOException {
|
|
||||||
final Path branchRefPath = branchRefPath(repository, branchName);
|
|
||||||
final byte[] commitIdBytes = commitId.name().getBytes(StandardCharsets.UTF_8);
|
|
||||||
Files.write(branchRefPath, commitIdBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Path branchRefPath(
|
|
||||||
final Repository repository,
|
|
||||||
final String branchName
|
|
||||||
) {
|
|
||||||
return repository.getDirectory()
|
|
||||||
.toPath()
|
|
||||||
.resolve(String.format(REFS_HEADS_FORMAT, branchName))
|
|
||||||
.toAbsolutePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Optional<GitDBBranch> branch(final String name) throws IOException {
|
public Optional<GitDBBranch> branch(final String name) throws IOException {
|
||||||
return Optional.ofNullable(repository.findRef(name))
|
return Optional.ofNullable(repository.findRef(name))
|
||||||
|
|
113
src/main/java/net/kemitix/gitdb/InitGitDBRepo.java
Normal file
113
src/main/java/net/kemitix/gitdb/InitGitDBRepo.java
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
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;
|
||||||
|
|
||||||
|
import org.eclipse.jgit.lib.ObjectId;
|
||||||
|
import org.eclipse.jgit.lib.Repository;
|
||||||
|
import org.eclipse.jgit.lib.RepositoryCache;
|
||||||
|
import org.eclipse.jgit.util.FS;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.nio.file.DirectoryNotEmptyException;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.NotDirectoryException;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise a new GitDB Repo.
|
||||||
|
*
|
||||||
|
* @author Paul Campbell (pcampbell@kemitix.net)
|
||||||
|
*/
|
||||||
|
class InitGitDBRepo {
|
||||||
|
|
||||||
|
private static final String INIT_MESSAGE = "Initialise GitDB v1";
|
||||||
|
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 REFS_HEADS_FORMAT = "refs/heads/%s";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialise a new GitDB repo.
|
||||||
|
*
|
||||||
|
* @param dbDir the directory to initialise the repo in
|
||||||
|
* @throws IOException if there is an error in creating the repo files
|
||||||
|
*/
|
||||||
|
static void create(final Path dbDir) throws IOException {
|
||||||
|
final InitGitDBRepo initRepo = new InitGitDBRepo();
|
||||||
|
final File validDbDir = initRepo.validDbDir(dbDir.toFile());
|
||||||
|
validDbDir.mkdirs();
|
||||||
|
final Repository repository = RepositoryCache.FileKey.exact(validDbDir, FS.DETECTED).open(false);
|
||||||
|
repository.create(true);
|
||||||
|
initRepo.createInitialBranchOnMaster(repository);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createInitialBranchOnMaster(final Repository repository) throws IOException {
|
||||||
|
final GitDBRepo repo = GitDBRepo.in(repository);
|
||||||
|
final ObjectId objectId = repo.insertBlob(new byte[0]);
|
||||||
|
final ObjectId treeId = repo.insertNewTree(IS_GIT_DB, objectId);
|
||||||
|
final ObjectId commitId = repo.insertCommit(treeId, INIT_MESSAGE, INIT_USER, INIT_EMAIL, ObjectId.zeroId());
|
||||||
|
createBranch(repository, commitId, MASTER);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createBranch(
|
||||||
|
final Repository repository,
|
||||||
|
final ObjectId commitId,
|
||||||
|
final String branchName
|
||||||
|
) throws IOException {
|
||||||
|
final Path branchRefPath = branchRefPath(repository, branchName);
|
||||||
|
final byte[] commitIdBytes = commitId.name().getBytes(StandardCharsets.UTF_8);
|
||||||
|
Files.write(branchRefPath, commitIdBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Path branchRefPath(
|
||||||
|
final Repository repository,
|
||||||
|
final String branchName
|
||||||
|
) {
|
||||||
|
return repository.getDirectory()
|
||||||
|
.toPath()
|
||||||
|
.resolve(String.format(REFS_HEADS_FORMAT, branchName))
|
||||||
|
.toAbsolutePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
private File validDbDir(final File dbDir) throws IOException {
|
||||||
|
verifyIsNotAFile(dbDir);
|
||||||
|
if (dbDir.exists()) {
|
||||||
|
verifyIsEmpty(dbDir);
|
||||||
|
}
|
||||||
|
return dbDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyIsEmpty(final File dbDir) throws IOException {
|
||||||
|
if (Files.newDirectoryStream(dbDir.toPath()).iterator().hasNext()) {
|
||||||
|
throw new DirectoryNotEmptyException(dbDir.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyIsNotAFile(final File dbDir) throws NotDirectoryException {
|
||||||
|
if (dbDir.isFile()) {
|
||||||
|
throw new NotDirectoryException(dbDir.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue