...
1
2
3
4
5
6
7 package modfile
8
9 import "strings"
10
11
12 func ParseGopkgIn(path string) (root, repo, major, subdir string, ok bool) {
13 if !strings.HasPrefix(path, "gopkg.in/") {
14 return
15 }
16 f := strings.Split(path, "/")
17 if len(f) >= 2 {
18 if elem, v, ok := dotV(f[1]); ok {
19 root = strings.Join(f[:2], "/")
20 repo = "github.com/go-" + elem + "/" + elem
21 major = v
22 subdir = strings.Join(f[2:], "/")
23 return root, repo, major, subdir, true
24 }
25 }
26 if len(f) >= 3 {
27 if elem, v, ok := dotV(f[2]); ok {
28 root = strings.Join(f[:3], "/")
29 repo = "github.com/" + f[1] + "/" + elem
30 major = v
31 subdir = strings.Join(f[3:], "/")
32 return root, repo, major, subdir, true
33 }
34 }
35 return
36 }
37
38 func dotV(name string) (elem, v string, ok bool) {
39 i := len(name) - 1
40 for i >= 0 && '0' <= name[i] && name[i] <= '9' {
41 i--
42 }
43 if i <= 2 || i+1 >= len(name) || name[i-1] != '.' || name[i] != 'v' || name[i+1] == '0' && len(name) != i+2 {
44 return "", "", false
45 }
46 return name[:i-1], name[i:], true
47 }
48
View as plain text