1package action
2
3import (
4	"os"
5	"path/filepath"
6
7	"github.com/Masterminds/glide/mirrors"
8	"github.com/Masterminds/glide/msg"
9	gpath "github.com/Masterminds/glide/path"
10)
11
12// MirrorsList displays a list of currently setup mirrors.
13func MirrorsList() error {
14	home := gpath.Home()
15
16	op := filepath.Join(home, "mirrors.yaml")
17
18	if _, err := os.Stat(op); os.IsNotExist(err) {
19		msg.Info("No mirrors exist. No mirrors.yaml file not found")
20		return nil
21	}
22
23	ov, err := mirrors.ReadMirrorsFile(op)
24	if err != nil {
25		msg.Die("Unable to read mirrors.yaml file: %s", err)
26	}
27
28	if len(ov.Repos) == 0 {
29		msg.Info("No mirrors found")
30		return nil
31	}
32
33	msg.Info("Mirrors...")
34	for _, r := range ov.Repos {
35		if r.Vcs == "" {
36			msg.Info("--> %s replaced by %s", r.Original, r.Repo)
37		} else {
38			msg.Info("--> %s replaced by %s (%s)", r.Original, r.Repo, r.Vcs)
39		}
40	}
41
42	return nil
43}
44
45// MirrorsSet sets a mirror to use
46func MirrorsSet(o, r, v string) error {
47	if o == "" || r == "" {
48		msg.Err("Both the original and mirror values are required")
49		return nil
50	}
51
52	home := gpath.Home()
53
54	op := filepath.Join(home, "mirrors.yaml")
55
56	var ov *mirrors.Mirrors
57	if _, err := os.Stat(op); os.IsNotExist(err) {
58		msg.Info("No mirrors.yaml file exists. Creating new one")
59		ov = &mirrors.Mirrors{
60			Repos: make(mirrors.MirrorRepos, 0),
61		}
62	} else {
63		ov, err = mirrors.ReadMirrorsFile(op)
64		if err != nil {
65			msg.Die("Error reading existing mirrors.yaml file: %s", err)
66		}
67	}
68
69	found := false
70	for i, re := range ov.Repos {
71		if re.Original == o {
72			found = true
73			msg.Info("%s found in mirrors. Replacing with new settings", o)
74			ov.Repos[i].Repo = r
75			ov.Repos[i].Vcs = v
76		}
77	}
78
79	if !found {
80		nr := &mirrors.MirrorRepo{
81			Original: o,
82			Repo:     r,
83			Vcs:      v,
84		}
85		ov.Repos = append(ov.Repos, nr)
86	}
87
88	msg.Info("%s being set to %s", o, r)
89
90	err := ov.WriteFile(op)
91	if err != nil {
92		msg.Err("Error writing mirrors.yaml file: %s", err)
93	} else {
94		msg.Info("mirrors.yaml written with changes")
95	}
96
97	return nil
98}
99
100// MirrorsRemove removes a mirrors setting
101func MirrorsRemove(k string) error {
102	if k == "" {
103		msg.Err("The mirror to remove is required")
104		return nil
105	}
106
107	home := gpath.Home()
108
109	op := filepath.Join(home, "mirrors.yaml")
110
111	if _, err := os.Stat(op); os.IsNotExist(err) {
112		msg.Err("mirrors.yaml file not found")
113		return nil
114	}
115
116	ov, err := mirrors.ReadMirrorsFile(op)
117	if err != nil {
118		msg.Die("Unable to read mirrors.yaml file: %s", err)
119	}
120
121	var nre mirrors.MirrorRepos
122	var found bool
123	for _, re := range ov.Repos {
124		if re.Original != k {
125			nre = append(nre, re)
126		} else {
127			found = true
128		}
129	}
130
131	if !found {
132		msg.Warn("%s was not found in mirrors", k)
133	} else {
134		msg.Info("%s was removed from mirrors", k)
135		ov.Repos = nre
136
137		err = ov.WriteFile(op)
138		if err != nil {
139			msg.Err("Error writing mirrors.yaml file: %s", err)
140		} else {
141			msg.Info("mirrors.yaml written with changes")
142		}
143	}
144
145	return nil
146}
147