From da3bda077a42349f741e66614771bcccc9aabcfd Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Fri, 3 Sep 2021 18:19:44 +0300 Subject: [PATCH] refactor: use classes instead of enums for git types --- lib/libgit2dart.dart | 2 +- lib/src/bindings/reference.dart | 2 + lib/src/enums.dart | 30 --------- lib/src/git_types.dart | 112 ++++++++++++++++++++++++++++++++ lib/src/index.dart | 6 +- lib/src/reference.dart | 2 +- lib/src/repository.dart | 4 +- lib/src/revparse.dart | 2 +- lib/src/revwalk.dart | 11 +--- lib/src/tag.dart | 7 +- lib/src/tree.dart | 2 +- lib/src/treebuilder.dart | 5 +- lib/src/util.dart | 23 +------ test/repository_test.dart | 2 +- test/tag_test.dart | 2 +- 15 files changed, 135 insertions(+), 77 deletions(-) delete mode 100644 lib/src/enums.dart create mode 100644 lib/src/git_types.dart diff --git a/lib/libgit2dart.dart b/lib/libgit2dart.dart index 767e751..1bfaabb 100644 --- a/lib/libgit2dart.dart +++ b/lib/libgit2dart.dart @@ -13,4 +13,4 @@ export 'src/blob.dart'; export 'src/tag.dart'; export 'src/treebuilder.dart'; export 'src/error.dart'; -export 'src/enums.dart'; +export 'src/git_types.dart'; diff --git a/lib/src/bindings/reference.dart b/lib/src/bindings/reference.dart index 028e9a8..9d3e87f 100644 --- a/lib/src/bindings/reference.dart +++ b/lib/src/bindings/reference.dart @@ -5,6 +5,8 @@ import 'libgit2_bindings.dart'; import '../util.dart'; /// Get the type of a reference. +/// +/// Either direct or symbolic. int referenceType(Pointer ref) => libgit2.git_reference_type(ref); diff --git a/lib/src/enums.dart b/lib/src/enums.dart deleted file mode 100644 index 9949946..0000000 --- a/lib/src/enums.dart +++ /dev/null @@ -1,30 +0,0 @@ -enum ReferenceType { direct, symbolic } - -enum GitFilemode { undreadable, tree, blob, blobExecutable, link, commit } - -/// Flags to specify the sorting which a revwalk should perform. -/// -/// [none] sort the output with the same default method from `git`: reverse -/// chronological order. This is the default sorting for new walkers. -/// -/// [topological] sort the repository contents in topological order (no parents before -/// all of its children are shown); this sorting mode can be combined -/// with time sorting to produce `git`'s `--date-order``. -/// -/// [time] sort the repository contents by commit time; -/// this sorting mode can be combined with topological sorting. -/// -/// [reverse] Iterate through the repository contents in reverse -/// order; this sorting mode can be combined with any of the above. -enum GitSort { none, topological, time, reverse } - -enum GitObject { commit, tree, blob, tag } - -/// Revparse flags, indicate the intended behavior of the spec. -/// -/// [single]: the spec targeted a single object. -/// -/// [range]: the spec targeted a range of commits. -/// -/// [mergeBase]: the spec used the '...' operator, which invokes special semantics. -enum GitRevParse { single, range, mergeBase } diff --git a/lib/src/git_types.dart b/lib/src/git_types.dart new file mode 100644 index 0000000..ed9351a --- /dev/null +++ b/lib/src/git_types.dart @@ -0,0 +1,112 @@ +/// Basic type of any Git reference. +class ReferenceType { + const ReferenceType._(this._value); + final int _value; + + /// Invalid reference. + static const invalid = ReferenceType._(0); + + /// A reference that points at an object id. + static const direct = ReferenceType._(1); + + /// A reference that points at another reference. + static const symbolic = ReferenceType._(2); + + static const all = ReferenceType._(3); + + int get value => _value; +} + +/// Valid modes for index and tree entries. +class GitFilemode { + const GitFilemode._(this._value); + final int _value; + + static const unreadable = GitFilemode._(0); + + static const tree = GitFilemode._(16384); + + static const blob = GitFilemode._(33188); + + static const blobExecutable = GitFilemode._(33261); + + static const link = GitFilemode._(40960); + + static const commit = GitFilemode._(57344); + + int get value => _value; +} + +/// Flags to specify the sorting which a revwalk should perform. +class GitSort { + const GitSort._(this._value); + final int _value; + + /// Sort the output with the same default method from `git`: reverse + /// chronological order. This is the default sorting for new walkers. + static const none = GitSort._(0); + + /// Sort the repository contents in topological order (no parents before + /// all of its children are shown); this sorting mode can be combined + /// with time sorting to produce `git`'s `--date-order``. + static const topological = GitSort._(1); + + /// Sort the repository contents by commit time; + /// this sorting mode can be combined with topological sorting. + static const time = GitSort._(2); + + /// Iterate through the repository contents in reverse order; this sorting mode + /// can be combined with any of the above. + static const reverse = GitSort._(4); + + int get value => _value; +} + +/// Basic type (loose or packed) of any Git object. +class GitObjectType { + const GitObjectType._(this._value); + final int _value; + + /// Object can be any of the following. + static const any = GitObjectType._(-2); + + /// Object is invalid. + static const invalid = GitObjectType._(-1); + + /// A commit object. + static const commit = GitObjectType._(1); + + /// A tree (directory listing) object. + static const tree = GitObjectType._(2); + + /// A file revision object. + static const blob = GitObjectType._(3); + + /// An annotated tag object. + static const tag = GitObjectType._(4); + + /// A delta, base is given by an offset. + static const offsetDelta = GitObjectType._(6); + + /// A delta, base is given by object id. + static const refDelta = GitObjectType._(7); + + int get value => _value; +} + +/// Revparse flags, indicate the intended behavior of the spec. +class GitRevParse { + const GitRevParse._(this._value); + final int _value; + + /// The spec targeted a single object. + static const single = GitRevParse._(1); + + /// The spec targeted a range of commits. + static const range = GitRevParse._(2); + + /// The spec used the '...' operator, which invokes special semantics. + static const mergeBase = GitRevParse._(4); + + int get value => _value; +} diff --git a/lib/src/index.dart b/lib/src/index.dart index 2788bb7..666d73e 100644 --- a/lib/src/index.dart +++ b/lib/src/index.dart @@ -4,7 +4,7 @@ import 'package:libgit2dart/src/tree.dart'; import 'bindings/libgit2_bindings.dart'; import 'bindings/index.dart' as bindings; import 'oid.dart'; -import 'enums.dart'; +import 'git_types.dart'; import 'repository.dart'; import 'util.dart'; @@ -166,9 +166,7 @@ class IndexEntry { GitFilemode get mode => intToGitFilemode(_indexEntryPointer.ref.mode); /// Sets the UNIX file attributes of a index entry. - set mode(GitFilemode mode) { - _indexEntryPointer.ref.mode = gitFilemodeToInt(mode); - } + set mode(GitFilemode mode) => _indexEntryPointer.ref.mode = mode.value; String _oidToHex(git_oid oid) { var hex = StringBuffer(); diff --git a/lib/src/reference.dart b/lib/src/reference.dart index bd6f48f..02f6419 100644 --- a/lib/src/reference.dart +++ b/lib/src/reference.dart @@ -3,7 +3,7 @@ import 'bindings/libgit2_bindings.dart'; import 'bindings/reference.dart' as bindings; import 'oid.dart'; import 'reflog.dart'; -import 'enums.dart'; +import 'git_types.dart'; import 'repository.dart'; import 'util.dart'; diff --git a/lib/src/repository.dart b/lib/src/repository.dart index e8338f9..f007cd9 100644 --- a/lib/src/repository.dart +++ b/lib/src/repository.dart @@ -11,7 +11,7 @@ import 'reference.dart'; import 'revwalk.dart'; import 'revparse.dart'; import 'blob.dart'; -import 'enums.dart'; +import 'git_types.dart'; import 'signature.dart'; import 'tag.dart'; import 'util.dart'; @@ -415,7 +415,7 @@ class Repository { Oid createTag({ required String tagName, required Oid target, - required GitObject targetType, + required GitObjectType targetType, required Signature tagger, required String message, bool force = false, diff --git a/lib/src/revparse.dart b/lib/src/revparse.dart index d6831f0..c6c158e 100644 --- a/lib/src/revparse.dart +++ b/lib/src/revparse.dart @@ -4,7 +4,7 @@ import 'bindings/revparse.dart' as bindings; import 'commit.dart'; import 'reference.dart'; import 'repository.dart'; -import 'enums.dart'; +import 'git_types.dart'; class RevParse { /// Finds a single object and intermediate reference (if there is one) by a [spec] revision string. diff --git a/lib/src/revwalk.dart b/lib/src/revwalk.dart index d1197ed..691f095 100644 --- a/lib/src/revwalk.dart +++ b/lib/src/revwalk.dart @@ -4,7 +4,7 @@ import 'bindings/revwalk.dart' as bindings; import 'commit.dart'; import 'oid.dart'; import 'repository.dart'; -import 'enums.dart'; +import 'git_types.dart'; class RevWalk { /// Initializes a new instance of the [RevWalk] class. @@ -36,13 +36,8 @@ class RevWalk { /// Changing the sorting mode resets the walker. /// /// Throws a [LibGit2Error] if error occured. - void sorting(GitSort sorting) { - bindings.sorting( - _revWalkPointer, - // in libgit2 GIT_SORT_REVERSE flag is integer 4 so we are adding 1 to our enum index - sorting == GitSort.reverse ? sorting.index + 1 : sorting.index, - ); - } + void sorting(GitSort sorting) => + bindings.sorting(_revWalkPointer, sorting.value); /// Adds a new root for the traversal. /// diff --git a/lib/src/tag.dart b/lib/src/tag.dart index b0c438d..42d7a4e 100644 --- a/lib/src/tag.dart +++ b/lib/src/tag.dart @@ -7,7 +7,7 @@ import 'commit.dart'; import 'oid.dart'; import 'repository.dart'; import 'signature.dart'; -import 'enums.dart'; +import 'git_types.dart'; class Tag { /// Initializes a new instance of [Tag] class from provided @@ -39,16 +39,15 @@ class Tag { required Repository repository, required String tagName, required Oid target, - required GitObject targetType, + required GitObjectType targetType, required Signature tagger, required String message, bool force = false, }) { - // add 1 to GitObject enum index to match libgit2 final object = object_bindings.lookup( repository.pointer, target.pointer, - targetType.index + 1, + targetType.value, ); final result = bindings.create( repository.pointer, diff --git a/lib/src/tree.dart b/lib/src/tree.dart index 18e646e..4366e1b 100644 --- a/lib/src/tree.dart +++ b/lib/src/tree.dart @@ -3,7 +3,7 @@ import 'bindings/libgit2_bindings.dart'; import 'bindings/tree.dart' as bindings; import 'repository.dart'; import 'oid.dart'; -import 'enums.dart'; +import 'git_types.dart'; import 'util.dart'; class Tree { diff --git a/lib/src/treebuilder.dart b/lib/src/treebuilder.dart index 6c18a2e..1e3f023 100644 --- a/lib/src/treebuilder.dart +++ b/lib/src/treebuilder.dart @@ -3,9 +3,8 @@ import 'bindings/libgit2_bindings.dart'; import 'bindings/treebuilder.dart' as bindings; import 'repository.dart'; import 'oid.dart'; -import 'enums.dart'; +import 'git_types.dart'; import 'tree.dart'; -import 'util.dart'; class TreeBuilder { /// Initializes a new instance of [TreeBuilder] class from provided @@ -62,7 +61,7 @@ class TreeBuilder { _treeBuilderPointer, filename, id.pointer, - gitFilemodeToInt(filemode), + filemode.value, ); } diff --git a/lib/src/util.dart b/lib/src/util.dart index 520af43..572190c 100644 --- a/lib/src/util.dart +++ b/lib/src/util.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'dart:ffi'; import 'bindings/libgit2_bindings.dart'; -import 'enums.dart'; +import 'git_types.dart'; DynamicLibrary loadLibrary() { if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) { @@ -30,7 +30,7 @@ bool isValidShaHex(String str) { GitFilemode intToGitFilemode(int i) { switch (i) { case 0: - return GitFilemode.undreadable; + return GitFilemode.unreadable; case 16384: return GitFilemode.tree; case 33188: @@ -42,23 +42,6 @@ GitFilemode intToGitFilemode(int i) { case 57344: return GitFilemode.commit; default: - return GitFilemode.undreadable; - } -} - -int gitFilemodeToInt(GitFilemode filemode) { - switch (filemode) { - case GitFilemode.undreadable: - return 0; - case GitFilemode.tree: - return 16384; - case GitFilemode.blob: - return 33188; - case GitFilemode.blobExecutable: - return 33261; - case GitFilemode.link: - return 40960; - case GitFilemode.commit: - return 57344; + return GitFilemode.unreadable; } } diff --git a/test/repository_test.dart b/test/repository_test.dart index ba61899..5976984 100644 --- a/test/repository_test.dart +++ b/test/repository_test.dart @@ -320,7 +320,7 @@ void main() { repository: repo, tagName: tagName, target: target, - targetType: GitObject.commit, + targetType: GitObjectType.commit, tagger: signature, message: message, ); diff --git a/test/tag_test.dart b/test/tag_test.dart index e949381..6ccfc66 100644 --- a/test/tag_test.dart +++ b/test/tag_test.dart @@ -68,7 +68,7 @@ void main() { repository: repo, tagName: tagName, target: target, - targetType: GitObject.commit, + targetType: GitObjectType.commit, tagger: signature, message: message, );