aboutsummaryrefslogtreecommitdiff
path: root/refstore/files/update_prepare_resolve.go
diff options
context:
space:
mode:
Diffstat (limited to 'refstore/files/update_prepare_resolve.go')
-rw-r--r--refstore/files/update_prepare_resolve.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/refstore/files/update_prepare_resolve.go b/refstore/files/update_prepare_resolve.go
new file mode 100644
index 00000000..492f5157
--- /dev/null
+++ b/refstore/files/update_prepare_resolve.go
@@ -0,0 +1,42 @@
+package files
+
+import "codeberg.org/lindenii/furgit/refstore"
+
+func (executor *refUpdateExecutor) resolvePreparedUpdates(ops []queuedUpdate) ([]preparedUpdate, error) {
+ prepared := make([]preparedUpdate, 0, len(ops))
+ targets := make(map[string]struct{}, len(ops))
+
+ for _, op := range ops {
+ target, err := executor.resolveQueuedUpdateTarget(op)
+ if err != nil {
+ return prepared, err
+ }
+
+ targetKey := updateTargetKey(target.loc)
+ if _, exists := targets[targetKey]; exists {
+ return prepared, wrapUpdateError(op.name, &refstore.DuplicateUpdateError{})
+ }
+
+ targets[targetKey] = struct{}{}
+ prepared = append(prepared, preparedUpdate{op: op, target: target})
+ }
+
+ return prepared, nil
+}
+
+func collectPreparedWrites(prepared []preparedUpdate) (deleted map[string]struct{}, written []string) {
+ deleted = make(map[string]struct{})
+ written = make([]string, 0, len(prepared))
+
+ for _, item := range prepared {
+ switch item.op.kind {
+ case updateDelete, updateDeleteSymbolic:
+ deleted[item.target.name] = struct{}{}
+ case updateCreate, updateReplace, updateCreateSymbolic, updateReplaceSymbolic:
+ written = append(written, item.target.name)
+ case updateVerify, updateVerifySymbolic:
+ }
+ }
+
+ return deleted, written
+}