libgit2dart/lib/src/oid.dart
2021-10-23 12:31:18 +03:00

97 lines
2.6 KiB
Dart

import 'dart:ffi';
import 'package:libgit2dart/libgit2dart.dart';
import 'package:libgit2dart/src/bindings/libgit2_bindings.dart';
import 'package:libgit2dart/src/bindings/odb.dart' as odb_bindings;
import 'package:libgit2dart/src/bindings/oid.dart' as bindings;
import 'package:libgit2dart/src/util.dart';
class Oid {
/// Initializes a new instance of [Oid] class from provided
/// pointer to Oid object in memory.
Oid(this._oidPointer);
/// Initializes a new instance of [Oid] class by determining if an object can
/// be found in the ODB of [repo]sitory with provided hexadecimal [sha]
/// string that is 40 characters long or shorter.
///
/// Throws [ArgumentError] if provided [sha] hex string is not valid.
///
/// Throws a [LibGit2Error] if error occured.
Oid.fromSHA({required Repository repo, required String sha}) {
if (isValidShaHex(sha)) {
if (sha.length == 40) {
_oidPointer = bindings.fromSHA(sha);
} else {
final odb = repo.odb;
_oidPointer = odb_bindings.existsPrefix(
odbPointer: odb.pointer,
shortOidPointer: bindings.fromStrN(sha),
length: sha.length,
);
odb.free();
}
} else {
throw ArgumentError.value('$sha is not a valid sha hex string');
}
}
/// Initializes a new instance of [Oid] class from provided raw git_oid
/// structure.
Oid.fromRaw(git_oid raw) {
_oidPointer = bindings.fromRaw(raw.id);
}
late final Pointer<git_oid> _oidPointer;
/// Pointer to memory address for allocated oid object.
Pointer<git_oid> get pointer => _oidPointer;
/// Hexadecimal SHA string.
String get sha => bindings.toSHA(_oidPointer);
@override
bool operator ==(Object other) {
return (other is Oid) &&
(bindings.compare(aPointer: _oidPointer, bPointer: other._oidPointer) ==
0);
}
bool operator <(Oid other) {
return bindings.compare(
aPointer: _oidPointer,
bPointer: other._oidPointer,
) ==
-1;
}
bool operator <=(Oid other) {
return bindings.compare(
aPointer: _oidPointer,
bPointer: other._oidPointer,
) ==
-1;
}
bool operator >(Oid other) {
return bindings.compare(
aPointer: _oidPointer,
bPointer: other._oidPointer,
) ==
1;
}
bool operator >=(Oid other) {
return bindings.compare(
aPointer: _oidPointer,
bPointer: other._oidPointer,
) ==
1;
}
@override // coverage:ignore-line
int get hashCode => _oidPointer.address.hashCode; // coverage:ignore-line
@override
String toString() => 'Oid{sha: $sha}';
}