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

Commit 55422bc

Browse files
authored
Merge pull request #256 from carolynvs/dry-run
Respect dry run flag during dep ensure
2 parents 1f44515 + 7e27e80 commit 55422bc

21 files changed

+1232
-317
lines changed

cmd/dep/ensure.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,25 +147,27 @@ func (cmd *ensureCommand) Run(ctx *dep.Ctx, args []string) error {
147147
return errors.Wrap(err, "ensure Solve()")
148148
}
149149

150-
sw := dep.SafeWriter{
151-
Root: p.AbsRoot,
152-
Lock: p.Lock,
153-
NewLock: solution,
154-
SourceManager: sm,
155-
}
156-
if !cmd.update {
157-
sw.Manifest = p.Manifest
158-
}
159-
160150
// check if vendor exists, because if the locks are the same but
161151
// vendor does not exist we should write vendor
162-
vendorExists, err := dep.IsNonEmptyDir(filepath.Join(sw.Root, "vendor"))
152+
vendorExists, err := dep.IsNonEmptyDir(filepath.Join(p.AbsRoot, "vendor"))
163153
if err != nil {
164154
return errors.Wrap(err, "ensure vendor is a directory")
165155
}
166156
writeV := !vendorExists && solution != nil
167157

168-
return errors.Wrap(sw.WriteAllSafe(writeV), "grouped write of manifest, lock and vendor")
158+
var sw dep.SafeWriter
159+
var manifest *dep.Manifest
160+
if !cmd.update {
161+
manifest = p.Manifest
162+
}
163+
164+
newLock := dep.LockFromInterface(solution)
165+
sw.Prepare(manifest, p.Lock, newLock, writeV)
166+
if cmd.dryRun {
167+
return sw.PrintPreparedActions()
168+
}
169+
170+
return errors.Wrap(sw.Write(p.AbsRoot, sm), "grouped write of manifest, lock and vendor")
169171
}
170172

171173
func applyUpdateArgs(args []string, params *gps.SolveParameters) {

cmd/dep/init.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,13 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
106106
if err != nil {
107107
return err
108108
}
109-
m := dep.Manifest{
109+
m := &dep.Manifest{
110110
Dependencies: pd.constraints,
111111
}
112112

113113
// Make an initial lock from what knowledge we've collected about the
114114
// versions on disk
115-
l := dep.Lock{
115+
l := &dep.Lock{
116116
P: make([]gps.LockedProject, 0, len(pd.ondisk)),
117117
}
118118

@@ -134,19 +134,13 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
134134
)
135135
}
136136

137-
sw := dep.SafeWriter{
138-
Root: root,
139-
SourceManager: sm,
140-
Manifest: &m,
141-
}
142-
143137
if len(pd.notondisk) > 0 {
144138
vlogf("Solving...")
145139
params := gps.SolveParameters{
146140
RootDir: root,
147141
RootPackageTree: pkgT,
148-
Manifest: &m,
149-
Lock: &l,
142+
Manifest: m,
143+
Lock: l,
150144
}
151145

152146
if *verbose {
@@ -163,14 +157,14 @@ func (cmd *initCommand) Run(ctx *dep.Ctx, args []string) error {
163157
handleAllTheFailuresOfTheWorld(err)
164158
return err
165159
}
166-
sw.Lock = dep.LockFromInterface(soln)
167-
} else {
168-
sw.Lock = &l
160+
l = dep.LockFromInterface(soln)
169161
}
170162

171163
vlogf("Writing manifest and lock files.")
172164

173-
if err := sw.WriteAllSafe(true); err != nil {
165+
var sw dep.SafeWriter
166+
sw.Prepare(m, l, nil, true)
167+
if err := sw.Write(root, sm); err != nil {
174168
return errors.Wrap(err, "safe write of manifest and lock")
175169
}
176170

cmd/dep/remove.go

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,10 @@ func (cmd *removeCommand) Run(ctx *dep.Ctx, args []string) error {
179179
return err
180180
}
181181

182-
sw := dep.SafeWriter{
183-
Root: p.AbsRoot,
184-
Manifest: p.Manifest,
185-
Lock: p.Lock,
186-
NewLock: soln,
187-
SourceManager: sm,
188-
}
189-
190-
if err := sw.WriteAllSafe(false); err != nil {
182+
var sw dep.SafeWriter
183+
newLock := dep.LockFromInterface(soln)
184+
sw.Prepare(p.Manifest, p.Lock, newLock, false)
185+
if err := sw.Write(p.AbsRoot, sm); err != nil {
191186
return errors.Wrap(err, "grouped write of manifest, lock and vendor")
192187
}
193188
return nil
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"memo": "9a5243dd3fa20feeaa20398e7283d6c566532e2af1aae279a010df34793761c5",
3+
"projects": [
4+
{
5+
"name": "github.com/sdboyer/deptest",
6+
"version": "v0.8.0",
7+
"revision": "ff2948a2ac8f538c4ecd55962e919d1e13e74baf",
8+
"packages": [
9+
"."
10+
]
11+
},
12+
{
13+
"name": "github.com/sdboyer/deptestdos",
14+
"version": "v2.0.0",
15+
"revision": "5c607206be5decd28e6263ffffdcee067266015e",
16+
"packages": [
17+
"."
18+
]
19+
}
20+
]
21+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"dependencies": {
3+
"github.com/sdboyer/deptest": {
4+
"version": "~0.8.0"
5+
}
6+
}
7+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"memo": "9a5243dd3fa20feeaa20398e7283d6c566532e2af1aae279a010df34793761c5",
3+
"projects": [
4+
{
5+
"name": "github.com/sdboyer/deptest",
6+
"version": "v0.8.0",
7+
"revision": "ff2948a2ac8f538c4ecd55962e919d1e13e74baf",
8+
"packages": [
9+
"."
10+
]
11+
},
12+
{
13+
"name": "github.com/sdboyer/deptestdos",
14+
"version": "v2.0.0",
15+
"revision": "5c607206be5decd28e6263ffffdcee067266015e",
16+
"packages": [
17+
"."
18+
]
19+
}
20+
]
21+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2016 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package main
6+
7+
import (
8+
"github.com/sdboyer/deptest"
9+
"github.com/sdboyer/deptestdos"
10+
)
11+
12+
func main() {
13+
err := nil
14+
if err != nil {
15+
deptest.Map["yo yo!"]
16+
}
17+
deptestdos.diMeLo("whatev")
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"dependencies": {
3+
"github.com/sdboyer/deptest": {
4+
"version": "~0.8.0"
5+
}
6+
}
7+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"commands": [
3+
["init"],
4+
["ensure", "-n", "-update", "github.com/sdboyer/deptest"]
5+
]
6+
}

fs.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ package dep
66

77
import (
88
"encoding/json"
9-
"fmt"
109
"io"
1110
"io/ioutil"
1211
"os"
1312
"path/filepath"
1413
"runtime"
1514
"syscall"
15+
16+
"github.com/pkg/errors"
1617
)
1718

1819
func IsRegular(name string) (bool, error) {
@@ -25,7 +26,7 @@ func IsRegular(name string) (bool, error) {
2526
return false, err
2627
}
2728
if fi.IsDir() {
28-
return false, fmt.Errorf("%q is a directory, should be a file", name)
29+
return false, errors.Errorf("%q is a directory, should be a file", name)
2930
}
3031
return true, nil
3132
}
@@ -40,7 +41,7 @@ func IsDir(name string) (bool, error) {
4041
return false, err
4142
}
4243
if !fi.IsDir() {
43-
return false, fmt.Errorf("%q is not a directory", name)
44+
return false, errors.Errorf("%q is not a directory", name)
4445
}
4546
return true, nil
4647
}
@@ -80,15 +81,15 @@ func writeFile(path string, in json.Marshaler) error {
8081
func renameWithFallback(src, dest string) error {
8182
fi, err := os.Lstat(src)
8283
if err != nil {
83-
return err
84+
return errors.Wrapf(err, "cannot stat %s", src)
8485
}
8586

8687
// Windows cannot use syscall.Rename to rename a directory
8788
if runtime.GOOS == "windows" && fi.IsDir() {
8889
if err := CopyDir(src, dest); err != nil {
8990
return err
9091
}
91-
return os.RemoveAll(src)
92+
return errors.Wrapf(os.RemoveAll(src), "cannot delete %s", src)
9293
}
9394

9495
err = os.Rename(src, dest)
@@ -98,7 +99,7 @@ func renameWithFallback(src, dest string) error {
9899

99100
terr, ok := err.(*os.LinkError)
100101
if !ok {
101-
return err
102+
return errors.Wrapf(err, "cannot rename %s to %s", src, dest)
102103
}
103104

104105
// Rename may fail if src and dest are on different devices; fall back to
@@ -123,38 +124,38 @@ func renameWithFallback(src, dest string) error {
123124
cerr = CopyFile(src, dest)
124125
}
125126
} else {
126-
return terr
127+
return errors.Wrapf(terr, "link error: cannot rename %s to %s", src, dest)
127128
}
128129

129130
if cerr != nil {
130-
return cerr
131+
return errors.Wrapf(cerr, "second attemp failed: cannot rename %s to %s", src, dest)
131132
}
132133

133-
return os.RemoveAll(src)
134+
return errors.Wrapf(os.RemoveAll(src), "cannot delete %s", src)
134135
}
135136

136137
// CopyDir takes in a directory and copies its contents to the destination.
137138
// It preserves the file mode on files as well.
138139
func CopyDir(src string, dest string) error {
139140
fi, err := os.Lstat(src)
140141
if err != nil {
141-
return err
142+
return errors.Wrapf(err, "cannot stat %s", src)
142143
}
143144

144145
err = os.MkdirAll(dest, fi.Mode())
145146
if err != nil {
146-
return err
147+
return errors.Wrapf(err, "cannot mkdir %s", dest)
147148
}
148149

149150
dir, err := os.Open(src)
150151
if err != nil {
151-
return err
152+
return errors.Wrapf(err, "cannot open %s", src)
152153
}
153154
defer dir.Close()
154155

155156
objects, err := dir.Readdir(-1)
156157
if err != nil {
157-
return err
158+
return errors.Wrapf(err, "cannot read directory %s", dir.Name())
158159
}
159160

160161
for _, obj := range objects {

lock.go

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -102,23 +102,7 @@ func (l *Lock) MarshalJSON() ([]byte, error) {
102102
}
103103

104104
v := lp.Version()
105-
// Figure out how to get the underlying revision
106-
switch tv := v.(type) {
107-
case gps.UnpairedVersion:
108-
// TODO we could error here, if we want to be very defensive about not
109-
// allowing a lock to be written if without an immmutable revision
110-
case gps.Revision:
111-
ld.Revision = tv.String()
112-
case gps.PairedVersion:
113-
ld.Revision = tv.Underlying().String()
114-
}
115-
116-
switch v.Type() {
117-
case gps.IsBranch:
118-
ld.Branch = v.String()
119-
case gps.IsSemver, gps.IsVersion:
120-
ld.Version = v.String()
121-
}
105+
ld.Revision, ld.Branch, ld.Version = getVersionInfo(v)
122106

123107
raw.P[k] = ld
124108
}
@@ -134,6 +118,29 @@ func (l *Lock) MarshalJSON() ([]byte, error) {
134118
return buf.Bytes(), err
135119
}
136120

121+
// TODO(carolynvs) this should be moved to gps
122+
func getVersionInfo(v gps.Version) (revision string, branch string, version string) {
123+
// Figure out how to get the underlying revision
124+
switch tv := v.(type) {
125+
case gps.UnpairedVersion:
126+
// TODO we could error here, if we want to be very defensive about not
127+
// allowing a lock to be written if without an immmutable revision
128+
case gps.Revision:
129+
revision = tv.String()
130+
case gps.PairedVersion:
131+
revision = tv.Underlying().String()
132+
}
133+
134+
switch v.Type() {
135+
case gps.IsBranch:
136+
branch = v.String()
137+
case gps.IsSemver, gps.IsVersion:
138+
version = v.String()
139+
}
140+
141+
return
142+
}
143+
137144
// LockFromInterface converts an arbitrary gps.Lock to dep's representation of a
138145
// lock. If the input is already dep's *lock, the input is returned directly.
139146
//
@@ -177,14 +184,3 @@ func (s SortedLockedProjects) Less(i, j int) bool {
177184

178185
return l.Source < r.Source
179186
}
180-
181-
// locksAreEquivalent compares two locks to see if they differ. If EITHER lock
182-
// is nil, or their memos do not match, or any projects differ, then false is
183-
// returned.
184-
func locksAreEquivalent(l, r *Lock) bool {
185-
if l == nil || r == nil {
186-
return false
187-
}
188-
189-
return gps.LocksAreEq(l, r, true)
190-
}

0 commit comments

Comments
 (0)