diff options
Diffstat (limited to 'refstore/files/update_verify_refnames.go')
| -rw-r--r-- | refstore/files/update_verify_refnames.go | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/refstore/files/update_verify_refnames.go b/refstore/files/update_verify_refnames.go new file mode 100644 index 00000000..12d67c5f --- /dev/null +++ b/refstore/files/update_verify_refnames.go @@ -0,0 +1,41 @@ +package files + +import ( + "strings" + + "codeberg.org/lindenii/furgit/refstore" +) + +func verifyRefnameAvailable(name string, existing map[string]struct{}, writes []string, deleted map[string]struct{}) error { + for existingName := range existing { + if existingName == name { + continue + } + + if _, skip := deleted[existingName]; skip { + continue + } + + if refnamesConflict(name, existingName) { + return wrapUpdateError(name, &refstore.NameConflictError{Other: existingName}) + } + } + + for _, other := range writes { + if other == name { + continue + } + + if refnamesConflict(name, other) { + return wrapUpdateError(name, &refstore.NameConflictError{Other: other}) + } + } + + return nil +} + +func refnamesConflict(left, right string) bool { + return left == right || + strings.HasPrefix(left, right+"/") || + strings.HasPrefix(right, left+"/") +} |
