Skip to content
This repository was archived by the owner on Sep 9, 2020. It is now read-only.

Commit a45e03b

Browse files
authored
Merge pull request #1617 from jmank88/log_api
log.Logger api changes
2 parents 93bcb36 + c30c76b commit a45e03b

File tree

10 files changed

+86
-63
lines changed

10 files changed

+86
-63
lines changed

cmd/dep/ensure.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"flag"
1111
"fmt"
1212
"go/build"
13-
"io/ioutil"
1413
"log"
1514
"os"
1615
"path/filepath"
@@ -288,9 +287,9 @@ func (cmd *ensureCommand) runDefault(ctx *dep.Ctx, args []string, p *dep.Project
288287
return sw.PrintPreparedActions(ctx.Out, ctx.Verbose)
289288
}
290289

291-
logger := ctx.Err
292-
if !ctx.Verbose {
293-
logger = log.New(ioutil.Discard, "", 0)
290+
var logger *log.Logger
291+
if ctx.Verbose {
292+
logger = ctx.Err
294293
}
295294
return errors.WithMessage(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor")
296295
}
@@ -312,9 +311,9 @@ func (cmd *ensureCommand) runDefault(ctx *dep.Ctx, args []string, p *dep.Project
312311
return sw.PrintPreparedActions(ctx.Out, ctx.Verbose)
313312
}
314313

315-
logger := ctx.Err
316-
if !ctx.Verbose {
317-
logger = log.New(ioutil.Discard, "", 0)
314+
var logger *log.Logger
315+
if ctx.Verbose {
316+
logger = ctx.Err
318317
}
319318
return errors.Wrap(sw.Write(p.AbsRoot, sm, false, logger), "grouped write of manifest, lock and vendor")
320319
}
@@ -338,9 +337,9 @@ func (cmd *ensureCommand) runVendorOnly(ctx *dep.Ctx, args []string, p *dep.Proj
338337
return sw.PrintPreparedActions(ctx.Out, ctx.Verbose)
339338
}
340339

341-
logger := ctx.Err
342-
if !ctx.Verbose {
343-
logger = log.New(ioutil.Discard, "", 0)
340+
var logger *log.Logger
341+
if ctx.Verbose {
342+
logger = ctx.Err
344343
}
345344
return errors.WithMessage(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor")
346345
}
@@ -402,9 +401,9 @@ func (cmd *ensureCommand) runUpdate(ctx *dep.Ctx, args []string, p *dep.Project,
402401
return sw.PrintPreparedActions(ctx.Out, ctx.Verbose)
403402
}
404403

405-
logger := ctx.Err
406-
if !ctx.Verbose {
407-
logger = log.New(ioutil.Discard, "", 0)
404+
var logger *log.Logger
405+
if ctx.Verbose {
406+
logger = ctx.Err
408407
}
409408
return errors.Wrap(sw.Write(p.AbsRoot, sm, false, logger), "grouped write of manifest, lock and vendor")
410409
}
@@ -702,9 +701,9 @@ func (cmd *ensureCommand) runAdd(ctx *dep.Ctx, args []string, p *dep.Project, sm
702701
return sw.PrintPreparedActions(ctx.Out, ctx.Verbose)
703702
}
704703

705-
logger := ctx.Err
706-
if !ctx.Verbose {
707-
logger = log.New(ioutil.Discard, "", 0)
704+
var logger *log.Logger
705+
if ctx.Verbose {
706+
logger = ctx.Err
708707
}
709708
if err := errors.Wrap(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor"); err != nil {
710709
return err

cmd/dep/init.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package main
77
import (
88
"context"
99
"flag"
10-
"io/ioutil"
1110
"log"
1211
"os"
1312
"path/filepath"
@@ -185,9 +184,9 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
185184
return errors.Wrap(err, "init failed: unable to create a SafeWriter")
186185
}
187186

188-
logger := ctx.Err
189-
if !ctx.Verbose {
190-
logger = log.New(ioutil.Discard, "", 0)
187+
var logger *log.Logger
188+
if ctx.Verbose {
189+
logger = ctx.Err
191190
}
192191
if err := sw.Write(root, sm, !cmd.noExamples, logger); err != nil {
193192
return errors.Wrap(err, "init failed: unable to write the manifest, lock and vendor directory to disk")

cmd/dep/prune.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,10 @@ func pruneProject(p *dep.Project, sm gps.SourceManager, logger *log.Logger) erro
103103
}
104104
defer os.RemoveAll(td)
105105

106-
if err := gps.WriteDepTree(td, p.Lock, sm, gps.CascadingPruneOptions{DefaultOptions: gps.PruneNestedVendorDirs}, logger); err != nil {
106+
onWrite := func(progress gps.WriteProgress) {
107+
logger.Println(progress)
108+
}
109+
if err := gps.WriteDepTree(td, p.Lock, sm, gps.CascadingPruneOptions{DefaultOptions: gps.PruneNestedVendorDirs}, onWrite); err != nil {
107110
return err
108111
}
109112

gps/example.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,10 @@ func main() {
5454
// If no failure, blow away the vendor dir and write a new one out,
5555
// stripping nested vendor directories as we go.
5656
os.RemoveAll(filepath.Join(root, "vendor"))
57-
gps.WriteDepTree(filepath.Join(root, "vendor"), solution, sourcemgr, true)
57+
pruneOpts := gps.CascadingPruneOptions{
58+
DefaultOptions: gps.PruneNestedVendorDirs | gps.PruneUnusedPackages | gps.PruneGoTestFiles,
59+
}
60+
gps.WriteDepTree(filepath.Join(root, "vendor"), solution, sourcemgr, pruneOpts, nil)
5861
}
5962
}
6063

gps/prune.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
package gps
66

77
import (
8-
"log"
98
"os"
109
"path/filepath"
1110
"sort"
@@ -138,7 +137,7 @@ var (
138137

139138
// PruneProject remove excess files according to the options passed, from
140139
// the lp directory in baseDir.
141-
func PruneProject(baseDir string, lp LockedProject, options PruneOptions, logger *log.Logger) error {
140+
func PruneProject(baseDir string, lp LockedProject, options PruneOptions) error {
142141
fsState, err := deriveFilesystemState(baseDir)
143142

144143
if err != nil {

gps/prune_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package gps
66

77
import (
88
"io/ioutil"
9-
"log"
109
"os"
1110
"testing"
1211

@@ -120,9 +119,8 @@ func TestPruneProject(t *testing.T) {
120119
}
121120

122121
options := PruneNestedVendorDirs | PruneNonGoFiles | PruneGoTestFiles | PruneUnusedPackages
123-
logger := log.New(ioutil.Discard, "", 0)
124122

125-
err := PruneProject(baseDir, lp, options, logger)
123+
err := PruneProject(baseDir, lp, options)
126124
if err != nil {
127125
t.Fatal(err)
128126
}

gps/solution.go

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ package gps
77
import (
88
"context"
99
"fmt"
10-
"log"
1110
"os"
1211
"path/filepath"
1312
"sync"
@@ -48,6 +47,22 @@ type solution struct {
4847
solv Solver
4948
}
5049

50+
// WriteProgress informs about the progress of WriteDepTree.
51+
type WriteProgress struct {
52+
Count int
53+
Total int
54+
LP LockedProject
55+
Failure bool
56+
}
57+
58+
func (p WriteProgress) String() string {
59+
msg := "Wrote"
60+
if p.Failure {
61+
msg = "Failed to write"
62+
}
63+
return fmt.Sprintf("(%d/%d) %s %s@%s", p.Count, p.Total, msg, p.LP.Ident(), p.LP.Version())
64+
}
65+
5166
const concurrentWriters = 16
5267

5368
// WriteDepTree takes a basedir, a Lock and a RootPruneOptions and exports all
@@ -58,7 +73,9 @@ const concurrentWriters = 16
5873
//
5974
// It requires a SourceManager to do the work. Prune options are read from the
6075
// passed manifest.
61-
func WriteDepTree(basedir string, l Lock, sm SourceManager, co CascadingPruneOptions, logger *log.Logger) error {
76+
//
77+
// If onWrite is not nil, it will be called after each project write. Calls are ordered and atomic.
78+
func WriteDepTree(basedir string, l Lock, sm SourceManager, co CascadingPruneOptions, onWrite func(WriteProgress)) error {
6279
if l == nil {
6380
return fmt.Errorf("must provide non-nil Lock to WriteDepTree")
6481
}
@@ -95,7 +112,7 @@ func WriteDepTree(basedir string, l Lock, sm SourceManager, co CascadingPruneOpt
95112
return errors.Wrapf(err, "failed to export %s", projectRoot)
96113
}
97114

98-
err := PruneProject(to, p, co.PruneOptionsFor(ident.ProjectRoot), logger)
115+
err := PruneProject(to, p, co.PruneOptionsFor(ident.ProjectRoot))
99116
if err != nil {
100117
return errors.Wrapf(err, "failed to prune %s", projectRoot)
101118
}
@@ -105,18 +122,20 @@ func WriteDepTree(basedir string, l Lock, sm SourceManager, co CascadingPruneOpt
105122

106123
switch err {
107124
case context.Canceled, context.DeadlineExceeded:
108-
// Don't log "secondary" errors.
125+
// Don't report "secondary" errors.
109126
default:
110-
msg := "Wrote"
111-
if err != nil {
112-
msg = "Failed to write"
127+
if onWrite != nil {
128+
// Increment and call atomically to prevent re-ordering.
129+
cnt.Lock()
130+
cnt.i++
131+
onWrite(WriteProgress{
132+
Count: cnt.i,
133+
Total: len(lps),
134+
LP: p,
135+
Failure: err != nil,
136+
})
137+
cnt.Unlock()
113138
}
114-
115-
// Log and increment atomically to prevent re-ordering.
116-
cnt.Lock()
117-
cnt.i++
118-
logger.Printf("(%d/%d) %s %s@%s\n", cnt.i, len(lps), msg, p.Ident(), p.Version())
119-
cnt.Unlock()
120139
}
121140

122141
return err

gps/solution_test.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,6 @@ import (
1616
"github.com/golang/dep/internal/test"
1717
)
1818

19-
func discardLogger() *log.Logger {
20-
return log.New(ioutil.Discard, "", 0)
21-
}
22-
2319
var basicResult solution
2420

2521
func pi(n string) ProjectIdentifier {
@@ -109,12 +105,12 @@ func testWriteDepTree(t *testing.T) {
109105
}
110106

111107
// nil lock/result should err immediately
112-
err = WriteDepTree(tmp, nil, sm, defaultCascadingPruneOptions(), discardLogger())
108+
err = WriteDepTree(tmp, nil, sm, defaultCascadingPruneOptions(), nil)
113109
if err == nil {
114110
t.Errorf("Should error if nil lock is passed to WriteDepTree")
115111
}
116112

117-
err = WriteDepTree(tmp, r, sm, defaultCascadingPruneOptions(), discardLogger())
113+
err = WriteDepTree(tmp, r, sm, defaultCascadingPruneOptions(), nil)
118114
if err != nil {
119115
t.Errorf("Unexpected error while creating vendor tree: %s", err)
120116
}
@@ -157,7 +153,6 @@ func BenchmarkCreateVendorTree(b *testing.B) {
157153
}
158154

159155
if clean {
160-
logger := discardLogger()
161156
b.ResetTimer()
162157
b.StopTimer()
163158
exp := path.Join(tmp, "export")
@@ -166,7 +161,7 @@ func BenchmarkCreateVendorTree(b *testing.B) {
166161
// ease manual inspection
167162
os.RemoveAll(exp)
168163
b.StartTimer()
169-
err = WriteDepTree(exp, r, sm, defaultCascadingPruneOptions(), logger)
164+
err = WriteDepTree(exp, r, sm, defaultCascadingPruneOptions(), nil)
170165
b.StopTimer()
171166
if err != nil {
172167
b.Errorf("unexpected error after %v iterations: %s", i, err)

txn_writer.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,8 @@ func (sw SafeWriter) validate(root string, sm gps.SourceManager) error {
267267
// operations succeeded. It also does its best to roll back if any moves fail.
268268
// This mostly guarantees that dep cannot exit with a partial write that would
269269
// leave an undefined state on disk.
270+
//
271+
// If logger is not nil, progress will be logged after each project write.
270272
func (sw *SafeWriter) Write(root string, sm gps.SourceManager, examples bool, logger *log.Logger) error {
271273
err := sw.validate(root, sm)
272274
if err != nil {
@@ -319,7 +321,13 @@ func (sw *SafeWriter) Write(root string, sm gps.SourceManager, examples bool, lo
319321
}
320322

321323
if sw.writeVendor {
322-
err = gps.WriteDepTree(filepath.Join(td, "vendor"), sw.lock, sm, sw.pruneOptions, logger)
324+
var onWrite func(gps.WriteProgress)
325+
if logger != nil {
326+
onWrite = func(progress gps.WriteProgress) {
327+
logger.Println(progress)
328+
}
329+
}
330+
err = gps.WriteDepTree(filepath.Join(td, "vendor"), sw.lock, sm, sw.pruneOptions, onWrite)
323331
if err != nil {
324332
return errors.Wrap(err, "error while writing out vendor tree")
325333
}

0 commit comments

Comments
 (0)