Skip to content

Commit d92b035

Browse files
committed
add subcommands for genpub command
1 parent 8d423e4 commit d92b035

File tree

2 files changed

+220
-37
lines changed

2 files changed

+220
-37
lines changed

chore/genpub/main.go

Lines changed: 167 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,49 +5,179 @@ import (
55
"fmt"
66
"log"
77
"os"
8+
"path/filepath"
89

910
"github.com/goplus/llgo/chore/genpub/pub"
1011
)
1112

13+
const (
14+
cleanSubcmd string = "clean"
15+
mergeSubcmd string = "merge"
16+
helpSubcmd string = "help"
17+
genpubCommand string = "main"
18+
)
19+
20+
func makeFlagsetMap() map[string]*flag.FlagSet {
21+
flagsetMap := make(map[string]*flag.FlagSet)
22+
flagsetMap[cleanSubcmd] = flag.NewFlagSet(cleanSubcmd, flag.ExitOnError)
23+
flagsetMap[cleanSubcmd].Usage = func() {
24+
fmt.Println(`clean all generaged .pub file for dir and it's subdir.
25+
usage: genpub clean dir`)
26+
}
27+
flagsetMap[mergeSubcmd] = flag.NewFlagSet(mergeSubcmd, flag.ExitOnError)
28+
flagsetMap[mergeSubcmd].Usage = func() {
29+
fmt.Println(`merge all .pub files to llcppg.pub.
30+
usage: genpub merge [-dir] llcppg.pub`)
31+
}
32+
flagsetMap[helpSubcmd] = flag.NewFlagSet(helpSubcmd, flag.ExitOnError)
33+
flagsetMap[helpSubcmd].Usage = func() {
34+
fmt.Println(`print help information for subcmds(clean,merge) or for genpub command.
35+
usage: genpub help or genpub help [clean|merge]`)
36+
}
37+
flagsetMap[genpubCommand] = flag.NewFlagSet(genpubCommand, flag.ExitOnError)
38+
flagsetMap[genpubCommand].Usage = func() {
39+
fmt.Println(`genpub is a tool for handling pub files.
40+
usage:genpub help [clean|merge] or genpub [-r] dir`)
41+
}
42+
return flagsetMap
43+
}
44+
1245
func main() {
13-
help, r, clean := false, false, false
14-
flag.BoolVar(&help, "h", false, "print help infomation")
15-
flag.BoolVar(&r, "r", false, "true if generate .pub recursively")
16-
flag.BoolVar(&clean, "clean", false, "clean all generaged .pub file for dir and it's subdir")
17-
flag.Parse()
18-
flag.Usage = func() {
19-
fmt.Println(`genpub is used to generate a .pub file for a dir of c standard lib.
20-
usage:genpub [path to dir]`)
21-
flag.PrintDefaults()
22-
}
23-
if help {
24-
flag.Usage()
25-
return
26-
}
27-
dir := "."
28-
if len(flag.Args()) > 0 {
29-
dir = flag.Args()[0]
30-
}
31-
if clean {
32-
pub.DoDirRecursively(dir, func(d string) {
33-
pubfile := pub.PubFilenameForDir(d)
34-
_, err := os.Stat(pubfile)
35-
if !os.IsNotExist(err) {
36-
err = os.Remove(pubfile)
37-
if err != nil {
38-
log.Panicln(err)
39-
} else {
40-
fmt.Println("remove", pubfile, "successfully")
41-
}
46+
47+
flagsetMap := makeFlagsetMap()
48+
49+
clean := func(do bool, args ...string) {
50+
if !do {
51+
return
52+
}
53+
if len(args) > 0 {
54+
defer func() {
55+
fmt.Println("clean finished!")
56+
}()
57+
fmt.Printf("starting clean all .pub files for %s\n", args[0])
58+
pub.CleanPubfileRecursively(args[0])
59+
} else {
60+
log.Println("please specify a directory where you want to clean up .pub files.")
61+
flagsetMap[cleanSubcmd].Usage()
62+
flagsetMap[cleanSubcmd].PrintDefaults()
63+
}
64+
}
65+
66+
merge := func(do bool, args ...string) {
67+
fs := flagsetMap[mergeSubcmd]
68+
pDir := fs.String("dir", ".", "merge all .pub files of the dir recursively to llcppg.pub")
69+
if err := fs.Parse(args); err != nil {
70+
log.Printf("error: %s", err)
71+
return
72+
}
73+
if !do {
74+
return
75+
}
76+
if pDir == nil {
77+
log.Println("Please specify a directory where you want to merge .pub files")
78+
fs.Usage()
79+
fs.PrintDefaults()
80+
return
81+
}
82+
var llcppgPubFileName string
83+
if len(fs.Args()) > 0 {
84+
llcppgPubFileName = fs.Args()[0]
85+
} else {
86+
pubfile, err := filepath.Abs("./llcppg.pub")
87+
if err != nil {
88+
log.Printf("error: %s", err)
89+
return
90+
}
91+
llcppgPubFileName = pubfile
92+
}
93+
defer func() {
94+
fmt.Println("merge finished!")
95+
}()
96+
fmt.Printf("starting merge all .pub files for %s to %s\n", *pDir, llcppgPubFileName)
97+
pub.MergePubfiles(llcppgPubFileName, *pDir)
98+
}
99+
100+
genpub := func(do bool, args ...string) {
101+
fs := flagsetMap[genpubCommand]
102+
pR := flag.Bool("r", false, "true if generate .pub recursively")
103+
if err := fs.Parse(args); err != nil {
104+
log.Printf("error: %s", err)
105+
return
106+
}
107+
if !do {
108+
return
109+
}
110+
var dir string
111+
if len(fs.Args()) > 0 {
112+
dir = fs.Args()[0]
113+
} else {
114+
dir = "."
115+
}
116+
defer func() {
117+
fmt.Println("generate done!")
118+
}()
119+
if *pR {
120+
if dir != "." {
121+
fmt.Printf("starting generate all .pub files recursively for %s\n", dir)
122+
} else {
123+
fmt.Println("starting generate .pub files recursively for working dir")
124+
}
125+
pub.DoDirRecursively(dir, func(d string) {
126+
pub.WriteDir(d)
127+
})
128+
} else {
129+
if dir != "." {
130+
fmt.Printf("starting generate .pub file for %s\n", dir)
131+
} else {
132+
fmt.Println("starting generate .pub file for working dir")
42133
}
43-
})
44-
return
134+
pub.WriteDir(dir)
135+
}
45136
}
46-
if r {
47-
pub.DoDirRecursively(dir, func(d string) {
48-
pub.WriteDir(d)
49-
})
50-
} else {
51-
pub.WriteDir(dir)
137+
138+
help := func(args []string) {
139+
if len(args) > 0 {
140+
switch args[0] {
141+
case cleanSubcmd:
142+
clean(false)
143+
flagsetMap[cleanSubcmd].Usage()
144+
flagsetMap[cleanSubcmd].PrintDefaults()
145+
case mergeSubcmd:
146+
merge(false)
147+
flagsetMap[mergeSubcmd].Usage()
148+
flagsetMap[mergeSubcmd].PrintDefaults()
149+
default:
150+
genpub(false)
151+
flagsetMap[genpubCommand].Usage()
152+
flagsetMap[genpubCommand].PrintDefaults()
153+
}
154+
} else {
155+
genpub(false)
156+
flagsetMap[genpubCommand].Usage()
157+
flagsetMap[genpubCommand].PrintDefaults()
158+
}
159+
}
160+
161+
subcmds := func(args []string) {
162+
if len(args) > 1 {
163+
switch args[1] {
164+
case cleanSubcmd:
165+
subArgs := args[2:]
166+
clean(true, subArgs...)
167+
case mergeSubcmd:
168+
subArgs := args[2:]
169+
merge(true, subArgs...)
170+
case helpSubcmd:
171+
subArgs := args[2:]
172+
help(subArgs)
173+
default:
174+
subArgs := args[1:]
175+
genpub(true, subArgs...)
176+
}
177+
} else {
178+
flagsetMap[genpubCommand].Usage()
179+
flagsetMap[genpubCommand].PrintDefaults()
180+
}
52181
}
182+
subcmds(os.Args)
53183
}

chore/genpub/pub/pub.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,3 +218,56 @@ func DoDirRecursively(dir string, fn func(d string)) {
218218
}
219219
wg.Wait()
220220
}
221+
222+
func CleanPubfile(dir string) {
223+
pubfile := PubFilenameForDir(dir)
224+
_, err := os.Stat(pubfile)
225+
if !os.IsNotExist(err) {
226+
err = os.Remove(pubfile)
227+
if err != nil {
228+
log.Panicln(err)
229+
} else {
230+
fmt.Println("remove", pubfile, "successfully")
231+
}
232+
}
233+
}
234+
235+
func CleanPubfileRecursively(dir string) {
236+
DoDirRecursively(dir, func(d string) {
237+
CleanPubfile(d)
238+
})
239+
}
240+
241+
func MergePubfiles(llcppgPubFileName string, dir string) {
242+
f, err := os.Create(llcppgPubFileName)
243+
if err != nil {
244+
panic(err)
245+
}
246+
defer f.Close()
247+
w := bufio.NewWriter(f)
248+
defer func() {
249+
if w.Buffered() > 0 {
250+
w.Flush()
251+
} else {
252+
fmt.Println("no pub files to merge! remove it!")
253+
os.Remove(llcppgPubFileName)
254+
}
255+
}()
256+
quit := make(chan int)
257+
defer close(quit)
258+
dirs := GenDirs(quit, dir)
259+
for d := range dirs {
260+
pubfile := PubFilenameForDir(d)
261+
_, err := os.Stat(pubfile)
262+
if !os.IsNotExist(err) {
263+
b, err := os.ReadFile(pubfile)
264+
if err != nil {
265+
panic(err)
266+
}
267+
_, err = w.Write(b)
268+
if err != nil {
269+
panic(err)
270+
}
271+
}
272+
}
273+
}

0 commit comments

Comments
 (0)