feat(repository): add ability to initialize repository

This commit is contained in:
Aleksey Kulikov 2021-08-21 15:36:42 +03:00
parent 543ebff223
commit 696d55bb3a
3 changed files with 59 additions and 1 deletions

View file

@ -69,6 +69,22 @@ String discover(String startPath, String ceilingDirs) {
return result;
}
/// Creates a new Git repository in the given folder.
///
/// Throws a [LibGit2Error] if error occured.
Pointer<git_repository> init(String path, bool isBare) {
final out = calloc<Pointer<git_repository>>();
final pathC = path.toNativeUtf8().cast<Int8>();
final isBareC = isBare ? 1 : 0;
final error = libgit2.git_repository_init(out, pathC, isBareC);
if (error < 0) {
throw LibGit2Error(libgit2.git_error_last());
}
return out.value;
}
/// Returns the path to the `.git` folder for normal repositories or the
/// repository itself for bare repositories.
String path(Pointer<git_repository> repo) {

View file

@ -10,12 +10,24 @@ import 'util.dart';
/// A Repository is the primary interface into a git repository
class Repository {
/// Initializes a new instance of the [Repository] class by creating a new
/// Git repository in the given folder.
///
/// Should be freed with `free()` to release allocated memory.
///
/// Throws a [LibGit2Error] if error occured.
Repository.init(String path, {bool isBare = false}) {
libgit2.git_libgit2_init();
_repoPointer = bindings.init(path, isBare);
}
/// Initializes a new instance of the [Repository] class.
/// For a standard repository, [path] should either point to the `.git` folder
/// or to the working directory. For a bare repository, [path] should directly
/// point to the repository folder.
///
/// [Repository] object should be close with [free] function to release allocated memory.
/// Should be freed with `free()` to release allocated memory.
///
/// Throws a [LibGit2Error] if error occured.
Repository.open(String path) {

View file

@ -14,6 +14,36 @@ void main() {
);
});
group('.init()', () {
final initDir = '${Directory.systemTemp.path}/init_repo/';
setUp(() async {
if (await Directory(initDir).exists()) {
await Directory(initDir).delete(recursive: true);
} else {
await Directory(initDir).create();
}
});
tearDown(() async {
repo.free();
await Directory(initDir).delete(recursive: true);
});
test('successfully creates new bare repo at provided path', () {
repo = Repository.init(initDir, isBare: true);
expect(repo.path, initDir);
expect(repo.isBare, true);
});
test('successfully creates new standard repo at provided path', () {
repo = Repository.init(initDir);
expect(repo.path, '$initDir.git/');
expect(repo.isBare, false);
expect(repo.isEmpty, true);
});
});
group('empty', () {
group('bare', () {
setUp(() {