refactor: use classes instead of enums for git types

This commit is contained in:
Aleksey Kulikov 2021-09-03 18:19:44 +03:00
parent ebfc67ee0d
commit da3bda077a
15 changed files with 135 additions and 77 deletions

View file

@ -13,4 +13,4 @@ export 'src/blob.dart';
export 'src/tag.dart'; export 'src/tag.dart';
export 'src/treebuilder.dart'; export 'src/treebuilder.dart';
export 'src/error.dart'; export 'src/error.dart';
export 'src/enums.dart'; export 'src/git_types.dart';

View file

@ -5,6 +5,8 @@ import 'libgit2_bindings.dart';
import '../util.dart'; import '../util.dart';
/// Get the type of a reference. /// Get the type of a reference.
///
/// Either direct or symbolic.
int referenceType(Pointer<git_reference> ref) => int referenceType(Pointer<git_reference> ref) =>
libgit2.git_reference_type(ref); libgit2.git_reference_type(ref);

View file

@ -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 }

112
lib/src/git_types.dart Normal file
View file

@ -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;
}

View file

@ -4,7 +4,7 @@ import 'package:libgit2dart/src/tree.dart';
import 'bindings/libgit2_bindings.dart'; import 'bindings/libgit2_bindings.dart';
import 'bindings/index.dart' as bindings; import 'bindings/index.dart' as bindings;
import 'oid.dart'; import 'oid.dart';
import 'enums.dart'; import 'git_types.dart';
import 'repository.dart'; import 'repository.dart';
import 'util.dart'; import 'util.dart';
@ -166,9 +166,7 @@ class IndexEntry {
GitFilemode get mode => intToGitFilemode(_indexEntryPointer.ref.mode); GitFilemode get mode => intToGitFilemode(_indexEntryPointer.ref.mode);
/// Sets the UNIX file attributes of a index entry. /// Sets the UNIX file attributes of a index entry.
set mode(GitFilemode mode) { set mode(GitFilemode mode) => _indexEntryPointer.ref.mode = mode.value;
_indexEntryPointer.ref.mode = gitFilemodeToInt(mode);
}
String _oidToHex(git_oid oid) { String _oidToHex(git_oid oid) {
var hex = StringBuffer(); var hex = StringBuffer();

View file

@ -3,7 +3,7 @@ import 'bindings/libgit2_bindings.dart';
import 'bindings/reference.dart' as bindings; import 'bindings/reference.dart' as bindings;
import 'oid.dart'; import 'oid.dart';
import 'reflog.dart'; import 'reflog.dart';
import 'enums.dart'; import 'git_types.dart';
import 'repository.dart'; import 'repository.dart';
import 'util.dart'; import 'util.dart';

View file

@ -11,7 +11,7 @@ import 'reference.dart';
import 'revwalk.dart'; import 'revwalk.dart';
import 'revparse.dart'; import 'revparse.dart';
import 'blob.dart'; import 'blob.dart';
import 'enums.dart'; import 'git_types.dart';
import 'signature.dart'; import 'signature.dart';
import 'tag.dart'; import 'tag.dart';
import 'util.dart'; import 'util.dart';
@ -415,7 +415,7 @@ class Repository {
Oid createTag({ Oid createTag({
required String tagName, required String tagName,
required Oid target, required Oid target,
required GitObject targetType, required GitObjectType targetType,
required Signature tagger, required Signature tagger,
required String message, required String message,
bool force = false, bool force = false,

View file

@ -4,7 +4,7 @@ import 'bindings/revparse.dart' as bindings;
import 'commit.dart'; import 'commit.dart';
import 'reference.dart'; import 'reference.dart';
import 'repository.dart'; import 'repository.dart';
import 'enums.dart'; import 'git_types.dart';
class RevParse { class RevParse {
/// Finds a single object and intermediate reference (if there is one) by a [spec] revision string. /// Finds a single object and intermediate reference (if there is one) by a [spec] revision string.

View file

@ -4,7 +4,7 @@ import 'bindings/revwalk.dart' as bindings;
import 'commit.dart'; import 'commit.dart';
import 'oid.dart'; import 'oid.dart';
import 'repository.dart'; import 'repository.dart';
import 'enums.dart'; import 'git_types.dart';
class RevWalk { class RevWalk {
/// Initializes a new instance of the [RevWalk] class. /// Initializes a new instance of the [RevWalk] class.
@ -36,13 +36,8 @@ class RevWalk {
/// Changing the sorting mode resets the walker. /// Changing the sorting mode resets the walker.
/// ///
/// Throws a [LibGit2Error] if error occured. /// Throws a [LibGit2Error] if error occured.
void sorting(GitSort sorting) { void sorting(GitSort sorting) =>
bindings.sorting( bindings.sorting(_revWalkPointer, sorting.value);
_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,
);
}
/// Adds a new root for the traversal. /// Adds a new root for the traversal.
/// ///

View file

@ -7,7 +7,7 @@ import 'commit.dart';
import 'oid.dart'; import 'oid.dart';
import 'repository.dart'; import 'repository.dart';
import 'signature.dart'; import 'signature.dart';
import 'enums.dart'; import 'git_types.dart';
class Tag { class Tag {
/// Initializes a new instance of [Tag] class from provided /// Initializes a new instance of [Tag] class from provided
@ -39,16 +39,15 @@ class Tag {
required Repository repository, required Repository repository,
required String tagName, required String tagName,
required Oid target, required Oid target,
required GitObject targetType, required GitObjectType targetType,
required Signature tagger, required Signature tagger,
required String message, required String message,
bool force = false, bool force = false,
}) { }) {
// add 1 to GitObject enum index to match libgit2
final object = object_bindings.lookup( final object = object_bindings.lookup(
repository.pointer, repository.pointer,
target.pointer, target.pointer,
targetType.index + 1, targetType.value,
); );
final result = bindings.create( final result = bindings.create(
repository.pointer, repository.pointer,

View file

@ -3,7 +3,7 @@ import 'bindings/libgit2_bindings.dart';
import 'bindings/tree.dart' as bindings; import 'bindings/tree.dart' as bindings;
import 'repository.dart'; import 'repository.dart';
import 'oid.dart'; import 'oid.dart';
import 'enums.dart'; import 'git_types.dart';
import 'util.dart'; import 'util.dart';
class Tree { class Tree {

View file

@ -3,9 +3,8 @@ import 'bindings/libgit2_bindings.dart';
import 'bindings/treebuilder.dart' as bindings; import 'bindings/treebuilder.dart' as bindings;
import 'repository.dart'; import 'repository.dart';
import 'oid.dart'; import 'oid.dart';
import 'enums.dart'; import 'git_types.dart';
import 'tree.dart'; import 'tree.dart';
import 'util.dart';
class TreeBuilder { class TreeBuilder {
/// Initializes a new instance of [TreeBuilder] class from provided /// Initializes a new instance of [TreeBuilder] class from provided
@ -62,7 +61,7 @@ class TreeBuilder {
_treeBuilderPointer, _treeBuilderPointer,
filename, filename,
id.pointer, id.pointer,
gitFilemodeToInt(filemode), filemode.value,
); );
} }

View file

@ -1,7 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'dart:ffi'; import 'dart:ffi';
import 'bindings/libgit2_bindings.dart'; import 'bindings/libgit2_bindings.dart';
import 'enums.dart'; import 'git_types.dart';
DynamicLibrary loadLibrary() { DynamicLibrary loadLibrary() {
if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) { if (Platform.isLinux || Platform.isAndroid || Platform.isFuchsia) {
@ -30,7 +30,7 @@ bool isValidShaHex(String str) {
GitFilemode intToGitFilemode(int i) { GitFilemode intToGitFilemode(int i) {
switch (i) { switch (i) {
case 0: case 0:
return GitFilemode.undreadable; return GitFilemode.unreadable;
case 16384: case 16384:
return GitFilemode.tree; return GitFilemode.tree;
case 33188: case 33188:
@ -42,23 +42,6 @@ GitFilemode intToGitFilemode(int i) {
case 57344: case 57344:
return GitFilemode.commit; return GitFilemode.commit;
default: default:
return GitFilemode.undreadable; return GitFilemode.unreadable;
}
}
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;
} }
} }

View file

@ -320,7 +320,7 @@ void main() {
repository: repo, repository: repo,
tagName: tagName, tagName: tagName,
target: target, target: target,
targetType: GitObject.commit, targetType: GitObjectType.commit,
tagger: signature, tagger: signature,
message: message, message: message,
); );

View file

@ -68,7 +68,7 @@ void main() {
repository: repo, repository: repo,
tagName: tagName, tagName: tagName,
target: target, target: target,
targetType: GitObject.commit, targetType: GitObjectType.commit,
tagger: signature, tagger: signature,
message: message, message: message,
); );