@@ -5,49 +5,179 @@ import (
5
5
"fmt"
6
6
"log"
7
7
"os"
8
+ "path/filepath"
8
9
9
10
"github.com/goplus/llgo/chore/genpub/pub"
10
11
)
11
12
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
+
12
45
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" )
42
133
}
43
- } )
44
- return
134
+ pub . WriteDir ( dir )
135
+ }
45
136
}
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
+ }
52
181
}
182
+ subcmds (os .Args )
53
183
}
0 commit comments