diff --git a/cmd/jb/main.go b/cmd/jb/main.go index df40a45..9fc82a4 100644 --- a/cmd/jb/main.go +++ b/cmd/jb/main.go @@ -52,10 +52,11 @@ func Main() int { initCmd := a.Command(initActionName, "Initialize a new empty jsonnetfile") - installCmd := a.Command(installActionName, "Install all dependencies or install specific ones") + installCmd := a.Command(installActionName, "Install new dependencies. Existing ones are silently skipped") installCmdURIs := installCmd.Arg("uris", "URIs to packages to install, URLs or file paths").Strings() - updateCmd := a.Command(updateActionName, "Update all dependencies.") + updateCmd := a.Command(updateActionName, "Update all or specific dependencies.") + updateCmdURIs := updateCmd.Arg("uris", "URIs to packages to update, URLs or file paths").Strings() rewriteCmd := a.Command(rewriteActionName, "Automatically rewrite legacy imports to absolute ones") @@ -79,7 +80,7 @@ func Main() int { case installCmd.FullCommand(): return installCommand(workdir, cfg.JsonnetHome, *installCmdURIs) case updateCmd.FullCommand(): - return updateCommand(workdir, cfg.JsonnetHome) + return updateCommand(workdir, cfg.JsonnetHome, *updateCmdURIs) case rewriteCmd.FullCommand(): return rewriteCommand(workdir, cfg.JsonnetHome) default: diff --git a/cmd/jb/update.go b/cmd/jb/update.go index f339782..f68bd89 100644 --- a/cmd/jb/update.go +++ b/cmd/jb/update.go @@ -15,7 +15,6 @@ package main import ( - "net/url" "os" "path/filepath" @@ -27,28 +26,44 @@ import ( "github.com/jsonnet-bundler/jsonnet-bundler/spec/v1/deps" ) -func updateCommand(dir, jsonnetHome string, urls ...*url.URL) int { +func updateCommand(dir, jsonnetHome string, uris []string) int { if dir == "" { dir = "." } + // load jsonnetfiles jsonnetFile, err := jsonnetfile.Load(filepath.Join(dir, jsonnetfile.File)) kingpin.FatalIfError(err, "failed to load jsonnetfile") + lockFile, err := jsonnetfile.Load(filepath.Join(dir, jsonnetfile.LockFile)) + kingpin.FatalIfError(err, "failed to load lockfile") + kingpin.FatalIfError( os.MkdirAll(filepath.Join(dir, jsonnetHome, ".tmp"), os.ModePerm), "creating vendor folder") - // When updating, locks are ignored. - locks := map[string]deps.Dependency{} - locked, err := pkg.Ensure(jsonnetFile, jsonnetHome, locks) - kingpin.FatalIfError(err, "failed to install packages") + locks := lockFile.Dependencies + + for _, u := range uris { + d := deps.Parse(dir, u) + if d == nil { + kingpin.Fatalf("Unable to parse package URI `%s`", u) + } + + delete(locks, d.Name()) + } + + // no uris: update all + if len(uris) == 0 { + locks = make(map[string]deps.Dependency) + } + + newLocks, err := pkg.Ensure(jsonnetFile, jsonnetHome, locks) + kingpin.FatalIfError(err, "updating") kingpin.FatalIfError( - writeJSONFile(filepath.Join(dir, jsonnetfile.File), jsonnetFile), - "updating jsonnetfile.json") - kingpin.FatalIfError( - writeJSONFile(filepath.Join(dir, jsonnetfile.LockFile), v1.JsonnetFile{Dependencies: locked}), + writeJSONFile(filepath.Join(dir, jsonnetfile.LockFile), v1.JsonnetFile{Dependencies: newLocks}), "updating jsonnetfile.lock.json") + return 0 }