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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
diff --git a/registry/registry.go b/registry/registry.go
index 79eafa99b68592bfe5f7f0ae4ee71d629ba42abe..d2ddf01e4d13496e46b74255217518859c46fdff 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -50,12 +50,16 @@ }
// DownloadTemplate downloads and adds a new Template to the Registry
func (r *Registry) DownloadTemplate(name, repo, branch string) (*Template, error) {
+ if _, err := r.GetTemplate(name); err == nil {
+ return nil, ErrTemplateExists{Name: name}
+ }
+
t := &Template{
reg: r,
Name: name,
Repository: repo,
Branch: branch,
- Created: time.Now(),
+ LastUpdate: time.Now(),
}
r.Templates = append(r.Templates, t)
@@ -68,11 +72,15 @@ }
// SaveTemplate saves a local Template to the Registry
func (r *Registry) SaveTemplate(name, path string) (*Template, error) {
+ if _, err := r.GetTemplate(name); err == nil {
+ return nil, ErrTemplateExists{Name: name}
+ }
+
t := &Template{
- reg: r,
- Name: name,
- Path: path,
- Created: time.Now(),
+ reg: r,
+ Name: name,
+ Path: path,
+ LastUpdate: time.Now(),
}
r.Templates = append(r.Templates, t)
@@ -89,16 +97,48 @@ _, err := r.GetTemplate(name)
if err != nil {
return err
}
+
for idx, t := range r.Templates {
if strings.EqualFold(name, t.Name) {
r.Templates = append(r.Templates[:idx], r.Templates[idx+1:]...)
if err := os.Remove(t.ArchivePath()); err != nil {
return err
}
+ return r.save()
}
}
- return r.save()
+ return nil
+}
+
+// RemoveTemplate updates the Template on disk and in meta
+func (r *Registry) UpdateTemplate(name string) error {
+ _, err := r.GetTemplate(name)
+ if err != nil {
+ return err
+ }
+
+ for idx, t := range r.Templates {
+ if strings.EqualFold(name, t.Name) {
+ // If the path doesn't exist, we are replacing it regardless
+ if err := os.Remove(t.ArchivePath()); err != nil && !os.IsNotExist(err) {
+ return err
+ }
+
+ // Cut it out of the template list so we don't get a duplicate
+ r.Templates = append(r.Templates[:idx], r.Templates[idx+1:]...)
+
+ // If path exists, it is local
+ if t.Path != "" {
+ _, err = r.SaveTemplate(t.Name, t.Path)
+ } else {
+ _, err = r.DownloadTemplate(t.Name, t.Repository, t.Branch)
+ }
+ return err
+ }
+ }
+
+ return nil
}
// GetSource retrieves a Source from the Registry
@@ -159,7 +199,16 @@ tree, err := toml.LoadFile(reg.MetaFilePath())
if err != nil {
return nil, err
}
- return ®, tree.Unmarshal(®)
+
+ if err := tree.Unmarshal(®); err != nil {
+ return nil, err
+ }
+
+ for _, tmpl := range reg.Templates {
+ tmpl.reg = ®
+ }
+
+ return ®, nil
}
func create(regFile string) error {
@@ -191,7 +240,7 @@ }); err != nil {
return err
}
- // RemoveTemplate .git
+ // Remove .git
if err := os.RemoveAll(filepath.Join(tmp, ".git")); err != nil {
return err
}
|