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

Commit 7a92654

Browse files
committed
dep, internal/gps: update SafeWriter.Write and gps.WriteDepTree
Signed-off-by: Ibrahim AshShohail <[email protected]>
1 parent 40838f5 commit 7a92654

File tree

6 files changed

+95
-52
lines changed

6 files changed

+95
-52
lines changed

cmd/dep/ensure.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,9 @@ func (cmd *ensureCommand) runDefault(ctx *dep.Ctx, args []string, p *dep.Project
252252
if !ctx.Verbose {
253253
logger = log.New(ioutil.Discard, "", 0)
254254
}
255-
return errors.WithMessage(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor")
255+
256+
err = sw.Write(p.AbsRoot, sm, true, p.Manifest.PruneOptions, logger)
257+
return errors.WithMessage(err, "grouped write of manifest, lock and vendor")
256258
}
257259

258260
solution, err := solver.Solve()
@@ -273,7 +275,9 @@ func (cmd *ensureCommand) runDefault(ctx *dep.Ctx, args []string, p *dep.Project
273275
if !ctx.Verbose {
274276
logger = log.New(ioutil.Discard, "", 0)
275277
}
276-
return errors.Wrap(sw.Write(p.AbsRoot, sm, false, logger), "grouped write of manifest, lock and vendor")
278+
279+
err = sw.Write(p.AbsRoot, sm, false, p.Manifest.PruneOptions, logger)
280+
return errors.Wrap(err, "grouped write of manifest, lock and vendor")
277281
}
278282

279283
func (cmd *ensureCommand) runVendorOnly(ctx *dep.Ctx, args []string, p *dep.Project, sm gps.SourceManager, params gps.SolveParameters) error {
@@ -306,7 +310,9 @@ func (cmd *ensureCommand) runVendorOnly(ctx *dep.Ctx, args []string, p *dep.Proj
306310
if !ctx.Verbose {
307311
logger = log.New(ioutil.Discard, "", 0)
308312
}
309-
return errors.WithMessage(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor")
313+
314+
err = sw.Write(p.AbsRoot, sm, true, p.Manifest.PruneOptions, logger)
315+
return errors.WithMessage(err, "grouped write of manifest, lock and vendor")
310316
}
311317

312318
func (cmd *ensureCommand) runUpdate(ctx *dep.Ctx, args []string, p *dep.Project, sm gps.SourceManager, params gps.SolveParameters) error {
@@ -401,7 +407,9 @@ func (cmd *ensureCommand) runUpdate(ctx *dep.Ctx, args []string, p *dep.Project,
401407
if !ctx.Verbose {
402408
logger = log.New(ioutil.Discard, "", 0)
403409
}
404-
return errors.Wrap(sw.Write(p.AbsRoot, sm, false, logger), "grouped write of manifest, lock and vendor")
410+
411+
err = sw.Write(p.AbsRoot, sm, false, p.Manifest.PruneOptions, logger)
412+
return errors.Wrap(err, "grouped write of manifest, lock and vendor")
405413
}
406414

407415
func (cmd *ensureCommand) runAdd(ctx *dep.Ctx, args []string, p *dep.Project, sm gps.SourceManager, params gps.SolveParameters) error {
@@ -654,7 +662,9 @@ func (cmd *ensureCommand) runAdd(ctx *dep.Ctx, args []string, p *dep.Project, sm
654662
if !ctx.Verbose {
655663
logger = log.New(ioutil.Discard, "", 0)
656664
}
657-
if err := errors.Wrap(sw.Write(p.AbsRoot, sm, true, logger), "grouped write of manifest, lock and vendor"); err != nil {
665+
666+
err = sw.Write(p.AbsRoot, sm, true, p.Manifest.PruneOptions, logger)
667+
if err := errors.Wrap(err, "grouped write of manifest, lock and vendor"); err != nil {
658668
return err
659669
}
660670

cmd/dep/init.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
213213
if !ctx.Verbose {
214214
logger = log.New(ioutil.Discard, "", 0)
215215
}
216-
if err := sw.Write(root, sm, !cmd.noExamples, logger); err != nil {
216+
217+
if err := sw.Write(root, sm, !cmd.noExamples, p.Manifest.PruneOptions, logger); err != nil {
217218
return errors.Wrap(err, "safe write of manifest and lock")
218219
}
219220

internal/gps/result.go

+50-21
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
package gps
66

77
import (
8-
"fmt"
98
"log"
109
"os"
1110
"path/filepath"
11+
"sync"
12+
13+
"github.com/pkg/errors"
1214
)
1315

1416
// A Solution is returned by a solver run. It is mostly just a Lock, with some
@@ -43,38 +45,65 @@ type solution struct {
4345
solv Solver
4446
}
4547

46-
// WriteDepTree takes a basedir and a Lock, and exports all the projects
47-
// listed in the lock to the appropriate target location within the basedir.
48+
// WriteDepTree takes a baseDir and a Lock, and exports all the projects
49+
// listed in the lock to the appropriate target location within baseDir.
4850
//
49-
// If the goal is to populate a vendor directory, basedir should be the absolute
51+
// If the goal is to populate a vendor directory, baseDir should be the absolute
5052
// path to that vendor directory, not its parent (a project root, typically).
5153
//
52-
// It requires a SourceManager to do the work, and takes a flag indicating
53-
// whether or not to strip vendor directories contained in the exported
54-
// dependencies.
55-
func WriteDepTree(basedir string, l Lock, sm SourceManager, sv bool, logger *log.Logger) error {
54+
// It requires a SourceManager to do the work, and takes a PruneOptions
55+
// indicating the pruning options required for the exported dependencies.
56+
func WriteDepTree(baseDir string, l Lock, sm SourceManager, prune PruneOptions, logger *log.Logger) error {
57+
if baseDir == "" {
58+
return errors.New("must provide a non-empty baseDir")
59+
}
5660
if l == nil {
57-
return fmt.Errorf("must provide non-nil Lock to WriteDepTree")
61+
return errors.New("must provide a non-nil Lock to WriteDepTree")
62+
}
63+
if sm == nil {
64+
return errors.New("must provide a non-nil SourceManager to WriteDepTree")
5865
}
5966

60-
err := os.MkdirAll(basedir, 0777)
61-
if err != nil {
67+
if err := os.MkdirAll(baseDir, 0777); err != nil {
6268
return err
6369
}
6470

65-
// TODO(sdboyer) parallelize
71+
var wg sync.WaitGroup
72+
errCh := make(chan error, len(l.Projects()))
73+
6674
for _, p := range l.Projects() {
67-
to := filepath.FromSlash(filepath.Join(basedir, string(p.Ident().ProjectRoot)))
75+
wg.Add(1)
76+
go func(p LockedProject) {
77+
to := filepath.FromSlash(filepath.Join(baseDir, string(p.Ident().ProjectRoot)))
6878

69-
logger.Printf("Writing out %s@%s", p.Ident().errString(), p.Version())
70-
err = sm.ExportProject(p.Ident(), p.Version(), to)
71-
if err != nil {
72-
removeAll(basedir)
73-
return fmt.Errorf("error while exporting %s@%s: %s", p.Ident().errString(), p.Version(), err)
74-
}
75-
if sv {
76-
filepath.Walk(to, stripVendor)
79+
logger.Printf("Writing out %s@%s", p.Ident().errString(), p.Version())
80+
81+
if err := sm.ExportProject(p.Ident(), p.Version(), to); err != nil {
82+
removeAll(to)
83+
errCh <- errors.Wrapf(err, "failed to export %s", p.Ident().ProjectRoot)
84+
}
85+
86+
wg.Done()
87+
}(p)
88+
}
89+
90+
wg.Wait()
91+
close(errCh)
92+
93+
if len(errCh) > 0 {
94+
logger.Println("Failed to write dep tree. The following errors occurred:")
95+
for err := range errCh {
96+
logger.Println(" * ", err)
7797
}
98+
removeAll(baseDir)
99+
// TODO(ibrasho) handle multiple errors
100+
return <-errCh
101+
}
102+
103+
if err := Prune(baseDir, prune, l, logger); err != nil {
104+
logger.Println("Failed to prune dep tree.")
105+
removeAll(baseDir)
106+
return err
78107
}
79108

80109
return nil

internal/gps/result_test.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import (
1313
"testing"
1414
)
1515

16-
var discardLogger = log.New(ioutil.Discard, "", 0)
17-
18-
var basicResult solution
16+
var (
17+
basicResult solution
18+
discardLogger = log.New(ioutil.Discard, "", 0)
19+
)
1920

2021
func pi(n string) ProjectIdentifier {
2122
return ProjectIdentifier{
@@ -93,13 +94,12 @@ func testWriteDepTree(t *testing.T) {
9394
}
9495

9596
// nil lock/result should err immediately
96-
err = WriteDepTree(tmp, nil, sm, true, discardLogger)
97-
if err == nil {
97+
98+
if err = WriteDepTree(tmp, nil, sm, PruneNestedVendorDirs, discardLogger); err == nil {
9899
t.Errorf("Should error if nil lock is passed to WriteDepTree")
99100
}
100101

101-
err = WriteDepTree(tmp, r, sm, true, discardLogger)
102-
if err != nil {
102+
if err = WriteDepTree(tmp, r, sm, PruneNestedVendorDirs, discardLogger); err != nil {
103103
t.Errorf("Unexpected error while creating vendor tree: %s", err)
104104
}
105105

@@ -146,7 +146,7 @@ func BenchmarkCreateVendorTree(b *testing.B) {
146146
// ease manual inspection
147147
os.RemoveAll(exp)
148148
b.StartTimer()
149-
err = WriteDepTree(exp, r, sm, true, discardLogger)
149+
err = WriteDepTree(exp, r, sm, PruneNestedVendorDirs, discardLogger)
150150
b.StopTimer()
151151
if err != nil {
152152
b.Errorf("unexpected error after %v iterations: %s", i, err)

txn_writer.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -253,15 +253,15 @@ func (sw SafeWriter) validate(root string, sm gps.SourceManager) error {
253253
return nil
254254
}
255255

256-
// Write saves some combination of config yaml, lock, and a vendor tree.
256+
// Write saves some combination of a manifest, a lock, and a vendor tree.
257257
// root is the absolute path of root dir in which to write.
258258
// sm is only required if vendor is being written.
259259
//
260260
// It first writes to a temp dir, then moves them in place if and only if all the write
261261
// operations succeeded. It also does its best to roll back if any moves fail.
262262
// This mostly guarantees that dep cannot exit with a partial write that would
263263
// leave an undefined state on disk.
264-
func (sw *SafeWriter) Write(root string, sm gps.SourceManager, examples bool, logger *log.Logger) error {
264+
func (sw *SafeWriter) Write(root string, sm gps.SourceManager, examples bool, prune gps.PruneOptions, logger *log.Logger) error {
265265
err := sw.validate(root, sm)
266266
if err != nil {
267267
return err
@@ -313,7 +313,10 @@ func (sw *SafeWriter) Write(root string, sm gps.SourceManager, examples bool, lo
313313
}
314314

315315
if sw.writeVendor {
316-
err = gps.WriteDepTree(filepath.Join(td, "vendor"), sw.lock, sm, true, logger)
316+
// Ensure that gps.PruneNestedVendorDirs is toggled on.
317+
prune |= gps.PruneNestedVendorDirs
318+
319+
err = gps.WriteDepTree(filepath.Join(td, "vendor"), sw.lock, sm, prune, logger)
317320
if err != nil {
318321
return errors.Wrap(err, "error while writing out vendor tree")
319322
}

txn_writer_test.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestSafeWriter_BadInput_MissingRoot(t *testing.T) {
2626
defer pc.Release()
2727

2828
sw, _ := NewSafeWriter(nil, nil, nil, VendorOnChanged)
29-
err := sw.Write("", pc.SourceManager, true, discardLogger)
29+
err := sw.Write("", pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
3030

3131
if err == nil {
3232
t.Fatal("should have errored without a root path, but did not")
@@ -44,7 +44,7 @@ func TestSafeWriter_BadInput_MissingSourceManager(t *testing.T) {
4444
pc.Load()
4545

4646
sw, _ := NewSafeWriter(nil, nil, pc.Project.Lock, VendorAlways)
47-
err := sw.Write(pc.Project.AbsRoot, nil, true, discardLogger)
47+
err := sw.Write(pc.Project.AbsRoot, nil, true, PruneNestedVendorDirs, discardLogger)
4848

4949
if err == nil {
5050
t.Fatal("should have errored without a source manager when forceVendor is true, but did not")
@@ -92,7 +92,7 @@ func TestSafeWriter_BadInput_NonexistentRoot(t *testing.T) {
9292
sw, _ := NewSafeWriter(nil, nil, nil, VendorOnChanged)
9393

9494
missingroot := filepath.Join(pc.Project.AbsRoot, "nonexistent")
95-
err := sw.Write(missingroot, pc.SourceManager, true, discardLogger)
95+
err := sw.Write(missingroot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
9696

9797
if err == nil {
9898
t.Fatal("should have errored with nonexistent dir for root path, but did not")
@@ -110,7 +110,7 @@ func TestSafeWriter_BadInput_RootIsFile(t *testing.T) {
110110
sw, _ := NewSafeWriter(nil, nil, nil, VendorOnChanged)
111111

112112
fileroot := pc.CopyFile("fileroot", "txn_writer/badinput_fileroot")
113-
err := sw.Write(fileroot, pc.SourceManager, true, discardLogger)
113+
err := sw.Write(fileroot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
114114

115115
if err == nil {
116116
t.Fatal("should have errored when root path is a file, but did not")
@@ -145,7 +145,7 @@ func TestSafeWriter_Manifest(t *testing.T) {
145145
}
146146

147147
// Write changes
148-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
148+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
149149
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
150150

151151
// Verify file system changes
@@ -190,7 +190,7 @@ func TestSafeWriter_ManifestAndUnmodifiedLock(t *testing.T) {
190190
}
191191

192192
// Write changes
193-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
193+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
194194
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
195195

196196
// Verify file system changes
@@ -235,7 +235,7 @@ func TestSafeWriter_ManifestAndUnmodifiedLockWithForceVendor(t *testing.T) {
235235
}
236236

237237
// Write changes
238-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
238+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
239239
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
240240

241241
// Verify file system changes
@@ -285,7 +285,7 @@ func TestSafeWriter_ModifiedLock(t *testing.T) {
285285
}
286286

287287
// Write changes
288-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
288+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
289289
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
290290

291291
// Verify file system changes
@@ -335,7 +335,7 @@ func TestSafeWriter_ModifiedLockSkipVendor(t *testing.T) {
335335
}
336336

337337
// Write changes
338-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
338+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
339339
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
340340

341341
// Verify file system changes
@@ -363,7 +363,7 @@ func TestSafeWriter_ForceVendorWhenVendorAlreadyExists(t *testing.T) {
363363
pc.Load()
364364

365365
sw, _ := NewSafeWriter(nil, pc.Project.Lock, pc.Project.Lock, VendorAlways)
366-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
366+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
367367
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
368368

369369
// Verify prepared actions
@@ -381,7 +381,7 @@ func TestSafeWriter_ForceVendorWhenVendorAlreadyExists(t *testing.T) {
381381
t.Fatal("Expected the payload to contain the vendor directory ")
382382
}
383383

384-
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
384+
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
385385
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
386386

387387
// Verify file system changes
@@ -431,7 +431,7 @@ func TestSafeWriter_NewLock(t *testing.T) {
431431
}
432432

433433
// Write changes
434-
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
434+
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
435435
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
436436

437437
// Verify file system changes
@@ -478,7 +478,7 @@ func TestSafeWriter_NewLockSkipVendor(t *testing.T) {
478478
}
479479

480480
// Write changes
481-
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
481+
err = sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
482482
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
483483

484484
// Verify file system changes
@@ -571,7 +571,7 @@ func TestSafeWriter_VendorDotGitPreservedWithForceVendor(t *testing.T) {
571571
t.Fatal("Expected the payload to contain the vendor directory")
572572
}
573573

574-
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, discardLogger)
574+
err := sw.Write(pc.Project.AbsRoot, pc.SourceManager, true, PruneNestedVendorDirs, discardLogger)
575575
h.Must(errors.Wrap(err, "SafeWriter.Write failed"))
576576

577577
// Verify file system changes

0 commit comments

Comments
 (0)