-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrank.go
64 lines (54 loc) · 1.22 KB
/
rank.go
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main
import (
"path/filepath"
"sort"
"strings"
)
type ByRank []string
func (paths ByRank) Len() int { return len(paths) }
func (paths ByRank) Swap(a, b int) { paths[a], paths[b] = paths[b], paths[a] }
func (paths ByRank) Less(a, b int) bool {
rankA := getRankForPath(paths[a])
rankB := getRankForPath(paths[b])
return rankA < rankB
}
func GetOrderedPaths(pathList []string) ([]string, error) {
uniquePathList, err := deduplicatePaths(pathList)
if err != nil {
return nil, err
}
sort.Strings(uniquePathList)
sort.Sort(ByRank(uniquePathList))
return uniquePathList, nil
}
func getRankForPath(path string) int {
prefixRankings := map[string]int{
"/home/": -1,
"/Users/": -2,
"/usr/local/": 1,
"/usr/": 2,
"/bin": 3,
"/sbin": 4,
}
for k, v := range prefixRankings {
if strings.HasPrefix(path, k) {
return v
}
}
return 0
}
func deduplicatePaths(paths []string) ([]string, error) {
newList := make([]string, 0, len(paths))
pathMap := make(map[string]bool)
for _, p := range paths {
p, err := filepath.Abs(p)
if err != nil {
return nil, err
}
if _, ok := pathMap[p]; !ok {
pathMap[p] = true
newList = append(newList, p)
}
}
return newList, nil
}