diff options
Diffstat (limited to 'ref/name/normalize.go')
| -rw-r--r-- | ref/name/normalize.go | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/ref/name/normalize.go b/ref/name/normalize.go new file mode 100644 index 00000000..9cbe7126 --- /dev/null +++ b/ref/name/normalize.go @@ -0,0 +1,53 @@ +package refname + +import "strings" + +// Normalize collapses slashes according to what Git wants +// then validates the normalized name. +func Normalize(name string, options Options) (string, error) { + normalized := collapseSlashes(name) + + err := validate(normalized, options.flags()) + if err != nil { + return "", err + } + + return normalized, nil +} + +func normalizeRefPath(path string) (string, bool) { + components := make([]string, 0, strings.Count(path, "/")+1) + i := 0 + + for i < len(path) { + for i < len(path) && path[i] == '/' { + i++ + } + + if i == len(path) { + break + } + + j := i + for j < len(path) && path[j] != '/' { + j++ + } + + component := path[i:j] + switch component { + case ".": + case "..": + if len(components) == 0 { + return "", false + } + + components = components[:len(components)-1] + default: + components = append(components, component) + } + + i = j + } + + return strings.Join(components, "/"), true +} |
