From 23787adc3acafc2e4e166d87efa4b9e138fb6caa Mon Sep 17 00:00:00 2001 From: Aleksey Kulikov Date: Wed, 13 Oct 2021 11:53:24 +0300 Subject: [PATCH] refactor(stash)!: extract implementation of api --- lib/src/bindings/stash.dart | 2 +- lib/src/repository.dart | 58 +++++++++++-------------- lib/src/stash.dart | 87 +++++++++++++++++++++++++++++++++++++ test/stash_test.dart | 26 +++++------ 4 files changed, 126 insertions(+), 47 deletions(-) diff --git a/lib/src/bindings/stash.dart b/lib/src/bindings/stash.dart index f2ed065..9ab92b0 100644 --- a/lib/src/bindings/stash.dart +++ b/lib/src/bindings/stash.dart @@ -10,7 +10,7 @@ import '../util.dart'; /// Save the local modifications to a new stash. /// /// Throws a [LibGit2Error] if error occured. -Pointer stash({ +Pointer save({ required Pointer repoPointer, required Pointer stasherPointer, String? message, diff --git a/lib/src/repository.dart b/lib/src/repository.dart index 212ff98..e23e4a5 100644 --- a/lib/src/repository.dart +++ b/lib/src/repository.dart @@ -10,7 +10,6 @@ import 'bindings/commit.dart' as commit_bindings; import 'bindings/checkout.dart' as checkout_bindings; import 'bindings/reset.dart' as reset_bindings; import 'bindings/diff.dart' as diff_bindings; -import 'bindings/stash.dart' as stash_bindings; import 'bindings/attr.dart' as attr_bindings; import 'bindings/graph.dart' as graph_bindings; import 'bindings/describe.dart' as describe_bindings; @@ -1098,33 +1097,33 @@ class Repository { ); } + /// Returns list of all the stashed states, first being the most recent. + List get stashes => Stash.list(this); + /// Saves the local modifications to a new stash. /// /// Throws a [LibGit2Error] if error occured. - Oid stash({ + Oid createStash({ required Signature stasher, String? message, bool keepIndex = false, bool includeUntracked = false, bool includeIgnored = false, }) { - int flags = 0; - if (keepIndex) flags |= GitStash.keepIndex.value; - if (includeUntracked) flags |= GitStash.includeUntracked.value; - if (includeIgnored) flags |= GitStash.includeIgnored.value; - - return Oid(stash_bindings.stash( - repoPointer: _repoPointer, - stasherPointer: stasher.pointer, + return Stash.create( + repo: this, + stasher: stasher, message: message, - flags: flags, - )); + keepIndex: keepIndex, + includeUntracked: includeUntracked, + includeIgnored: includeIgnored, + ); } /// Applies a single stashed state from the stash list. /// /// Throws a [LibGit2Error] if error occured. - void stashApply({ + void applyStash({ int index = 0, bool reinstateIndex = false, Set strategy = const { @@ -1134,11 +1133,11 @@ class Repository { String? directory, List? paths, }) { - stash_bindings.apply( - repoPointer: _repoPointer, + Stash.apply( + repo: this, index: index, - flags: reinstateIndex ? GitStashApply.reinstateIndex.value : 0, - strategy: strategy.fold(0, (acc, e) => acc | e.value), + reinstateIndex: reinstateIndex, + strategy: strategy, directory: directory, paths: paths, ); @@ -1147,17 +1146,15 @@ class Repository { /// Removes a single stashed state from the stash list. /// /// Throws a [LibGit2Error] if error occured. - void stashDrop([int index = 0]) { - stash_bindings.drop( - repoPointer: _repoPointer, - index: index, - ); + void dropStash([int index = 0]) { + Stash.drop(repo: this, index: index); } - /// Applies a single stashed state from the stash list and remove it from the list if successful. + /// Applies a single stashed state from the stash list and remove it from + /// the list if successful. /// /// Throws a [LibGit2Error] if error occured. - void stashPop({ + void popStash({ int index = 0, bool reinstateIndex = false, Set strategy = const { @@ -1167,21 +1164,16 @@ class Repository { String? directory, List? paths, }) { - stash_bindings.pop( - repoPointer: _repoPointer, + Stash.pop( + repo: this, index: index, - flags: reinstateIndex ? GitStashApply.reinstateIndex.value : 0, - strategy: strategy.fold(0, (acc, e) => acc | e.value), + reinstateIndex: reinstateIndex, + strategy: strategy, directory: directory, paths: paths, ); } - /// Returns list of all the stashed states, first being the most recent. - List get stashList { - return stash_bindings.list(_repoPointer); - } - /// Returns a list of the configured remotes for a repository. /// /// Throws a [LibGit2Error] if error occured. diff --git a/lib/src/stash.dart b/lib/src/stash.dart index 8ebfded..f29dd23 100644 --- a/lib/src/stash.dart +++ b/lib/src/stash.dart @@ -1,4 +1,5 @@ import 'package:libgit2dart/libgit2dart.dart'; +import 'bindings/stash.dart' as bindings; class Stash { /// Initializes a new instance of [Stash] class. @@ -17,6 +18,92 @@ class Stash { /// The commit oid of the stashed state. final Oid oid; + /// Returns list of all the stashed states, first being the most recent. + static List list(Repository repo) => bindings.list(repo.pointer); + + /// Saves the local modifications to a new stash. + /// + /// Throws a [LibGit2Error] if error occured. + static Oid create({ + required Repository repo, + required Signature stasher, + String? message, + bool keepIndex = false, + bool includeUntracked = false, + bool includeIgnored = false, + }) { + int flags = 0; + if (keepIndex) flags |= GitStash.keepIndex.value; + if (includeUntracked) flags |= GitStash.includeUntracked.value; + if (includeIgnored) flags |= GitStash.includeIgnored.value; + + return Oid(bindings.save( + repoPointer: repo.pointer, + stasherPointer: stasher.pointer, + message: message, + flags: flags, + )); + } + + /// Applies a single stashed state from the stash list. + /// + /// Throws a [LibGit2Error] if error occured. + static void apply({ + required Repository repo, + int index = 0, + bool reinstateIndex = false, + Set strategy = const { + GitCheckout.safe, + GitCheckout.recreateMissing + }, + String? directory, + List? paths, + }) { + bindings.apply( + repoPointer: repo.pointer, + index: index, + flags: reinstateIndex ? GitStashApply.reinstateIndex.value : 0, + strategy: strategy.fold(0, (acc, e) => acc | e.value), + directory: directory, + paths: paths, + ); + } + + /// Removes a single stashed state from the stash list. + /// + /// Throws a [LibGit2Error] if error occured. + static void drop({required Repository repo, int index = 0}) { + bindings.drop( + repoPointer: repo.pointer, + index: index, + ); + } + + /// Applies a single stashed state from the stash list and remove it from + /// the list if successful. + /// + /// Throws a [LibGit2Error] if error occured. + static void pop({ + required Repository repo, + int index = 0, + bool reinstateIndex = false, + Set strategy = const { + GitCheckout.safe, + GitCheckout.recreateMissing + }, + String? directory, + List? paths, + }) { + bindings.pop( + repoPointer: repo.pointer, + index: index, + flags: reinstateIndex ? GitStashApply.reinstateIndex.value : 0, + strategy: strategy.fold(0, (acc, e) => acc | e.value), + directory: directory, + paths: paths, + ); + } + @override String toString() { return 'Stash{index: $index, message: $message, sha: ${oid.sha}}'; diff --git a/test/stash_test.dart b/test/stash_test.dart index a16094e..ff5aa56 100644 --- a/test/stash_test.dart +++ b/test/stash_test.dart @@ -30,7 +30,7 @@ void main() { mode: FileMode.append, ); - repo.stash(stasher: stasher, includeUntracked: true); + repo.createStash(stasher: stasher, includeUntracked: true); expect(repo.status.isEmpty, true); }); @@ -40,10 +40,10 @@ void main() { mode: FileMode.append, ); - repo.stash(stasher: stasher); + repo.createStash(stasher: stasher); expect(repo.status.isEmpty, true); - repo.stashApply(); + repo.applyStash(); expect(repo.status, contains('file')); }); @@ -53,10 +53,10 @@ void main() { mode: FileMode.append, ); - repo.stash(stasher: stasher); - final stash = repo.stashList.first; - repo.stashDrop(stash.index); - expect(() => repo.stashApply(), throwsA(isA())); + repo.createStash(stasher: stasher); + final stash = repo.stashes.first; + repo.dropStash(stash.index); + expect(() => repo.applyStash(), throwsA(isA())); }); test('successfully pops from stash', () { @@ -65,10 +65,10 @@ void main() { mode: FileMode.append, ); - repo.stash(stasher: stasher); - repo.stashPop(); + repo.createStash(stasher: stasher); + repo.popStash(); expect(repo.status, contains('file')); - expect(() => repo.stashApply(), throwsA(isA())); + expect(() => repo.applyStash(), throwsA(isA())); }); test('returns list of stashes', () { @@ -77,11 +77,11 @@ void main() { mode: FileMode.append, ); - repo.stash(stasher: stasher, message: 'WIP'); + repo.createStash(stasher: stasher, message: 'WIP'); - final stash = repo.stashList.first; + final stash = repo.stashes.first; - expect(repo.stashList.length, 1); + expect(repo.stashes.length, 1); expect(stash.index, 0); expect(stash.message, 'On master: WIP'); });