From 06b44597d53c31c268effa779d4e4572269a5ebd Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Wed, 11 Aug 2021 12:55:04 +0300 Subject: [PATCH] feat(index): add ability to change attributes of index entry --- lib/libgit2dart.dart | 1 + lib/src/index.dart | 27 ++++++++++++++++++++------- lib/src/types.dart | 9 +++++++++ test/index_test.dart | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 lib/src/types.dart diff --git a/lib/libgit2dart.dart b/lib/libgit2dart.dart index a87cafa..5e63534 100644 --- a/lib/libgit2dart.dart +++ b/lib/libgit2dart.dart @@ -2,3 +2,4 @@ export 'src/repository.dart'; export 'src/config.dart'; export 'src/error.dart'; export 'src/reference.dart'; +export 'src/types.dart'; diff --git a/lib/src/index.dart b/lib/src/index.dart index d917a5f..4317329 100644 --- a/lib/src/index.dart +++ b/lib/src/index.dart @@ -2,6 +2,7 @@ import 'dart:ffi'; import 'package:ffi/ffi.dart'; import 'bindings/libgit2_bindings.dart'; import 'bindings/index.dart' as bindings; +import 'oid.dart'; import 'util.dart'; class Index { @@ -116,18 +117,30 @@ class IndexEntry { /// Pointer to memory address for allocated index entry object. late final Pointer _indexEntryPointer; - /// Returns path to file. + /// Unique identity of the index entry. + Oid get id => Oid.fromSHA(sha); + + set id(Oid oid) => _indexEntryPointer.ref.id = oid.pointer.ref; + + /// Path of the index entry. String get path => _indexEntryPointer.ref.path.cast().toDartString(); - /// Returns sha-1 of file. - String get sha { + set path(String path) => + _indexEntryPointer.ref.path = path.toNativeUtf8().cast(); + + /// Returns id of the index entry as sha-1 hex. + String get sha => _oidToHex(_indexEntryPointer.ref.id); + + /// Mode of the index entry. + int get mode => _indexEntryPointer.ref.mode; + + set mode(int mode) => _indexEntryPointer.ref.mode = mode; + + String _oidToHex(git_oid oid) { var hex = StringBuffer(); for (var i = 0; i < 20; i++) { - hex.write(_indexEntryPointer.ref.id.id[i].toRadixString(16)); + hex.write(oid.id[i].toRadixString(16)); } return hex.toString(); } - - /// Returns mode of file. - int get mode => _indexEntryPointer.ref.mode; } diff --git a/lib/src/types.dart b/lib/src/types.dart new file mode 100644 index 0000000..03b7efd --- /dev/null +++ b/lib/src/types.dart @@ -0,0 +1,9 @@ +/// Valid modes for index and tree entries. +abstract class GitFilemode { + static const int unreadable = 0; + static const int tree = 16384; + static const int blob = 33188; + static const int blobExecutable = 33261; + static const int link = 40960; + static const int commit = 57344; +} diff --git a/test/index_test.dart b/test/index_test.dart index 2a22e2f..ae249f0 100644 --- a/test/index_test.dart +++ b/test/index_test.dart @@ -1,8 +1,10 @@ import 'dart:io'; +import 'package:libgit2dart/libgit2dart.dart'; import 'package:test/test.dart'; import 'package:libgit2dart/src/index.dart'; import 'package:libgit2dart/src/repository.dart'; +import 'package:libgit2dart/src/types.dart'; import 'package:libgit2dart/src/error.dart'; import 'helpers/util.dart'; @@ -60,6 +62,22 @@ void main() { expect(() => index[10], throwsA(isA())); }); + test('successfully changes attributes', () { + final entry = index['file']; + final otherEntry = index['feature_file']; + + expect(entry.id == otherEntry.id, false); + expect(entry.mode, isNot(GitFilemode.blobExecutable)); + + entry.path = 'some.txt'; + entry.id = otherEntry.id; + entry.mode = GitFilemode.blobExecutable; + + expect(entry.path, 'some.txt'); + expect(entry.id == otherEntry.id, true); + expect(entry.mode, GitFilemode.blobExecutable); + }); + test('clears the contents', () { expect(index.count, 3); index.clear();