2014-12-09 18:01:46 -05:00
|
|
|
package atlas
|
2014-12-09 18:00:03 -05:00
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
2015-05-29 14:26:07 -04:00
|
|
|
"path/filepath"
|
2014-12-09 18:00:03 -05:00
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
// longestCommonPrefix finds the longest common prefix for all the strings
|
|
|
|
// given as an argument, or returns the empty string if a prefix can't be
|
|
|
|
// found.
|
|
|
|
//
|
|
|
|
// This function just uses brute force instead of a more optimized algorithm.
|
|
|
|
func longestCommonPrefix(vs []string) string {
|
2014-12-11 08:24:17 -05:00
|
|
|
var length int64
|
2014-12-09 18:00:03 -05:00
|
|
|
// Find the shortest string
|
|
|
|
var shortest string
|
2014-12-11 08:24:17 -05:00
|
|
|
length = math.MaxUint32
|
2014-12-09 18:00:03 -05:00
|
|
|
for _, v := range vs {
|
2014-12-11 08:24:17 -05:00
|
|
|
if int64(len(v)) < length {
|
2014-12-09 18:00:03 -05:00
|
|
|
shortest = v
|
2014-12-11 08:24:17 -05:00
|
|
|
length = int64(len(v))
|
2014-12-09 18:00:03 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now go through and find a prefix to all the strings using this
|
|
|
|
// short string, which itself must contain the prefix.
|
|
|
|
for i := len(shortest); i > 0; i-- {
|
|
|
|
// We only care about prefixes with path seps
|
2015-05-29 14:26:07 -04:00
|
|
|
if shortest[i-1] != filepath.Separator {
|
2014-12-09 18:00:03 -05:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
bad := false
|
2015-05-29 14:26:07 -04:00
|
|
|
prefix := shortest[0:i]
|
2014-12-09 18:00:03 -05:00
|
|
|
for _, v := range vs {
|
|
|
|
if !strings.HasPrefix(v, prefix) {
|
|
|
|
bad = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !bad {
|
|
|
|
return prefix
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ""
|
|
|
|
}
|