aboutsummaryrefslogtreecommitdiff
path: root/ref/store/files/update_prepare_resolve.go
blob: c78d77e2eb1922e73fbb0e2f208cc6e7a838b86d (about) (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package files

import "codeberg.org/lindenii/furgit/ref/store"

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
}