|  | 
| 5 | 5 | 	"io/ioutil" | 
| 6 | 6 | 	"os" | 
| 7 | 7 | 	"path/filepath" | 
|  | 8 | +	"sort" | 
| 8 | 9 | 	"strconv" | 
| 9 | 10 | 
 | 
| 10 | 11 | 	"github.com/pkg/errors" | 
| @@ -118,6 +119,26 @@ func read(doLog bool) (*LockJSON, error) { | 
| 118 | 119 | 	return &lockJSON, nil | 
| 119 | 120 | } | 
| 120 | 121 | 
 | 
|  | 122 | +// sortArrays sorts all arrays in lock.json for generating readable diff output | 
|  | 123 | +// when lock.json is under version-controled. | 
|  | 124 | +func sortArrays(lockJSON *LockJSON) { | 
|  | 125 | +	// Sort repos[] by path | 
|  | 126 | +	sort.SliceStable(lockJSON.Repos, func(i, j int) bool { | 
|  | 127 | +		return lockJSON.Repos[i].Path.FullPath() < lockJSON.Repos[j].Path.FullPath() | 
|  | 128 | +	}) | 
|  | 129 | +	// Sort profiles[] by name | 
|  | 130 | +	sort.SliceStable(lockJSON.Profiles, func(i, j int) bool { | 
|  | 131 | +		return lockJSON.Profiles[i].Name < lockJSON.Profiles[j].Name | 
|  | 132 | +	}) | 
|  | 133 | +	// Sort profiles[]/repos_path[] by URLs | 
|  | 134 | +	for i := range lockJSON.Profiles { | 
|  | 135 | +		pathList := lockJSON.Profiles[i].ReposPath | 
|  | 136 | +		sort.SliceStable(pathList, func(i, j int) bool { | 
|  | 137 | +			return pathList[i] < pathList[j] | 
|  | 138 | +		}) | 
|  | 139 | +	} | 
|  | 140 | +} | 
|  | 141 | + | 
| 121 | 142 | func validate(lockJSON *LockJSON) error { | 
| 122 | 143 | 	if lockJSON.Version < 1 { | 
| 123 | 144 | 		return errors.Errorf("lock.json version is '%d' (must be 1 or greater)", lockJSON.Version) | 
| @@ -253,6 +274,9 @@ func validateMissing(lockJSON *LockJSON) error { | 
| 253 | 274 | } | 
| 254 | 275 | 
 | 
| 255 | 276 | func (lockJSON *LockJSON) Write() error { | 
|  | 277 | +	// Sort all arrays in lock.json for readable diff | 
|  | 278 | +	sortArrays(lockJSON) | 
|  | 279 | + | 
| 256 | 280 | 	// Validate lock.json | 
| 257 | 281 | 	err := validate(lockJSON) | 
| 258 | 282 | 	if err != nil { | 
|  | 
0 commit comments