Skip to content

Commit ce38548

Browse files
committed
initial commit
0 parents  commit ce38548

File tree

6 files changed

+372
-0
lines changed

6 files changed

+372
-0
lines changed

common.go

+161
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"io/ioutil"
6+
"os"
7+
"os/exec"
8+
"path/filepath"
9+
"sort"
10+
"strings"
11+
)
12+
13+
func (cmd Common) DeleteNonRepos() {
14+
var err error
15+
srcdir := cmd.Path("src")
16+
17+
var repos = map[string]bool{}
18+
repos[strings.ToLower(filepath.FromSlash(cmd.Package))] = true
19+
20+
err = filepath.Walk(srcdir,
21+
func(path string, info os.FileInfo, err error) error {
22+
rpath, err := filepath.Rel(srcdir, path)
23+
if err != nil || rpath == "" || rpath == "." || rpath == ".." || !info.IsDir() {
24+
return err
25+
}
26+
if filepath.Base(rpath) == ".git" {
27+
repos[strings.ToLower(filepath.Dir(rpath))] = true
28+
return filepath.SkipDir
29+
}
30+
return nil
31+
})
32+
ErrFatalf(err, "collect failed: %q", err)
33+
34+
err = filepath.Walk(srcdir,
35+
func(path string, info os.FileInfo, err error) error {
36+
rpath, err := filepath.Rel(srcdir, path)
37+
if err != nil || rpath == "" || rpath == "." || rpath == ".." {
38+
return err
39+
}
40+
41+
lowpath := strings.ToLower(rpath)
42+
43+
for repo := range repos {
44+
if repo == lowpath {
45+
return filepath.SkipDir
46+
}
47+
}
48+
49+
for repo := range repos {
50+
if strings.HasPrefix(repo, lowpath) {
51+
return nil
52+
}
53+
}
54+
55+
err = os.RemoveAll(path)
56+
if err != nil {
57+
return err
58+
}
59+
return filepath.SkipDir
60+
})
61+
ErrFatalf(err, "remove failed: %q", err)
62+
}
63+
64+
func (cmd Common) VendorModules() {
65+
fmt.Fprintf(os.Stdout, "# Vendoring modules\n")
66+
67+
workdir, err := os.Getwd()
68+
ErrFatalf(err, "unable to get working directory: %q\n", err)
69+
70+
defer func() {
71+
err = os.Chdir(workdir)
72+
ErrFatalf(err, "unable to change directory: %q\n", err)
73+
}()
74+
75+
err = os.Chdir(cmd.RepoDir())
76+
ErrFatalf(err, "unable to change directory: %q\n", err)
77+
78+
err = os.RemoveAll("vendor")
79+
if os.IsNotExist(err) {
80+
err = nil
81+
}
82+
ErrFatalf(err, "unable to delete vendor: %q\n", err)
83+
84+
for repeat := 2; repeat > 0; repeat-- {
85+
gomod := exec.Command("go", "mod", "vendor", "-v")
86+
gomod.Env = append(os.Environ(), "GO111MODULE=on")
87+
gomod.Stdout, gomod.Stderr = os.Stdout, os.Stderr
88+
err = gomod.Run()
89+
Errf(err, "go mod vendor failed, retrying: %q\n", err)
90+
if err == nil {
91+
break
92+
}
93+
}
94+
ErrFatalf(err, "go mod vendor failed: %q\n", err)
95+
}
96+
97+
func (cmd Common) FlattenVendor() {
98+
fmt.Fprintf(os.Stdout, "# Flattening vendor\n")
99+
100+
vendordir := filepath.Join(cmd.RepoDir(), "vendor")
101+
srcdir := cmd.Path("src")
102+
err := filepath.Walk(vendordir,
103+
func(path string, info os.FileInfo, err error) error {
104+
rpath, err := filepath.Rel(vendordir, path)
105+
if err != nil || rpath == "" || rpath == "." || rpath == ".." {
106+
return err
107+
}
108+
if err != nil {
109+
return err
110+
}
111+
err = os.Rename(
112+
filepath.Join(vendordir, rpath),
113+
filepath.Join(srcdir, rpath))
114+
if err != nil {
115+
return err
116+
}
117+
return filepath.SkipDir
118+
})
119+
ErrFatalf(err, "rename failed: %q", err)
120+
121+
err = os.Remove(vendordir)
122+
ErrFatalf(err, "unable to delete vendor: %q", err)
123+
}
124+
125+
func ReadModules(path string) []string {
126+
data, err := ioutil.ReadFile(path)
127+
if os.IsNotExist(err) {
128+
return nil
129+
}
130+
131+
if err != nil {
132+
ErrFatalf(err, "unable to read modules.txt: %q", err)
133+
}
134+
135+
unsorted := []string{}
136+
for _, line := range strings.Split(string(data), "\n") {
137+
line = strings.TrimSpace(line)
138+
if strings.HasPrefix(line, "#") {
139+
continue
140+
}
141+
if line == "" {
142+
continue
143+
}
144+
unsorted = append(unsorted, line)
145+
}
146+
147+
sort.Strings(unsorted)
148+
149+
modules := []string{}
150+
before := "\x00"
151+
152+
for _, line := range unsorted {
153+
if strings.HasPrefix(line, before) {
154+
continue
155+
}
156+
before = line
157+
modules = append(modules, line)
158+
}
159+
160+
return modules
161+
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module storj.io/gospace

main.go

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"path/filepath"
8+
"strings"
9+
)
10+
11+
type Command interface {
12+
Name() string
13+
Parse(args []string) error
14+
Exec()
15+
}
16+
17+
type Common struct {
18+
Root string
19+
RootAbs string
20+
21+
Package string
22+
Repo string
23+
}
24+
25+
func (cmd Common) RepoDir() string {
26+
return cmd.Path("src", filepath.FromSlash(cmd.Package))
27+
}
28+
29+
func (cmd Common) Path(args ...string) string {
30+
return filepath.Join(append([]string{cmd.RootAbs}, args...)...)
31+
}
32+
33+
func main() {
34+
common := Common{}
35+
cmdname := ""
36+
args := []string{}
37+
{
38+
set := flag.NewFlagSet("", flag.ContinueOnError)
39+
40+
set.StringVar(&common.Root, "root", os.Getenv("GOSPACE_ROOT"), "root directory (default GOSPACE_ROOT)")
41+
set.StringVar(&common.Package, "pkg", os.Getenv("GOSPACE_PKG"), "package name (default GOSPACE_PKG)")
42+
set.StringVar(&common.Repo, "repo", os.Getenv("GOSPACE_REPO"), "package name (default GOSPACE_REPO)")
43+
44+
if err := set.Parse(os.Args[1:]); err != nil {
45+
fmt.Fprintln(os.Stderr, "invalid args")
46+
os.Exit(1)
47+
}
48+
49+
fail := false
50+
if common.Root == "" {
51+
fmt.Fprintln(os.Stderr, "root directory is missing, please specify `-root` or GOSPACE_ROOT environment variable")
52+
fail = true
53+
}
54+
if common.Package == "" {
55+
fmt.Fprintln(os.Stderr, "package name is missing, please specify `-pkg` or GOSPACE_PKG environment variable")
56+
fail = true
57+
}
58+
if common.Repo == "" {
59+
fmt.Fprintln(os.Stderr, "repo name is missing, please specify `-repo` or GOSPACE_REPO environment variable")
60+
fail = true
61+
}
62+
63+
if fail {
64+
os.Exit(1)
65+
}
66+
67+
cmdname = set.Arg(0)
68+
if set.NArg() > 1 {
69+
args = set.Args()[1:]
70+
}
71+
72+
common.RootAbs, _ = filepath.Abs(common.Root)
73+
}
74+
75+
cmds := []Command{
76+
&Setup{Common: common},
77+
&Update{Common: common},
78+
}
79+
80+
for _, cmd := range cmds {
81+
if strings.EqualFold(cmdname, cmd.Name()) {
82+
if err := cmd.Parse(args); err != nil {
83+
fmt.Fprintln(os.Stderr, "invalid args", err)
84+
os.Exit(1)
85+
}
86+
cmd.Exec()
87+
return
88+
}
89+
}
90+
91+
fmt.Fprintln(os.Stderr, "unknown command:", cmdname)
92+
fmt.Fprintln(os.Stderr, "supported:")
93+
for _, cmd := range cmds {
94+
fmt.Fprintln(os.Stderr, "\t"+cmd.Name())
95+
}
96+
os.Exit(1)
97+
}

setup.go

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"fmt"
6+
"os"
7+
"os/exec"
8+
)
9+
10+
type Setup struct {
11+
Common
12+
Overwrite bool
13+
}
14+
15+
func (cmd *Setup) Name() string { return "setup" }
16+
17+
func (cmd *Setup) Parse(args []string) error {
18+
set := flag.NewFlagSet(cmd.Name(), flag.ExitOnError)
19+
set.BoolVar(&cmd.Overwrite, "overwrite", false, "overwrite existing and reclone everything")
20+
return set.Parse(args)
21+
}
22+
23+
func (cmd *Setup) Exec() {
24+
if !cmd.Overwrite && !Exists(cmd.Path("src")) {
25+
fmt.Fprintf(os.Stderr, "src directory %q already setup", cmd.Path("src"))
26+
os.Exit(1)
27+
}
28+
29+
// _ = os.RemoveAll(cmd.Path("pkg"))
30+
_ = os.RemoveAll(cmd.Path("bin"))
31+
_ = os.RemoveAll(cmd.Path("src"))
32+
33+
repodir := cmd.RepoDir()
34+
35+
fmt.Fprintf(os.Stdout, "# Cloning repository\n")
36+
git := exec.Command("git", "clone", cmd.Repo, repodir)
37+
git.Stdout, git.Stderr = os.Stdout, os.Stderr
38+
ErrFatal(git.Run(), "git clone failed")
39+
40+
cmd.VendorModules()
41+
cmd.FlattenVendor()
42+
}

update.go

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
)
6+
7+
type Update struct {
8+
Common
9+
}
10+
11+
func (cmd *Update) Name() string { return "update" }
12+
13+
func (cmd *Update) Parse(args []string) error {
14+
set := flag.NewFlagSet("update", flag.ExitOnError)
15+
return set.Parse(args)
16+
}
17+
18+
func (cmd *Update) Exec() {
19+
srcdir := cmd.Path("src")
20+
if !Exists(srcdir) {
21+
Fatalf("src directory %q missing, run setup", srcdir)
22+
}
23+
24+
cmd.DeleteNonRepos()
25+
cmd.VendorModules()
26+
cmd.FlattenVendor()
27+
}

util.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
func Exists(dir string) bool {
9+
_, err := os.Stat(dir)
10+
return err == nil || !os.IsNotExist(err)
11+
}
12+
13+
func Fatal(args ...interface{}) {
14+
fmt.Fprintln(os.Stderr, args...)
15+
panic("aborted")
16+
}
17+
18+
func Fatalf(format string, args ...interface{}) {
19+
fmt.Fprintf(os.Stderr, format, args...)
20+
panic("aborted")
21+
}
22+
23+
func ErrFatal(err error, args ...interface{}) {
24+
if err == nil {
25+
return
26+
}
27+
fmt.Fprintln(os.Stderr, args...)
28+
panic("aborted")
29+
}
30+
31+
func ErrFatalf(err error, format string, args ...interface{}) {
32+
if err == nil {
33+
return
34+
}
35+
fmt.Fprintf(os.Stderr, format, args...)
36+
panic("aborted")
37+
}
38+
39+
func Errf(err error, format string, args ...interface{}) {
40+
if err == nil {
41+
return
42+
}
43+
fmt.Fprintf(os.Stderr, format, args...)
44+
}

0 commit comments

Comments
 (0)