Skip to content

Commit 6778d12

Browse files
committed
mainImplementation(): take stdout and stderr as arguments
Instead of writing directly to `os.Stdout` or `os.Stderr`, take two `io.Writer`s as arguments and write to those. This permits a caller to specify another destination for its output, which could be interesting for testing.
1 parent 631f619 commit 6778d12

File tree

1 file changed

+18
-15
lines changed

1 file changed

+18
-15
lines changed

git-sizer.go

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ var ReleaseVersion string
9393
var BuildVersion string
9494

9595
func main() {
96-
err := mainImplementation(os.Args[1:])
96+
err := mainImplementation(os.Stdout, os.Stderr, os.Args[1:])
9797
if err != nil {
9898
fmt.Fprintf(os.Stderr, "error: %s\n", err)
9999
os.Exit(1)
100100
}
101101
}
102102

103-
func mainImplementation(args []string) error {
103+
func mainImplementation(stdout, stderr io.Writer, args []string) error {
104104
var nameStyle sizes.NameStyle = sizes.NameStyleFull
105105
var cpuprofile string
106106
var jsonOutput bool
@@ -116,7 +116,7 @@ func mainImplementation(args []string) error {
116116

117117
flags := pflag.NewFlagSet("git-sizer", pflag.ContinueOnError)
118118
flags.Usage = func() {
119-
fmt.Print(usage)
119+
fmt.Fprint(stdout, usage)
120120
}
121121

122122
flags.VarP(
@@ -154,11 +154,15 @@ func mainImplementation(args []string) error {
154154
flags.BoolVarP(&jsonOutput, "json", "j", false, "output results in JSON format")
155155
flags.IntVar(&jsonVersion, "json-version", 1, "JSON format version to output (1 or 2)")
156156

157-
atty, err := isatty.Isatty(os.Stderr.Fd())
158-
if err != nil {
159-
atty = false
157+
defaultProgress := false
158+
if f, ok := stderr.(*os.File); ok {
159+
atty, err := isatty.Isatty(f.Fd())
160+
if err == nil && atty {
161+
defaultProgress = true
162+
}
160163
}
161-
flags.BoolVar(&progress, "progress", atty, "report progress to stderr")
164+
165+
flags.BoolVar(&progress, "progress", defaultProgress, "report progress to stderr")
162166
flags.BoolVar(&version, "version", false, "report the git-sizer version number")
163167
flags.Var(&NegatedBoolValue{&progress}, "no-progress", "suppress progress output")
164168
flags.Lookup("no-progress").NoOptDefVal = "true"
@@ -205,9 +209,9 @@ func mainImplementation(args []string) error {
205209

206210
if version {
207211
if ReleaseVersion != "" {
208-
fmt.Printf("git-sizer release %s\n", ReleaseVersion)
212+
fmt.Fprintf(stdout, "git-sizer release %s\n", ReleaseVersion)
209213
} else {
210-
fmt.Printf("git-sizer build %s\n", BuildVersion)
214+
fmt.Fprintf(stdout, "git-sizer build %s\n", BuildVersion)
211215
}
212216
return nil
213217
}
@@ -275,13 +279,13 @@ func mainImplementation(args []string) error {
275279
}
276280

277281
if showRefs {
278-
fmt.Fprintf(os.Stderr, "References (included references marked with '+'):\n")
279-
rg = refopts.NewShowRefGrouper(rg, os.Stderr)
282+
fmt.Fprintf(stderr, "References (included references marked with '+'):\n")
283+
rg = refopts.NewShowRefGrouper(rg, stderr)
280284
}
281285

282286
var progressMeter meter.Progress = meter.NoProgressMeter
283287
if progress {
284-
progressMeter = meter.NewProgressMeter(os.Stderr, 100*time.Millisecond)
288+
progressMeter = meter.NewProgressMeter(stderr, 100*time.Millisecond)
285289
}
286290

287291
historySize, err := sizes.ScanRepositoryUsingGraph(repo, rg, nameStyle, progressMeter)
@@ -303,11 +307,10 @@ func mainImplementation(args []string) error {
303307
if err != nil {
304308
return fmt.Errorf("could not convert %v to json: %w", historySize, err)
305309
}
306-
fmt.Printf("%s\n", j)
310+
fmt.Fprintf(stdout, "%s\n", j)
307311
} else {
308312
if _, err := io.WriteString(
309-
os.Stdout,
310-
historySize.TableString(rg.Groups(), threshold, nameStyle),
313+
stdout, historySize.TableString(rg.Groups(), threshold, nameStyle),
311314
); err != nil {
312315
return fmt.Errorf("writing output: %w", err)
313316
}

0 commit comments

Comments
 (0)