diff options
Diffstat (limited to 'refstore/files/update_prepare_resolve.go')
| -rw-r--r-- | refstore/files/update_prepare_resolve.go | 42 |
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 +} |
