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 _oidPointer; /// Pointer to memory address for allocated oid object. Pointer 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}'; }