...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package name
16
17 import (
18 "strings"
19 )
20
21 const (
22
23 tagChars = "abcdefghijklmnopqrstuvwxyz0123456789_-.ABCDEFGHIJKLMNOPQRSTUVWXYZ"
24 tagDelim = ":"
25 )
26
27
28 type Tag struct {
29 Repository
30 tag string
31 original string
32 }
33
34
35 var _ Reference = (*Tag)(nil)
36
37
38 func (t Tag) Context() Repository {
39 return t.Repository
40 }
41
42
43 func (t Tag) Identifier() string {
44 return t.TagStr()
45 }
46
47
48 func (t Tag) TagStr() string {
49 return t.tag
50 }
51
52
53 func (t Tag) Name() string {
54 return t.Repository.Name() + tagDelim + t.TagStr()
55 }
56
57
58 func (t Tag) String() string {
59 return t.original
60 }
61
62
63 func (t Tag) Scope(action string) string {
64 return t.Repository.Scope(action)
65 }
66
67 func checkTag(name string) error {
68 return checkElement("tag", name, tagChars, 1, 128)
69 }
70
71
72 func NewTag(name string, opts ...Option) (Tag, error) {
73 opt := makeOptions(opts...)
74 base := name
75 tag := ""
76
77
78 parts := strings.Split(name, tagDelim)
79
80 if len(parts) > 1 && !strings.Contains(parts[len(parts)-1], regRepoDelimiter) {
81 base = strings.Join(parts[:len(parts)-1], tagDelim)
82 tag = parts[len(parts)-1]
83 }
84
85
86
87
88
89 if tag != "" || opt.strict {
90 if err := checkTag(tag); err != nil {
91 return Tag{}, err
92 }
93 }
94
95 if tag == "" {
96 tag = opt.defaultTag
97 }
98
99 repo, err := NewRepository(base, opts...)
100 if err != nil {
101 return Tag{}, err
102 }
103 return Tag{
104 Repository: repo,
105 tag: tag,
106 original: name,
107 }, nil
108 }
109
View as plain text