Skip to content

Commit 7a4eec5

Browse files
findleyrgopherbot
authored andcommitted
internal/cmd/weave: add -o flag
Add a -o flag to the weave command, so that it can be more easily used with go:generate. Change-Id: I620c99528ab8156dd89700b1576c445c6ac7c55a Reviewed-on: https://go-review.googlesource.com/c/example/+/702377 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Alan Donovan <[email protected]> Auto-Submit: Robert Findley <[email protected]>
1 parent 8b40562 commit 7a4eec5

File tree

1 file changed

+52
-25
lines changed

1 file changed

+52
-25
lines changed

internal/cmd/weave/weave.go

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -37,33 +37,60 @@ import (
3737
"strings"
3838
)
3939

40+
var output = flag.String("o", "", "output file (empty means stdout)")
41+
4042
func main() {
43+
flag.Usage = func() {
44+
fmt.Fprintf(flag.CommandLine.Output(), "usage: weave [flags] <input.md>\n\nflags:\n")
45+
flag.PrintDefaults()
46+
}
4147
flag.Parse()
42-
log.SetFlags(0)
43-
log.SetPrefix("weave: ")
4448
if flag.NArg() != 1 {
45-
log.Fatal("usage: weave input.md\n")
49+
flag.Usage()
50+
os.Exit(2)
4651
}
4752

48-
f, err := os.Open(flag.Arg(0))
53+
log.SetFlags(0)
54+
log.SetPrefix("weave: ")
55+
56+
wd, err := os.Getwd()
4957
if err != nil {
5058
log.Fatal(err)
5159
}
52-
defer f.Close()
60+
curDir := filepath.Base(wd)
5361

54-
wd, err := os.Getwd()
62+
in, err := os.Open(flag.Arg(0))
5563
if err != nil {
5664
log.Fatal(err)
5765
}
58-
curDir := filepath.Base(wd)
66+
defer in.Close()
5967

60-
fmt.Println("<!-- Autogenerated by weave; DO NOT EDIT -->")
68+
out := os.Stdout
69+
if *output != "" {
70+
out, err = os.Create(*output)
71+
if err != nil {
72+
log.Fatal(err)
73+
}
74+
defer func() {
75+
if err := out.Close(); err != nil {
76+
log.Fatal(err)
77+
}
78+
}()
79+
}
80+
81+
printf := func(format string, args ...any) {
82+
if _, err := fmt.Fprintf(out, format, args...); err != nil {
83+
log.Fatalf("writing failed: %v", err)
84+
}
85+
}
86+
87+
printf("<!-- Autogenerated by weave; DO NOT EDIT -->")
6188

6289
// Pass 1: extract table of contents.
6390
var toc []string
64-
in := bufio.NewScanner(f)
65-
for in.Scan() {
66-
line := in.Text()
91+
scanner := bufio.NewScanner(in)
92+
for scanner.Scan() {
93+
line := scanner.Text()
6794
if line == "" || (line[0] != '#' && line[0] != '%') {
6895
continue
6996
}
@@ -84,21 +111,21 @@ func main() {
84111
toc = append(toc, line)
85112
}
86113
}
87-
if in.Err() != nil {
88-
log.Fatal(in.Err())
114+
if scanner.Err() != nil {
115+
log.Fatal(scanner.Err())
89116
}
90117

91118
// Pass 2.
92-
if _, err := f.Seek(0, io.SeekStart); err != nil {
119+
if _, err := in.Seek(0, io.SeekStart); err != nil {
93120
log.Fatalf("can't rewind input: %v", err)
94121
}
95-
in = bufio.NewScanner(f)
96-
for in.Scan() {
97-
line := in.Text()
122+
scanner = bufio.NewScanner(in)
123+
for scanner.Scan() {
124+
line := scanner.Text()
98125
switch {
99126
case strings.HasPrefix(line, "%toc"): // ToC
100127
for _, h := range toc {
101-
fmt.Println(h)
128+
printf("%s\n", h)
102129
}
103130
case strings.HasPrefix(line, "%include"):
104131
words := strings.Fields(line)
@@ -125,23 +152,23 @@ func main() {
125152
filename := words[1]
126153

127154
if caption {
128-
fmt.Printf(" // go get golang.org/x/example/%s/%s\n\n",
155+
printf(" // go get golang.org/x/example/%s/%s\n\n",
129156
curDir, filepath.Dir(filename))
130157
}
131158

132159
s, err := include(filename, section)
133160
if err != nil {
134161
log.Fatal(err)
135162
}
136-
fmt.Println("```go")
137-
fmt.Println(cleanListing(s)) // TODO(adonovan): escape /^```/ in s
138-
fmt.Println("```")
163+
printf("```go\n")
164+
printf("%s\n", cleanListing(s)) // TODO(adonovan): escape /^```/ in s
165+
printf("```\n")
139166
default:
140-
fmt.Println(line)
167+
printf("%s\n", line)
141168
}
142169
}
143-
if in.Err() != nil {
144-
log.Fatal(in.Err())
170+
if scanner.Err() != nil {
171+
log.Fatal(scanner.Err())
145172
}
146173
}
147174

0 commit comments

Comments
 (0)