Merge "v.io/jiir/runutil: more cleanup"
diff --git a/cl.go b/cl.go
index c360baa..241d146 100644
--- a/cl.go
+++ b/cl.go
@@ -14,6 +14,7 @@
"v.io/jiri/collect"
"v.io/jiri/gerrit"
"v.io/jiri/gitutil"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/tool"
"v.io/x/lib/cmdline"
@@ -75,28 +76,28 @@
cmdCLSync.Flags.StringVar(&remoteBranchFlag, "remote-branch", "master", "Name of the remote branch the CL pertains to.")
}
-func getCommitMessageFileName(ctx *tool.Context, branch string) (string, error) {
- topLevel, err := ctx.Git().TopLevel()
+func getCommitMessageFileName(jirix *jiri.X, branch string) (string, error) {
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return "", err
}
return filepath.Join(topLevel, project.MetadataDirName(), branch, commitMessageFileName), nil
}
-func getDependencyPathFileName(ctx *tool.Context, branch string) (string, error) {
- topLevel, err := ctx.Git().TopLevel()
+func getDependencyPathFileName(jirix *jiri.X, branch string) (string, error) {
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return "", err
}
return filepath.Join(topLevel, project.MetadataDirName(), branch, dependencyPathFileName), nil
}
-func getDependentCLs(ctx *tool.Context, branch string) ([]string, error) {
- file, err := getDependencyPathFileName(ctx, branch)
+func getDependentCLs(jirix *jiri.X, branch string) ([]string, error) {
+ file, err := getDependencyPathFileName(jirix, branch)
if err != nil {
return nil, err
}
- data, err := ctx.Run().ReadFile(file)
+ data, err := jirix.Run().ReadFile(file)
var branches []string
if err != nil {
if !os.IsNotExist(err) {
@@ -124,7 +125,7 @@
// TODO(jsimsa): Replace this with a "submit" command that talks to
// Gerrit to submit the CL and then (optionally) removes it locally.
var cmdCLCleanup = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runCLCleanup),
+ Runner: jiri.RunnerFunc(runCLCleanup),
Name: "cleanup",
Short: "Clean up changelists that have been merged",
Long: `
@@ -137,34 +138,34 @@
ArgsLong: "<branches> is a list of branches to cleanup.",
}
-func cleanupCL(ctx *tool.Context, branches []string) (e error) {
- originalBranch, err := ctx.Git().CurrentBranchName()
+func cleanupCL(jirix *jiri.X, branches []string) (e error) {
+ originalBranch, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
- stashed, err := ctx.Git().Stash()
+ stashed, err := jirix.Git().Stash()
if err != nil {
return err
}
if stashed {
- defer collect.Error(func() error { return ctx.Git().StashPop() }, &e)
+ defer collect.Error(func() error { return jirix.Git().StashPop() }, &e)
}
- if err := ctx.Git().CheckoutBranch(remoteBranchFlag); err != nil {
+ if err := jirix.Git().CheckoutBranch(remoteBranchFlag); err != nil {
return err
}
checkoutOriginalBranch := true
defer collect.Error(func() error {
if checkoutOriginalBranch {
- return ctx.Git().CheckoutBranch(originalBranch)
+ return jirix.Git().CheckoutBranch(originalBranch)
}
return nil
}, &e)
- if err := ctx.Git().FetchRefspec("origin", remoteBranchFlag); err != nil {
+ if err := jirix.Git().FetchRefspec("origin", remoteBranchFlag); err != nil {
return err
}
for _, branch := range branches {
- cleanupFn := func() error { return cleanupBranch(ctx, branch) }
- if err := ctx.Run().Function(cleanupFn, "Cleaning up branch %q", branch); err != nil {
+ cleanupFn := func() error { return cleanupBranch(jirix, branch) }
+ if err := jirix.Run().Function(cleanupFn, "Cleaning up branch %q", branch); err != nil {
return err
}
if branch == originalBranch {
@@ -174,16 +175,16 @@
return nil
}
-func cleanupBranch(ctx *tool.Context, branch string) error {
- if err := ctx.Git().CheckoutBranch(branch); err != nil {
+func cleanupBranch(jirix *jiri.X, branch string) error {
+ if err := jirix.Git().CheckoutBranch(branch); err != nil {
return err
}
if !forceFlag {
trackingBranch := "origin/" + remoteBranchFlag
- if err := ctx.Git().Merge(trackingBranch); err != nil {
+ if err := jirix.Git().Merge(trackingBranch); err != nil {
return err
}
- files, err := ctx.Git().ModifiedFiles(trackingBranch, branch)
+ files, err := jirix.Git().ModifiedFiles(trackingBranch, branch)
if err != nil {
return err
}
@@ -191,29 +192,29 @@
return fmt.Errorf("unmerged changes in\n%s", strings.Join(files, "\n"))
}
}
- if err := ctx.Git().CheckoutBranch(remoteBranchFlag); err != nil {
+ if err := jirix.Git().CheckoutBranch(remoteBranchFlag); err != nil {
return err
}
- if err := ctx.Git().DeleteBranch(branch, gitutil.ForceOpt(true)); err != nil {
+ if err := jirix.Git().DeleteBranch(branch, gitutil.ForceOpt(true)); err != nil {
return err
}
reviewBranch := branch + "-REVIEW"
- if ctx.Git().BranchExists(reviewBranch) {
- if err := ctx.Git().DeleteBranch(reviewBranch, gitutil.ForceOpt(true)); err != nil {
+ if jirix.Git().BranchExists(reviewBranch) {
+ if err := jirix.Git().DeleteBranch(reviewBranch, gitutil.ForceOpt(true)); err != nil {
return err
}
}
// Delete branch metadata.
- topLevel, err := ctx.Git().TopLevel()
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return err
}
metadataDir := filepath.Join(topLevel, project.MetadataDirName())
- if err := ctx.Run().RemoveAll(filepath.Join(metadataDir, branch)); err != nil {
+ if err := jirix.Run().RemoveAll(filepath.Join(metadataDir, branch)); err != nil {
return err
}
// Remove the branch from all dependency paths.
- fileInfos, err := ctx.Run().ReadDir(metadataDir)
+ fileInfos, err := jirix.Run().ReadDir(metadataDir)
if err != nil {
return err
}
@@ -221,11 +222,11 @@
if !fileInfo.IsDir() {
continue
}
- file, err := getDependencyPathFileName(ctx, fileInfo.Name())
+ file, err := getDependencyPathFileName(jirix, fileInfo.Name())
if err != nil {
return err
}
- data, err := ctx.Run().ReadFile(file)
+ data, err := jirix.Run().ReadFile(file)
if err != nil {
if !os.IsNotExist(err) {
return err
@@ -236,7 +237,7 @@
for i, tmpBranch := range branches {
if branch == tmpBranch {
data := []byte(strings.Join(append(branches[:i], branches[i+1:]...), "\n"))
- if err := ctx.Run().WriteFile(file, data, os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(file, data, os.FileMode(0644)); err != nil {
return err
}
break
@@ -246,17 +247,16 @@
return nil
}
-func runCLCleanup(env *cmdline.Env, args []string) error {
+func runCLCleanup(jirix *jiri.X, args []string) error {
if len(args) == 0 {
- return env.UsageErrorf("cleanup requires at least one argument")
+ return jirix.UsageErrorf("cleanup requires at least one argument")
}
- ctx := tool.NewContextFromEnv(env)
- return cleanupCL(ctx, args)
+ return cleanupCL(jirix, args)
}
// cmdCLMail represents the "jiri cl mail" command.
var cmdCLMail = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runCLMail),
+ Runner: jiri.RunnerFunc(runCLMail),
Name: "mail",
Short: "Mail a changelist for review",
Long: `
@@ -331,26 +331,24 @@
`
// runCLMail is a wrapper that sets up and runs a review instance.
-func runCLMail(env *cmdline.Env, _ []string) error {
- ctx := tool.NewContextFromEnv(env)
-
+func runCLMail(jirix *jiri.X, _ []string) error {
// Sanity checks for the <presubmitFlag> flag.
if !checkPresubmitFlag() {
- return env.UsageErrorf("invalid value for the -presubmit flag. Valid values: %s.",
+ return jirix.UsageErrorf("invalid value for the -presubmit flag. Valid values: %s.",
strings.Join(gerrit.PresubmitTestTypes(), ","))
}
host := hostFlag
if host == "" {
var err error
- if host, err = project.GerritHost(ctx); err != nil {
+ if host, err = project.GerritHost(jirix); err != nil {
return err
}
}
// Create and run the review.
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(jirix, gerrit.CLOpts{
Autosubmit: autosubmitFlag,
Ccs: parseEmails(ccsFlag),
Draft: draftFlag,
@@ -394,21 +392,21 @@
// checkDependents makes sure that all CLs in the sequence of
// dependent CLs leading to (but not including) the current branch
// have been exported to Gerrit.
-func checkDependents(ctx *tool.Context) (e error) {
- originalBranch, err := ctx.Git().CurrentBranchName()
+func checkDependents(jirix *jiri.X) (e error) {
+ originalBranch, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
- branches, err := getDependentCLs(ctx, originalBranch)
+ branches, err := getDependentCLs(jirix, originalBranch)
if err != nil {
return err
}
for i := 1; i < len(branches); i++ {
- file, err := getCommitMessageFileName(ctx, branches[i])
+ file, err := getCommitMessageFileName(jirix, branches[i])
if err != nil {
return err
}
- if _, err := ctx.Run().Stat(file); err != nil {
+ if _, err := jirix.Run().Stat(file); err != nil {
if !os.IsNotExist(err) {
return err
}
@@ -426,15 +424,15 @@
}
type review struct {
- ctx *tool.Context
+ jirix *jiri.X
reviewBranch string
gerrit.CLOpts
}
-func newReview(ctx *tool.Context, opts gerrit.CLOpts) (*review, error) {
+func newReview(jirix *jiri.X, opts gerrit.CLOpts) (*review, error) {
// Sync all CLs in the sequence of dependent CLs ending in the
// current branch.
- if err := syncCL(ctx); err != nil {
+ if err := syncCL(jirix); err != nil {
return nil, err
}
@@ -444,11 +442,11 @@
//
// NOTE: The alternative here is to prompt the user for multiple
// commit messages, which seems less user friendly.
- if err := checkDependents(ctx); err != nil {
+ if err := checkDependents(jirix); err != nil {
return nil, err
}
- branch, err := ctx.Git().CurrentBranchName()
+ branch, err := jirix.Git().CurrentBranchName()
if err != nil {
return nil, err
}
@@ -463,7 +461,7 @@
opts.RemoteBranch = "master" // use master as the default
}
return &review{
- ctx: ctx,
+ jirix: jirix,
reviewBranch: branch + "-REVIEW",
CLOpts: opts,
}, nil
@@ -481,11 +479,11 @@
// confirmFlagChanges asks users to confirm if any of the
// presubmit and autosubmit flags changes.
func (review *review) confirmFlagChanges() (bool, error) {
- file, err := getCommitMessageFileName(review.ctx, review.CLOpts.Branch)
+ file, err := getCommitMessageFileName(review.jirix, review.CLOpts.Branch)
if err != nil {
return false, err
}
- bytes, err := review.ctx.Run().ReadFile(file)
+ bytes, err := review.jirix.Run().ReadFile(file)
if err != nil {
if os.IsNotExist(err) {
return true, nil
@@ -525,16 +523,16 @@
// cleanup cleans up after the review.
func (review *review) cleanup(stashed bool) error {
- if err := review.ctx.Git().CheckoutBranch(review.CLOpts.Branch); err != nil {
+ if err := review.jirix.Git().CheckoutBranch(review.CLOpts.Branch); err != nil {
return err
}
- if review.ctx.Git().BranchExists(review.reviewBranch) {
- if err := review.ctx.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true)); err != nil {
+ if review.jirix.Git().BranchExists(review.reviewBranch) {
+ if err := review.jirix.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true)); err != nil {
return err
}
}
if stashed {
- if err := review.ctx.Git().StashPop(); err != nil {
+ if err := review.jirix.Git().StashPop(); err != nil {
return err
}
}
@@ -550,35 +548,35 @@
// the commit message for the last commit.
func (review *review) createReviewBranch(message string) (e error) {
// Create the review branch.
- if err := review.ctx.Git().FetchRefspec("origin", review.CLOpts.RemoteBranch); err != nil {
+ if err := review.jirix.Git().FetchRefspec("origin", review.CLOpts.RemoteBranch); err != nil {
return err
}
- if review.ctx.Git().BranchExists(review.reviewBranch) {
- if err := review.ctx.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true)); err != nil {
+ if review.jirix.Git().BranchExists(review.reviewBranch) {
+ if err := review.jirix.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true)); err != nil {
return err
}
}
upstream := "origin/" + review.CLOpts.RemoteBranch
- if err := review.ctx.Git().CreateBranchWithUpstream(review.reviewBranch, upstream); err != nil {
+ if err := review.jirix.Git().CreateBranchWithUpstream(review.reviewBranch, upstream); err != nil {
return err
}
- if err := review.ctx.Git().CheckoutBranch(review.reviewBranch); err != nil {
+ if err := review.jirix.Git().CheckoutBranch(review.reviewBranch); err != nil {
return err
}
// Register a cleanup handler in case of subsequent errors.
cleanup := true
defer collect.Error(func() error {
if !cleanup {
- return review.ctx.Git().CheckoutBranch(review.CLOpts.Branch)
+ return review.jirix.Git().CheckoutBranch(review.CLOpts.Branch)
}
- review.ctx.Git().CheckoutBranch(review.CLOpts.Branch, gitutil.ForceOpt(true))
- review.ctx.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true))
+ review.jirix.Git().CheckoutBranch(review.CLOpts.Branch, gitutil.ForceOpt(true))
+ review.jirix.Git().DeleteBranch(review.reviewBranch, gitutil.ForceOpt(true))
return nil
}, &e)
// Report an error if the CL is empty.
- if !review.ctx.DryRun() {
- hasDiff, err := review.ctx.Git().BranchesDiffer(review.CLOpts.Branch, review.reviewBranch)
+ if !review.jirix.DryRun() {
+ hasDiff, err := review.jirix.Git().BranchesDiffer(review.CLOpts.Branch, review.reviewBranch)
if err != nil {
return err
}
@@ -599,7 +597,7 @@
// Iterate over all dependent CLs leading to (and including) the
// current branch, creating one commit in the review branch per CL
// by squashing all commits of each individual CL.
- branches, err := getDependentCLs(review.ctx, review.CLOpts.Branch)
+ branches, err := getDependentCLs(review.jirix, review.CLOpts.Branch)
if err != nil {
return err
}
@@ -627,7 +625,7 @@
// here is based on:
//
// http://stackoverflow.com/questions/173919/is-there-a-theirs-version-of-git-merge-s-ours
- if err := review.ctx.Git().Merge(branches[i], gitutil.SquashOpt(true), gitutil.StrategyOpt("ours")); err != nil {
+ if err := review.jirix.Git().Merge(branches[i], gitutil.SquashOpt(true), gitutil.StrategyOpt("ours")); err != nil {
return changeConflictError{
localBranch: branches[i],
remoteBranch: review.CLOpts.RemoteBranch,
@@ -641,7 +639,7 @@
// this was not the case, consecutive invocations of "jiri cl mail"
// could fail if some, but not all, of the dependent CLs submitted
// to Gerrit have changed.
- output, err := review.ctx.Git().Log(branches[i], branches[i]+"^", "%ad%n%cd")
+ output, err := review.jirix.Git().Log(branches[i], branches[i]+"^", "%ad%n%cd")
if err != nil {
return err
}
@@ -651,37 +649,37 @@
authorDate := tool.AuthorDateOpt(output[0][0])
committerDate := tool.CommitterDateOpt(output[0][1])
if i < len(branches)-1 {
- file, err := getCommitMessageFileName(review.ctx, branches[i])
+ file, err := getCommitMessageFileName(review.jirix, branches[i])
if err != nil {
return err
}
- message, err := review.ctx.Run().ReadFile(file)
+ message, err := review.jirix.Run().ReadFile(file)
if err != nil {
return err
}
- if err := review.ctx.Git(authorDate, committerDate).CommitWithMessage(string(message)); err != nil {
+ if err := review.jirix.Git(authorDate, committerDate).CommitWithMessage(string(message)); err != nil {
return err
}
} else {
- committer := review.ctx.Git(authorDate, committerDate).NewCommitter(review.CLOpts.Edit)
+ committer := review.jirix.Git(authorDate, committerDate).NewCommitter(review.CLOpts.Edit)
if err := committer.Commit(message); err != nil {
return err
}
}
tmpBranch := review.reviewBranch + "-" + branches[i] + "-TMP"
- if err := review.ctx.Git().CreateBranch(tmpBranch); err != nil {
+ if err := review.jirix.Git().CreateBranch(tmpBranch); err != nil {
return err
}
defer collect.Error(func() error {
- return review.ctx.Git().DeleteBranch(tmpBranch, gitutil.ForceOpt(true))
+ return review.jirix.Git().DeleteBranch(tmpBranch, gitutil.ForceOpt(true))
}, &e)
- if err := review.ctx.Git().Reset(branches[i]); err != nil {
+ if err := review.jirix.Git().Reset(branches[i]); err != nil {
return err
}
- if err := review.ctx.Git().Reset(tmpBranch, gitutil.ModeOpt("soft")); err != nil {
+ if err := review.jirix.Git().Reset(tmpBranch, gitutil.ModeOpt("soft")); err != nil {
return err
}
- if err := review.ctx.Git(authorDate, committerDate).CommitAmend(); err != nil {
+ if err := review.jirix.Git(authorDate, committerDate).CommitAmend(); err != nil {
return err
}
}
@@ -691,7 +689,7 @@
// defaultCommitMessage creates the default commit message from the
// list of commits on the branch.
func (review *review) defaultCommitMessage() (string, error) {
- commitMessages, err := review.ctx.Git().CommitMessages(review.CLOpts.Branch, review.reviewBranch)
+ commitMessages, err := review.jirix.Git().CommitMessages(review.CLOpts.Branch, review.reviewBranch)
if err != nil {
return "", err
}
@@ -706,7 +704,7 @@
// ensureChangeID makes sure that the last commit contains a Change-Id, and
// returns an error if it does not.
func (review *review) ensureChangeID() error {
- latestCommitMessage, err := review.ctx.Git().LatestCommitMessage()
+ latestCommitMessage, err := review.jirix.Git().LatestCommitMessage()
if err != nil {
return err
}
@@ -746,7 +744,7 @@
// and then mails it to Gerrit.
func (review *review) run() (e error) {
if uncommittedFlag {
- changes, err := review.ctx.Git().FilesWithUncommittedChanges()
+ changes, err := review.jirix.Git().FilesWithUncommittedChanges()
if err != nil {
return err
}
@@ -757,7 +755,7 @@
if review.CLOpts.Branch == remoteBranchFlag {
return fmt.Errorf("cannot do a review from the %q branch.", remoteBranchFlag)
}
- stashed, err := review.ctx.Git().Stash()
+ stashed, err := review.jirix.Git().Stash()
if err != nil {
return err
}
@@ -765,23 +763,23 @@
if err != nil {
return fmt.Errorf("Getwd() failed: %v", err)
}
- defer collect.Error(func() error { return review.ctx.Run().Chdir(wd) }, &e)
- topLevel, err := review.ctx.Git().TopLevel()
+ defer collect.Error(func() error { return review.jirix.Run().Chdir(wd) }, &e)
+ topLevel, err := review.jirix.Git().TopLevel()
if err != nil {
return err
}
- if err := review.ctx.Run().Chdir(topLevel); err != nil {
+ if err := review.jirix.Run().Chdir(topLevel); err != nil {
return err
}
defer collect.Error(func() error { return review.cleanup(stashed) }, &e)
- file, err := getCommitMessageFileName(review.ctx, review.CLOpts.Branch)
+ file, err := getCommitMessageFileName(review.jirix, review.CLOpts.Branch)
if err != nil {
return err
}
message := messageFlag
if message == "" {
// Message was not passed in flag. Attempt to read it from file.
- data, err := review.ctx.Run().ReadFile(file)
+ data, err := review.jirix.Run().ReadFile(file)
if err != nil {
if !os.IsNotExist(err) {
return err
@@ -820,12 +818,12 @@
// send mails the current branch out for review.
func (review *review) send() error {
- if !review.ctx.DryRun() {
+ if !review.jirix.DryRun() {
if err := review.ensureChangeID(); err != nil {
return err
}
}
- if err := gerrit.Push(review.ctx.Run(), review.CLOpts); err != nil {
+ if err := gerrit.Push(review.jirix.Run(), review.CLOpts); err != nil {
return gerritError(err.Error())
}
return nil
@@ -833,11 +831,11 @@
// getChangeID reads the commit message and extracts the change-Id.
func (review *review) getChangeID() (string, error) {
- file, err := getCommitMessageFileName(review.ctx, review.CLOpts.Branch)
+ file, err := getCommitMessageFileName(review.jirix, review.CLOpts.Branch)
if err != nil {
return "", err
}
- bytes, err := review.ctx.Run().ReadFile(file)
+ bytes, err := review.jirix.Run().ReadFile(file)
if err != nil {
return "", err
}
@@ -855,7 +853,7 @@
if err != nil {
return err
}
- if err := review.ctx.Gerrit(review.CLOpts.Host).SetTopic(changeID, review.CLOpts); err != nil {
+ if err := review.jirix.Gerrit(review.CLOpts.Host).SetTopic(changeID, review.CLOpts); err != nil {
return err
}
return nil
@@ -863,10 +861,10 @@
// updateReviewMessage writes the commit message to the given file.
func (review *review) updateReviewMessage(file string) error {
- if err := review.ctx.Git().CheckoutBranch(review.reviewBranch); err != nil {
+ if err := review.jirix.Git().CheckoutBranch(review.reviewBranch); err != nil {
return err
}
- newMessage, err := review.ctx.Git().LatestCommitMessage()
+ newMessage, err := review.jirix.Git().LatestCommitMessage()
if err != nil {
return err
}
@@ -875,25 +873,25 @@
//
// This behavior is consistent with how Change-ID is added for the
// initial commit so we don't confuse users.
- if _, err := review.ctx.Run().Stat(file); err != nil {
+ if _, err := review.jirix.Run().Stat(file); err != nil {
if os.IsNotExist(err) {
newMessage = review.processLabels(newMessage)
- if err := review.ctx.Git().CommitAmendWithMessage(newMessage); err != nil {
+ if err := review.jirix.Git().CommitAmendWithMessage(newMessage); err != nil {
return err
}
} else {
return err
}
}
- topLevel, err := review.ctx.Git().TopLevel()
+ topLevel, err := review.jirix.Git().TopLevel()
if err != nil {
return err
}
newMetadataDir := filepath.Join(topLevel, project.MetadataDirName(), review.CLOpts.Branch)
- if err := review.ctx.Run().MkdirAll(newMetadataDir, os.FileMode(0755)); err != nil {
+ if err := review.jirix.Run().MkdirAll(newMetadataDir, os.FileMode(0755)); err != nil {
return err
}
- if err := review.ctx.Run().WriteFile(file, []byte(newMessage), 0644); err != nil {
+ if err := review.jirix.Run().WriteFile(file, []byte(newMessage), 0644); err != nil {
return err
}
return nil
@@ -901,7 +899,7 @@
// cmdCLNew represents the "jiri cl new" command.
var cmdCLNew = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runCLNew),
+ Runner: jiri.RunnerFunc(runCLNew),
Name: "new",
Short: "Create a new local branch for a changelist",
Long: fmt.Sprintf(`
@@ -916,27 +914,26 @@
ArgsLong: "<name> is the changelist name.",
}
-func runCLNew(env *cmdline.Env, args []string) error {
+func runCLNew(jirix *jiri.X, args []string) error {
if got, want := len(args), 1; got != want {
- return env.UsageErrorf("unexpected number of arguments: got %v, want %v", got, want)
+ return jirix.UsageErrorf("unexpected number of arguments: got %v, want %v", got, want)
}
- ctx := tool.NewContextFromEnv(env)
- return newCL(ctx, args)
+ return newCL(jirix, args)
}
-func newCL(ctx *tool.Context, args []string) error {
- topLevel, err := ctx.Git().TopLevel()
+func newCL(jirix *jiri.X, args []string) error {
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return err
}
- originalBranch, err := ctx.Git().CurrentBranchName()
+ originalBranch, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
// Create a new branch using the current branch.
newBranch := args[0]
- if err := ctx.Git().CreateAndCheckoutBranch(newBranch); err != nil {
+ if err := jirix.Git().CreateAndCheckoutBranch(newBranch); err != nil {
return err
}
@@ -944,28 +941,28 @@
cleanup := true
defer func() {
if cleanup {
- ctx.Git().CheckoutBranch(originalBranch, gitutil.ForceOpt(true))
- ctx.Git().DeleteBranch(newBranch, gitutil.ForceOpt(true))
+ jirix.Git().CheckoutBranch(originalBranch, gitutil.ForceOpt(true))
+ jirix.Git().DeleteBranch(newBranch, gitutil.ForceOpt(true))
}
}()
// Record the dependent CLs for the new branch. The dependent CLs
// are recorded in a <dependencyPathFileName> file as a
// newline-separated list of branch names.
- branches, err := getDependentCLs(ctx, originalBranch)
+ branches, err := getDependentCLs(jirix, originalBranch)
if err != nil {
return err
}
branches = append(branches, originalBranch)
newMetadataDir := filepath.Join(topLevel, project.MetadataDirName(), newBranch)
- if err := ctx.Run().MkdirAll(newMetadataDir, os.FileMode(0755)); err != nil {
+ if err := jirix.Run().MkdirAll(newMetadataDir, os.FileMode(0755)); err != nil {
return err
}
- file, err := getDependencyPathFileName(ctx, newBranch)
+ file, err := getDependencyPathFileName(jirix, newBranch)
if err != nil {
return err
}
- if err := ctx.Run().WriteFile(file, []byte(strings.Join(branches, "\n")), os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(file, []byte(strings.Join(branches, "\n")), os.FileMode(0644)); err != nil {
return err
}
@@ -975,7 +972,7 @@
// cmdCLSync represents the "jiri cl sync" command.
var cmdCLSync = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runCLSync),
+ Runner: jiri.RunnerFunc(runCLSync),
Name: "sync",
Short: "Bring a changelist up to date",
Long: fmt.Sprintf(`
@@ -995,23 +992,22 @@
`, project.MetadataDirName()),
}
-func runCLSync(env *cmdline.Env, _ []string) error {
- ctx := tool.NewContextFromEnv(env)
- return syncCL(ctx)
+func runCLSync(jirix *jiri.X, _ []string) error {
+ return syncCL(jirix)
}
-func syncCL(ctx *tool.Context) (e error) {
- stashed, err := ctx.Git().Stash()
+func syncCL(jirix *jiri.X) (e error) {
+ stashed, err := jirix.Git().Stash()
if err != nil {
return err
}
if stashed {
- defer collect.Error(func() error { return ctx.Git().StashPop() }, &e)
+ defer collect.Error(func() error { return jirix.Git().StashPop() }, &e)
}
// Register a cleanup handler in case of subsequent errors.
forceOriginalBranch := true
- originalBranch, err := ctx.Git().CurrentBranchName()
+ originalBranch, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
@@ -1022,43 +1018,43 @@
defer func() {
if forceOriginalBranch {
- ctx.Git().CheckoutBranch(originalBranch, gitutil.ForceOpt(true))
+ jirix.Git().CheckoutBranch(originalBranch, gitutil.ForceOpt(true))
}
- ctx.Run().Chdir(originalWd)
+ jirix.Run().Chdir(originalWd)
}()
// Switch to an existing directory in master so we can run commands.
- topLevel, err := ctx.Git().TopLevel()
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return err
}
- if err := ctx.Run().Chdir(topLevel); err != nil {
+ if err := jirix.Run().Chdir(topLevel); err != nil {
return err
}
// Identify the dependents CLs leading to (and including) the
// current branch.
- branches, err := getDependentCLs(ctx, originalBranch)
+ branches, err := getDependentCLs(jirix, originalBranch)
if err != nil {
return err
}
branches = append(branches, originalBranch)
// Sync from upstream.
- if err := ctx.Git().CheckoutBranch(branches[0]); err != nil {
+ if err := jirix.Git().CheckoutBranch(branches[0]); err != nil {
return err
}
- if err := ctx.Git().Pull("origin", branches[0]); err != nil {
+ if err := jirix.Git().Pull("origin", branches[0]); err != nil {
return err
}
// Bring all CLs in the sequence of dependent CLs leading to the
// current branch up to date with the <remoteBranchFlag> branch.
for i := 1; i < len(branches); i++ {
- if err := ctx.Git().CheckoutBranch(branches[i]); err != nil {
+ if err := jirix.Git().CheckoutBranch(branches[i]); err != nil {
return err
}
- if err := ctx.Git().Merge(branches[i-1]); err != nil {
+ if err := jirix.Git().Merge(branches[i-1]); err != nil {
return fmt.Errorf(`Failed to automatically merge branch %v into branch %v: %v
The following steps are needed before the operation can be retried:
$ git checkout %v
diff --git a/cl_test.go b/cl_test.go
index 9e998b6..586aef3 100644
--- a/cl_test.go
+++ b/cl_test.go
@@ -15,14 +15,14 @@
"v.io/jiri/gerrit"
"v.io/jiri/gitutil"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
- "v.io/jiri/tool"
)
// assertCommitCount asserts that the commit count between two
// branches matches the expectedCount.
-func assertCommitCount(t *testing.T, ctx *tool.Context, branch, baseBranch string, expectedCount int) {
- got, err := ctx.Git().CountCommits(branch, baseBranch)
+func assertCommitCount(t *testing.T, jirix *jiri.X, branch, baseBranch string, expectedCount int) {
+ got, err := jirix.Git().CountCommits(branch, baseBranch)
if err != nil {
t.Fatalf("%v", err)
}
@@ -33,8 +33,8 @@
// assertFileContent asserts that the content of the given file
// matches the expected content.
-func assertFileContent(t *testing.T, ctx *tool.Context, file, want string) {
- got, err := ctx.Run().ReadFile(file)
+func assertFileContent(t *testing.T, jirix *jiri.X, file, want string) {
+ got, err := jirix.Run().ReadFile(file)
if err != nil {
t.Fatalf("%v\n", err)
}
@@ -44,9 +44,9 @@
}
// assertFilesExist asserts that the files exist.
-func assertFilesExist(t *testing.T, ctx *tool.Context, files []string) {
+func assertFilesExist(t *testing.T, jirix *jiri.X, files []string) {
for _, file := range files {
- if _, err := ctx.Run().Stat(file); err != nil {
+ if _, err := jirix.Run().Stat(file); err != nil {
if os.IsNotExist(err) {
t.Fatalf("expected file %v to exist but it did not", file)
}
@@ -56,9 +56,9 @@
}
// assertFilesDoNotExist asserts that the files do not exist.
-func assertFilesDoNotExist(t *testing.T, ctx *tool.Context, files []string) {
+func assertFilesDoNotExist(t *testing.T, jirix *jiri.X, files []string) {
for _, file := range files {
- if _, err := ctx.Run().Stat(file); err != nil && !os.IsNotExist(err) {
+ if _, err := jirix.Run().Stat(file); err != nil && !os.IsNotExist(err) {
t.Fatalf("%v", err)
} else if err == nil {
t.Fatalf("expected file %v to not exist but it did", file)
@@ -68,10 +68,10 @@
// assertFilesCommitted asserts that the files exist and are committed
// in the current branch.
-func assertFilesCommitted(t *testing.T, ctx *tool.Context, files []string) {
- assertFilesExist(t, ctx, files)
+func assertFilesCommitted(t *testing.T, jirix *jiri.X, files []string) {
+ assertFilesExist(t, jirix, files)
for _, file := range files {
- if !ctx.Git().IsFileCommitted(file) {
+ if !jirix.Git().IsFileCommitted(file) {
t.Fatalf("expected file %v to be committed but it is not", file)
}
}
@@ -79,10 +79,10 @@
// assertFilesNotCommitted asserts that the files exist and are *not*
// committed in the current branch.
-func assertFilesNotCommitted(t *testing.T, ctx *tool.Context, files []string) {
- assertFilesExist(t, ctx, files)
+func assertFilesNotCommitted(t *testing.T, jirix *jiri.X, files []string) {
+ assertFilesExist(t, jirix, files)
for _, file := range files {
- if ctx.Git().IsFileCommitted(file) {
+ if jirix.Git().IsFileCommitted(file) {
t.Fatalf("expected file %v not to be committed but it is", file)
}
}
@@ -90,20 +90,20 @@
// assertFilesPushedToRef asserts that the given files have been
// pushed to the given remote repository reference.
-func assertFilesPushedToRef(t *testing.T, ctx *tool.Context, repoPath, gerritPath, pushedRef string, files []string) {
- chdir(t, ctx, gerritPath)
- assertCommitCount(t, ctx, pushedRef, "master", 1)
- if err := ctx.Git().CheckoutBranch(pushedRef); err != nil {
+func assertFilesPushedToRef(t *testing.T, jirix *jiri.X, repoPath, gerritPath, pushedRef string, files []string) {
+ chdir(t, jirix, gerritPath)
+ assertCommitCount(t, jirix, pushedRef, "master", 1)
+ if err := jirix.Git().CheckoutBranch(pushedRef); err != nil {
t.Fatalf("%v", err)
}
- assertFilesCommitted(t, ctx, files)
- chdir(t, ctx, repoPath)
+ assertFilesCommitted(t, jirix, files)
+ chdir(t, jirix, repoPath)
}
// assertStashSize asserts that the stash size matches the expected
// size.
-func assertStashSize(t *testing.T, ctx *tool.Context, want int) {
- got, err := ctx.Git().StashSize()
+func assertStashSize(t *testing.T, jirix *jiri.X, want int) {
+ got, err := jirix.Git().StashSize()
if err != nil {
t.Fatalf("%v", err)
}
@@ -113,38 +113,38 @@
}
// commitFile commits a file with the specified content into a branch
-func commitFile(t *testing.T, ctx *tool.Context, filename string, content string) {
- if err := ctx.Run().WriteFile(filename, []byte(content), 0644); err != nil {
+func commitFile(t *testing.T, jirix *jiri.X, filename string, content string) {
+ if err := jirix.Run().WriteFile(filename, []byte(content), 0644); err != nil {
t.Fatalf("%v", err)
}
commitMessage := "Commit " + filename
- if err := ctx.Git().CommitFile(filename, commitMessage); err != nil {
+ if err := jirix.Git().CommitFile(filename, commitMessage); err != nil {
t.Fatalf("%v", err)
}
}
// commitFiles commits the given files into to current branch.
-func commitFiles(t *testing.T, ctx *tool.Context, filenames []string) {
+func commitFiles(t *testing.T, jirix *jiri.X, filenames []string) {
// Create and commit the files one at a time.
for _, filename := range filenames {
content := "This is file " + filename
- commitFile(t, ctx, filename, content)
+ commitFile(t, jirix, filename, content)
}
}
// createRepo creates a new repository in the given working directory.
-func createRepo(t *testing.T, ctx *tool.Context, workingDir, prefix string) string {
- repoPath, err := ctx.Run().TempDir(workingDir, "repo-"+prefix)
+func createRepo(t *testing.T, jirix *jiri.X, workingDir, prefix string) string {
+ repoPath, err := jirix.Run().TempDir(workingDir, "repo-"+prefix)
if err != nil {
t.Fatalf("TempDir() failed: %v", err)
}
if err := os.Chmod(repoPath, 0777); err != nil {
t.Fatalf("Chmod(%v) failed: %v", repoPath, err)
}
- if err := ctx.Git().Init(repoPath); err != nil {
+ if err := jirix.Git().Init(repoPath); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Run().MkdirAll(filepath.Join(repoPath, project.MetadataDirName()), os.FileMode(0755)); err != nil {
+ if err := jirix.Run().MkdirAll(filepath.Join(repoPath, project.MetadataDirName()), os.FileMode(0755)); err != nil {
t.Fatalf("%v", err)
}
return repoPath
@@ -157,29 +157,29 @@
`
// installCommitMsgHook links the gerrit commit-msg hook into a different repo.
-func installCommitMsgHook(t *testing.T, ctx *tool.Context, repoPath string) {
+func installCommitMsgHook(t *testing.T, jirix *jiri.X, repoPath string) {
hookLocation := path.Join(repoPath, ".git/hooks/commit-msg")
- if err := ctx.Run().WriteFile(hookLocation, []byte(commitMsgHook), 0755); err != nil {
+ if err := jirix.Run().WriteFile(hookLocation, []byte(commitMsgHook), 0755); err != nil {
t.Fatalf("WriteFile(%v) failed: %v", hookLocation, err)
}
}
// chdir changes the runtime working directory and traps any errors.
-func chdir(t *testing.T, ctx *tool.Context, path string) {
- if err := ctx.Run().Chdir(path); err != nil {
+func chdir(t *testing.T, jirix *jiri.X, path string) {
+ if err := jirix.Run().Chdir(path); err != nil {
_, file, line, _ := runtime.Caller(1)
t.Fatalf("%s: %d: Chdir(%v) failed: %v", file, line, path, err)
}
}
// createRepoFromOrigin creates a Git repo tracking origin/master.
-func createRepoFromOrigin(t *testing.T, ctx *tool.Context, workingDir string, subpath string, originPath string) string {
- repoPath := createRepo(t, ctx, workingDir, subpath)
- chdir(t, ctx, repoPath)
- if err := ctx.Git().AddRemote("origin", originPath); err != nil {
+func createRepoFromOrigin(t *testing.T, jirix *jiri.X, workingDir string, subpath string, originPath string) string {
+ repoPath := createRepo(t, jirix, workingDir, subpath)
+ chdir(t, jirix, repoPath)
+ if err := jirix.Git().AddRemote("origin", originPath); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Pull("origin", "master"); err != nil {
+ if err := jirix.Git().Pull("origin", "master"); err != nil {
t.Fatalf("%v", err)
}
return repoPath
@@ -188,94 +188,92 @@
// createTestRepos sets up three local repositories: origin, gerrit,
// and the main test repository which pulls from origin and can push
// to gerrit.
-func createTestRepos(t *testing.T, ctx *tool.Context, workingDir string) (string, string, string) {
+func createTestRepos(t *testing.T, jirix *jiri.X, workingDir string) (string, string, string) {
// Create origin.
- originPath := createRepo(t, ctx, workingDir, "origin")
- chdir(t, ctx, originPath)
- if err := ctx.Git().CommitWithMessage("initial commit"); err != nil {
+ originPath := createRepo(t, jirix, workingDir, "origin")
+ chdir(t, jirix, originPath)
+ if err := jirix.Git().CommitWithMessage("initial commit"); err != nil {
t.Fatalf("%v", err)
}
// Create test repo.
- repoPath := createRepoFromOrigin(t, ctx, workingDir, "test", originPath)
+ repoPath := createRepoFromOrigin(t, jirix, workingDir, "test", originPath)
// Add Gerrit remote.
- gerritPath := createRepoFromOrigin(t, ctx, workingDir, "gerrit", originPath)
+ gerritPath := createRepoFromOrigin(t, jirix, workingDir, "gerrit", originPath)
// Switch back to test repo.
- chdir(t, ctx, repoPath)
+ chdir(t, jirix, repoPath)
return repoPath, originPath, gerritPath
}
// submit mocks a Gerrit review submit by pushing the Gerrit remote to origin.
// Actually origin pulls from Gerrit since origin isn't actually a bare git repo.
// Some of our tests actually rely on accessing .git in origin, so it must be non-bare.
-func submit(t *testing.T, ctx *tool.Context, originPath string, gerritPath string, review *review) {
+func submit(t *testing.T, jirix *jiri.X, originPath string, gerritPath string, review *review) {
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("Getwd() failed: %v", err)
}
- chdir(t, ctx, originPath)
+ chdir(t, jirix, originPath)
expectedRef := gerrit.Reference(review.CLOpts)
- if err := ctx.Git().Pull(gerritPath, expectedRef); err != nil {
+ if err := jirix.Git().Pull(gerritPath, expectedRef); err != nil {
t.Fatalf("Pull gerrit to origin failed: %v", err)
}
- chdir(t, ctx, cwd)
+ chdir(t, jirix, cwd)
}
// setupTest creates a setup for testing the review tool.
-func setupTest(t *testing.T, installHook bool) (ctx *tool.Context, cwd string, root *project.FakeJiriRoot, repoPath, originPath, gerritPath string) {
- ctx = tool.NewDefaultContext()
- cwd, err := os.Getwd()
- if err != nil {
+func setupTest(t *testing.T, installHook bool) (cwd string, root *project.FakeJiriRoot, repoPath, originPath, gerritPath string) {
+ var err error
+ if cwd, err = os.Getwd(); err != nil {
t.Fatalf("Getwd() failed: %v", err)
}
- root, err = project.NewFakeJiriRoot(ctx)
- if err != nil {
+ if root, err = project.NewFakeJiriRoot(); err != nil {
t.Fatalf("%v", err)
}
- repoPath, originPath, gerritPath = createTestRepos(t, ctx, root.Dir)
+ repoPath, originPath, gerritPath = createTestRepos(t, root.X, root.Dir)
if installHook == true {
for _, path := range []string{repoPath, originPath, gerritPath} {
- installCommitMsgHook(t, ctx, path)
+ installCommitMsgHook(t, root.X, path)
}
}
- chdir(t, ctx, repoPath)
+ chdir(t, root.X, repoPath)
return
}
// teardownTest cleans up the setup for testing the review tool.
-func teardownTest(t *testing.T, ctx *tool.Context, oldWorkDir string, root *project.FakeJiriRoot) {
- chdir(t, ctx, oldWorkDir)
- if err := root.Cleanup(ctx); err != nil {
+func teardownTest(t *testing.T, oldWorkDir string, root *project.FakeJiriRoot) {
+ chdir(t, root.X, oldWorkDir)
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}
-func createCLWithFiles(t *testing.T, ctx *tool.Context, branch string, files ...string) {
- if err := newCL(ctx, []string{branch}); err != nil {
+func createCLWithFiles(t *testing.T, jirix *jiri.X, branch string, files ...string) {
+ if err := newCL(jirix, []string{branch}); err != nil {
t.Fatalf("%v", err)
}
- commitFiles(t, ctx, files)
+ commitFiles(t, jirix, files)
}
// TestCleanupClean checks that cleanup succeeds if the branch to be
// cleaned up has been merged with the master.
func TestCleanupClean(t *testing.T) {
- ctx, cwd, root, repoPath, originPath, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, originPath, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
- commitFiles(t, ctx, []string{"file1", "file2"})
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ commitFiles(t, root.X, []string{"file1", "file2"})
+ if err := root.X.Git().CheckoutBranch("master"); err != nil {
t.Fatalf("%v", err)
}
- chdir(t, ctx, originPath)
- commitFiles(t, ctx, []string{"file1", "file2"})
- chdir(t, ctx, repoPath)
- if err := cleanupCL(ctx, []string{branch}); err != nil {
+ chdir(t, root.X, originPath)
+ commitFiles(t, root.X, []string{"file1", "file2"})
+ chdir(t, root.X, repoPath)
+ if err := cleanupCL(root.X, []string{branch}); err != nil {
t.Fatalf("cleanup() failed: %v", err)
}
- if ctx.Git().BranchExists(branch) {
+ if root.X.Git().BranchExists(branch) {
t.Fatalf("cleanup failed to remove the feature branch")
}
}
@@ -283,38 +281,38 @@
// TestCleanupDirty checks that cleanup is a no-op if the branch to be
// cleaned up has unmerged changes.
func TestCleanupDirty(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
files := []string{"file1", "file2"}
- commitFiles(t, ctx, files)
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ commitFiles(t, root.X, files)
+ if err := root.X.Git().CheckoutBranch("master"); err != nil {
t.Fatalf("%v", err)
}
- if err := cleanupCL(ctx, []string{branch}); err == nil {
+ if err := cleanupCL(root.X, []string{branch}); err == nil {
t.Fatalf("cleanup did not fail when it should")
}
- if err := ctx.Git().CheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
- assertFilesCommitted(t, ctx, files)
+ assertFilesCommitted(t, root.X, files)
}
// TestCreateReviewBranch checks that the temporary review branch is
// created correctly.
func TestCreateReviewBranch(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
files := []string{"file1", "file2", "file3"}
- commitFiles(t, ctx, files)
- review, err := newReview(ctx, gerrit.CLOpts{})
+ commitFiles(t, root.X, files)
+ review, err := newReview(root.X, gerrit.CLOpts{})
if err != nil {
t.Fatalf("%v", err)
}
@@ -326,27 +324,27 @@
t.Fatalf("%v", err)
}
// Verify that the branch exists.
- if !ctx.Git().BranchExists(review.reviewBranch) {
+ if !root.X.Git().BranchExists(review.reviewBranch) {
t.Fatalf("review branch not found")
}
- if err := ctx.Git().CheckoutBranch(review.reviewBranch); err != nil {
+ if err := root.X.Git().CheckoutBranch(review.reviewBranch); err != nil {
t.Fatalf("%v", err)
}
- assertCommitCount(t, ctx, review.reviewBranch, "master", 1)
- assertFilesCommitted(t, ctx, files)
+ assertCommitCount(t, root.X, review.reviewBranch, "master", 1)
+ assertFilesCommitted(t, root.X, files)
}
// TestCreateReviewBranchWithEmptyChange checks that running
// createReviewBranch() on a branch with no changes will result in an
// EmptyChangeError.
func TestCreateReviewBranchWithEmptyChange(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
- review, err := newReview(ctx, gerrit.CLOpts{Remote: branch})
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: branch})
if err != nil {
t.Fatalf("%v", err)
}
@@ -362,17 +360,17 @@
// TestSendReview checks the various options for sending a review.
func TestSendReview(t *testing.T) {
- ctx, cwd, root, repoPath, _, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, _, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
files := []string{"file1"}
- commitFiles(t, ctx, files)
+ commitFiles(t, root.X, files)
{
// Test with draft = false, no reviewiers, and no ccs.
- review, err := newReview(ctx, gerrit.CLOpts{Remote: gerritPath})
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: gerritPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -380,11 +378,11 @@
t.Fatalf("failed to send a review: %v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
{
// Test with draft = true, no reviewers, and no ccs.
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(root.X, gerrit.CLOpts{
Draft: true,
Remote: gerritPath,
})
@@ -395,11 +393,11 @@
t.Fatalf("failed to send a review: %v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
{
// Test with draft = false, reviewers, and no ccs.
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(root.X, gerrit.CLOpts{
Remote: gerritPath,
Reviewers: parseEmails("reviewer1,reviewer2@example.org"),
})
@@ -410,11 +408,11 @@
t.Fatalf("failed to send a review: %v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
{
// Test with draft = true, reviewers, and ccs.
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(root.X, gerrit.CLOpts{
Ccs: parseEmails("cc1@example.org,cc2"),
Draft: true,
Remote: gerritPath,
@@ -427,7 +425,7 @@
t.Fatalf("failed to send a review: %v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
}
@@ -435,14 +433,14 @@
// not run with a commit hook that adds a Change-Id.
func TestSendReviewNoChangeID(t *testing.T) {
// Pass 'false' to setup so it doesn't install the commit-msg hook.
- ctx, cwd, root, _, _, gerritPath := setupTest(t, false)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, gerritPath := setupTest(t, false)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
- commitFiles(t, ctx, []string{"file1"})
- review, err := newReview(ctx, gerrit.CLOpts{Remote: gerritPath})
+ commitFiles(t, root.X, []string{"file1"})
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: gerritPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -457,15 +455,15 @@
// TestEndToEnd checks the end-to-end functionality of the review tool.
func TestEndToEnd(t *testing.T) {
- ctx, cwd, root, repoPath, _, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, _, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
files := []string{"file1", "file2", "file3"}
- commitFiles(t, ctx, files)
- review, err := newReview(ctx, gerrit.CLOpts{Remote: gerritPath})
+ commitFiles(t, root.X, files)
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: gerritPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -474,7 +472,7 @@
t.Fatalf("run() failed: %v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
// TestLabelsInCommitMessage checks the labels are correctly processed
@@ -492,17 +490,17 @@
// fact that the reference name is a function of the reviewers and
// uses different reviewers for different review runs.
func TestLabelsInCommitMessage(t *testing.T) {
- ctx, cwd, root, repoPath, _, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, _, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
// Test setting -presubmit=none and autosubmit.
files := []string{"file1", "file2", "file3"}
- commitFiles(t, ctx, files)
- review, err := newReview(ctx, gerrit.CLOpts{
+ commitFiles(t, root.X, files)
+ review, err := newReview(root.X, gerrit.CLOpts{
Autosubmit: true,
Presubmit: gerrit.PresubmitTestTypeNone,
Remote: gerritPath,
@@ -516,16 +514,16 @@
t.Fatalf("%v", err)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
// The last three lines of the gerrit commit message file should be:
// AutoSubmit
// PresubmitTest: none
// Change-Id: ...
- file, err := getCommitMessageFileName(review.ctx, review.CLOpts.Branch)
+ file, err := getCommitMessageFileName(review.jirix, review.CLOpts.Branch)
if err != nil {
t.Fatalf("%v", err)
}
- bytes, err := ctx.Run().ReadFile(file)
+ bytes, err := root.X.Run().ReadFile(file)
if err != nil {
t.Fatalf("%v\n", err)
}
@@ -545,7 +543,7 @@
}
// Test setting -presubmit=all but keep autosubmit=true.
- review, err = newReview(ctx, gerrit.CLOpts{
+ review, err = newReview(root.X, gerrit.CLOpts{
Autosubmit: true,
Remote: gerritPath,
Reviewers: parseEmails("run2"),
@@ -557,8 +555,8 @@
t.Fatalf("%v", err)
}
expectedRef = gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
- bytes, err = ctx.Run().ReadFile(file)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
+ bytes, err = root.X.Run().ReadFile(file)
if err != nil {
t.Fatalf("%v\n", err)
}
@@ -574,7 +572,7 @@
}
// Test setting autosubmit=false.
- review, err = newReview(ctx, gerrit.CLOpts{
+ review, err = newReview(root.X, gerrit.CLOpts{
Remote: gerritPath,
Reviewers: parseEmails("run3"),
})
@@ -585,8 +583,8 @@
t.Fatalf("%v", err)
}
expectedRef = gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
- bytes, err = ctx.Run().ReadFile(file)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
+ bytes, err = root.X.Run().ReadFile(file)
if err != nil {
t.Fatalf("%v\n", err)
}
@@ -601,42 +599,42 @@
// TestDirtyBranch checks that the tool correctly handles unstaged and
// untracked changes in a working branch with stashed changes.
func TestDirtyBranch(t *testing.T) {
- ctx, cwd, root, _, _, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
files := []string{"file1", "file2"}
- commitFiles(t, ctx, files)
- assertStashSize(t, ctx, 0)
+ commitFiles(t, root.X, files)
+ assertStashSize(t, root.X, 0)
stashedFile, stashedFileContent := "stashed-file", "stashed-file content"
- if err := ctx.Run().WriteFile(stashedFile, []byte(stashedFileContent), 0644); err != nil {
+ if err := root.X.Run().WriteFile(stashedFile, []byte(stashedFileContent), 0644); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", stashedFile, stashedFileContent, err)
}
- if err := ctx.Git().Add(stashedFile); err != nil {
+ if err := root.X.Git().Add(stashedFile); err != nil {
t.Fatalf("%v", err)
}
- if _, err := ctx.Git().Stash(); err != nil {
+ if _, err := root.X.Git().Stash(); err != nil {
t.Fatalf("%v", err)
}
- assertStashSize(t, ctx, 1)
+ assertStashSize(t, root.X, 1)
modifiedFile, modifiedFileContent := "file1", "modified-file content"
- if err := ctx.Run().WriteFile(modifiedFile, []byte(modifiedFileContent), 0644); err != nil {
+ if err := root.X.Run().WriteFile(modifiedFile, []byte(modifiedFileContent), 0644); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", modifiedFile, modifiedFileContent, err)
}
stagedFile, stagedFileContent := "file2", "staged-file content"
- if err := ctx.Run().WriteFile(stagedFile, []byte(stagedFileContent), 0644); err != nil {
+ if err := root.X.Run().WriteFile(stagedFile, []byte(stagedFileContent), 0644); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", stagedFile, stagedFileContent, err)
}
- if err := ctx.Git().Add(stagedFile); err != nil {
+ if err := root.X.Git().Add(stagedFile); err != nil {
t.Fatalf("%v", err)
}
untrackedFile, untrackedFileContent := "file3", "untracked-file content"
- if err := ctx.Run().WriteFile(untrackedFile, []byte(untrackedFileContent), 0644); err != nil {
+ if err := root.X.Run().WriteFile(untrackedFile, []byte(untrackedFileContent), 0644); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", untrackedFile, untrackedFileContent, err)
}
- review, err := newReview(ctx, gerrit.CLOpts{Remote: gerritPath})
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: gerritPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -644,44 +642,44 @@
if err := review.run(); err == nil {
t.Fatalf("run() didn't fail when it should")
}
- assertFilesNotCommitted(t, ctx, []string{stagedFile})
- assertFilesNotCommitted(t, ctx, []string{untrackedFile})
- assertFileContent(t, ctx, modifiedFile, modifiedFileContent)
- assertFileContent(t, ctx, stagedFile, stagedFileContent)
- assertFileContent(t, ctx, untrackedFile, untrackedFileContent)
+ assertFilesNotCommitted(t, root.X, []string{stagedFile})
+ assertFilesNotCommitted(t, root.X, []string{untrackedFile})
+ assertFileContent(t, root.X, modifiedFile, modifiedFileContent)
+ assertFileContent(t, root.X, stagedFile, stagedFileContent)
+ assertFileContent(t, root.X, untrackedFile, untrackedFileContent)
// As of git 2.4.3 "git stash pop" fails if there are uncommitted
// changes in the index. So we need to commit them first.
- if err := ctx.Git().Commit(); err != nil {
+ if err := root.X.Git().Commit(); err != nil {
t.Fatalf("%v", err)
}
- assertStashSize(t, ctx, 1)
- if err := ctx.Git().StashPop(); err != nil {
+ assertStashSize(t, root.X, 1)
+ if err := root.X.Git().StashPop(); err != nil {
t.Fatalf("%v", err)
}
- assertStashSize(t, ctx, 0)
- assertFilesNotCommitted(t, ctx, []string{stashedFile})
- assertFileContent(t, ctx, stashedFile, stashedFileContent)
+ assertStashSize(t, root.X, 0)
+ assertFilesNotCommitted(t, root.X, []string{stashedFile})
+ assertFileContent(t, root.X, stashedFile, stashedFileContent)
}
// TestRunInSubdirectory checks that the command will succeed when run from
// within a subdirectory of a branch that does not exist on master branch, and
// will return the user to the subdirectory after completion.
func TestRunInSubdirectory(t *testing.T) {
- ctx, cwd, root, repoPath, _, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, _, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
branch := "my-branch"
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
subdir := "sub/directory"
subdirPerms := os.FileMode(0744)
- if err := ctx.Run().MkdirAll(subdir, subdirPerms); err != nil {
+ if err := root.X.Run().MkdirAll(subdir, subdirPerms); err != nil {
t.Fatalf("MkdirAll(%v, %v) failed: %v", subdir, subdirPerms, err)
}
files := []string{path.Join(subdir, "file1")}
- commitFiles(t, ctx, files)
- chdir(t, ctx, subdir)
- review, err := newReview(ctx, gerrit.CLOpts{Remote: gerritPath})
+ commitFiles(t, root.X, files)
+ chdir(t, root.X, subdir)
+ review, err := newReview(root.X, gerrit.CLOpts{Remote: gerritPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -706,13 +704,13 @@
t.Fatalf("unexpected working directory: got %v, want %v", got, want)
}
expectedRef := gerrit.Reference(review.CLOpts)
- assertFilesPushedToRef(t, ctx, repoPath, gerritPath, expectedRef, files)
+ assertFilesPushedToRef(t, root.X, repoPath, gerritPath, expectedRef, files)
}
// TestProcessLabels checks that the processLabels function works as expected.
func TestProcessLabels(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
testCases := []struct {
autosubmit bool
presubmitType gerrit.PresubmitTestType
@@ -784,7 +782,7 @@
},
}
for _, test := range testCases {
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(root.X, gerrit.CLOpts{
Autosubmit: test.autosubmit,
Presubmit: test.presubmitType,
})
@@ -799,14 +797,14 @@
// TestCLNew checks the operation of the "jiri cl new" command.
func TestCLNew(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
// Create some dependent CLs.
- if err := newCL(ctx, []string{"feature1"}); err != nil {
+ if err := newCL(root.X, []string{"feature1"}); err != nil {
t.Fatalf("%v", err)
}
- if err := newCL(ctx, []string{"feature2"}); err != nil {
+ if err := newCL(root.X, []string{"feature2"}); err != nil {
t.Fatalf("%v", err)
}
@@ -825,11 +823,11 @@
},
}
for _, testCase := range testCases {
- file, err := getDependencyPathFileName(ctx, testCase.branch)
+ file, err := getDependencyPathFileName(root.X, testCase.branch)
if err != nil {
t.Fatalf("%v", err)
}
- data, err := ctx.Run().ReadFile(file)
+ data, err := root.X.Run().ReadFile(file)
if err != nil {
t.Fatalf("%v", err)
}
@@ -843,28 +841,28 @@
// where if a CL edits a file and a dependent CL deletes it, jiri cl mail after
// the deletion failed with unrecoverable merge errors.
func TestDependentClsWithEditDelete(t *testing.T) {
- ctx, cwd, root, repoPath, originPath, gerritPath := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
- chdir(t, ctx, originPath)
- commitFiles(t, ctx, []string{"A", "B"})
+ cwd, root, repoPath, originPath, gerritPath := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
+ chdir(t, root.X, originPath)
+ commitFiles(t, root.X, []string{"A", "B"})
- chdir(t, ctx, repoPath)
- if err := syncCL(ctx); err != nil {
+ chdir(t, root.X, repoPath)
+ if err := syncCL(root.X); err != nil {
t.Fatalf("%v", err)
}
- assertFilesExist(t, ctx, []string{"A", "B"})
+ assertFilesExist(t, root.X, []string{"A", "B"})
- createCLWithFiles(t, ctx, "editme", "C")
- if err := ctx.Run().WriteFile("B", []byte("Will I dream?"), 0644); err != nil {
+ createCLWithFiles(t, root.X, "editme", "C")
+ if err := root.X.Run().WriteFile("B", []byte("Will I dream?"), 0644); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Add("B"); err != nil {
+ if err := root.X.Git().Add("B"); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CommitWithMessage("editing stuff"); err != nil {
+ if err := root.X.Git().CommitWithMessage("editing stuff"); err != nil {
t.Fatalf("git commit failed: %v", err)
}
- review, err := newReview(ctx, gerrit.CLOpts{
+ review, err := newReview(root.X, gerrit.CLOpts{
Remote: gerritPath,
Reviewers: parseEmails("run1"), // See hack note about TestLabelsInCommitMessage
})
@@ -876,16 +874,16 @@
t.Fatalf("run() failed: %v", err)
}
- if err := newCL(ctx, []string{"deleteme"}); err != nil {
+ if err := newCL(root.X, []string{"deleteme"}); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Remove("B", "C"); err != nil {
+ if err := root.X.Git().Remove("B", "C"); err != nil {
t.Fatalf("git rm B C failed: %v", err)
}
- if err := ctx.Git().CommitWithMessage("deleting stuff"); err != nil {
+ if err := root.X.Git().CommitWithMessage("deleting stuff"); err != nil {
t.Fatalf("git commit failed: %v", err)
}
- review, err = newReview(ctx, gerrit.CLOpts{
+ review, err = newReview(root.X, gerrit.CLOpts{
Remote: gerritPath,
Reviewers: parseEmails("run2"),
})
@@ -896,35 +894,35 @@
t.Fatalf("run() failed: %v", err)
}
- chdir(t, ctx, gerritPath)
+ chdir(t, root.X, gerritPath)
expectedRef := gerrit.Reference(review.CLOpts)
- if err := ctx.Git().CheckoutBranch(expectedRef); err != nil {
+ if err := root.X.Git().CheckoutBranch(expectedRef); err != nil {
t.Fatalf("%v", err)
}
- assertFilesExist(t, ctx, []string{"A"})
- assertFilesDoNotExist(t, ctx, []string{"B", "C"})
+ assertFilesExist(t, root.X, []string{"A"})
+ assertFilesDoNotExist(t, root.X, []string{"B", "C"})
}
// TestParallelDev checks "jiri cl mail" behavior when parallel development has
// been submitted upstream.
func TestParallelDev(t *testing.T) {
- ctx, cwd, root, repoPath, originPath, gerritAPath := setupTest(t, true)
- gerritBPath := createRepoFromOrigin(t, ctx, root.Dir, "gerritB", originPath)
- chdir(t, ctx, repoPath)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, repoPath, originPath, gerritAPath := setupTest(t, true)
+ gerritBPath := createRepoFromOrigin(t, root.X, root.Dir, "gerritB", originPath)
+ chdir(t, root.X, repoPath)
+ defer teardownTest(t, cwd, root)
// Create parallel branches with:
// * non-conflicting changes in different files
// * conflicting changes in a file
- createCLWithFiles(t, ctx, "feature1-A", "A")
+ createCLWithFiles(t, root.X, "feature1-A", "A")
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ if err := root.X.Git().CheckoutBranch("master"); err != nil {
t.Fatalf("%v", err)
}
- createCLWithFiles(t, ctx, "feature1-B", "B")
- commitFile(t, ctx, "A", "Don't tread on me.")
+ createCLWithFiles(t, root.X, "feature1-B", "B")
+ commitFile(t, root.X, "A", "Don't tread on me.")
- reviewB, err := newReview(ctx, gerrit.CLOpts{Remote: gerritBPath})
+ reviewB, err := newReview(root.X, gerrit.CLOpts{Remote: gerritBPath})
if err != nil {
t.Fatalf("%v", err)
}
@@ -934,48 +932,48 @@
}
// Submit B and verify A doesn't revert it.
- submit(t, ctx, originPath, gerritBPath, reviewB)
+ submit(t, root.X, originPath, gerritBPath, reviewB)
// Assert files pushed to origin.
- chdir(t, ctx, originPath)
- assertFilesExist(t, ctx, []string{"A", "B"})
- chdir(t, ctx, repoPath)
+ chdir(t, root.X, originPath)
+ assertFilesExist(t, root.X, []string{"A", "B"})
+ chdir(t, root.X, repoPath)
- if err := ctx.Git().CheckoutBranch("feature1-A"); err != nil {
+ if err := root.X.Git().CheckoutBranch("feature1-A"); err != nil {
t.Fatalf("%v", err)
}
- reviewA, err := newReview(ctx, gerrit.CLOpts{Remote: gerritAPath})
+ reviewA, err := newReview(root.X, gerrit.CLOpts{Remote: gerritAPath})
if err == nil {
t.Fatalf("creating a review did not fail when it should")
}
// Assert state restored after failed review.
- assertFileContent(t, ctx, "A", "This is file A")
- assertFilesDoNotExist(t, ctx, []string{"B"})
+ assertFileContent(t, root.X, "A", "This is file A")
+ assertFilesDoNotExist(t, root.X, []string{"B"})
// Manual conflict resolution.
- if err := ctx.Git().Merge("master", gitutil.ResetOnFailureOpt(false)); err == nil {
+ if err := root.X.Git().Merge("master", gitutil.ResetOnFailureOpt(false)); err == nil {
t.Fatalf("merge applied cleanly when it shouldn't")
}
- assertFilesNotCommitted(t, ctx, []string{"A", "B"})
- assertFileContent(t, ctx, "B", "This is file B")
+ assertFilesNotCommitted(t, root.X, []string{"A", "B"})
+ assertFileContent(t, root.X, "B", "This is file B")
- if err := ctx.Run().WriteFile("A", []byte("This is file A. Don't tread on me."), 0644); err != nil {
+ if err := root.X.Run().WriteFile("A", []byte("This is file A. Don't tread on me."), 0644); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Add("A"); err != nil {
+ if err := root.X.Git().Add("A"); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Add("B"); err != nil {
+ if err := root.X.Git().Add("B"); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CommitWithMessage("Conflict resolution"); err != nil {
+ if err := root.X.Git().CommitWithMessage("Conflict resolution"); err != nil {
t.Fatalf("%v", err)
}
// Retry review.
- reviewA, err = newReview(ctx, gerrit.CLOpts{Remote: gerritAPath})
+ reviewA, err = newReview(root.X, gerrit.CLOpts{Remote: gerritAPath})
if err != nil {
t.Fatalf("review failed: %v", err)
}
@@ -984,46 +982,46 @@
t.Fatalf("run() failed: %v", err)
}
- chdir(t, ctx, gerritAPath)
+ chdir(t, root.X, gerritAPath)
expectedRef := gerrit.Reference(reviewA.CLOpts)
- if err := ctx.Git().CheckoutBranch(expectedRef); err != nil {
+ if err := root.X.Git().CheckoutBranch(expectedRef); err != nil {
t.Fatalf("%v", err)
}
- assertFilesExist(t, ctx, []string{"B"})
+ assertFilesExist(t, root.X, []string{"B"})
}
// TestCLSync checks the operation of the "jiri cl sync" command.
func TestCLSync(t *testing.T) {
- ctx, cwd, root, _, _, _ := setupTest(t, true)
- defer teardownTest(t, ctx, cwd, root)
+ cwd, root, _, _, _ := setupTest(t, true)
+ defer teardownTest(t, cwd, root)
// Create some dependent CLs.
- if err := newCL(ctx, []string{"feature1"}); err != nil {
+ if err := newCL(root.X, []string{"feature1"}); err != nil {
t.Fatalf("%v", err)
}
- if err := newCL(ctx, []string{"feature2"}); err != nil {
+ if err := newCL(root.X, []string{"feature2"}); err != nil {
t.Fatalf("%v", err)
}
// Add the "test" file to the master.
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ if err := root.X.Git().CheckoutBranch("master"); err != nil {
t.Fatalf("%v", err)
}
- commitFiles(t, ctx, []string{"test"})
+ commitFiles(t, root.X, []string{"test"})
// Sync the dependent CLs.
- if err := ctx.Git().CheckoutBranch("feature2"); err != nil {
+ if err := root.X.Git().CheckoutBranch("feature2"); err != nil {
t.Fatalf("%v", err)
}
- if err := syncCL(ctx); err != nil {
+ if err := syncCL(root.X); err != nil {
t.Fatalf("%v", err)
}
// Check that the "test" file exists in the dependent CLs.
for _, branch := range []string{"feature1", "feature2"} {
- if err := ctx.Git().CheckoutBranch(branch); err != nil {
+ if err := root.X.Git().CheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
- assertFilesExist(t, ctx, []string{"test"})
+ assertFilesExist(t, root.X, []string{"test"})
}
}
diff --git a/cmd.go b/cmd.go
index a3f6e93..0090f3b 100644
--- a/cmd.go
+++ b/cmd.go
@@ -8,7 +8,6 @@
package main
import (
- "fmt"
"runtime"
"v.io/jiri/tool"
@@ -40,26 +39,12 @@
cmdRebuild,
cmdSnapshot,
cmdUpdate,
- cmdVersion,
},
Topics: []cmdline.Topic{
topicManifest,
},
}
-// cmdVersion represents the "jiri version" command.
-var cmdVersion = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runVersion),
- Name: "version",
- Short: "Print version",
- Long: "Print version of the jiri tool.",
-}
-
-func runVersion(env *cmdline.Env, _ []string) error {
- fmt.Fprintf(env.Stdout, "jiri tool version %v\n", tool.Version)
- return nil
-}
-
var topicManifest = cmdline.Topic{
Name: "manifest",
Short: "Description of manifest files",
diff --git a/contrib.go b/contrib.go
index 8210f33..066850a 100644
--- a/contrib.go
+++ b/contrib.go
@@ -14,6 +14,7 @@
"strings"
"v.io/jiri/collect"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/tool"
"v.io/x/lib/cmdline"
@@ -36,7 +37,7 @@
// cmdContributors represents the "jiri contributors" command.
var cmdContributors = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runContributors),
+ Runner: jiri.RunnerFunc(runContributors),
Name: "contributors",
Short: "List project contributors",
Long: `
@@ -90,16 +91,16 @@
return canonicalEmail, canonicalName
}
-func loadAliases(ctx *tool.Context) (*aliasMaps, error) {
+func loadAliases(jirix *jiri.X) (*aliasMaps, error) {
aliasesFile := aliasesFlag
if aliasesFile == "" {
- dataDir, err := project.DataDirPath(ctx, tool.Name)
+ dataDir, err := project.DataDirPath(jirix, tool.Name)
if err != nil {
return nil, err
}
aliasesFile = filepath.Join(dataDir, aliasesFileName)
}
- bytes, err := ctx.Run().ReadFile(aliasesFile)
+ bytes, err := jirix.Run().ReadFile(aliasesFile)
if err != nil {
return nil, err
}
@@ -124,10 +125,8 @@
return aliases, nil
}
-func runContributors(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
-
- projects, err := project.LocalProjects(ctx, project.FastScan)
+func runContributors(jirix *jiri.X, args []string) error {
+ projects, err := project.LocalProjects(jirix, project.FastScan)
if err != nil {
return err
}
@@ -140,7 +139,7 @@
}
}
- aliases, err := loadAliases(ctx)
+ aliases, err := loadAliases(jirix)
if err != nil {
return err
}
@@ -150,12 +149,12 @@
if !ok {
continue
}
- if err := ctx.Run().Chdir(project.Path); err != nil {
+ if err := jirix.Run().Chdir(project.Path); err != nil {
return err
}
switch project.Protocol {
case "git":
- lines, err := listCommitters(ctx)
+ lines, err := listCommitters(jirix)
if err != nil {
return err
}
@@ -193,28 +192,28 @@
for _, name := range names {
c := contributors[name]
if countFlag {
- fmt.Fprintf(env.Stdout, "%4d ", c.count)
+ fmt.Fprintf(jirix.Stdout(), "%4d ", c.count)
}
- fmt.Fprintf(env.Stdout, "%v <%v>\n", c.name, c.email)
+ fmt.Fprintf(jirix.Stdout(), "%v <%v>\n", c.name, c.email)
}
return nil
}
-func listCommitters(ctx *tool.Context) (_ []string, e error) {
- branch, err := ctx.Git().CurrentBranchName()
+func listCommitters(jirix *jiri.X) (_ []string, e error) {
+ branch, err := jirix.Git().CurrentBranchName()
if err != nil {
return nil, err
}
- stashed, err := ctx.Git().Stash()
+ stashed, err := jirix.Git().Stash()
if err != nil {
return nil, err
}
if stashed {
- defer collect.Error(func() error { return ctx.Git().StashPop() }, &e)
+ defer collect.Error(func() error { return jirix.Git().StashPop() }, &e)
}
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ if err := jirix.Git().CheckoutBranch("master"); err != nil {
return nil, err
}
- defer collect.Error(func() error { return ctx.Git().CheckoutBranch(branch) }, &e)
- return ctx.Git().Committers()
+ defer collect.Error(func() error { return jirix.Git().CheckoutBranch(branch) }, &e)
+ return jirix.Git().Committers()
}
diff --git a/doc.go b/doc.go
index 3940c48..b41ea96 100644
--- a/doc.go
+++ b/doc.go
@@ -18,7 +18,6 @@
rebuild Rebuild all jiri tools
snapshot Manage project snapshots
update Update all jiri tools and projects
- version Print version
help Display help for commands or topics
The jiri additional help topics are:
@@ -339,13 +338,6 @@
-manifest=
Name of the project manifest.
-Jiri version - Print version
-
-Print version of the jiri tool.
-
-Usage:
- jiri version
-
Jiri help - Display help for commands or topics
Help with no args displays the usage of the parent command.
diff --git a/jiri/jiritest/x.go b/jiri/jiritest/x.go
new file mode 100644
index 0000000..3f680b6
--- /dev/null
+++ b/jiri/jiritest/x.go
@@ -0,0 +1,32 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package jiritest provides utilities for testing jiri functionality.
+package jiritest
+
+import (
+ "os"
+ "testing"
+
+ "v.io/jiri/jiri"
+ "v.io/jiri/tool"
+)
+
+// NewX is similar to jiri.NewX, but is meant for usage in a testing environment.
+func NewX(t *testing.T) (*jiri.X, func()) {
+ ctx := tool.NewDefaultContext()
+ root, err := ctx.NewSeq().TempDir("", "")
+ if err != nil {
+ t.Fatalf("TempDir() failed: %v", err)
+ }
+ oldEnv := os.Getenv("JIRI_ROOT")
+ if err := os.Setenv("JIRI_ROOT", root); err != nil {
+ t.Fatalf("Setenv(JIRI_ROOT) failed: %v", err)
+ }
+ cleanup := func() {
+ os.Setenv("JIRI_ROOT", oldEnv)
+ ctx.NewSeq().RemoveAll(root).Done()
+ }
+ return &jiri.X{Context: ctx, Root: root}, cleanup
+}
diff --git a/jiri/x.go b/jiri/x.go
new file mode 100644
index 0000000..5b5e0c9
--- /dev/null
+++ b/jiri/x.go
@@ -0,0 +1,104 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package jiri provides utilities used by the jiri tool and related tools.
+package jiri
+
+// TODO(toddw): Rename this package to v.io/jiri, and rename the tool itself to
+// v.io/jiri/cmd/jiri
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+
+ "v.io/jiri/tool"
+ "v.io/x/lib/cmdline"
+)
+
+const (
+ rootEnv = "JIRI_ROOT"
+)
+
+// X holds the execution environment for the jiri tool and related tools. This
+// includes the jiri filesystem root directory.
+//
+// TODO(toddw): The Root is not currently used; we still use project.JiriRoot
+// everywhere. Transition those uses gradually over to use this instead.
+//
+// TODO(toddw): Other jiri state should be transitioned to this struct,
+// including the manifest and related operations.
+type X struct {
+ *tool.Context
+ Root string
+ Usage func(format string, args ...interface{}) error
+}
+
+// NewX returns a new execution environment, given a cmdline env.
+func NewX(env *cmdline.Env) (*X, error) {
+ ctx := tool.NewContextFromEnv(env)
+ root, err := findJiriRoot(ctx)
+ if err != nil {
+ return nil, err
+ }
+ return &X{
+ Context: ctx,
+ Root: root,
+ Usage: env.UsageErrorf,
+ }, nil
+}
+
+func findJiriRoot(ctx *tool.Context) (string, error) {
+ ctx.TimerPush("find JIRI_ROOT")
+ defer ctx.TimerPop()
+ if root := os.Getenv(rootEnv); root != "" {
+ // Always use JIRI_ROOT if it's set.
+ result, err := filepath.EvalSymlinks(root)
+ if err != nil {
+ return "", fmt.Errorf("%v EvalSymlinks(%v) failed: %v", rootEnv, root, err)
+ }
+ if !filepath.IsAbs(result) {
+ return "", fmt.Errorf("%v isn't an absolute path: %v", rootEnv, result)
+ }
+ return filepath.Clean(result), nil
+ }
+ // TODO(toddw): Try to find the root by walking up the filesystem.
+ return "", fmt.Errorf("%v is not set", rootEnv)
+}
+
+// Clone returns a clone of the environment.
+func (x *X) Clone(opts tool.ContextOpts) *X {
+ return &X{
+ Context: x.Context.Clone(opts),
+ Root: x.Root,
+ Usage: x.Usage,
+ }
+}
+
+// UsageErrorf prints the error message represented by the printf-style format
+// and args, followed by the usage output. The implementation typically calls
+// cmdline.Env.UsageErrorf.
+func (x *X) UsageErrorf(format string, args ...interface{}) error {
+ if x.Usage != nil {
+ return x.Usage(format, args...)
+ }
+ return nil
+}
+
+// RunnerFunc is an adapter that turns regular functions into cmdline.Runner.
+// This is similar to cmdline.RunnerFunc, but the first function argument is
+// jiri.X, rather than cmdline.Env.
+func RunnerFunc(run func(*X, []string) error) cmdline.Runner {
+ return runner(run)
+}
+
+type runner func(*X, []string) error
+
+func (r runner) Run(env *cmdline.Env, args []string) error {
+ x, err := NewX(env)
+ if err != nil {
+ return err
+ }
+ return r(x, args)
+}
diff --git a/profiles/commandline/driver.go b/profiles/commandline/driver.go
index 6fa89ef..44f2c87 100644
--- a/profiles/commandline/driver.go
+++ b/profiles/commandline/driver.go
@@ -16,6 +16,7 @@
"strings"
"text/template"
+ "v.io/jiri/jiri"
"v.io/jiri/profiles"
"v.io/jiri/project"
"v.io/jiri/tool"
@@ -45,7 +46,7 @@
// cmdInstall represents the "profile install" command.
var cmdInstall = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runInstall),
+ Runner: jiri.RunnerFunc(runInstall),
Name: "install",
Short: "Install the given profiles",
Long: "Install the given profiles.",
@@ -55,7 +56,7 @@
// cmdList represents the "profile list" command.
var cmdList = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runList),
+ Runner: jiri.RunnerFunc(runList),
Name: "list",
Short: "List available or installed profiles",
Long: "List available or installed profiles.",
@@ -65,7 +66,7 @@
// cmdEnv represents the "profile env" command.
var cmdEnv = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runEnv),
+ Runner: jiri.RunnerFunc(runEnv),
Name: "env",
Short: "Display profile environment variables",
Long: `
@@ -83,7 +84,7 @@
// cmdUpdate represents the "profile update" command.
var cmdUpdate = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runUpdate),
+ Runner: jiri.RunnerFunc(runUpdate),
Name: "update",
Short: "Install the latest default version of the given profiles",
Long: "Install the latest default version of the given profiles.",
@@ -93,7 +94,7 @@
// cmdCleanup represents the "profile Cleanup" command.
var cmdCleanup = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runCleanup),
+ Runner: jiri.RunnerFunc(runCleanup),
Name: "cleanup",
Short: "Cleanup the locally installed profiles",
Long: "Cleanup the locally installed profiles. This is generally required when recovering from earlier bugs or when preparing for a subsequent change to the profiles implementation.",
@@ -103,7 +104,7 @@
// cmdUninstall represents the "profile uninstall" command.
var cmdUninstall = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runUninstall),
+ Runner: jiri.RunnerFunc(runUninstall),
Name: "uninstall",
Short: "Uninstall the given profiles",
Long: "Uninstall the given profiles.",
@@ -201,33 +202,32 @@
cmdCleanup.Flags.BoolVar(&rewriteManifestFlag, "rewrite-profiles-manifest", false, "rewrite the profiles manifest file to use the latest schema version")
}
-func runList(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
+func runList(jirix *jiri.X, args []string) error {
if showManifestFlag {
- data, err := ctx.Run().ReadFile(manifestFlag)
+ data, err := jirix.Run().ReadFile(manifestFlag)
if err != nil {
return err
}
- fmt.Fprintln(ctx.Stdout(), string(data))
+ fmt.Fprintln(jirix.Stdout(), string(data))
return nil
}
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Manifest: %s\n", manifestFlag)
+ fmt.Fprintf(jirix.Stdout(), "Manifest: %s\n", manifestFlag)
}
if availableFlag {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Available Profiles:\n")
+ fmt.Fprintf(jirix.Stdout(), "Available Profiles:\n")
for _, name := range profiles.Managers() {
mgr := profiles.LookupManager(name)
vi := mgr.VersionInfo()
- fmt.Fprintf(ctx.Stdout(), "%s: versions: %s\n", name, vi)
+ fmt.Fprintf(jirix.Stdout(), "%s: versions: %s\n", name, vi)
}
} else {
- fmt.Fprintf(ctx.Stdout(), "%s\n", strings.Join(profiles.Managers(), ", "))
+ fmt.Fprintf(jirix.Stdout(), "%s\n", strings.Join(profiles.Managers(), ", "))
}
}
- if err := profiles.Read(ctx, manifestFlag); err != nil {
- fmt.Fprintf(ctx.Stderr(), "Failed to read manifest: %v", err)
+ if err := profiles.Read(jirix, manifestFlag); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "Failed to read manifest: %v", err)
return err
}
profileNames := args
@@ -241,13 +241,13 @@
}
}
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Installed Profiles: ")
- fmt.Fprintf(ctx.Stdout(), "%s\n", strings.Join(profiles.Profiles(), ", "))
+ fmt.Fprintf(jirix.Stdout(), "Installed Profiles: ")
+ fmt.Fprintf(jirix.Stdout(), "%s\n", strings.Join(profiles.Profiles(), ", "))
for _, name := range availableNames {
profile := profiles.LookupProfile(name)
- fmt.Fprintf(ctx.Stdout(), "Profile: %s @ %s\n", profile.Name, profile.Root)
+ fmt.Fprintf(jirix.Stdout(), "Profile: %s @ %s\n", profile.Name, profile.Root)
for _, target := range profile.Targets() {
- fmt.Fprintf(ctx.Stdout(), "\t%s\n", target.DebugString())
+ fmt.Fprintf(jirix.Stdout(), "\t%s\n", target.DebugString())
}
}
} else {
@@ -267,7 +267,7 @@
out.WriteString(fmtHeader(name, target))
out.WriteString(" ")
}
- r, err := fmtInfo(ctx, mgr, profile, target)
+ r, err := fmtInfo(jirix, mgr, profile, target)
if err != nil {
return err
}
@@ -276,7 +276,7 @@
out.WriteString("\n")
}
}
- fmt.Fprint(ctx.Stdout(), out.String())
+ fmt.Fprint(jirix.Stdout(), out.String())
}
}
return nil
@@ -322,7 +322,7 @@
Note: if no profiles are specified then the requested field will be displayed for all profiles.`
}
-func fmtOutput(ctx *tool.Context, o string) string {
+func fmtOutput(jirix *jiri.X, o string) string {
_, width, err := textutil.TerminalSize()
if err != nil {
width = 80
@@ -345,7 +345,7 @@
return root.RootJoin(s).Expand()
}
-func fmtInfo(ctx *tool.Context, mgr profiles.Manager, profile *profiles.Profile, target *profiles.Target) (string, error) {
+func fmtInfo(jirix *jiri.X, mgr profiles.Manager, profile *profiles.Profile, target *profiles.Target) (string, error) {
if len(infoFlag) > 0 {
// Populate an instance listInfo
info := &listInfo{}
@@ -353,7 +353,7 @@
if mgr != nil {
// Format the description on its own, without any preceeding
// text so that the line breaks work correctly.
- info.Profile.Description = "\n" + fmtOutput(ctx, mgr.Info()) + "\n"
+ info.Profile.Description = "\n" + fmtOutput(jirix, mgr.Info()) + "\n"
vi := mgr.VersionInfo()
if supported := vi.Supported(); len(supported) > 0 {
info.Profile.Versions = supported
@@ -391,12 +391,11 @@
return "", nil
}
-func runEnv(env *cmdline.Env, args []string) error {
+func runEnv(jirix *jiri.X, args []string) error {
if len(profilesFlag) == 0 {
return fmt.Errorf("no profiles were specified using --profiles")
}
- ctx := tool.NewContextFromEnv(env)
- ch, err := profiles.NewConfigHelper(ctx, profiles.UseProfiles, manifestFlag)
+ ch, err := profiles.NewConfigHelper(jirix, profiles.UseProfiles, manifestFlag)
if err != nil {
return err
}
@@ -407,7 +406,7 @@
ch.MergeEnvFromProfiles(mergePoliciesFlag, targetFlag, profileNames...)
out := fmtVars(ch.ToMap(), args)
if len(out) > 0 {
- fmt.Fprintln(ctx.Stdout(), out)
+ fmt.Fprintln(jirix.Stdout(), out)
}
return nil
}
@@ -439,7 +438,7 @@
return strings.TrimSuffix(buf.String(), " ")
}
-func initCommand(ctx *tool.Context, args []string) error {
+func initCommand(jirix *jiri.X, args []string) error {
if len(args) == 0 {
return fmt.Errorf("no profiles specified")
}
@@ -448,19 +447,18 @@
return fmt.Errorf("profile %v is not available, use \"list --available\" to see the list of available profiles", n)
}
}
- if err := profiles.Read(ctx, manifestFlag); err != nil {
- fmt.Fprintf(ctx.Stderr(), "Failed to read manifest: %v", err)
+ if err := profiles.Read(jirix, manifestFlag); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "Failed to read manifest: %v", err)
return err
}
return nil
}
-func runUpdate(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
+func runUpdate(jirix *jiri.X, args []string) error {
if len(args) == 0 {
args = profiles.Managers()
}
- if err := initCommand(ctx, args); err != nil {
+ if err := initCommand(jirix, args); err != nil {
return err
}
for _, n := range args {
@@ -473,34 +471,34 @@
for _, target := range profile.Targets() {
if vi.IsTargetOlderThanDefault(target.Version()) {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Updating %s %s from %q to %s\n", n, target, target.Version(), vi)
+ fmt.Fprintf(jirix.Stdout(), "Updating %s %s from %q to %s\n", n, target, target.Version(), vi)
}
target.SetVersion(vi.Default())
- err := mgr.Install(ctx, rootPath, *target)
- logResult(ctx, "Update", mgr, *target, err)
+ err := mgr.Install(jirix, rootPath, *target)
+ logResult(jirix, "Update", mgr, *target, err)
if err != nil {
return err
}
} else {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "%s %s at %q is up to date(%s)\n", n, target, target.Version(), vi)
+ fmt.Fprintf(jirix.Stdout(), "%s %s at %q is up to date(%s)\n", n, target, target.Version(), vi)
}
}
}
}
- return profiles.Write(ctx, manifestFlag)
+ return profiles.Write(jirix, manifestFlag)
}
-func runGC(ctx *tool.Context, args []string) error {
+func runGC(jirix *jiri.X, args []string) error {
for _, n := range args {
mgr := profiles.LookupManager(n)
vi := mgr.VersionInfo()
profile := profiles.LookupProfile(n)
for _, target := range profile.Targets() {
if vi.IsTargetOlderThanDefault(target.Version()) {
- err := mgr.Uninstall(ctx, rootPath, *target)
- logResult(ctx, "gc", mgr, *target, err)
+ err := mgr.Uninstall(jirix, rootPath, *target)
+ logResult(jirix, "gc", mgr, *target, err)
if err != nil {
return err
}
@@ -510,12 +508,12 @@
return nil
}
-func runEnsureVersionsAreSet(ctx *tool.Context, args []string) error {
+func runEnsureVersionsAreSet(jirix *jiri.X, args []string) error {
for _, name := range args {
profile := profiles.LookupProfile(name)
mgr := profiles.LookupManager(name)
if mgr == nil {
- fmt.Fprintf(ctx.Stderr(), "%s is not linked into this binary", name)
+ fmt.Fprintf(jirix.Stderr(), "%s is not linked into this binary", name)
continue
}
for _, target := range profile.Targets() {
@@ -531,7 +529,7 @@
return err
}
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "%s %s had no version, now set to: %s\n", name, prior, target)
+ fmt.Fprintf(jirix.Stdout(), "%s %s had no version, now set to: %s\n", name, prior, target)
}
}
}
@@ -539,8 +537,8 @@
return nil
}
-func runRmAll(ctx *tool.Context) error {
- s := ctx.NewSeq()
+func runRmAll(jirix *jiri.X) error {
+ s := jirix.NewSeq()
if exists, err := s.FileExists(manifestFlag); err != nil || exists {
if err := s.Remove(manifestFlag).Done(); err != nil {
return err
@@ -556,10 +554,9 @@
return nil
}
-func runCleanup(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
- if err := profiles.Read(ctx, manifestFlag); err != nil {
- fmt.Fprintf(ctx.Stderr(), "Failed to read manifest: %v", err)
+func runCleanup(jirix *jiri.X, args []string) error {
+ if err := profiles.Read(jirix, manifestFlag); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "Failed to read manifest: %v", err)
return err
}
if len(args) == 0 {
@@ -568,27 +565,27 @@
dirty := false
if specificVersionsFlag {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Ensuring that all targets have a specific version set for %s\n", args)
+ fmt.Fprintf(jirix.Stdout(), "Ensuring that all targets have a specific version set for %s\n", args)
}
- if err := runEnsureVersionsAreSet(ctx, args); err != nil {
+ if err := runEnsureVersionsAreSet(jirix, args); err != nil {
return fmt.Errorf("ensure-specific-versions-are-set: %v", err)
}
dirty = true
}
if cleanupFlag {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Removing targets older than the default version for %s\n", args)
+ fmt.Fprintf(jirix.Stdout(), "Removing targets older than the default version for %s\n", args)
}
- if err := runGC(ctx, args); err != nil {
+ if err := runGC(jirix, args); err != nil {
return fmt.Errorf("gc: %v", err)
}
dirty = true
}
if rmAllFlag {
if verboseFlag {
- fmt.Fprintf(ctx.Stdout(), "Removing profile manifest and all profile output files\n")
+ fmt.Fprintf(jirix.Stdout(), "Removing profile manifest and all profile output files\n")
}
- if err := runRmAll(ctx); err != nil {
+ if err := runRmAll(jirix); err != nil {
return err
}
// Don't write out the profiles manifest file again.
@@ -600,19 +597,19 @@
if !dirty {
return fmt.Errorf("at least one option must be specified")
}
- return profiles.Write(ctx, manifestFlag)
+ return profiles.Write(jirix, manifestFlag)
}
-func logResult(ctx *tool.Context, action string, mgr profiles.Manager, target profiles.Target, err error) {
- fmt.Fprintf(ctx.Stdout(), "%s: %s %s: ", action, mgr.Name(), target)
+func logResult(jirix *jiri.X, action string, mgr profiles.Manager, target profiles.Target, err error) {
+ fmt.Fprintf(jirix.Stdout(), "%s: %s %s: ", action, mgr.Name(), target)
if err == nil {
- fmt.Fprintf(ctx.Stdout(), "success\n")
+ fmt.Fprintf(jirix.Stdout(), "success\n")
} else {
- fmt.Fprintf(ctx.Stdout(), "%v\n", err)
+ fmt.Fprintf(jirix.Stdout(), "%v\n", err)
}
}
-func applyCommand(names []string, env *cmdline.Env, ctx *tool.Context, target profiles.Target, fn func(profiles.Manager, *tool.Context, profiles.Target) error) error {
+func applyCommand(names []string, jirix *jiri.X, target profiles.Target, fn func(profiles.Manager, *jiri.X, profiles.Target) error) error {
for _, n := range names {
mgr := profiles.LookupManager(n)
version, err := mgr.VersionInfo().Select(target.Version())
@@ -620,16 +617,15 @@
return err
}
target.SetVersion(version)
- if err := fn(mgr, ctx, target); err != nil {
+ if err := fn(mgr, jirix, target); err != nil {
return err
}
}
return nil
}
-func runInstall(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
- if err := initCommand(ctx, args); err != nil {
+func runInstall(jirix *jiri.X, args []string) error {
+ if err := initCommand(jirix, args); err != nil {
return err
}
names := []string{}
@@ -641,29 +637,28 @@
targetFlag.UseCommandLineEnv()
for _, name := range args {
if p := profiles.LookupProfileTarget(name, targetFlag); p != nil {
- fmt.Fprintf(ctx.Stdout(), "%v %v is already installed as %v\n", name, targetFlag, p)
+ fmt.Fprintf(jirix.Stdout(), "%v %v is already installed as %v\n", name, targetFlag, p)
continue
}
names = append(names, name)
}
- if err := applyCommand(names, env, ctx, targetFlag,
- func(mgr profiles.Manager, ctx *tool.Context, target profiles.Target) error {
- err := mgr.Install(ctx, rootPath, target)
- logResult(ctx, "Install:", mgr, target, err)
+ if err := applyCommand(names, jirix, targetFlag,
+ func(mgr profiles.Manager, jirix *jiri.X, target profiles.Target) error {
+ err := mgr.Install(jirix, rootPath, target)
+ logResult(jirix, "Install:", mgr, target, err)
return err
}); err != nil {
return err
}
- return profiles.Write(ctx, manifestFlag)
+ return profiles.Write(jirix, manifestFlag)
}
-func runUninstall(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
- if err := initCommand(ctx, args); err != nil {
+func runUninstall(jirix *jiri.X, args []string) error {
+ if err := initCommand(jirix, args); err != nil {
return err
}
if allFlag && targetFlag.IsSet() {
- fmt.Fprintf(ctx.Stdout(), "ignore target (%v) when used in conjunction with --all-targets\n", targetFlag)
+ fmt.Fprintf(jirix.Stdout(), "ignore target (%v) when used in conjunction with --all-targets\n", targetFlag)
}
if allFlag {
for _, name := range args {
@@ -673,20 +668,20 @@
continue
}
for _, target := range profile.Targets() {
- if err := mgr.Uninstall(ctx, rootPath, *target); err != nil {
- logResult(ctx, "Uninstall", mgr, *target, err)
+ if err := mgr.Uninstall(jirix, rootPath, *target); err != nil {
+ logResult(jirix, "Uninstall", mgr, *target, err)
return err
}
- logResult(ctx, "Uninstall", mgr, *target, nil)
+ logResult(jirix, "Uninstall", mgr, *target, nil)
}
}
} else {
- applyCommand(args, env, ctx, targetFlag,
- func(mgr profiles.Manager, ctx *tool.Context, target profiles.Target) error {
- err := mgr.Uninstall(ctx, rootPath, target)
- logResult(ctx, "Uninstall", mgr, target, err)
+ applyCommand(args, jirix, targetFlag,
+ func(mgr profiles.Manager, jirix *jiri.X, target profiles.Target) error {
+ err := mgr.Uninstall(jirix, rootPath, target)
+ logResult(jirix, "Uninstall", mgr, target, err)
return err
})
}
- return profiles.Write(ctx, manifestFlag)
+ return profiles.Write(jirix, manifestFlag)
}
diff --git a/profiles/env.go b/profiles/env.go
index 752d7b6..4f34cf8 100644
--- a/profiles/env.go
+++ b/profiles/env.go
@@ -13,8 +13,8 @@
"strconv"
"strings"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
- "v.io/jiri/tool"
"v.io/jiri/util"
"v.io/x/lib/envvar"
)
@@ -100,7 +100,7 @@
*envvar.Vars
profilesMode bool
root string
- ctx *tool.Context
+ jirix *jiri.X
config *util.Config
projects project.Projects
tools project.Tools
@@ -110,26 +110,26 @@
// length then that file will be read as a profiles manifest file, if not, the
// existing, if any, in-memory profiles information will be used. If SkipProfiles
// is specified for profilesMode, then no profiles are used.
-func NewConfigHelper(ctx *tool.Context, profilesMode ProfilesMode, filename string) (*ConfigHelper, error) {
+func NewConfigHelper(jirix *jiri.X, profilesMode ProfilesMode, filename string) (*ConfigHelper, error) {
root, err := project.JiriRoot()
if err != nil {
return nil, err
}
- config, err := util.LoadConfig(ctx)
+ config, err := util.LoadConfig(jirix)
if err != nil {
return nil, err
}
- projects, tools, err := project.ReadManifest(ctx)
+ projects, tools, err := project.ReadManifest(jirix)
if err != nil {
return nil, err
}
if profilesMode == UseProfiles && len(filename) > 0 {
- if err := Read(ctx, filename); err != nil {
+ if err := Read(jirix, filename); err != nil {
return nil, err
}
}
ch := &ConfigHelper{
- ctx: ctx,
+ jirix: jirix,
root: root,
config: config,
projects: projects,
@@ -223,19 +223,19 @@
// GoPath computes and returns the GOPATH environment variable based on the
// current jiri configuration.
func (ch *ConfigHelper) GoPath() string {
- path := pathHelper(ch.ctx, ch.root, ch.projects, ch.config.GoWorkspaces(), "")
+ path := pathHelper(ch.jirix, ch.root, ch.projects, ch.config.GoWorkspaces(), "")
return "GOPATH=" + envvar.JoinTokens(path, ":")
}
// VDLPath computes and returns the VDLPATH environment variable based on the
// current jiri configuration.
func (ch *ConfigHelper) VDLPath() string {
- path := pathHelper(ch.ctx, ch.root, ch.projects, ch.config.VDLWorkspaces(), "src")
+ path := pathHelper(ch.jirix, ch.root, ch.projects, ch.config.VDLWorkspaces(), "src")
return "VDLPATH=" + envvar.JoinTokens(path, ":")
}
// pathHelper is a utility function for determining paths for project workspaces.
-func pathHelper(ctx *tool.Context, root string, projects project.Projects, workspaces []string, suffix string) []string {
+func pathHelper(jirix *jiri.X, root string, projects project.Projects, workspaces []string, suffix string) []string {
path := []string{}
for _, workspace := range workspaces {
absWorkspace := filepath.Join(root, workspace, suffix)
@@ -250,7 +250,7 @@
// account for Go workspaces that span multiple jiri projects,
// such as: $JIRI_ROOT/release/go.
if strings.HasPrefix(absWorkspace, project.Path) || strings.HasPrefix(project.Path, absWorkspace) {
- if _, err := ctx.Run().Stat(filepath.Join(absWorkspace)); err == nil {
+ if _, err := jirix.Run().Stat(filepath.Join(absWorkspace)); err == nil {
path = append(path, absWorkspace)
break
}
diff --git a/profiles/env_test.go b/profiles/env_test.go
index f057c3c..e0c3423 100644
--- a/profiles/env_test.go
+++ b/profiles/env_test.go
@@ -13,6 +13,7 @@
"sort"
"testing"
+ "v.io/jiri/jiri"
"v.io/jiri/profiles"
"v.io/jiri/project"
"v.io/jiri/tool"
@@ -21,12 +22,12 @@
)
func TestConfigHelper(t *testing.T) {
- ctx := tool.NewDefaultContext()
root, err := project.JiriRoot()
if err != nil {
t.Fatal(err)
}
- ch, err := profiles.NewConfigHelper(ctx, profiles.UseProfiles, filepath.Join(root, "release/go/src/v.io/jiri/profiles/testdata/m2.xml"))
+ jirix := &jiri.X{Context: tool.NewDefaultContext(), Root: root}
+ ch, err := profiles.NewConfigHelper(jirix, profiles.UseProfiles, filepath.Join(root, "release/go/src/v.io/jiri/profiles/testdata/m2.xml"))
if err != nil {
t.Fatal(err)
}
@@ -44,8 +45,11 @@
func TestEnvFromTarget(t *testing.T) {
profiles.Clear()
- root, _ := project.JiriRoot()
- ctx := tool.NewDefaultContext()
+ root, err := project.JiriRoot()
+ if err != nil {
+ t.Fatal(err)
+ }
+ jirix := &jiri.X{Context: tool.NewDefaultContext(), Root: root}
profiles.InstallProfile("a", "root")
profiles.InstallProfile("b", "root")
t1, t2 := &profiles.Target{}, &profiles.Target{}
@@ -60,11 +64,11 @@
t.Fatal(err)
}
filename := filepath.Join(root, "release", "go", "src", "v.io", "jiri", "profiles", tmpdir, "manifest")
- if err := profiles.Write(ctx, filename); err != nil {
+ if err := profiles.Write(jirix, filename); err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmpdir)
- ch, err := profiles.NewConfigHelper(ctx, profiles.UseProfiles, filename)
+ ch, err := profiles.NewConfigHelper(jirix, profiles.UseProfiles, filename)
if err != nil {
t.Fatal(err)
}
@@ -145,31 +149,29 @@
func testSetPathHelper(t *testing.T, name string) {
profiles.Clear()
- ctx := tool.NewDefaultContext()
-
// Setup a fake JIRI_ROOT.
- root, err := project.NewFakeJiriRoot(ctx)
+ root, err := project.NewFakeJiriRoot()
if err != nil {
t.Fatalf("%v", err)
}
defer func() {
- if err := root.Cleanup(ctx); err != nil {
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}()
// Create a test project and identify it as a Go workspace.
- if err := root.CreateRemoteProject(ctx, "test"); err != nil {
+ if err := root.CreateRemoteProject("test"); err != nil {
t.Fatalf("%v", err)
}
- if err := root.AddProject(ctx, project.Project{
+ if err := root.AddProject(project.Project{
Name: "test",
Path: "test",
Remote: root.Projects["test"],
}); err != nil {
t.Fatalf("%v", err)
}
- if err := root.UpdateUniverse(ctx, false); err != nil {
+ if err := root.UpdateUniverse(false); err != nil {
t.Fatalf("%v", err)
}
var config *util.Config
@@ -186,11 +188,11 @@
}
defer os.Setenv("JIRI_ROOT", oldRoot)
- if err := profiles.Write(ctx, filepath.Join(root.Dir, "profiles-manifest")); err != nil {
+ if err := profiles.Write(root.X, filepath.Join(root.Dir, "profiles-manifest")); err != nil {
t.Fatal(err)
}
- if err := util.SaveConfig(ctx, config); err != nil {
+ if err := util.SaveConfig(root.X, config); err != nil {
t.Fatalf("%v", err)
}
@@ -200,7 +202,7 @@
t.Fatalf("%v", err)
}
- ch, err := profiles.NewConfigHelper(ctx, profiles.UseProfiles, filepath.Join(jiriRoot, "profiles-manifest"))
+ ch, err := profiles.NewConfigHelper(root.X, profiles.UseProfiles, filepath.Join(jiriRoot, "profiles-manifest"))
if err != nil {
t.Fatal(err)
}
@@ -213,7 +215,7 @@
case "VDLPATH":
// Make a fake src directory.
want = filepath.Join(jiriRoot, "test", "src")
- if err := ctx.Run().MkdirAll(want, 0755); err != nil {
+ if err := root.X.Run().MkdirAll(want, 0755); err != nil {
t.Fatalf("%v", err)
}
want = "VDLPATH=" + want
diff --git a/profiles/manager.go b/profiles/manager.go
index 4f60cfb..65635ed 100644
--- a/profiles/manager.go
+++ b/profiles/manager.go
@@ -41,7 +41,7 @@
"strings"
"sync"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
"v.io/x/lib/envvar"
)
@@ -177,9 +177,9 @@
// is its name and version.
String() string
// Install installs the profile for the specified build target.
- Install(ctx *tool.Context, root RelativePath, target Target) error
+ Install(jirix *jiri.X, root RelativePath, target Target) error
// Uninstall uninstalls the profile for the specified build target. When
// the last target for any given profile is uninstalled, then the profile
// itself (i.e. the source code) will be uninstalled.
- Uninstall(ctx *tool.Context, root RelativePath, target Target) error
+ Uninstall(jirix *jiri.X, root RelativePath, target Target) error
}
diff --git a/profiles/manager_test.go b/profiles/manager_test.go
index 5e83747..b613330 100644
--- a/profiles/manager_test.go
+++ b/profiles/manager_test.go
@@ -11,6 +11,7 @@
"path/filepath"
"testing"
+ "v.io/jiri/jiri"
"v.io/jiri/profiles"
"v.io/jiri/tool"
)
@@ -81,13 +82,13 @@
func (p *myNewProfile) AddFlags(*flag.FlagSet, profiles.Action) {
}
-func (p *myNewProfile) Install(ctx *tool.Context, root profiles.RelativePath, target profiles.Target) error {
+func (p *myNewProfile) Install(jirix *jiri.X, root profiles.RelativePath, target profiles.Target) error {
p.status = "installed"
profiles.AddProfileTarget(p.name, target)
return nil
}
-func (p *myNewProfile) Uninstall(ctx *tool.Context, root profiles.RelativePath, target profiles.Target) error {
+func (p *myNewProfile) Uninstall(jirix *jiri.X, root profiles.RelativePath, target profiles.Target) error {
profiles.RemoveProfileTarget(p.name, target)
if profiles.LookupProfile(p.name) == nil {
p.status = "uninstalled"
@@ -113,9 +114,9 @@
panic("manager not found for: " + myProfile)
}
- ctx := tool.NewDefaultContext()
+ jirix := &jiri.X{Context: tool.NewDefaultContext()}
// Install myNewProfile for target.
- if err := mgr.Install(ctx, rootPath, target); err != nil {
+ if err := mgr.Install(jirix, rootPath, target); err != nil {
panic("failed to find manager for: " + myProfile)
}
@@ -124,7 +125,7 @@
filename := tmpFile()
defer os.RemoveAll(filepath.Dir(filename))
- if err := profiles.Write(ctx, filename); err != nil {
+ if err := profiles.Write(jirix, filename); err != nil {
panic(err)
}
@@ -133,7 +134,7 @@
profiles.Clear()
// Read the profile manifest.
- profiles.Read(ctx, filename)
+ profiles.Read(jirix, filename)
mgr = profiles.LookupManager(myProfile)
if mgr == nil {
@@ -141,7 +142,7 @@
}
fmt.Println(mgr.String())
- mgr.Uninstall(ctx, rootPath, target)
+ mgr.Uninstall(jirix, rootPath, target)
fmt.Println(mgr.String())
fmt.Println(mgr.VersionInfo().Supported())
fmt.Println(mgr.VersionInfo().Default())
diff --git a/profiles/manifest.go b/profiles/manifest.go
index cb1c505..02395ab 100644
--- a/profiles/manifest.go
+++ b/profiles/manifest.go
@@ -12,7 +12,7 @@
"sync"
"time"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
)
const (
@@ -145,14 +145,14 @@
// Read reads the specified manifest file to obtain the current set of
// installed profiles.
-func Read(ctx *tool.Context, filename string) error {
- return db.read(ctx, filename)
+func Read(jirix *jiri.X, filename string) error {
+ return db.read(jirix, filename)
}
// Write writes the current set of installed profiles to the specified manifest
// file.
-func Write(ctx *tool.Context, filename string) error {
- return db.write(ctx, filename)
+func Write(jirix *jiri.X, filename string) error {
+ return db.write(jirix, filename)
}
func (pdb *profileDB) installProfile(name, root string) {
@@ -237,15 +237,15 @@
return pdb.db[name]
}
-func (pdb *profileDB) read(ctx *tool.Context, filename string) error {
+func (pdb *profileDB) read(jirix *jiri.X, filename string) error {
pdb.Lock()
defer pdb.Unlock()
pdb.db = make(map[string]*Profile)
- data, err := ctx.Run().ReadFile(filename)
+ data, err := jirix.Run().ReadFile(filename)
if err != nil {
if os.IsNotExist(err) {
- fmt.Fprintf(ctx.Stderr(), "WARNING: %v doesn't exist\n", filename)
+ fmt.Fprintf(jirix.Stderr(), "WARNING: %v doesn't exist\n", filename)
return nil
}
return err
@@ -278,7 +278,7 @@
return nil
}
-func (pdb *profileDB) write(ctx *tool.Context, filename string) error {
+func (pdb *profileDB) write(jirix *jiri.X, filename string) error {
pdb.Lock()
defer pdb.Unlock()
@@ -318,17 +318,17 @@
oldName := filename + ".prev"
newName := filename + fmt.Sprintf(".%d", time.Now().UnixNano())
- if err := ctx.Run().WriteFile(newName, data, defaultFileMode); err != nil {
+ if err := jirix.Run().WriteFile(newName, data, defaultFileMode); err != nil {
return err
}
- if ctx.Run().FileExists(filename) {
- if err := ctx.Run().Rename(filename, oldName); err != nil {
+ if jirix.Run().FileExists(filename) {
+ if err := jirix.Run().Rename(filename, oldName); err != nil {
return err
}
}
- if err := ctx.Run().Rename(newName, filename); err != nil {
+ if err := jirix.Run().Rename(newName, filename); err != nil {
return err
}
diff --git a/profiles/manifest_test.go b/profiles/manifest_test.go
index aa6ef33..99a2a86 100644
--- a/profiles/manifest_test.go
+++ b/profiles/manifest_test.go
@@ -15,6 +15,7 @@
"strings"
"testing"
+ "v.io/jiri/jiri"
"v.io/jiri/profiles"
"v.io/jiri/project"
"v.io/jiri/tool"
@@ -55,21 +56,21 @@
profiles.Clear()
filename := tmpFile()
defer os.RemoveAll(filepath.Dir(filename))
- ctx := tool.NewDefaultContext()
+ jirix := &jiri.X{Context: tool.NewDefaultContext()}
// test for no version being set.
t1, _ := profiles.NewTargetWithEnv("cpu1-os1", "A=B,C=D")
if err := profiles.AddProfileTarget("b", t1); err != nil {
t.Fatal(err)
}
- if err := profiles.Write(ctx, filename); err == nil || !strings.HasPrefix(err.Error(), "missing version for profile") {
+ if err := profiles.Write(jirix, filename); err == nil || !strings.HasPrefix(err.Error(), "missing version for profile") {
t.Fatalf("was expecing a missing version error, but got %v", err)
}
profiles.RemoveProfileTarget("b", t1)
addProfileAndTargets(t, "b")
addProfileAndTargets(t, "a")
- if err := profiles.Write(ctx, filename); err != nil {
+ if err := profiles.Write(jirix, filename); err != nil {
t.Fatal(err)
}
@@ -82,8 +83,8 @@
func TestRead(t *testing.T) {
profiles.Clear()
- ctx := tool.NewDefaultContext()
- if err := profiles.Read(ctx, "./testdata/m1.xml"); err != nil {
+ jirix := &jiri.X{Context: tool.NewDefaultContext()}
+ if err := profiles.Read(jirix, "./testdata/m1.xml"); err != nil {
t.Fatal(err)
}
@@ -135,8 +136,8 @@
return db
}
- ctx := tool.NewDefaultContext()
- if err := profiles.Read(ctx, "./testdata/legacy.xml"); err != nil {
+ jirix := &jiri.X{Context: tool.NewDefaultContext()}
+ if err := profiles.Read(jirix, "./testdata/legacy.xml"); err != nil {
t.Fatal(err)
}
@@ -155,11 +156,11 @@
t1.Set("cpu-os@1")
profiles.AddProfileTarget("__first", t1)
- if err := profiles.Write(ctx, filename); err != nil {
+ if err := profiles.Write(jirix, filename); err != nil {
t.Fatal(err)
}
- if err := profiles.Read(ctx, filename); err != nil {
+ if err := profiles.Read(jirix, filename); err != nil {
t.Fatal(err)
}
@@ -191,11 +192,11 @@
}
func TestReadingV3AndV4(t *testing.T) {
- ctx := tool.NewDefaultContext()
root, err := project.JiriRoot()
if err != nil {
t.Fatal(err)
}
+ jirix := &jiri.X{Context: tool.NewDefaultContext(), Root: root}
for i, c := range []struct {
filename, prefix, variable string
version profiles.Version
@@ -203,7 +204,7 @@
{"v3.xml", "", "", profiles.V3},
{"v4.xml", root, "${JIRI_ROOT}", profiles.V4},
} {
- ch, err := profiles.NewConfigHelper(ctx, profiles.UseProfiles, filepath.Join("testdata", c.filename))
+ ch, err := profiles.NewConfigHelper(jirix, profiles.UseProfiles, filepath.Join("testdata", c.filename))
if err != nil {
t.Fatal(err)
}
diff --git a/profiles/util.go b/profiles/util.go
index f12d3c1..170f897 100644
--- a/profiles/util.go
+++ b/profiles/util.go
@@ -16,6 +16,7 @@
"runtime"
"strings"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/runutil"
"v.io/jiri/tool"
@@ -95,10 +96,10 @@
// are not successfully logged therein after deleting the entire contents of the
// dir parameter. Consequently it does not make sense to apply AtomicAction to
// the same directory in sequence.
-func AtomicAction(ctx *tool.Context, installFn func() error, dir, message string) error {
+func AtomicAction(jirix *jiri.X, installFn func() error, dir, message string) error {
atomicFn := func() error {
completionLogPath := filepath.Join(dir, ".complete")
- s := ctx.NewSeq()
+ s := jirix.NewSeq()
if dir != "" {
if exists, _ := s.DirectoryExists(dir); exists {
// If the dir exists but the completionLogPath doesn't, then it
@@ -107,8 +108,8 @@
if exists, _ := s.FileExists(completionLogPath); !exists {
s.RemoveAll(dir).Done()
} else {
- if ctx.Verbose() {
- fmt.Fprintf(ctx.Stdout(), "AtomicAction: %s already completed in %s\n", message, dir)
+ if jirix.Verbose() {
+ fmt.Fprintf(jirix.Stdout(), "AtomicAction: %s already completed in %s\n", message, dir)
}
return nil
}
@@ -122,14 +123,14 @@
}
return s.WriteFile(completionLogPath, []byte("completed"), DefaultFilePerm).Done()
}
- return ctx.NewSeq().Call(atomicFn, message).Done()
+ return jirix.NewSeq().Call(atomicFn, message).Done()
}
-func brewList(ctx *tool.Context) (map[string]bool, error) {
+func brewList(jirix *jiri.X) (map[string]bool, error) {
var out bytes.Buffer
- err := ctx.NewSeq().Capture(&out, &out).Last("brew", "list")
+ err := jirix.NewSeq().Capture(&out, &out).Last("brew", "list")
if err != nil || tool.VerboseFlag {
- fmt.Fprintf(ctx.Stdout(), "%s", out.String())
+ fmt.Fprintf(jirix.Stdout(), "%s", out.String())
}
scanner := bufio.NewScanner(&out)
pkgs := map[string]bool{}
@@ -141,14 +142,14 @@
// InstallPackages identifies the packages that need to be installed
// and installs them using the OS-specific package manager.
-func InstallPackages(ctx *tool.Context, pkgs []string) error {
+func InstallPackages(jirix *jiri.X, pkgs []string) error {
installDepsFn := func() error {
- s := ctx.NewSeq()
+ s := jirix.NewSeq()
switch runtime.GOOS {
case "linux":
if runutil.IsFNLHost() {
- fmt.Fprintf(ctx.Stdout(), "skipping installation of %v on FNL host", pkgs)
- fmt.Fprintf(ctx.Stdout(), "success\n")
+ fmt.Fprintf(jirix.Stdout(), "skipping installation of %v on FNL host", pkgs)
+ fmt.Fprintf(jirix.Stdout(), "success\n")
break
}
installPkgs := []string{}
@@ -159,16 +160,16 @@
}
if len(installPkgs) > 0 {
args := append([]string{"apt-get", "install", "-y"}, installPkgs...)
- fmt.Fprintf(ctx.Stdout(), "Running: sudo %s: ", strings.Join(args, " "))
+ fmt.Fprintf(jirix.Stdout(), "Running: sudo %s: ", strings.Join(args, " "))
if err := s.Last("sudo", args...); err != nil {
- fmt.Fprintf(ctx.Stdout(), "%v\n", err)
+ fmt.Fprintf(jirix.Stdout(), "%v\n", err)
return err
}
- fmt.Fprintf(ctx.Stdout(), "success\n")
+ fmt.Fprintf(jirix.Stdout(), "success\n")
}
case "darwin":
installPkgs := []string{}
- installedPkgs, err := brewList(ctx)
+ installedPkgs, err := brewList(jirix)
if err != nil {
return err
}
@@ -179,22 +180,22 @@
}
if len(installPkgs) > 0 {
args := append([]string{"install"}, installPkgs...)
- fmt.Fprintf(ctx.Stdout(), "Running: brew %s: ", strings.Join(args, " "))
+ fmt.Fprintf(jirix.Stdout(), "Running: brew %s: ", strings.Join(args, " "))
if err := s.Last("brew", args...); err != nil {
- fmt.Fprintf(ctx.Stdout(), "%v\n", err)
+ fmt.Fprintf(jirix.Stdout(), "%v\n", err)
return err
}
- fmt.Fprintf(ctx.Stdout(), "success\n")
+ fmt.Fprintf(jirix.Stdout(), "success\n")
}
}
return nil
}
- return ctx.NewSeq().Call(installDepsFn, "Install dependencies").Done()
+ return jirix.NewSeq().Call(installDepsFn, "Install dependencies").Done()
}
// ensureAction ensures that the requested profile and target
// is installed/uninstalled, installing/uninstalling it if only if necessary.
-func ensureAction(ctx *tool.Context, action Action, profile string, root RelativePath, target Target) error {
+func ensureAction(jirix *jiri.X, action Action, profile string, root RelativePath, target Target) error {
verb := ""
switch action {
case Install:
@@ -205,8 +206,8 @@
return fmt.Errorf("unrecognised action %v", action)
}
if t := LookupProfileTarget(profile, target); t != nil {
- if ctx.Verbose() {
- fmt.Fprintf(ctx.Stdout(), "%v %v is already %sed as %v\n", profile, target, verb, t)
+ if jirix.Verbose() {
+ fmt.Fprintf(jirix.Stdout(), "%v %v is already %sed as %v\n", profile, target, verb, t)
}
return nil
}
@@ -219,32 +220,32 @@
return err
}
target.SetVersion(version)
- if ctx.Verbose() || ctx.DryRun() {
- fmt.Fprintf(ctx.Stdout(), "%s %s %s\n", verb, profile, target.DebugString())
+ if jirix.Verbose() || jirix.DryRun() {
+ fmt.Fprintf(jirix.Stdout(), "%s %s %s\n", verb, profile, target.DebugString())
}
if action == Install {
- return mgr.Install(ctx, root, target)
+ return mgr.Install(jirix, root, target)
}
- return mgr.Uninstall(ctx, root, target)
+ return mgr.Uninstall(jirix, root, target)
}
// EnsureProfileTargetIsInstalled ensures that the requested profile and target
// is installed, installing it if only if necessary.
-func EnsureProfileTargetIsInstalled(ctx *tool.Context, profile string, root RelativePath, target Target) error {
- return ensureAction(ctx, Install, profile, root, target)
+func EnsureProfileTargetIsInstalled(jirix *jiri.X, profile string, root RelativePath, target Target) error {
+ return ensureAction(jirix, Install, profile, root, target)
}
// EnsureProfileTargetIsUninstalled ensures that the requested profile and target
// are no longer installed.
-func EnsureProfileTargetIsUninstalled(ctx *tool.Context, profile string, root RelativePath, target Target) error {
- return ensureAction(ctx, Uninstall, profile, root, target)
+func EnsureProfileTargetIsUninstalled(jirix *jiri.X, profile string, root RelativePath, target Target) error {
+ return ensureAction(jirix, Uninstall, profile, root, target)
}
// Fetch downloads the specified url and saves it to dst.
// TODO(nlacasse, cnicoloau): Move this to a package for profile-implementors
// so it does not pollute the profile package namespace.
-func Fetch(ctx *tool.Context, dst, url string) error {
- s := ctx.NewSeq()
+func Fetch(jirix *jiri.X, dst, url string) error {
+ s := jirix.NewSeq()
s.Output([]string{"fetching " + url})
resp, err := http.Get(url)
if err != nil {
@@ -265,7 +266,7 @@
// Unzip unzips the file in srcFile and puts resulting files in directory dstDir.
// TODO(nlacasse, cnicoloau): Move this to a package for profile-implementors
// so it does not pollute the profile package namespace.
-func Unzip(ctx *tool.Context, srcFile, dstDir string) error {
+func Unzip(jirix *jiri.X, srcFile, dstDir string) error {
r, err := zip.OpenReader(srcFile)
if err != nil {
return err
@@ -279,7 +280,7 @@
}
defer rc.Close()
- s := ctx.NewSeq()
+ s := jirix.NewSeq()
fileDst := filepath.Join(dstDir, zFile.Name)
if zFile.FileInfo().IsDir() {
return s.MkdirAll(fileDst, zFile.Mode()).Done()
@@ -299,7 +300,7 @@
_, err = s.Copy(file, rc)
return err
}
- s := ctx.NewSeq()
+ s := jirix.NewSeq()
s.Output([]string{"unzipping " + srcFile})
for _, zFile := range r.File {
s.Output([]string{"extracting " + zFile.Name})
diff --git a/project.go b/project.go
index ac11219..f59871a 100644
--- a/project.go
+++ b/project.go
@@ -12,6 +12,7 @@
"sort"
"strings"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/tool"
"v.io/jiri/util"
@@ -48,7 +49,7 @@
// cmdProjectClean represents the "jiri project clean" command.
var cmdProjectClean = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runProjectClean),
+ Runner: jiri.RunnerFunc(runProjectClean),
Name: "clean",
Short: "Restore jiri projects to their pristine state",
Long: "Restore jiri projects back to their master branches and get rid of all the local branches and changes.",
@@ -56,9 +57,8 @@
ArgsLong: "<project ...> is a list of projects to clean up.",
}
-func runProjectClean(env *cmdline.Env, args []string) (e error) {
- ctx := tool.NewContextFromEnv(env)
- localProjects, err := project.LocalProjects(ctx, project.FullScan)
+func runProjectClean(jirix *jiri.X, args []string) (e error) {
+ localProjects, err := project.LocalProjects(jirix, project.FullScan)
if err != nil {
return err
}
@@ -68,13 +68,13 @@
if p, ok := localProjects[arg]; ok {
projects[p.Name] = p
} else {
- fmt.Fprintf(ctx.Stderr(), "Local project %q not found.\n", p.Name)
+ fmt.Fprintf(jirix.Stderr(), "Local project %q not found.\n", p.Name)
}
}
} else {
projects = localProjects
}
- if err := project.CleanupProjects(ctx, projects, cleanupBranchesFlag); err != nil {
+ if err := project.CleanupProjects(jirix, projects, cleanupBranchesFlag); err != nil {
return err
}
return nil
@@ -82,16 +82,15 @@
// cmdProjectList represents the "jiri project list" command.
var cmdProjectList = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runProjectList),
+ Runner: jiri.RunnerFunc(runProjectList),
Name: "list",
Short: "List existing jiri projects and branches",
Long: "Inspect the local filesystem and list the existing projects and branches.",
}
// runProjectList generates a listing of local projects.
-func runProjectList(env *cmdline.Env, _ []string) error {
- ctx := tool.NewContextFromEnv(env)
- states, err := project.GetProjectStates(ctx, noPristineFlag)
+func runProjectList(jirix *jiri.X, _ []string) error {
+ states, err := project.GetProjectStates(jirix, noPristineFlag)
if err != nil {
return err
}
@@ -109,7 +108,7 @@
continue
}
}
- fmt.Fprintf(ctx.Stdout(), "project=%q path=%q\n", path.Base(name), state.Project.Path)
+ fmt.Fprintf(jirix.Stdout(), "project=%q path=%q\n", path.Base(name), state.Project.Path)
if branchesFlag {
for _, branch := range state.Branches {
s := " "
@@ -120,7 +119,7 @@
if branch.HasGerritMessage {
s += " (exported to gerrit)"
}
- fmt.Fprintf(ctx.Stdout(), "%v\n", s)
+ fmt.Fprintf(jirix.Stdout(), "%v\n", s)
}
}
}
@@ -129,7 +128,7 @@
// cmdProjectShellPrompt represents the "jiri project shell-prompt" command.
var cmdProjectShellPrompt = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runProjectShellPrompt),
+ Runner: jiri.RunnerFunc(runProjectShellPrompt),
Name: "shell-prompt",
Short: "Print a succinct status of projects suitable for shell prompts",
Long: `
@@ -140,10 +139,8 @@
`,
}
-func runProjectShellPrompt(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
-
- states, err := project.GetProjectStates(ctx, checkDirtyFlag)
+func runProjectShellPrompt(jirix *jiri.X, args []string) error {
+ states, err := project.GetProjectStates(jirix, checkDirtyFlag)
if err != nil {
return err
}
@@ -154,7 +151,7 @@
sort.Strings(names)
// Get the name of the current project.
- currentProjectName, err := project.CurrentProjectName(ctx)
+ currentProjectName, err := project.CurrentProjectName(jirix)
if err != nil {
return err
}
@@ -194,7 +191,7 @@
// cmdProjectPoll represents the "jiri project poll" command.
var cmdProjectPoll = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runProjectPoll),
+ Runner: jiri.RunnerFunc(runProjectPoll),
Name: "poll",
Short: "Poll existing jiri projects",
Long: `
@@ -208,11 +205,10 @@
// runProjectPoll generates a description of changes that exist
// remotely but do not exist locally.
-func runProjectPoll(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
+func runProjectPoll(jirix *jiri.X, args []string) error {
projectSet := map[string]struct{}{}
if len(args) > 0 {
- config, err := util.LoadConfig(ctx)
+ config, err := util.LoadConfig(jirix)
if err != nil {
return err
}
@@ -232,7 +228,7 @@
set.String.Union(projectSet, set.String.FromSlice(projects))
}
}
- update, err := project.PollProjects(ctx, projectSet)
+ update, err := project.PollProjects(jirix, projectSet)
if err != nil {
return err
}
@@ -250,7 +246,7 @@
if err != nil {
return fmt.Errorf("MarshalIndent() failed: %v", err)
}
- fmt.Fprintf(env.Stdout, "%s\n", bytes)
+ fmt.Fprintf(jirix.Stdout(), "%s\n", bytes)
}
return nil
}
diff --git a/project/fake.go b/project/fake.go
index 5e1e125..fcbf5c7 100644
--- a/project/fake.go
+++ b/project/fake.go
@@ -11,10 +11,12 @@
"path/filepath"
"v.io/jiri/collect"
+ "v.io/jiri/jiri"
"v.io/jiri/tool"
)
type FakeJiriRoot struct {
+ X *jiri.X
Dir string
Projects map[string]string
remote string
@@ -29,47 +31,48 @@
)
// NewFakeJiriRoot is the FakeJiriRoot factory.
-func NewFakeJiriRoot(ctx *tool.Context) (*FakeJiriRoot, error) {
+func NewFakeJiriRoot() (*FakeJiriRoot, error) {
+ // Create a fake JIRI_ROOT.
+ ctx := tool.NewDefaultContext()
+ rootDir, err := ctx.Run().TempDir("", "")
+ if err != nil {
+ return nil, err
+ }
+ jirix := &jiri.X{Context: ctx, Root: rootDir}
root := &FakeJiriRoot{
+ X: jirix,
+ Dir: rootDir,
Projects: map[string]string{},
}
// Create fake remote manifest and tools projects.
- remoteDir, err := ctx.Run().TempDir("", "")
+ remoteDir, err := jirix.Run().TempDir("", "")
if err != nil {
return nil, err
}
doCleanup := true
defer func() {
if doCleanup {
- root.Cleanup(ctx)
+ root.Cleanup()
}
}()
-
root.remote = remoteDir
- if err := root.CreateRemoteProject(ctx, manifestProject); err != nil {
+ if err := root.CreateRemoteProject(manifestProject); err != nil {
return nil, err
}
- if err := root.CreateRemoteProject(ctx, toolsProject); err != nil {
+ if err := root.CreateRemoteProject(toolsProject); err != nil {
return nil, err
}
// Create a fake manifest.
manifestDir := filepath.Join(remoteDir, manifestProject, manifestVersion)
- if err := ctx.Run().MkdirAll(manifestDir, os.FileMode(0700)); err != nil {
+ if err := jirix.Run().MkdirAll(manifestDir, os.FileMode(0700)); err != nil {
return nil, err
}
- if err := root.WriteRemoteManifest(ctx, &Manifest{}); err != nil {
+ if err := root.WriteRemoteManifest(&Manifest{}); err != nil {
return nil, err
}
-
- // Create a fake JIRI_ROOT.
- rootDir, err := ctx.Run().TempDir("", "")
- if err != nil {
- return nil, err
- }
- root.Dir = rootDir
- if err := ctx.Git().Clone(root.Projects[manifestProject], filepath.Join(root.Dir, manifestProject)); err != nil {
+ if err := jirix.Git().Clone(root.Projects[manifestProject], filepath.Join(root.Dir, manifestProject)); err != nil {
return nil, err
}
@@ -77,14 +80,14 @@
// manifests. This is necessary to make sure that the commonly
// invoked DataDirPath() function, which uses the "jiri" tool
// configuration for its default, works.
- if err := root.AddProject(ctx, Project{
+ if err := root.AddProject(Project{
Name: toolsProject,
Path: toolsProject,
Remote: root.Projects[toolsProject],
}); err != nil {
return nil, err
}
- if err := root.AddTool(ctx, Tool{
+ if err := root.AddTool(Tool{
Name: "jiri",
Data: defaultDataDir,
Project: toolsProject,
@@ -94,13 +97,13 @@
// Add "gerrit" and "git" hosts to the manifest, as required by the "jiri"
// tool.
- if err := root.AddHost(ctx, Host{
+ if err := root.AddHost(Host{
Name: "gerrit",
Location: "git://example.com/gerrit",
}); err != nil {
return nil, err
}
- if err := root.AddHost(ctx, Host{
+ if err := root.AddHost(Host{
Name: "git",
Location: "git://example.com/git",
}); err != nil {
@@ -109,7 +112,7 @@
// Update the contents of the fake JIRI_ROOT instance based on
// the information recorded in the remote manifest.
- if err := root.UpdateUniverse(ctx, false); err != nil {
+ if err := root.UpdateUniverse(false); err != nil {
return nil, err
}
@@ -118,15 +121,15 @@
}
// Cleanup cleans up the given Vanadium root fake.
-func (root FakeJiriRoot) Cleanup(ctx *tool.Context) error {
+func (root FakeJiriRoot) Cleanup() error {
var errs []error
collect.Errors(func() error {
if root.Dir == "" {
return nil
}
- return ctx.Run().RemoveAll(root.Dir)
+ return root.X.Run().RemoveAll(root.Dir)
}, &errs)
- collect.Errors(func() error { return ctx.Run().RemoveAll(root.remote) }, &errs)
+ collect.Errors(func() error { return root.X.Run().RemoveAll(root.remote) }, &errs)
if len(errs) != 0 {
return fmt.Errorf("Cleanup() failed: %v", errs)
}
@@ -134,39 +137,39 @@
}
// AddHost adds the given host to a remote manifest.
-func (root FakeJiriRoot) AddHost(ctx *tool.Context, host Host) error {
- manifest, err := root.ReadRemoteManifest(ctx)
+func (root FakeJiriRoot) AddHost(host Host) error {
+ manifest, err := root.ReadRemoteManifest()
if err != nil {
return err
}
manifest.Hosts = append(manifest.Hosts, host)
- if err := root.WriteRemoteManifest(ctx, manifest); err != nil {
+ if err := root.WriteRemoteManifest(manifest); err != nil {
return err
}
return nil
}
// AddProject adds the given project to a remote manifest.
-func (root FakeJiriRoot) AddProject(ctx *tool.Context, project Project) error {
- manifest, err := root.ReadRemoteManifest(ctx)
+func (root FakeJiriRoot) AddProject(project Project) error {
+ manifest, err := root.ReadRemoteManifest()
if err != nil {
return err
}
manifest.Projects = append(manifest.Projects, project)
- if err := root.WriteRemoteManifest(ctx, manifest); err != nil {
+ if err := root.WriteRemoteManifest(manifest); err != nil {
return err
}
return nil
}
// AddTool adds the given tool to a remote manifest.
-func (root FakeJiriRoot) AddTool(ctx *tool.Context, tool Tool) error {
- manifest, err := root.ReadRemoteManifest(ctx)
+func (root FakeJiriRoot) AddTool(tool Tool) error {
+ manifest, err := root.ReadRemoteManifest()
if err != nil {
return err
}
manifest.Tools = append(manifest.Tools, tool)
- if err := root.WriteRemoteManifest(ctx, manifest); err != nil {
+ if err := root.WriteRemoteManifest(manifest); err != nil {
return err
}
return nil
@@ -174,9 +177,9 @@
// DisableRemoteManifestPush disables pushes to the remote manifest
// repository.
-func (root FakeJiriRoot) DisableRemoteManifestPush(ctx *tool.Context) error {
+func (root FakeJiriRoot) DisableRemoteManifestPush() error {
dir := tool.RootDirOpt(filepath.Join(root.remote, manifestProject))
- if err := ctx.Git(dir).CheckoutBranch("master"); err != nil {
+ if err := root.X.Git(dir).CheckoutBranch("master"); err != nil {
return err
}
return nil
@@ -184,37 +187,37 @@
// EnableRemoteManifestPush enables pushes to the remote manifest
// repository.
-func (root FakeJiriRoot) EnableRemoteManifestPush(ctx *tool.Context) error {
+func (root FakeJiriRoot) EnableRemoteManifestPush() error {
dir := tool.RootDirOpt(filepath.Join(root.remote, manifestProject))
- if !ctx.Git(dir).BranchExists("non-master") {
- if err := ctx.Git(dir).CreateBranch("non-master"); err != nil {
+ if !root.X.Git(dir).BranchExists("non-master") {
+ if err := root.X.Git(dir).CreateBranch("non-master"); err != nil {
return err
}
}
- if err := ctx.Git(dir).CheckoutBranch("non-master"); err != nil {
+ if err := root.X.Git(dir).CheckoutBranch("non-master"); err != nil {
return err
}
return nil
}
// CreateRemoteProject creates a new remote project.
-func (root FakeJiriRoot) CreateRemoteProject(ctx *tool.Context, name string) error {
+func (root FakeJiriRoot) CreateRemoteProject(name string) error {
projectDir := filepath.Join(root.remote, name)
- if err := ctx.Run().MkdirAll(projectDir, os.FileMode(0700)); err != nil {
+ if err := root.X.Run().MkdirAll(projectDir, os.FileMode(0700)); err != nil {
return err
}
- if err := ctx.Git().Init(projectDir); err != nil {
+ if err := root.X.Git().Init(projectDir); err != nil {
return err
}
- if err := ctx.Git(tool.RootDirOpt(projectDir)).CommitWithMessage("initial commit"); err != nil {
+ if err := root.X.Git(tool.RootDirOpt(projectDir)).CommitWithMessage("initial commit"); err != nil {
return err
}
root.Projects[name] = projectDir
return nil
}
-func getManifest(ctx *tool.Context) string {
- manifest := ctx.Manifest()
+func getManifest(jirix *jiri.X) string {
+ manifest := jirix.Manifest()
if manifest != "" {
return manifest
}
@@ -222,19 +225,19 @@
}
// ReadLocalManifest read a manifest from the local manifest project.
-func (root FakeJiriRoot) ReadLocalManifest(ctx *tool.Context) (*Manifest, error) {
- path := filepath.Join(root.Dir, manifestProject, manifestVersion, getManifest(ctx))
- return root.readManifest(ctx, path)
+func (root FakeJiriRoot) ReadLocalManifest() (*Manifest, error) {
+ path := filepath.Join(root.Dir, manifestProject, manifestVersion, getManifest(root.X))
+ return root.readManifest(path)
}
// ReadRemoteManifest read a manifest from the remote manifest project.
-func (root FakeJiriRoot) ReadRemoteManifest(ctx *tool.Context) (*Manifest, error) {
- path := filepath.Join(root.remote, manifestProject, manifestVersion, getManifest(ctx))
- return root.readManifest(ctx, path)
+func (root FakeJiriRoot) ReadRemoteManifest() (*Manifest, error) {
+ path := filepath.Join(root.remote, manifestProject, manifestVersion, getManifest(root.X))
+ return root.readManifest(path)
}
-func (root FakeJiriRoot) readManifest(ctx *tool.Context, path string) (*Manifest, error) {
- bytes, err := ctx.Run().ReadFile(path)
+func (root FakeJiriRoot) readManifest(path string) (*Manifest, error) {
+ bytes, err := root.X.Run().ReadFile(path)
if err != nil {
return nil, err
}
@@ -247,13 +250,13 @@
// UpdateUniverse synchronizes the content of the Vanadium root based
// on the content of the remote manifest.
-func (root FakeJiriRoot) UpdateUniverse(ctx *tool.Context, gc bool) error {
+func (root FakeJiriRoot) UpdateUniverse(gc bool) error {
oldRoot := os.Getenv("JIRI_ROOT")
if err := os.Setenv("JIRI_ROOT", root.Dir); err != nil {
return fmt.Errorf("Setenv() failed: %v", err)
}
defer os.Setenv("JIRI_ROOT", oldRoot)
- if err := UpdateUniverse(ctx, gc); err != nil {
+ if err := UpdateUniverse(root.X, gc); err != nil {
return err
}
return nil
@@ -261,32 +264,32 @@
// WriteLocalManifest writes the given manifest to the local
// manifest project.
-func (root FakeJiriRoot) WriteLocalManifest(ctx *tool.Context, manifest *Manifest) error {
+func (root FakeJiriRoot) WriteLocalManifest(manifest *Manifest) error {
dir := filepath.Join(root.Dir, manifestProject)
- path := filepath.Join(dir, manifestVersion, getManifest(ctx))
- return root.writeManifest(ctx, manifest, dir, path)
+ path := filepath.Join(dir, manifestVersion, getManifest(root.X))
+ return root.writeManifest(manifest, dir, path)
}
// WriteRemoteManifest writes the given manifest to the remote
// manifest project.
-func (root FakeJiriRoot) WriteRemoteManifest(ctx *tool.Context, manifest *Manifest) error {
+func (root FakeJiriRoot) WriteRemoteManifest(manifest *Manifest) error {
dir := filepath.Join(root.remote, manifestProject)
- path := filepath.Join(dir, manifestVersion, getManifest(ctx))
- return root.writeManifest(ctx, manifest, dir, path)
+ path := filepath.Join(dir, manifestVersion, getManifest(root.X))
+ return root.writeManifest(manifest, dir, path)
}
-func (root FakeJiriRoot) writeManifest(ctx *tool.Context, manifest *Manifest, dir, path string) error {
+func (root FakeJiriRoot) writeManifest(manifest *Manifest, dir, path string) error {
bytes, err := xml.Marshal(manifest)
if err != nil {
return fmt.Errorf("Marshal(%v) failed: %v", manifest, err)
}
- if err := ctx.Run().WriteFile(path, bytes, os.FileMode(0600)); err != nil {
+ if err := root.X.Run().WriteFile(path, bytes, os.FileMode(0600)); err != nil {
return err
}
- if err := ctx.Git(tool.RootDirOpt(dir)).Add(path); err != nil {
+ if err := root.X.Git(tool.RootDirOpt(dir)).Add(path); err != nil {
return err
}
- if err := ctx.Git(tool.RootDirOpt(dir)).Commit(); err != nil {
+ if err := root.X.Git(tool.RootDirOpt(dir)).Commit(); err != nil {
return err
}
return nil
diff --git a/project/paths.go b/project/paths.go
index 45d874a..6586fe3 100644
--- a/project/paths.go
+++ b/project/paths.go
@@ -9,7 +9,7 @@
"os"
"path/filepath"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
)
const (
@@ -25,8 +25,8 @@
// uses DataDirPath, and the default tool name is "jiri", so nothing actually
// breaks. We should revisit the whole data directory thing, and in particular
// see if we can get rid of tools having to know their own names.
-func DataDirPath(ctx *tool.Context, toolName string) (string, error) {
- _, projects, tools, _, err := readManifest(ctx, false)
+func DataDirPath(jirix *jiri.X, toolName string) (string, error) {
+ _, projects, tools, _, err := readManifest(jirix, false)
if err != nil {
return "", err
}
@@ -121,8 +121,8 @@
return path, nil
}
-func getHost(ctx *tool.Context, name string) (string, error) {
- hosts, _, _, _, err := readManifest(ctx, false)
+func getHost(jirix *jiri.X, name string) (string, error) {
+ hosts, _, _, _, err := readManifest(jirix, false)
if err != nil {
return "", err
}
@@ -134,13 +134,13 @@
}
// GerritHost returns the URL that hosts the Gerrit code review system.
-func GerritHost(ctx *tool.Context) (string, error) {
- return getHost(ctx, "gerrit")
+func GerritHost(jirix *jiri.X) (string, error) {
+ return getHost(jirix, "gerrit")
}
// GitHost returns the URL that hosts the git repositories.
-func GitHost(ctx *tool.Context) (string, error) {
- return getHost(ctx, "git")
+func GitHost(jirix *jiri.X) (string, error) {
+ return getHost(jirix, "git")
}
// JiriRoot returns the root of the jiri universe.
diff --git a/project/project.go b/project/project.go
index ade8eb8..5fb7b6e 100644
--- a/project/project.go
+++ b/project/project.go
@@ -17,6 +17,7 @@
"v.io/jiri/collect"
"v.io/jiri/gitutil"
"v.io/jiri/googlesource"
+ "v.io/jiri/jiri"
"v.io/jiri/runutil"
"v.io/jiri/tool"
"v.io/x/lib/cmdline"
@@ -183,14 +184,14 @@
// CreateSnapshot creates a manifest that encodes the current state of
// master branches of all projects and writes this snapshot out to the
// given file.
-func CreateSnapshot(ctx *tool.Context, path string) error {
- ctx.TimerPush("create snapshot")
- defer ctx.TimerPop()
+func CreateSnapshot(jirix *jiri.X, path string) error {
+ jirix.TimerPush("create snapshot")
+ defer jirix.TimerPop()
manifest := Manifest{}
// Add all local projects to manifest.
- localProjects, err := LocalProjects(ctx, FullScan)
+ localProjects, err := LocalProjects(jirix, FullScan)
if err != nil {
return err
}
@@ -205,7 +206,7 @@
// Add all hosts, tools, and hooks from the current manifest to the
// snapshot manifest.
- hosts, _, tools, hooks, err := readManifest(ctx, true)
+ hosts, _, tools, hooks, err := readManifest(jirix, true)
if err != nil {
return err
}
@@ -220,7 +221,7 @@
}
perm := os.FileMode(0755)
- if err := ctx.Run().MkdirAll(filepath.Dir(path), perm); err != nil {
+ if err := jirix.Run().MkdirAll(filepath.Dir(path), perm); err != nil {
return err
}
data, err := xml.MarshalIndent(manifest, "", " ")
@@ -228,7 +229,7 @@
return fmt.Errorf("MarshalIndent(%v) failed: %v", manifest, err)
}
perm = os.FileMode(0644)
- if err := ctx.Run().WriteFile(path, data, perm); err != nil {
+ if err := jirix.Run().WriteFile(path, data, perm); err != nil {
return err
}
return nil
@@ -238,15 +239,15 @@
// CurrentManifest returns a manifest that identifies the result of
// the most recent "jiri update" invocation.
-func CurrentManifest(ctx *tool.Context) (*Manifest, error) {
+func CurrentManifest(jirix *jiri.X) (*Manifest, error) {
currentManifestPath, err := ToAbs(currentManifestFileName)
if err != nil {
return nil, err
}
- bytes, err := ctx.Run().ReadFile(currentManifestPath)
+ bytes, err := jirix.Run().ReadFile(currentManifestPath)
if err != nil {
if os.IsNotExist(err) {
- fmt.Fprintf(ctx.Stderr(), `WARNING: Could not find %s.
+ fmt.Fprintf(jirix.Stderr(), `WARNING: Could not find %s.
The contents of this file are stored as metadata in binaries the jiri
tool builds. To fix this problem, please run "jiri update".
`, currentManifestPath)
@@ -263,7 +264,7 @@
// writeCurrentManifest writes the given manifest to a file that
// stores the result of the most recent "jiri update" invocation.
-func writeCurrentManifest(ctx *tool.Context, manifest *Manifest) error {
+func writeCurrentManifest(jirix *jiri.X, manifest *Manifest) error {
currentManifestPath, err := ToAbs(currentManifestFileName)
if err != nil {
return err
@@ -272,7 +273,7 @@
if err != nil {
return fmt.Errorf("MarshalIndent(%v) failed: %v", manifest, err)
}
- if err := ctx.Run().WriteFile(currentManifestPath, bytes, os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(currentManifestPath, bytes, os.FileMode(0644)); err != nil {
return err
}
return nil
@@ -281,15 +282,15 @@
// CurrentProjectName gets the name of the current project from the
// current directory by reading the jiri project metadata located in a
// directory at the root of the current repository.
-func CurrentProjectName(ctx *tool.Context) (string, error) {
- topLevel, err := ctx.Git().TopLevel()
+func CurrentProjectName(jirix *jiri.X) (string, error) {
+ topLevel, err := jirix.Git().TopLevel()
if err != nil {
return "", nil
}
metadataDir := filepath.Join(topLevel, metadataDirName)
- if _, err := ctx.Run().Stat(metadataDir); err == nil {
+ if _, err := jirix.Run().Stat(metadataDir); err == nil {
metadataFile := filepath.Join(metadataDir, metadataFileName)
- bytes, err := ctx.Run().ReadFile(metadataFile)
+ bytes, err := jirix.Run().ReadFile(metadataFile)
if err != nil {
return "", err
}
@@ -304,20 +305,20 @@
// setProjectRevisions sets the current project revision from the master for
// each project as found on the filesystem
-func setProjectRevisions(ctx *tool.Context, projects Projects) (_ Projects, e error) {
+func setProjectRevisions(jirix *jiri.X, projects Projects) (_ Projects, e error) {
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
for name, project := range projects {
switch project.Protocol {
case "git":
- if err := ctx.Run().Chdir(project.Path); err != nil {
+ if err := jirix.Run().Chdir(project.Path); err != nil {
return nil, err
}
- revision, err := ctx.Git().CurrentRevisionOfBranch("master")
+ revision, err := jirix.Git().CurrentRevisionOfBranch("master")
if err != nil {
return nil, err
}
@@ -335,25 +336,25 @@
// projects in the manifest that exist locally will be returned. Otherwise, a
// full scan of the filesystem will take place, and all found projects will be
// returned.
-func LocalProjects(ctx *tool.Context, scanMode ScanMode) (Projects, error) {
- ctx.TimerPush("local projects")
- defer ctx.TimerPop()
+func LocalProjects(jirix *jiri.X, scanMode ScanMode) (Projects, error) {
+ jirix.TimerPush("local projects")
+ defer jirix.TimerPop()
projects := Projects{}
if scanMode == FastScan {
// Fast path: Full scan was not requested, and all projects in
// manifest exist on local filesystem. We just use the projects
// directly from the manifest.
- manifestProjects, _, err := ReadManifest(ctx)
+ manifestProjects, _, err := ReadManifest(jirix)
if err != nil {
return nil, err
}
- projectsExist, err := projectsExistLocally(ctx, manifestProjects)
+ projectsExist, err := projectsExistLocally(jirix, manifestProjects)
if err != nil {
return nil, err
}
if projectsExist {
- return setProjectRevisions(ctx, manifestProjects)
+ return setProjectRevisions(jirix, manifestProjects)
}
}
@@ -367,24 +368,24 @@
// Initial call to findLocalProjects -- it will recursively search all the
// directories under JiriRoot.
- ctx.TimerPush("scan fs")
- err = findLocalProjects(ctx, root, projects)
- ctx.TimerPop()
+ jirix.TimerPush("scan fs")
+ err = findLocalProjects(jirix, root, projects)
+ jirix.TimerPop()
if err != nil {
return nil, err
}
- return setProjectRevisions(ctx, projects)
+ return setProjectRevisions(jirix, projects)
}
// projectsExistLocally returns true iff all the given projects exist on the
// local filesystem.
// Note that this may return true even if there are projects on the local
// filesystem not included in the provided projects argument.
-func projectsExistLocally(ctx *tool.Context, projects Projects) (bool, error) {
- ctx.TimerPush("match manifest")
- defer ctx.TimerPop()
+func projectsExistLocally(jirix *jiri.X, projects Projects) (bool, error) {
+ jirix.TimerPush("match manifest")
+ defer jirix.TimerPop()
for _, p := range projects {
- isLocal, err := isLocalProject(ctx, p.Path)
+ isLocal, err := isLocalProject(jirix, p.Path)
if err != nil {
return false, err
}
@@ -398,23 +399,23 @@
// PollProjects returns the set of changelists that exist remotely but not
// locally. Changes are grouped by projects and contain author identification
// and a description of their content.
-func PollProjects(ctx *tool.Context, projectSet map[string]struct{}) (_ Update, e error) {
- ctx.TimerPush("poll projects")
- defer ctx.TimerPop()
+func PollProjects(jirix *jiri.X, projectSet map[string]struct{}) (_ Update, e error) {
+ jirix.TimerPush("poll projects")
+ defer jirix.TimerPop()
// Switch back to current working directory when we're done.
cwd, err := os.Getwd()
if err != nil {
return nil, err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
// Gather local & remote project data.
- localProjects, err := LocalProjects(ctx, FastScan)
+ localProjects, err := LocalProjects(jirix, FastScan)
if err != nil {
return nil, err
}
- _, remoteProjects, _, _, err := readManifest(ctx, false)
+ _, remoteProjects, _, _, err := readManifest(jirix, false)
if err != nil {
return nil, err
}
@@ -443,17 +444,17 @@
case "git":
// Enter project directory - this assumes absolute paths.
- if err := ctx.Run().Chdir(updateOp.destination); err != nil {
+ if err := jirix.Run().Chdir(updateOp.destination); err != nil {
return nil, err
}
// Fetch the latest from origin.
- if err := ctx.Git().FetchRefspec("origin", updateOp.project.RemoteBranch); err != nil {
+ if err := jirix.Git().FetchRefspec("origin", updateOp.project.RemoteBranch); err != nil {
return nil, err
}
// Collect commits visible from FETCH_HEAD that aren't visible from master.
- commitsText, err := ctx.Git().Log("FETCH_HEAD", "master", "%an%n%ae%n%B")
+ commitsText, err := jirix.Git().Log("FETCH_HEAD", "master", "%an%n%ae%n%B")
if err != nil {
return nil, err
}
@@ -480,8 +481,8 @@
// ReadManifest retrieves and parses the manifest that determines what
// projects and tools are part of the jiri universe.
-func ReadManifest(ctx *tool.Context) (Projects, Tools, error) {
- _, p, t, _, e := readManifest(ctx, false)
+func ReadManifest(jirix *jiri.X) (Projects, Tools, error) {
+ _, p, t, _, e := readManifest(jirix, false)
return p, t, e
}
@@ -490,11 +491,11 @@
// TODO(nlacasse,toddw): Once the manifest project is specified in the
// manifest, we should get the remote directly from the manifest, and not from
// the filesystem.
-func getManifestRemote(ctx *tool.Context, manifestPath string) (string, error) {
+func getManifestRemote(jirix *jiri.X, manifestPath string) (string, error) {
var remote string
- return remote, ctx.NewSeq().Pushd(manifestPath).Call(
+ return remote, jirix.NewSeq().Pushd(manifestPath).Call(
func() (e error) {
- remote, e = ctx.Git().RemoteUrl("origin")
+ remote, e = jirix.Git().RemoteUrl("origin")
return
}, "get manifest origin").Done()
}
@@ -502,15 +503,15 @@
// readManifest implements the ReadManifest logic and provides an
// optional flag that can be used to fetch the latest manifest updates
// from the manifest repository.
-func readManifest(ctx *tool.Context, update bool) (Hosts, Projects, Tools, Hooks, error) {
- ctx.TimerPush("read manifest")
- defer ctx.TimerPop()
+func readManifest(jirix *jiri.X, update bool) (Hosts, Projects, Tools, Hooks, error) {
+ jirix.TimerPush("read manifest")
+ defer jirix.TimerPop()
if update {
manifestPath, err := ToAbs(".manifest")
if err != nil {
return nil, nil, nil, nil, err
}
- manifestRemote, err := getManifestRemote(ctx, manifestPath)
+ manifestRemote, err := getManifestRemote(jirix, manifestPath)
if err != nil {
return nil, nil, nil, nil, err
}
@@ -521,16 +522,16 @@
Revision: "HEAD",
RemoteBranch: "master",
}
- if err := resetProject(ctx, project); err != nil {
+ if err := resetProject(jirix, project); err != nil {
return nil, nil, nil, nil, err
}
}
- path, err := ResolveManifestPath(ctx.Manifest())
+ path, err := ResolveManifestPath(jirix.Manifest())
if err != nil {
return nil, nil, nil, nil, err
}
hosts, projects, tools, hooks, stack := Hosts{}, Projects{}, Tools{}, Hooks{}, map[string]struct{}{}
- if err := loadManifest(ctx, path, hosts, projects, tools, hooks, stack); err != nil {
+ if err := loadManifest(jirix, path, hosts, projects, tools, hooks, stack); err != nil {
return nil, nil, nil, nil, err
}
return hosts, projects, tools, hooks, nil
@@ -540,74 +541,74 @@
// remote counterparts identified by the given manifest. Optionally,
// the 'gc' flag can be used to indicate that local projects that no
// longer exist remotely should be removed.
-func UpdateUniverse(ctx *tool.Context, gc bool) (e error) {
- ctx.TimerPush("update universe")
- defer ctx.TimerPop()
- _, remoteProjects, remoteTools, remoteHooks, err := readManifest(ctx, true)
+func UpdateUniverse(jirix *jiri.X, gc bool) (e error) {
+ jirix.TimerPush("update universe")
+ defer jirix.TimerPop()
+ _, remoteProjects, remoteTools, remoteHooks, err := readManifest(jirix, true)
if err != nil {
return err
}
// 1. Update all local projects to match their remote counterparts.
- if err := updateProjects(ctx, remoteProjects, gc); err != nil {
+ if err := updateProjects(jirix, remoteProjects, gc); err != nil {
return err
}
// 2. Build all tools in a temporary directory.
- tmpDir, err := ctx.Run().TempDir("", "tmp-jiri-tools-build")
+ tmpDir, err := jirix.Run().TempDir("", "tmp-jiri-tools-build")
if err != nil {
return fmt.Errorf("TempDir() failed: %v", err)
}
- defer collect.Error(func() error { return ctx.Run().RemoveAll(tmpDir) }, &e)
- if err := buildToolsFromMaster(ctx, remoteTools, tmpDir); err != nil {
+ defer collect.Error(func() error { return jirix.Run().RemoveAll(tmpDir) }, &e)
+ if err := buildToolsFromMaster(jirix, remoteTools, tmpDir); err != nil {
return err
}
// 3. Install the tools into $JIRI_ROOT/devtools/bin.
- if err := InstallTools(ctx, tmpDir); err != nil {
+ if err := InstallTools(jirix, tmpDir); err != nil {
return err
}
// 4. Run all specified hooks
- return runHooks(ctx, remoteHooks)
+ return runHooks(jirix, remoteHooks)
}
// ApplyToLocalMaster applies an operation expressed as the given function to
// the local master branch of the given projects.
-func ApplyToLocalMaster(ctx *tool.Context, projects Projects, fn func() error) (e error) {
+func ApplyToLocalMaster(jirix *jiri.X, projects Projects, fn func() error) (e error) {
cwd, err := os.Getwd()
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
// Loop through all projects, checking out master and stashing any unstaged
// changes.
for _, project := range projects {
p := project
- if err := ctx.Run().Chdir(p.Path); err != nil {
+ if err := jirix.Run().Chdir(p.Path); err != nil {
return err
}
switch p.Protocol {
case "git":
- branch, err := ctx.Git().CurrentBranchName()
+ branch, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
- stashed, err := ctx.Git().Stash()
+ stashed, err := jirix.Git().Stash()
if err != nil {
return err
}
- if err := ctx.Git().CheckoutBranch("master"); err != nil {
+ if err := jirix.Git().CheckoutBranch("master"); err != nil {
return err
}
// After running the function, return to this project's directory,
// checkout the original branch, and stash pop if necessary.
defer collect.Error(func() error {
- if err := ctx.Run().Chdir(p.Path); err != nil {
+ if err := jirix.Run().Chdir(p.Path); err != nil {
return err
}
- if err := ctx.Git().CheckoutBranch(branch); err != nil {
+ if err := jirix.Git().CheckoutBranch(branch); err != nil {
return err
}
if stashed {
- return ctx.Git().StashPop()
+ return jirix.Git().StashPop()
}
return nil
}, &e)
@@ -620,14 +621,14 @@
// BuildTools builds the given tools and places the resulting binaries into the
// given directory.
-func BuildTools(ctx *tool.Context, tools Tools, outputDir string) error {
- ctx.TimerPush("build tools")
- defer ctx.TimerPop()
+func BuildTools(jirix *jiri.X, tools Tools, outputDir string) error {
+ jirix.TimerPush("build tools")
+ defer jirix.TimerPop()
if len(tools) == 0 {
// Nothing to do here...
return nil
}
- projects, err := LocalProjects(ctx, FastScan)
+ projects, err := LocalProjects(jirix, FastScan)
if err != nil {
return err
}
@@ -664,7 +665,7 @@
workspaces = append(workspaces, strings.Split(envGoPath, string(filepath.ListSeparator))...)
}
var stderr bytes.Buffer
- opts := ctx.Run().Opts()
+ opts := jirix.Run().Opts()
// We unset GOARCH and GOOS because jiri update should always build for the
// native architecture and OS. Also, as of go1.5, setting GOBIN is not
// compatible with GOARCH or GOOS.
@@ -677,7 +678,7 @@
opts.Stdout = ioutil.Discard
opts.Stderr = &stderr
args := append([]string{"install"}, toolPkgs...)
- if err := ctx.Run().CommandWithOpts(opts, "go", args...); err != nil {
+ if err := jirix.Run().CommandWithOpts(opts, "go", args...); err != nil {
return fmt.Errorf("tool build failed\n%v", stderr.String())
}
return nil
@@ -687,8 +688,8 @@
// available in the local master branch of the tools repository. Notably, this
// function does not perform any version control operation on the master
// branch.
-func buildToolsFromMaster(ctx *tool.Context, tools Tools, outputDir string) error {
- localProjects, err := LocalProjects(ctx, FastScan)
+func buildToolsFromMaster(jirix *jiri.X, tools Tools, outputDir string) error {
+ localProjects, err := LocalProjects(jirix, FastScan)
if err != nil {
return err
}
@@ -714,16 +715,16 @@
}
updateFn := func() error {
- return ApplyToLocalMaster(ctx, toolProjects, func() error {
- return BuildTools(ctx, toolsToBuild, outputDir)
+ return ApplyToLocalMaster(jirix, toolProjects, func() error {
+ return BuildTools(jirix, toolsToBuild, outputDir)
})
}
// Always log the output of updateFn, irrespective of
// the value of the verbose flag.
opts := runutil.Opts{Verbose: true}
- if err := ctx.Run().FunctionWithOpts(opts, updateFn, "build tools: %v", strings.Join(toolNames, " ")); err != nil {
- fmt.Fprintf(ctx.Stderr(), "%v\n", err)
+ if err := jirix.Run().FunctionWithOpts(opts, updateFn, "build tools: %v", strings.Join(toolNames, " ")); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "%v\n", err)
failed = true
}
if failed {
@@ -735,18 +736,18 @@
// CleanupProjects restores the given jiri projects back to their master
// branches and gets rid of all the local changes. If "cleanupBranches" is
// true, it will also delete all the non-master branches.
-func CleanupProjects(ctx *tool.Context, projects Projects, cleanupBranches bool) (e error) {
+func CleanupProjects(jirix *jiri.X, projects Projects, cleanupBranches bool) (e error) {
wd, err := os.Getwd()
if err != nil {
return fmt.Errorf("Getwd() failed: %v", err)
}
- defer collect.Error(func() error { return ctx.Run().Chdir(wd) }, &e)
+ defer collect.Error(func() error { return jirix.Run().Chdir(wd) }, &e)
for _, project := range projects {
localProjectDir := project.Path
- if err := ctx.Run().Chdir(localProjectDir); err != nil {
+ if err := jirix.Run().Chdir(localProjectDir); err != nil {
return err
}
- if err := resetLocalProject(ctx, cleanupBranches, project.RemoteBranch); err != nil {
+ if err := resetLocalProject(jirix, cleanupBranches, project.RemoteBranch); err != nil {
return err
}
}
@@ -755,31 +756,31 @@
// resetLocalProject checks out the master branch, cleans up untracked files
// and uncommitted changes, and optionally deletes all the other branches.
-func resetLocalProject(ctx *tool.Context, cleanupBranches bool, remoteBranch string) error {
+func resetLocalProject(jirix *jiri.X, cleanupBranches bool, remoteBranch string) error {
// Check out master and clean up changes.
- curBranchName, err := ctx.Git().CurrentBranchName()
+ curBranchName, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
if curBranchName != "master" {
- if err := ctx.Git().CheckoutBranch("master", gitutil.ForceOpt(true)); err != nil {
+ if err := jirix.Git().CheckoutBranch("master", gitutil.ForceOpt(true)); err != nil {
return err
}
}
- if err := ctx.Git().RemoveUntrackedFiles(); err != nil {
+ if err := jirix.Git().RemoveUntrackedFiles(); err != nil {
return err
}
// Discard any uncommitted changes.
if remoteBranch == "" {
remoteBranch = "master"
}
- if err := ctx.Git().Reset("origin/" + remoteBranch); err != nil {
+ if err := jirix.Git().Reset("origin/" + remoteBranch); err != nil {
return err
}
// Delete all the other branches.
// At this point we should be at the master branch.
- branches, _, err := ctx.Git().GetBranches()
+ branches, _, err := jirix.Git().GetBranches()
if err != nil {
return err
}
@@ -788,7 +789,7 @@
continue
}
if cleanupBranches {
- if err := ctx.Git().DeleteBranch(branch, gitutil.ForceOpt(true)); err != nil {
+ if err := jirix.Git().DeleteBranch(branch, gitutil.ForceOpt(true)); err != nil {
return nil
}
}
@@ -798,7 +799,7 @@
}
// isLocalProject returns true if there is a project at the given path.
-func isLocalProject(ctx *tool.Context, path string) (bool, error) {
+func isLocalProject(jirix *jiri.X, path string) (bool, error) {
absPath, err := ToAbs(path)
if err != nil {
return false, err
@@ -806,7 +807,7 @@
// Existence of a metadata directory is how we know we've found a
// Jiri-maintained project.
metadataDir := filepath.Join(absPath, metadataDirName)
- _, err = ctx.Run().Stat(metadataDir)
+ _, err = jirix.Run().Stat(metadataDir)
if err != nil {
if os.IsNotExist(err) {
return false, nil
@@ -818,14 +819,14 @@
// projectAtPath returns a Project struct corresponding to the project at the
// path in the filesystem.
-func projectAtPath(ctx *tool.Context, path string) (Project, error) {
+func projectAtPath(jirix *jiri.X, path string) (Project, error) {
var project Project
absPath, err := ToAbs(path)
if err != nil {
return project, err
}
metadataFile := filepath.Join(absPath, metadataDirName, metadataFileName)
- bytes, err := ctx.Run().ReadFile(metadataFile)
+ bytes, err := jirix.Run().ReadFile(metadataFile)
if err != nil {
return project, err
}
@@ -842,17 +843,17 @@
// findLocalProjects scans the filesystem for all projects. Note that project
// directories can be nested recursively.
-func findLocalProjects(ctx *tool.Context, path string, projects Projects) error {
+func findLocalProjects(jirix *jiri.X, path string, projects Projects) error {
absPath, err := ToAbs(path)
if err != nil {
return err
}
- isLocal, err := isLocalProject(ctx, absPath)
+ isLocal, err := isLocalProject(jirix, absPath)
if err != nil {
return err
}
if isLocal {
- project, err := projectAtPath(ctx, absPath)
+ project, err := projectAtPath(jirix, absPath)
if err != nil {
return err
}
@@ -866,13 +867,13 @@
}
// Recurse into all the sub directories.
- fileInfos, err := ctx.Run().ReadDir(path)
+ fileInfos, err := jirix.Run().ReadDir(path)
if err != nil {
return err
}
for _, fileInfo := range fileInfos {
if fileInfo.IsDir() && !strings.HasPrefix(fileInfo.Name(), ".") {
- if err := findLocalProjects(ctx, filepath.Join(path, fileInfo.Name()), projects); err != nil {
+ if err := findLocalProjects(jirix, filepath.Join(path, fileInfo.Name()), projects); err != nil {
return err
}
}
@@ -882,10 +883,10 @@
// InstallTools installs the tools from the given directory into
// $JIRI_ROOT/devtools/bin.
-func InstallTools(ctx *tool.Context, dir string) error {
- ctx.TimerPush("install tools")
- defer ctx.TimerPop()
- if ctx.DryRun() {
+func InstallTools(jirix *jiri.X, dir string) error {
+ jirix.TimerPush("install tools")
+ defer jirix.TimerPop()
+ if jirix.DryRun() {
// In "dry run" mode, no binaries are built.
return nil
}
@@ -902,14 +903,14 @@
installFn := func() error {
src := filepath.Join(dir, fi.Name())
dst := filepath.Join(binDir, fi.Name())
- if err := ctx.Run().Rename(src, dst); err != nil {
+ if err := jirix.Run().Rename(src, dst); err != nil {
return err
}
return nil
}
opts := runutil.Opts{Verbose: true}
- if err := ctx.Run().FunctionWithOpts(opts, installFn, "install tool %q", fi.Name()); err != nil {
- fmt.Fprintf(ctx.Stderr(), "%v\n", err)
+ if err := jirix.Run().FunctionWithOpts(opts, installFn, "install tool %q", fi.Name()); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "%v\n", err)
failed = true
}
}
@@ -924,7 +925,7 @@
}
for _, subCmd := range v23SubCmds {
subCmdPath := filepath.Join(binDir, subCmd)
- if err := ctx.Run().RemoveAll(subCmdPath); err != nil {
+ if err := jirix.Run().RemoveAll(subCmdPath); err != nil {
return err
}
}
@@ -933,9 +934,9 @@
}
// runHooks runs the specified hooks
-func runHooks(ctx *tool.Context, hooks Hooks) error {
- ctx.TimerPush("run hooks")
- defer ctx.TimerPop()
+func runHooks(jirix *jiri.X, hooks Hooks) error {
+ jirix.TimerPush("run hooks")
+ defer jirix.TimerPop()
for _, hook := range hooks {
command := hook.Path
args := []string{}
@@ -946,7 +947,7 @@
for _, arg := range hook.Args {
args = append(args, arg.Arg)
}
- if err := ctx.Run().Command(command, args...); err != nil {
+ if err := jirix.Run().Command(command, args...); err != nil {
return fmt.Errorf("Hook %v failed: %v command: %v args: %v", hook.Name, err, command, args)
}
}
@@ -955,24 +956,24 @@
// resetProject advances the local master branch of the given
// project, which is expected to exist locally at project.Path.
-func resetProject(ctx *tool.Context, project Project) error {
+func resetProject(jirix *jiri.X, project Project) error {
fn := func() error {
switch project.Protocol {
case "git":
if project.Remote == "" {
return fmt.Errorf("project %v does not have a remote", project.Name)
}
- if err := ctx.Git().SetRemoteUrl("origin", project.Remote); err != nil {
+ if err := jirix.Git().SetRemoteUrl("origin", project.Remote); err != nil {
return err
}
- if err := ctx.Git().Fetch("origin"); err != nil {
+ if err := jirix.Git().Fetch("origin"); err != nil {
return err
}
// Having a specific revision trumps everything else - once fetched,
// always reset to that revision.
if project.Revision != "" && project.Revision != "HEAD" {
- return ctx.Git().Reset(project.Revision)
+ return jirix.Git().Reset(project.Revision)
}
// If no revision, reset to the configured remote branch, or master
@@ -981,18 +982,18 @@
if remoteBranch == "" {
remoteBranch = "master"
}
- return ctx.Git().Reset("origin/" + remoteBranch)
+ return jirix.Git().Reset("origin/" + remoteBranch)
default:
return UnsupportedProtocolErr(project.Protocol)
}
}
- return ApplyToLocalMaster(ctx, Projects{project.Name: project}, fn)
+ return ApplyToLocalMaster(jirix, Projects{project.Name: project}, fn)
}
// loadManifest loads the given manifest, processing all of its
// imports, projects and tools settings.
-func loadManifest(ctx *tool.Context, path string, hosts Hosts, projects Projects, tools Tools, hooks Hooks, stack map[string]struct{}) error {
- data, err := ctx.Run().ReadFile(path)
+func loadManifest(jirix *jiri.X, path string, hosts Hosts, projects Projects, tools Tools, hooks Hooks, stack map[string]struct{}) error {
+ data, err := jirix.Run().ReadFile(path)
if err != nil {
return err
}
@@ -1010,7 +1011,7 @@
return err
}
stack[manifest.Name] = struct{}{}
- if err := loadManifest(ctx, path, hosts, projects, tools, hooks, stack); err != nil {
+ if err := loadManifest(jirix, path, hosts, projects, tools, hooks, stack); err != nil {
return err
}
delete(stack, manifest.Name)
@@ -1101,18 +1102,18 @@
// reportNonMaster checks if the given project is on master branch and
// if not, reports this fact along with information on how to update it.
-func reportNonMaster(ctx *tool.Context, project Project) (e error) {
+func reportNonMaster(jirix *jiri.X, project Project) (e error) {
cwd, err := os.Getwd()
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
- if err := ctx.Run().Chdir(project.Path); err != nil {
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
+ if err := jirix.Run().Chdir(project.Path); err != nil {
return err
}
switch project.Protocol {
case "git":
- current, err := ctx.Git().CurrentBranchName()
+ current, err := jirix.Git().CurrentBranchName()
if err != nil {
return err
}
@@ -1120,7 +1121,7 @@
line1 := fmt.Sprintf(`NOTE: "jiri update" only updates the "master" branch and the current branch is %q`, current)
line2 := fmt.Sprintf(`to update the %q branch once the master branch is updated, run "git merge master"`, current)
opts := runutil.Opts{Verbose: true}
- ctx.Run().OutputWithOpts(opts, []string{line1, line2})
+ jirix.Run().OutputWithOpts(opts, []string{line1, line2})
}
return nil
default:
@@ -1130,7 +1131,7 @@
// getRemoteHeadRevisions attempts to get the repo statuses from remote for HEAD
// projects so we can detect when a local project is already up-to-date.
-func getRemoteHeadRevisions(ctx *tool.Context, remoteProjects Projects) {
+func getRemoteHeadRevisions(jirix *jiri.X, remoteProjects Projects) {
someAtHead := false
for _, rp := range remoteProjects {
if rp.Revision == "HEAD" {
@@ -1141,14 +1142,14 @@
if !someAtHead {
return
}
- gitHost, gitHostErr := GitHost(ctx)
+ gitHost, gitHostErr := GitHost(jirix)
if gitHostErr != nil || !googlesource.IsGoogleSourceHost(gitHost) {
return
}
- repoStatuses, err := googlesource.GetRepoStatuses(ctx, gitHost)
+ repoStatuses, err := googlesource.GetRepoStatuses(jirix.Context, gitHost)
if err != nil {
// Log the error but don't fail.
- fmt.Fprintf(ctx.Stderr(), "Error fetching repo statuses from remote: %v\n", err)
+ fmt.Fprintf(jirix.Stderr(), "Error fetching repo statuses from remote: %v\n", err)
return
}
for name, rp := range remoteProjects {
@@ -1168,45 +1169,45 @@
}
}
-func updateProjects(ctx *tool.Context, remoteProjects Projects, gc bool) error {
- ctx.TimerPush("update projects")
- defer ctx.TimerPop()
+func updateProjects(jirix *jiri.X, remoteProjects Projects, gc bool) error {
+ jirix.TimerPush("update projects")
+ defer jirix.TimerPop()
scanMode := FastScan
if gc {
scanMode = FullScan
}
- localProjects, err := LocalProjects(ctx, scanMode)
+ localProjects, err := LocalProjects(jirix, scanMode)
if err != nil {
return err
}
- getRemoteHeadRevisions(ctx, remoteProjects)
+ getRemoteHeadRevisions(jirix, remoteProjects)
ops, err := computeOperations(localProjects, remoteProjects, gc)
if err != nil {
return err
}
for _, op := range ops {
- if err := op.Test(ctx); err != nil {
+ if err := op.Test(jirix); err != nil {
return err
}
}
failed := false
- manifest := &Manifest{Label: ctx.Manifest()}
+ manifest := &Manifest{Label: jirix.Manifest()}
for _, op := range ops {
- updateFn := func() error { return op.Run(ctx, manifest) }
+ updateFn := func() error { return op.Run(jirix, manifest) }
// Always log the output of updateFn, irrespective of
// the value of the verbose flag.
opts := runutil.Opts{Verbose: true}
- if err := ctx.Run().FunctionWithOpts(opts, updateFn, "%v", op); err != nil {
- fmt.Fprintf(ctx.Stderr(), "%v\n", err)
+ if err := jirix.Run().FunctionWithOpts(opts, updateFn, "%v", op); err != nil {
+ fmt.Fprintf(jirix.Stderr(), "%v\n", err)
failed = true
}
}
if failed {
return cmdline.ErrExitCode(2)
}
- if err := writeCurrentManifest(ctx, manifest); err != nil {
+ if err := writeCurrentManifest(jirix, manifest); err != nil {
return err
}
return nil
@@ -1214,17 +1215,17 @@
// writeMetadata stores the given project metadata in the directory
// identified by the given path.
-func writeMetadata(ctx *tool.Context, project Project, dir string) (e error) {
+func writeMetadata(jirix *jiri.X, project Project, dir string) (e error) {
metadataDir := filepath.Join(dir, metadataDirName)
cwd, err := os.Getwd()
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
- if err := ctx.Run().MkdirAll(metadataDir, os.FileMode(0755)); err != nil {
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
+ if err := jirix.Run().MkdirAll(metadataDir, os.FileMode(0755)); err != nil {
return err
}
- if err := ctx.Run().Chdir(metadataDir); err != nil {
+ if err := jirix.Run().Chdir(metadataDir); err != nil {
return err
}
// Replace absolute project paths with relative paths to make it
@@ -1240,10 +1241,10 @@
}
metadataFile := filepath.Join(metadataDir, metadataFileName)
tmpMetadataFile := metadataFile + ".tmp"
- if err := ctx.Run().WriteFile(tmpMetadataFile, bytes, os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(tmpMetadataFile, bytes, os.FileMode(0644)); err != nil {
return err
}
- if err := ctx.Run().Rename(tmpMetadataFile, metadataFile); err != nil {
+ if err := jirix.Run().Rename(tmpMetadataFile, metadataFile); err != nil {
return err
}
return nil
@@ -1256,12 +1257,12 @@
//
// NOTE: The function assumes that the the given project is on a
// master branch.
-func addProjectToManifest(ctx *tool.Context, manifest *Manifest, project Project) error {
+func addProjectToManifest(jirix *jiri.X, manifest *Manifest, project Project) error {
// If the project uses relative revision, replace it with an absolute one.
switch project.Protocol {
case "git":
if project.Revision == "HEAD" {
- revision, err := ctx.Git(tool.RootDirOpt(project.Path)).CurrentRevision()
+ revision, err := jirix.Git(tool.RootDirOpt(project.Path)).CurrentRevision()
if err != nil {
return err
}
@@ -1283,11 +1284,11 @@
// Project identifies the project this operation pertains to.
Project() Project
// Run executes the operation.
- Run(ctx *tool.Context, manifest *Manifest) error
+ Run(jirix *jiri.X, manifest *Manifest) error
// String returns a string representation of the operation.
String() string
// Test checks whether the operation would fail.
- Test(ctx *tool.Context) error
+ Test(jirix *jiri.X) error
}
// commonOperation represents a project operation.
@@ -1311,28 +1312,28 @@
commonOperation
}
-func (op createOperation) Run(ctx *tool.Context, manifest *Manifest) (e error) {
- hosts, _, _, _, err := readManifest(ctx, false)
+func (op createOperation) Run(jirix *jiri.X, manifest *Manifest) (e error) {
+ hosts, _, _, _, err := readManifest(jirix, false)
if err != nil {
return err
}
path, perm := filepath.Dir(op.destination), os.FileMode(0755)
- if err := ctx.Run().MkdirAll(path, perm); err != nil {
+ if err := jirix.Run().MkdirAll(path, perm); err != nil {
return err
}
// Create a temporary directory for the initial setup of the
// project to prevent an untimely termination from leaving the
// $JIRI_ROOT directory in an inconsistent state.
tmpDirPrefix := strings.Replace(op.Project().Name, "/", ".", -1) + "-"
- tmpDir, err := ctx.Run().TempDir(path, tmpDirPrefix)
+ tmpDir, err := jirix.Run().TempDir(path, tmpDirPrefix)
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().RemoveAll(tmpDir) }, &e)
+ defer collect.Error(func() error { return jirix.Run().RemoveAll(tmpDir) }, &e)
switch op.project.Protocol {
case "git":
- if err := ctx.Git().Clone(op.project.Remote, tmpDir); err != nil {
+ if err := jirix.Git().Clone(op.project.Remote, tmpDir); err != nil {
return err
}
@@ -1348,12 +1349,12 @@
if err != nil {
return err
}
- src, err := ctx.Run().ReadFile(filepath.Join(mdir, githook.Path))
+ src, err := jirix.Run().ReadFile(filepath.Join(mdir, githook.Path))
if err != nil {
return err
}
dst := filepath.Join(gitHookDir, githook.Name)
- if err := ctx.Run().WriteFile(dst, src, perm); err != nil {
+ if err := jirix.Run().WriteFile(dst, src, perm); err != nil {
return err
}
}
@@ -1363,11 +1364,11 @@
// write to .git/info/exclude
excludeString := "/.jiri/\n"
excludeDir := filepath.Join(tmpDir, ".git", "info")
- if err := ctx.Run().MkdirAll(excludeDir, os.FileMode(0750)); err != nil {
+ if err := jirix.Run().MkdirAll(excludeDir, os.FileMode(0750)); err != nil {
return err
}
excludeFile := filepath.Join(excludeDir, "exclude")
- if err := ctx.Run().WriteFile(excludeFile, []byte(excludeString), perm); err != nil {
+ if err := jirix.Run().WriteFile(excludeFile, []byte(excludeString), perm); err != nil {
return err
}
@@ -1375,38 +1376,38 @@
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
- if err := ctx.Run().Chdir(tmpDir); err != nil {
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
+ if err := jirix.Run().Chdir(tmpDir); err != nil {
return err
}
- if err := ctx.Git().Reset(op.project.Revision); err != nil {
+ if err := jirix.Git().Reset(op.project.Revision); err != nil {
return err
}
default:
return UnsupportedProtocolErr(op.project.Protocol)
}
- if err := writeMetadata(ctx, op.project, tmpDir); err != nil {
+ if err := writeMetadata(jirix, op.project, tmpDir); err != nil {
return err
}
- if err := ctx.Run().Chmod(tmpDir, os.FileMode(0755)); err != nil {
+ if err := jirix.Run().Chmod(tmpDir, os.FileMode(0755)); err != nil {
return err
}
- if err := ctx.Run().Rename(tmpDir, op.destination); err != nil {
+ if err := jirix.Run().Rename(tmpDir, op.destination); err != nil {
return err
}
- if err := resetProject(ctx, op.project); err != nil {
+ if err := resetProject(jirix, op.project); err != nil {
return err
}
- return addProjectToManifest(ctx, manifest, op.project)
+ return addProjectToManifest(jirix, manifest, op.project)
}
func (op createOperation) String() string {
return fmt.Sprintf("create project %q in %q and advance it to %q", op.project.Name, op.destination, fmtRevision(op.project.Revision))
}
-func (op createOperation) Test(ctx *tool.Context) error {
+func (op createOperation) Test(jirix *jiri.X) error {
// Check the local file system.
- if _, err := ctx.Run().Stat(op.destination); err != nil {
+ if _, err := jirix.Run().Stat(op.destination); err != nil {
if !os.IsNotExist(err) {
return err
}
@@ -1424,7 +1425,7 @@
gc bool
}
-func (op deleteOperation) Run(ctx *tool.Context, _ *Manifest) error {
+func (op deleteOperation) Run(jirix *jiri.X, _ *Manifest) error {
if op.gc {
// Never delete the <JiriProject>.
if op.project.Name == JiriProject {
@@ -1434,12 +1435,12 @@
"development tools and will thus not be deleted",
}
opts := runutil.Opts{Verbose: true}
- ctx.Run().OutputWithOpts(opts, lines)
+ jirix.Run().OutputWithOpts(opts, lines)
return nil
}
// Never delete projects with non-master branches, uncommitted
// work, or untracked content.
- git := ctx.Git(tool.RootDirOpt(op.project.Path))
+ git := jirix.Git(tool.RootDirOpt(op.project.Path))
branches, _, err := git.GetBranches()
if err != nil {
return err
@@ -1459,10 +1460,10 @@
"work, or untracked files and will thus not be deleted",
}
opts := runutil.Opts{Verbose: true}
- ctx.Run().OutputWithOpts(opts, lines)
+ jirix.Run().OutputWithOpts(opts, lines)
return nil
}
- return ctx.Run().RemoveAll(op.source)
+ return jirix.Run().RemoveAll(op.source)
}
lines := []string{
fmt.Sprintf("NOTE: project %v was not found in the project manifest", op.project.Name),
@@ -1471,7 +1472,7 @@
`or invoke "jiri update -gc" to remove all such local projects`,
}
opts := runutil.Opts{Verbose: true}
- ctx.Run().OutputWithOpts(opts, lines)
+ jirix.Run().OutputWithOpts(opts, lines)
return nil
}
@@ -1479,8 +1480,8 @@
return fmt.Sprintf("delete project %q from %q", op.project.Name, op.source)
}
-func (op deleteOperation) Test(ctx *tool.Context) error {
- if _, err := ctx.Run().Stat(op.source); err != nil {
+func (op deleteOperation) Test(jirix *jiri.X) error {
+ if _, err := jirix.Run().Stat(op.source); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("cannot delete %q as it does not exist", op.source)
}
@@ -1494,38 +1495,38 @@
commonOperation
}
-func (op moveOperation) Run(ctx *tool.Context, manifest *Manifest) error {
+func (op moveOperation) Run(jirix *jiri.X, manifest *Manifest) error {
path, perm := filepath.Dir(op.destination), os.FileMode(0755)
- if err := ctx.Run().MkdirAll(path, perm); err != nil {
+ if err := jirix.Run().MkdirAll(path, perm); err != nil {
return err
}
- if err := ctx.Run().Rename(op.source, op.destination); err != nil {
+ if err := jirix.Run().Rename(op.source, op.destination); err != nil {
return err
}
- if err := reportNonMaster(ctx, op.project); err != nil {
+ if err := reportNonMaster(jirix, op.project); err != nil {
return err
}
- if err := resetProject(ctx, op.project); err != nil {
+ if err := resetProject(jirix, op.project); err != nil {
return err
}
- if err := writeMetadata(ctx, op.project, op.project.Path); err != nil {
+ if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
return err
}
- return addProjectToManifest(ctx, manifest, op.project)
+ return addProjectToManifest(jirix, manifest, op.project)
}
func (op moveOperation) String() string {
return fmt.Sprintf("move project %q located in %q to %q and advance it to %q", op.project.Name, op.source, op.destination, fmtRevision(op.project.Revision))
}
-func (op moveOperation) Test(ctx *tool.Context) error {
- if _, err := ctx.Run().Stat(op.source); err != nil {
+func (op moveOperation) Test(jirix *jiri.X) error {
+ if _, err := jirix.Run().Stat(op.source); err != nil {
if os.IsNotExist(err) {
return fmt.Errorf("cannot move %q to %q as the source does not exist", op.source, op.destination)
}
return err
}
- if _, err := ctx.Run().Stat(op.destination); err != nil {
+ if _, err := jirix.Run().Stat(op.destination); err != nil {
if !os.IsNotExist(err) {
return err
}
@@ -1540,24 +1541,24 @@
commonOperation
}
-func (op updateOperation) Run(ctx *tool.Context, manifest *Manifest) error {
- if err := reportNonMaster(ctx, op.project); err != nil {
+func (op updateOperation) Run(jirix *jiri.X, manifest *Manifest) error {
+ if err := reportNonMaster(jirix, op.project); err != nil {
return err
}
- if err := resetProject(ctx, op.project); err != nil {
+ if err := resetProject(jirix, op.project); err != nil {
return err
}
- if err := writeMetadata(ctx, op.project, op.project.Path); err != nil {
+ if err := writeMetadata(jirix, op.project, op.project.Path); err != nil {
return err
}
- return addProjectToManifest(ctx, manifest, op.project)
+ return addProjectToManifest(jirix, manifest, op.project)
}
func (op updateOperation) String() string {
return fmt.Sprintf("advance project %q located in %q to %q", op.project.Name, op.source, fmtRevision(op.project.Revision))
}
-func (op updateOperation) Test(ctx *tool.Context) error {
+func (op updateOperation) Test(jirix *jiri.X) error {
return nil
}
@@ -1567,15 +1568,15 @@
commonOperation
}
-func (op nullOperation) Run(ctx *tool.Context, manifest *Manifest) error {
- return addProjectToManifest(ctx, manifest, op.project)
+func (op nullOperation) Run(jirix *jiri.X, manifest *Manifest) error {
+ return addProjectToManifest(jirix, manifest, op.project)
}
func (op nullOperation) String() string {
return fmt.Sprintf("project %q located in %q at revision %q is up-to-date", op.project.Name, op.source, fmtRevision(op.project.Revision))
}
-func (op nullOperation) Test(ctx *tool.Context) error {
+func (op nullOperation) Test(jirix *jiri.X) error {
return nil
}
@@ -1696,8 +1697,8 @@
// ParseNames identifies the set of projects that a jiri command should
// be applied to.
-func ParseNames(ctx *tool.Context, args []string, defaultProjects map[string]struct{}) (map[string]Project, error) {
- projects, _, err := ReadManifest(ctx)
+func ParseNames(jirix *jiri.X, args []string, defaultProjects map[string]struct{}) (map[string]Project, error) {
+ projects, _, err := ReadManifest(jirix)
if err != nil {
return nil, err
}
@@ -1712,7 +1713,7 @@
} else {
// Issue a warning if the target project does not exist in the
// project manifest.
- fmt.Fprintf(ctx.Stderr(), "WARNING: project %q does not exist in the project manifest and will be skipped\n", name)
+ fmt.Fprintf(jirix.Stderr(), "WARNING: project %q does not exist in the project manifest and will be skipped\n", name)
}
}
return result, nil
diff --git a/project/project_test.go b/project/project_test.go
index 3355850..b15b445 100644
--- a/project/project_test.go
+++ b/project/project_test.go
@@ -18,25 +18,26 @@
"strings"
"testing"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
+ "v.io/jiri/jiri/jiritest"
)
-func addRemote(t *testing.T, ctx *tool.Context, localProject, name, remoteProject string) {
+func addRemote(t *testing.T, jirix *jiri.X, localProject, name, remoteProject string) {
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(localProject); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(localProject); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().AddRemote(name, remoteProject); err != nil {
+ if err := jirix.Git().AddRemote(name, remoteProject); err != nil {
t.Fatalf("%v", err)
}
}
-func checkReadme(t *testing.T, ctx *tool.Context, project, message string) {
- if _, err := ctx.Run().Stat(project); err != nil {
+func checkReadme(t *testing.T, jirix *jiri.X, project, message string) {
+ if _, err := jirix.Run().Stat(project); err != nil {
t.Fatalf("%v", err)
}
readmeFile := filepath.Join(project, "README")
@@ -50,8 +51,8 @@
}
// Checks that /.jiri/ is ignored in a local project checkout
-func checkGitIgnore(t *testing.T, ctx *tool.Context, project string) {
- if _, err := ctx.Run().Stat(project); err != nil {
+func checkGitIgnore(t *testing.T, jirix *jiri.X, project string) {
+ if _, err := jirix.Run().Stat(project); err != nil {
t.Fatalf("%v", err)
}
gitInfoExcludeFile := filepath.Join(project, ".git", "info", "exclude")
@@ -65,7 +66,7 @@
}
}
-func createLocalManifestCopy(t *testing.T, ctx *tool.Context, dir, manifestDir string) {
+func createLocalManifestCopy(t *testing.T, jirix *jiri.X, dir, manifestDir string) {
// Load the remote manifest.
manifestFile := filepath.Join(manifestDir, "v2", "default")
data, err := ioutil.ReadFile(manifestFile)
@@ -88,7 +89,7 @@
}
}
-func createLocalManifestStub(t *testing.T, ctx *tool.Context, dir string) {
+func createLocalManifestStub(t *testing.T, jirix *jiri.X, dir string) {
// Create a manifest stub.
manifest := Manifest{}
manifest.Imports = append(manifest.Imports, Import{Name: "default"})
@@ -104,9 +105,9 @@
}
}
-func createRemoteManifest(t *testing.T, ctx *tool.Context, dir string, remotes []string) {
+func createRemoteManifest(t *testing.T, jirix *jiri.X, dir string, remotes []string) {
manifestDir, perm := filepath.Join(dir, "v2"), os.FileMode(0755)
- if err := ctx.Run().MkdirAll(manifestDir, perm); err != nil {
+ if err := jirix.Run().MkdirAll(manifestDir, perm); err != nil {
t.Fatalf("%v", err)
}
manifest := Manifest{}
@@ -129,10 +130,10 @@
Location: "git://example.com/git",
},
}
- commitManifest(t, ctx, &manifest, dir)
+ commitManifest(t, jirix, &manifest, dir)
}
-func commitManifest(t *testing.T, ctx *tool.Context, manifest *Manifest, manifestDir string) {
+func commitManifest(t *testing.T, jirix *jiri.X, manifest *Manifest, manifestDir string) {
data, err := xml.Marshal(*manifest)
if err != nil {
t.Fatalf("%v", err)
@@ -145,16 +146,16 @@
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(manifestDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(manifestDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CommitFile(manifestFile, "creating manifest"); err != nil {
+ if err := jirix.Git().CommitFile(manifestFile, "creating manifest"); err != nil {
t.Fatalf("%v", err)
}
}
-func deleteProject(t *testing.T, ctx *tool.Context, manifestDir, project string) {
+func deleteProject(t *testing.T, jirix *jiri.X, manifestDir, project string) {
manifestFile := filepath.Join(manifestDir, "v2", "default")
data, err := ioutil.ReadFile(manifestFile)
if err != nil {
@@ -165,20 +166,20 @@
t.Fatalf("Unmarshal() failed: %v\n%v", err, data)
}
manifest.Projects = append(manifest.Projects, Project{Exclude: true, Name: project})
- commitManifest(t, ctx, &manifest, manifestDir)
+ commitManifest(t, jirix, &manifest, manifestDir)
}
// Identify the current revision for a given project.
-func currentRevision(t *testing.T, ctx *tool.Context, project string) string {
+func currentRevision(t *testing.T, jirix *jiri.X, project string) string {
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(project); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(project); err != nil {
t.Fatalf("%v", err)
}
- revision, err := ctx.Git().CurrentRevision()
+ revision, err := jirix.Git().CurrentRevision()
if err != nil {
t.Fatalf("%v", err)
}
@@ -186,7 +187,7 @@
}
// Fix the revision in the manifest file.
-func setRevisionForProject(t *testing.T, ctx *tool.Context, manifestDir, project, revision string) {
+func setRevisionForProject(t *testing.T, jirix *jiri.X, manifestDir, project, revision string) {
manifestFile := filepath.Join(manifestDir, "v2", "default")
data, err := ioutil.ReadFile(manifestFile)
if err != nil {
@@ -208,19 +209,19 @@
if !updated {
t.Fatalf("failed to fix revision for project %v", project)
}
- commitManifest(t, ctx, &manifest, manifestDir)
+ commitManifest(t, jirix, &manifest, manifestDir)
}
-func holdProjectBack(t *testing.T, ctx *tool.Context, manifestDir, project string) {
- revision := currentRevision(t, ctx, project)
- setRevisionForProject(t, ctx, manifestDir, project, revision)
+func holdProjectBack(t *testing.T, jirix *jiri.X, manifestDir, project string) {
+ revision := currentRevision(t, jirix, project)
+ setRevisionForProject(t, jirix, manifestDir, project, revision)
}
func localProjectName(i int) string {
return "test-local-project-" + fmt.Sprintf("%d", i)
}
-func moveProject(t *testing.T, ctx *tool.Context, manifestDir, project, dst string) {
+func moveProject(t *testing.T, jirix *jiri.X, manifestDir, project, dst string) {
manifestFile := filepath.Join(manifestDir, "v2", "default")
data, err := ioutil.ReadFile(manifestFile)
if err != nil {
@@ -242,50 +243,50 @@
if !updated {
t.Fatalf("failed to set path for project %v", project)
}
- commitManifest(t, ctx, &manifest, manifestDir)
+ commitManifest(t, jirix, &manifest, manifestDir)
}
func remoteProjectName(i int) string {
return "test-remote-project-" + fmt.Sprintf("%d", i)
}
-func setupNewProject(t *testing.T, ctx *tool.Context, dir, name string, ignore bool) string {
+func setupNewProject(t *testing.T, jirix *jiri.X, dir, name string, ignore bool) string {
projectDir, perm := filepath.Join(dir, name), os.FileMode(0755)
- if err := ctx.Run().MkdirAll(projectDir, perm); err != nil {
+ if err := jirix.Run().MkdirAll(projectDir, perm); err != nil {
t.Fatalf("%v", err)
}
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(projectDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Init(projectDir); err != nil {
+ if err := jirix.Git().Init(projectDir); err != nil {
t.Fatalf("%v", err)
}
if ignore {
ignoreFile := filepath.Join(projectDir, ".gitignore")
- if err := ctx.Run().WriteFile(ignoreFile, []byte(metadataDirName), os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(ignoreFile, []byte(metadataDirName), os.FileMode(0644)); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Add(ignoreFile); err != nil {
+ if err := jirix.Git().Add(ignoreFile); err != nil {
t.Fatalf("%v", err)
}
}
- if err := ctx.Git().Commit(); err != nil {
+ if err := jirix.Git().Commit(); err != nil {
t.Fatalf("%v", err)
}
return projectDir
}
-func writeEmptyMetadata(t *testing.T, ctx *tool.Context, projectDir string) {
- if err := ctx.Run().Chdir(projectDir); err != nil {
+func writeEmptyMetadata(t *testing.T, jirix *jiri.X, projectDir string) {
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
metadataDir := filepath.Join(projectDir, metadataDirName)
- if err := ctx.Run().MkdirAll(metadataDir, os.FileMode(0755)); err != nil {
+ if err := jirix.Run().MkdirAll(metadataDir, os.FileMode(0755)); err != nil {
t.Fatalf("%v", err)
}
bytes, err := xml.Marshal(Project{})
@@ -293,12 +294,12 @@
t.Fatalf("Marshal() failed: %v", err)
}
metadataFile := filepath.Join(metadataDir, metadataFileName)
- if err := ctx.Run().WriteFile(metadataFile, bytes, os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(metadataFile, bytes, os.FileMode(0644)); err != nil {
t.Fatalf("%v", err)
}
}
-func writeReadme(t *testing.T, ctx *tool.Context, projectDir, message string) {
+func writeReadme(t *testing.T, jirix *jiri.X, projectDir, message string) {
path, perm := filepath.Join(projectDir, "README"), os.FileMode(0644)
if err := ioutil.WriteFile(path, []byte(message), perm); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", path, perm, err)
@@ -307,39 +308,39 @@
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(projectDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CommitFile(path, "creating README"); err != nil {
+ if err := jirix.Git().CommitFile(path, "creating README"); err != nil {
t.Fatalf("%v", err)
}
}
-func createAndCheckoutBranch(t *testing.T, ctx *tool.Context, projectDir, branch string) {
+func createAndCheckoutBranch(t *testing.T, jirix *jiri.X, projectDir, branch string) {
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(projectDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CreateAndCheckoutBranch(branch); err != nil {
+ if err := jirix.Git().CreateAndCheckoutBranch(branch); err != nil {
t.Fatalf("%v", err)
}
}
-func resetToOriginMaster(t *testing.T, ctx *tool.Context, projectDir string) {
+func resetToOriginMaster(t *testing.T, jirix *jiri.X, projectDir string) {
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(projectDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().Reset("origin/master"); err != nil {
+ if err := jirix.Git().Reset("origin/master"); err != nil {
t.Fatalf("%v", err)
}
}
@@ -359,49 +360,40 @@
// TestLocalProjects tests the behavior of the LocalProjects method with
// different ScanModes.
func TestLocalProjects(t *testing.T) {
- ctx := tool.NewDefaultContext()
- rootDir, err := ctx.Run().TempDir("", "")
- if err != nil {
- t.Fatalf("TempDir() failed: %v", err)
- }
- defer ctx.Run().RemoveAll(rootDir)
- oldRoot := os.Getenv("JIRI_ROOT")
- if err := os.Setenv("JIRI_ROOT", rootDir); err != nil {
- t.Fatalf("%v", err)
- }
- defer os.Setenv("JIRI_ROOT", oldRoot)
+ jirix, cleanup := jiritest.NewX(t)
+ defer cleanup()
- manifestDir := setupNewProject(t, ctx, rootDir, ".manifest", false)
+ manifestDir := setupNewProject(t, jirix, jirix.Root, ".manifest", false)
// Create some projects.
numProjects, projectPaths := 3, []string{}
for i := 0; i < numProjects; i++ {
projectName := localProjectName(i)
- projectPath := setupNewProject(t, ctx, rootDir, projectName, true)
+ projectPath := setupNewProject(t, jirix, jirix.Root, projectName, true)
project := Project{
Path: projectPath,
Name: projectName,
Protocol: "git",
}
- if err := writeMetadata(ctx, project, projectPath); err != nil {
+ if err := writeMetadata(jirix, project, projectPath); err != nil {
t.Fatalf("writeMetadata %v %v) failed: %v\n", project, projectPath, err)
}
projectPaths = append(projectPaths, projectPath)
}
// Create manifest but only tell it about the first project.
- createRemoteManifest(t, ctx, manifestDir, projectPaths[:1])
+ createRemoteManifest(t, jirix, manifestDir, projectPaths[:1])
// LocalProjects with scanMode = FastScan should only find the first
// project.
- foundProjects, err := LocalProjects(ctx, FastScan)
+ foundProjects, err := LocalProjects(jirix, FastScan)
if err != nil {
t.Fatalf("LocalProjects(%v) failed: %v", FastScan, err)
}
checkProjectsMatchPaths(t, foundProjects, projectPaths[:1])
// LocalProjects with scanMode = FullScan should find all projects.
- foundProjects, err = LocalProjects(ctx, FullScan)
+ foundProjects, err = LocalProjects(jirix, FullScan)
if err != nil {
t.Fatalf("LocalProjects(%v) failed: %v", FastScan, err)
}
@@ -409,10 +401,10 @@
// Check that deleting a project forces LocalProjects to run a full scan,
// even if FastScan is specified.
- if err := ctx.Run().RemoveAll(projectPaths[0]); err != nil {
+ if err := jirix.Run().RemoveAll(projectPaths[0]); err != nil {
t.Fatalf("RemoveAll(%v) failed: %v", projectPaths[0])
}
- foundProjects, err = LocalProjects(ctx, FastScan)
+ foundProjects, err = LocalProjects(jirix, FastScan)
if err != nil {
t.Fatalf("LocalProjects(%v) failed: %v", FastScan, err)
}
@@ -427,50 +419,46 @@
// Setup an instance of jiri universe, creating the remote repositories for
// the manifest and projects under the "remote" directory, which is ignored
// from the consideration of LocalProjects().
- ctx := tool.NewDefaultContext()
- rootDir, err := ctx.Run().TempDir("", "")
- if err != nil {
- t.Fatalf("TempDir() failed: %v", err)
- }
- defer ctx.Run().RemoveAll(rootDir)
- localDir := filepath.Join(rootDir, "local")
- remoteDir := filepath.Join(rootDir, "remote")
- localManifest := setupNewProject(t, ctx, localDir, ".manifest", false)
- writeEmptyMetadata(t, ctx, localManifest)
- remoteManifest := setupNewProject(t, ctx, remoteDir, "test-remote-manifest", false)
- addRemote(t, ctx, localManifest, "origin", remoteManifest)
- numProjects, remoteProjects := 5, []string{}
- for i := 0; i < numProjects; i++ {
- remoteProject := setupNewProject(t, ctx, remoteDir, remoteProjectName(i), true)
- remoteProjects = append(remoteProjects, remoteProject)
- }
- createRemoteManifest(t, ctx, remoteManifest, remoteProjects)
- oldRoot := os.Getenv("JIRI_ROOT")
+ jirix, cleanup := jiritest.NewX(t)
+ defer cleanup()
+
+ localDir := filepath.Join(jirix.Root, "local")
+ remoteDir := filepath.Join(jirix.Root, "remote")
if err := os.Setenv("JIRI_ROOT", localDir); err != nil {
t.Fatalf("%v", err)
}
- defer os.Setenv("JIRI_ROOT", oldRoot)
+
+ localManifest := setupNewProject(t, jirix, localDir, ".manifest", false)
+ writeEmptyMetadata(t, jirix, localManifest)
+ remoteManifest := setupNewProject(t, jirix, remoteDir, "test-remote-manifest", false)
+ addRemote(t, jirix, localManifest, "origin", remoteManifest)
+ numProjects, remoteProjects := 5, []string{}
+ for i := 0; i < numProjects; i++ {
+ remoteProject := setupNewProject(t, jirix, remoteDir, remoteProjectName(i), true)
+ remoteProjects = append(remoteProjects, remoteProject)
+ }
+ createRemoteManifest(t, jirix, remoteManifest, remoteProjects)
// Check that calling UpdateUniverse() creates local copies of
// the remote repositories, advancing projects to HEAD or to
// the fixed revision set in the manifest.
for _, remoteProject := range remoteProjects {
- writeReadme(t, ctx, remoteProject, "revision 1")
+ writeReadme(t, jirix, remoteProject, "revision 1")
}
- holdProjectBack(t, ctx, remoteManifest, remoteProjects[0])
+ holdProjectBack(t, jirix, remoteManifest, remoteProjects[0])
for _, remoteProject := range remoteProjects {
- writeReadme(t, ctx, remoteProject, "revision 2")
+ writeReadme(t, jirix, remoteProject, "revision 2")
}
- if err := UpdateUniverse(ctx, false); err != nil {
+ if err := UpdateUniverse(jirix, false); err != nil {
t.Fatalf("%v", err)
}
checkCreateFn := func(i int, revision string) {
localProject := filepath.Join(localDir, localProjectName(i))
- checkGitIgnore(t, ctx, localProject)
+ checkGitIgnore(t, jirix, localProject)
if i == 0 {
- checkReadme(t, ctx, localProject, "revision 1")
+ checkReadme(t, jirix, localProject, "revision 1")
} else {
- checkReadme(t, ctx, localProject, revision)
+ checkReadme(t, jirix, localProject, revision)
}
}
for i, _ := range remoteProjects {
@@ -480,16 +468,16 @@
// Commit more work to the remote repositories and check that
// calling UpdateUniverse() advances project to HEAD or to the
// fixed revision set in the manifest.
- holdProjectBack(t, ctx, remoteManifest, remoteProjects[1])
+ holdProjectBack(t, jirix, remoteManifest, remoteProjects[1])
for _, remoteProject := range remoteProjects {
- writeReadme(t, ctx, remoteProject, "revision 3")
+ writeReadme(t, jirix, remoteProject, "revision 3")
}
- if err := UpdateUniverse(ctx, false); err != nil {
+ if err := UpdateUniverse(jirix, false); err != nil {
t.Fatalf("%v", err)
}
checkUpdateFn := func(i int, revision string) {
if i == 1 {
- checkReadme(t, ctx, filepath.Join(localDir, localProjectName(i)), "revision 2")
+ checkReadme(t, jirix, filepath.Join(localDir, localProjectName(i)), "revision 2")
} else {
checkCreateFn(i, revision)
}
@@ -506,7 +494,7 @@
if err := ioutil.WriteFile(file, want, perm); err != nil {
t.Fatalf("WriteFile(%v, %v) failed: %v", file, err, perm)
}
- if err := UpdateUniverse(ctx, false); err != nil {
+ if err := UpdateUniverse(jirix, false); err != nil {
t.Fatalf("%v", err)
}
got, err := ioutil.ReadFile(file)
@@ -521,13 +509,13 @@
// located and check that UpdateUniverse() moves the local
// copy of the project.
destination := filepath.Join("test", localProjectName(2))
- moveProject(t, ctx, remoteManifest, remoteProjects[2], destination)
- if err := UpdateUniverse(ctx, false); err != nil {
+ moveProject(t, jirix, remoteManifest, remoteProjects[2], destination)
+ if err := UpdateUniverse(jirix, false); err != nil {
t.Fatalf("%v", err)
}
checkMoveFn := func(i int, revision string) {
if i == 2 {
- checkReadme(t, ctx, filepath.Join(localDir, destination), revision)
+ checkReadme(t, jirix, filepath.Join(localDir, destination), revision)
} else {
checkUpdateFn(i, revision)
}
@@ -538,14 +526,14 @@
// Delete a remote project and check that UpdateUniverse()
// deletes the local copy of the project.
- deleteProject(t, ctx, remoteManifest, remoteProjects[3])
- if err := UpdateUniverse(ctx, true); err != nil {
+ deleteProject(t, jirix, remoteManifest, remoteProjects[3])
+ if err := UpdateUniverse(jirix, true); err != nil {
t.Fatalf("%v", err)
}
checkDeleteFn := func(i int, revision string) {
if i == 3 {
localProject := filepath.Join(localDir, localProjectName(i))
- if _, err := ctx.Run().Stat(localProject); err == nil {
+ if _, err := jirix.Run().Stat(localProject); err == nil {
t.Fatalf("project %v has not been deleted", localProject)
} else {
if !os.IsNotExist(err) {
@@ -563,32 +551,32 @@
// Commit to a non-master branch of a remote project and check that
// UpdateUniverse() can update the local project to point to a revision on
// that branch.
- writeReadme(t, ctx, remoteProjects[4], "master commit")
- createAndCheckoutBranch(t, ctx, remoteProjects[4], "non_master")
- writeReadme(t, ctx, remoteProjects[4], "non master commit")
- remoteBranchRevision := currentRevision(t, ctx, remoteProjects[4])
- setRevisionForProject(t, ctx, remoteManifest, remoteProjects[4], remoteBranchRevision)
- if err := UpdateUniverse(ctx, true); err != nil {
+ writeReadme(t, jirix, remoteProjects[4], "master commit")
+ createAndCheckoutBranch(t, jirix, remoteProjects[4], "non_master")
+ writeReadme(t, jirix, remoteProjects[4], "non master commit")
+ remoteBranchRevision := currentRevision(t, jirix, remoteProjects[4])
+ setRevisionForProject(t, jirix, remoteManifest, remoteProjects[4], remoteBranchRevision)
+ if err := UpdateUniverse(jirix, true); err != nil {
t.Fatalf("%v", err)
}
localProject := filepath.Join(localDir, localProjectName(4))
- localBranchRevision := currentRevision(t, ctx, localProject)
+ localBranchRevision := currentRevision(t, jirix, localProject)
if localBranchRevision != remoteBranchRevision {
t.Fatalf("project 4 is at revision %v, expected %v\n", localBranchRevision, remoteBranchRevision)
}
// Reset back to origin/master so the next update without a "revision" works.
- resetToOriginMaster(t, ctx, localProject)
+ resetToOriginMaster(t, jirix, localProject)
// Create a local manifest that imports the remote manifest
// and check that UpdateUniverse() has no effect.
- createLocalManifestStub(t, ctx, localDir)
- if err := UpdateUniverse(ctx, true); err != nil {
+ createLocalManifestStub(t, jirix, localDir)
+ if err := UpdateUniverse(jirix, true); err != nil {
t.Fatalf("%v", err)
}
checkRebaseFn := func(i int, revision string) {
if i == 4 {
- checkReadme(t, ctx, localProject, "non master commit")
+ checkReadme(t, jirix, localProject, "non master commit")
} else {
checkDeleteFn(i, revision)
}
@@ -600,9 +588,9 @@
// Create a local manifest that matches the remote manifest,
// then revert the remote manifest to its initial version and
// check that UpdateUniverse() has no effect.
- createLocalManifestCopy(t, ctx, localDir, remoteManifest)
- createRemoteManifest(t, ctx, remoteManifest, remoteProjects)
- if err := UpdateUniverse(ctx, true); err != nil {
+ createLocalManifestCopy(t, jirix, localDir, remoteManifest)
+ createRemoteManifest(t, jirix, remoteManifest, remoteProjects)
+ if err := UpdateUniverse(jirix, true); err != nil {
t.Fatalf("%v", err)
}
for i, _ := range remoteProjects {
diff --git a/project/state.go b/project/state.go
index eef43b5..2f86aa9 100644
--- a/project/state.go
+++ b/project/state.go
@@ -8,6 +8,7 @@
"os"
"path/filepath"
+ "v.io/jiri/jiri"
"v.io/jiri/tool"
)
@@ -24,11 +25,11 @@
Project Project
}
-func setProjectState(ctx *tool.Context, state *ProjectState, checkDirty bool, ch chan<- error) {
+func setProjectState(jirix *jiri.X, state *ProjectState, checkDirty bool, ch chan<- error) {
var err error
switch state.Project.Protocol {
case "git":
- scm := ctx.Git(tool.RootDirOpt(state.Project.Path))
+ scm := jirix.Git(tool.RootDirOpt(state.Project.Path))
var branches []string
branches, state.CurrentBranch, err = scm.GetBranches()
if err != nil {
@@ -38,7 +39,7 @@
for _, branch := range branches {
file := filepath.Join(state.Project.Path, MetadataDirName(), branch, ".gerrit_commit_message")
hasFile := true
- if _, err := ctx.Run().Stat(file); err != nil {
+ if _, err := jirix.Run().Stat(file); err != nil {
if !os.IsNotExist(err) {
ch <- err
return
@@ -69,8 +70,8 @@
ch <- nil
}
-func GetProjectStates(ctx *tool.Context, checkDirty bool) (map[string]*ProjectState, error) {
- projects, err := LocalProjects(ctx, FastScan)
+func GetProjectStates(jirix *jiri.X, checkDirty bool) (map[string]*ProjectState, error) {
+ projects, err := LocalProjects(jirix, FastScan)
if err != nil {
return nil, err
}
@@ -81,8 +82,8 @@
Project: project,
}
states[name] = state
- // ctx is not threadsafe, so we make a clone for each goroutine.
- go setProjectState(ctx.Clone(tool.ContextOpts{}), state, checkDirty, sem)
+ // jirix is not threadsafe, so we make a clone for each goroutine.
+ go setProjectState(jirix.Clone(tool.ContextOpts{}), state, checkDirty, sem)
}
for _ = range projects {
err := <-sem
diff --git a/rebuild.go b/rebuild.go
index 577c1d8..2ca2de0 100644
--- a/rebuild.go
+++ b/rebuild.go
@@ -8,14 +8,14 @@
"fmt"
"v.io/jiri/collect"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
- "v.io/jiri/tool"
"v.io/x/lib/cmdline"
)
// cmdRebuild represents the "jiri rebuild" command.
var cmdRebuild = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runRebuild),
+ Runner: jiri.RunnerFunc(runRebuild),
Name: "rebuild",
Short: "Rebuild all jiri tools",
Long: `
@@ -28,21 +28,20 @@
`,
}
-func runRebuild(env *cmdline.Env, args []string) (e error) {
- ctx := tool.NewContextFromEnv(env)
- _, tools, err := project.ReadManifest(ctx)
+func runRebuild(jirix *jiri.X, args []string) (e error) {
+ _, tools, err := project.ReadManifest(jirix)
if err != nil {
return err
}
// Create a temporary directory in which tools will be built.
- tmpDir, err := ctx.Run().TempDir("", "tmp-jiri-rebuild")
+ tmpDir, err := jirix.Run().TempDir("", "tmp-jiri-rebuild")
if err != nil {
return fmt.Errorf("TempDir() failed: %v", err)
}
// Make sure we cleanup the temp directory.
- defer collect.Error(func() error { return ctx.Run().RemoveAll(tmpDir) }, &e)
+ defer collect.Error(func() error { return jirix.Run().RemoveAll(tmpDir) }, &e)
// Paranoid sanity checking.
if _, ok := tools[project.JiriName]; !ok {
@@ -50,8 +49,8 @@
}
// Build and install tools.
- if err := project.BuildTools(ctx, tools, tmpDir); err != nil {
+ if err := project.BuildTools(jirix, tools, tmpDir); err != nil {
return err
}
- return project.InstallTools(ctx, tmpDir)
+ return project.InstallTools(jirix, tmpDir)
}
diff --git a/snapshot.go b/snapshot.go
index f90f81e..0afc338 100644
--- a/snapshot.go
+++ b/snapshot.go
@@ -15,8 +15,8 @@
"v.io/jiri/collect"
"v.io/jiri/gitutil"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
- "v.io/jiri/tool"
"v.io/x/lib/cmdline"
)
@@ -47,7 +47,7 @@
// cmdSnapshotCreate represents the "jiri snapshot create" command.
var cmdSnapshotCreate = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runSnapshotCreate),
+ Runner: jiri.RunnerFunc(runSnapshotCreate),
Name: "create",
Short: "Create a new project snapshot",
Long: `
@@ -83,13 +83,12 @@
ArgsLong: "<label> is the snapshot label.",
}
-func runSnapshotCreate(env *cmdline.Env, args []string) error {
+func runSnapshotCreate(jirix *jiri.X, args []string) error {
if len(args) != 1 {
- return env.UsageErrorf("unexpected number of arguments")
+ return jirix.UsageErrorf("unexpected number of arguments")
}
label := args[0]
- ctx := tool.NewContextFromEnv(env)
- if err := checkSnapshotDir(ctx); err != nil {
+ if err := checkSnapshotDir(jirix); err != nil {
return err
}
snapshotDir, err := getSnapshotDir()
@@ -101,14 +100,14 @@
// state and push the changes to the remote repository (if
// applicable), or fail with no effect.
createFn := func() error {
- revision, err := ctx.Git().CurrentRevision()
+ revision, err := jirix.Git().CurrentRevision()
if err != nil {
return err
}
- if err := createSnapshot(ctx, snapshotDir, snapshotFile, label); err != nil {
+ if err := createSnapshot(jirix, snapshotDir, snapshotFile, label); err != nil {
// Clean up on all errors.
- ctx.Git().Reset(revision)
- ctx.Git().RemoveUntrackedFiles()
+ jirix.Git().Reset(revision)
+ jirix.Git().RemoveUntrackedFiles()
return err
}
return nil
@@ -120,7 +119,7 @@
Protocol: "git",
Revision: "HEAD",
}
- if err := project.ApplyToLocalMaster(ctx, project.Projects{p.Name: p}, createFn); err != nil {
+ if err := project.ApplyToLocalMaster(jirix, project.Projects{p.Name: p}, createFn); err != nil {
return err
}
return nil
@@ -128,53 +127,53 @@
// checkSnapshotDir makes sure that he local snapshot directory exists
// and is initialized properly.
-func checkSnapshotDir(ctx *tool.Context) (e error) {
+func checkSnapshotDir(jirix *jiri.X) (e error) {
snapshotDir, err := getSnapshotDir()
if err != nil {
return err
}
- if _, err := ctx.Run().Stat(snapshotDir); err != nil {
+ if _, err := jirix.Run().Stat(snapshotDir); err != nil {
if !os.IsNotExist(err) {
return err
}
if remoteFlag {
- if err := ctx.Run().MkdirAll(snapshotDir, 0755); err != nil {
+ if err := jirix.Run().MkdirAll(snapshotDir, 0755); err != nil {
return err
}
return nil
}
createFn := func() (err error) {
- if err := ctx.Run().MkdirAll(snapshotDir, 0755); err != nil {
+ if err := jirix.Run().MkdirAll(snapshotDir, 0755); err != nil {
return err
}
- if err := ctx.Git().Init(snapshotDir); err != nil {
+ if err := jirix.Git().Init(snapshotDir); err != nil {
return err
}
cwd, err := os.Getwd()
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
- if err := ctx.Run().Chdir(snapshotDir); err != nil {
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
+ if err := jirix.Run().Chdir(snapshotDir); err != nil {
return err
}
- if err := ctx.Git().Commit(); err != nil {
+ if err := jirix.Git().Commit(); err != nil {
return err
}
return nil
}
if err := createFn(); err != nil {
- ctx.Run().RemoveAll(snapshotDir)
+ jirix.Run().RemoveAll(snapshotDir)
return err
}
}
return nil
}
-func createSnapshot(ctx *tool.Context, snapshotDir, snapshotFile, label string) error {
+func createSnapshot(jirix *jiri.X, snapshotDir, snapshotFile, label string) error {
// Create a snapshot that encodes the current state of master
// branches for all local projects.
- if err := project.CreateSnapshot(ctx, snapshotFile); err != nil {
+ if err := project.CreateSnapshot(jirix, snapshotFile); err != nil {
return err
}
@@ -182,19 +181,19 @@
// latest snapshot.
symlink := filepath.Join(snapshotDir, label)
newSymlink := symlink + ".new"
- if err := ctx.Run().RemoveAll(newSymlink); err != nil {
+ if err := jirix.Run().RemoveAll(newSymlink); err != nil {
return err
}
relativeSnapshotPath := strings.TrimPrefix(snapshotFile, snapshotDir+string(os.PathSeparator))
- if err := ctx.Run().Symlink(relativeSnapshotPath, newSymlink); err != nil {
+ if err := jirix.Run().Symlink(relativeSnapshotPath, newSymlink); err != nil {
return err
}
- if err := ctx.Run().Rename(newSymlink, symlink); err != nil {
+ if err := jirix.Run().Rename(newSymlink, symlink); err != nil {
return err
}
// Revision the changes.
- if err := revisionChanges(ctx, snapshotDir, snapshotFile, label); err != nil {
+ if err := revisionChanges(jirix, snapshotDir, snapshotFile, label); err != nil {
return err
}
return nil
@@ -220,28 +219,28 @@
// revisionChanges commits changes identified by the given manifest
// file and label to the manifest repository and (if applicable)
// pushes these changes to the remote repository.
-func revisionChanges(ctx *tool.Context, snapshotDir, snapshotFile, label string) (e error) {
+func revisionChanges(jirix *jiri.X, snapshotDir, snapshotFile, label string) (e error) {
cwd, err := os.Getwd()
if err != nil {
return err
}
- defer collect.Error(func() error { return ctx.Run().Chdir(cwd) }, &e)
- if err := ctx.Run().Chdir(snapshotDir); err != nil {
+ defer collect.Error(func() error { return jirix.Run().Chdir(cwd) }, &e)
+ if err := jirix.Run().Chdir(snapshotDir); err != nil {
return err
}
relativeSnapshotPath := strings.TrimPrefix(snapshotFile, snapshotDir+string(os.PathSeparator))
- if err := ctx.Git().Add(relativeSnapshotPath); err != nil {
+ if err := jirix.Git().Add(relativeSnapshotPath); err != nil {
return err
}
- if err := ctx.Git().Add(label); err != nil {
+ if err := jirix.Git().Add(label); err != nil {
return err
}
name := strings.TrimPrefix(snapshotFile, snapshotDir)
- if err := ctx.Git().CommitWithMessage(fmt.Sprintf("adding snapshot %q for label %q", name, label)); err != nil {
+ if err := jirix.Git().CommitWithMessage(fmt.Sprintf("adding snapshot %q for label %q", name, label)); err != nil {
return err
}
if remoteFlag {
- if err := ctx.Git().Push("origin", "master", gitutil.VerifyOpt(false)); err != nil {
+ if err := jirix.Git().Push("origin", "master", gitutil.VerifyOpt(false)); err != nil {
return err
}
}
@@ -250,7 +249,7 @@
// cmdSnapshotList represents the "jiri snapshot list" command.
var cmdSnapshotList = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runSnapshotList),
+ Runner: jiri.RunnerFunc(runSnapshotList),
Name: "list",
Short: "List existing project snapshots",
Long: `
@@ -262,9 +261,8 @@
ArgsLong: "<label ...> is a list of snapshot labels.",
}
-func runSnapshotList(env *cmdline.Env, args []string) error {
- ctx := tool.NewContextFromEnv(env)
- if err := checkSnapshotDir(ctx); err != nil {
+func runSnapshotList(jirix *jiri.X, args []string) error {
+ if err := checkSnapshotDir(jirix); err != nil {
return err
}
@@ -300,12 +298,12 @@
failed := false
for _, label := range args {
labelDir := filepath.Join(snapshotDir, "labels", label)
- if _, err := ctx.Run().Stat(labelDir); err != nil {
+ if _, err := jirix.Run().Stat(labelDir); err != nil {
if !os.IsNotExist(err) {
return err
}
failed = true
- fmt.Fprintf(env.Stderr, "snapshot label %q not found", label)
+ fmt.Fprintf(jirix.Stderr(), "snapshot label %q not found", label)
}
}
if failed {
@@ -322,9 +320,9 @@
if err != nil {
return fmt.Errorf("ReadDir(%v) failed: %v", labelDir, err)
}
- fmt.Fprintf(env.Stdout, "snapshots of label %q:\n", label)
+ fmt.Fprintf(jirix.Stdout(), "snapshots of label %q:\n", label)
for _, fileInfo := range fileInfoList {
- fmt.Fprintf(env.Stdout, " %v\n", fileInfo.Name())
+ fmt.Fprintf(jirix.Stdout(), " %v\n", fileInfo.Name())
}
}
return nil
diff --git a/snapshot_test.go b/snapshot_test.go
index fe54d1d..bb97ed9 100644
--- a/snapshot_test.go
+++ b/snapshot_test.go
@@ -11,14 +11,14 @@
"path/filepath"
"testing"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/tool"
- "v.io/x/lib/cmdline"
)
-func createLabelDir(t *testing.T, ctx *tool.Context, snapshotDir, name string, snapshots []string) {
+func createLabelDir(t *testing.T, jirix *jiri.X, snapshotDir, name string, snapshots []string) {
labelDir, perm := filepath.Join(snapshotDir, "labels", name), os.FileMode(0700)
- if err := ctx.Run().MkdirAll(labelDir, perm); err != nil {
+ if err := jirix.Run().MkdirAll(labelDir, perm); err != nil {
t.Fatalf("MkdirAll(%v, %v) failed: %v", labelDir, perm, err)
}
for i, snapshot := range snapshots {
@@ -29,7 +29,7 @@
}
if i == 0 {
symlinkPath := filepath.Join(snapshotDir, name)
- if err := ctx.Run().Symlink(path, symlinkPath); err != nil {
+ if err := jirix.Run().Symlink(path, symlinkPath); err != nil {
t.Fatalf("Symlink(%v, %v) failed: %v", path, symlinkPath, err)
}
}
@@ -58,15 +58,13 @@
}
func TestList(t *testing.T) {
- ctx := tool.NewDefaultContext()
-
// Setup a fake JIRI_ROOT.
- root, err := project.NewFakeJiriRoot(ctx)
+ root, err := project.NewFakeJiriRoot()
if err != nil {
t.Fatalf("%v", err)
}
defer func() {
- if err := root.Cleanup(ctx); err != nil {
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}()
@@ -112,17 +110,14 @@
// Create the snapshots directory and populate it with the
// data specified by the test suite.
for _, label := range labels {
- createLabelDir(t, ctx, test.dir, label.name, label.snapshots)
+ createLabelDir(t, root.X, test.dir, label.name, label.snapshots)
}
// Check that running "jiri snapshot list" with no arguments
// returns the expected output.
var stdout bytes.Buffer
- env := &cmdline.Env{Stdout: &stdout}
- if err != nil {
- t.Fatalf("%v", err)
- }
- if err := runSnapshotList(env, nil); err != nil {
+ root.X.Context = tool.NewContext(tool.ContextOpts{Stdout: &stdout})
+ if err := runSnapshotList(root.X, nil); err != nil {
t.Fatalf("%v", err)
}
got, want := stdout.String(), generateOutput(labels)
@@ -133,7 +128,7 @@
// Check that running "jiri snapshot list" with one argument
// returns the expected output.
stdout.Reset()
- if err := runSnapshotList(env, []string{"stable"}); err != nil {
+ if err := runSnapshotList(root.X, []string{"stable"}); err != nil {
t.Fatalf("%v", err)
}
got, want = stdout.String(), generateOutput(labels[1:])
@@ -144,7 +139,7 @@
// Check that running "jiri snapshot list" with
// multiple arguments returns the expected output.
stdout.Reset()
- if err := runSnapshotList(env, []string{"beta", "stable"}); err != nil {
+ if err := runSnapshotList(root.X, []string{"beta", "stable"}); err != nil {
t.Fatalf("%v", err)
}
got, want = stdout.String(), generateOutput(labels)
@@ -154,12 +149,12 @@
}
}
-func checkReadme(t *testing.T, ctx *tool.Context, project, message string) {
- if _, err := ctx.Run().Stat(project); err != nil {
+func checkReadme(t *testing.T, jirix *jiri.X, project, message string) {
+ if _, err := jirix.Run().Stat(project); err != nil {
t.Fatalf("%v", err)
}
readmeFile := filepath.Join(project, "README")
- data, err := ctx.Run().ReadFile(readmeFile)
+ data, err := jirix.Run().ReadFile(readmeFile)
if err != nil {
t.Fatalf("%v", err)
}
@@ -176,34 +171,32 @@
return "test-remote-project-" + fmt.Sprintf("%d", i+1)
}
-func writeReadme(t *testing.T, ctx *tool.Context, projectDir, message string) {
+func writeReadme(t *testing.T, jirix *jiri.X, projectDir, message string) {
path, perm := filepath.Join(projectDir, "README"), os.FileMode(0644)
- if err := ctx.Run().WriteFile(path, []byte(message), perm); err != nil {
+ if err := jirix.Run().WriteFile(path, []byte(message), perm); err != nil {
t.Fatalf("%v", err)
}
cwd, err := os.Getwd()
if err != nil {
t.Fatalf("%v", err)
}
- defer ctx.Run().Chdir(cwd)
- if err := ctx.Run().Chdir(projectDir); err != nil {
+ defer jirix.Run().Chdir(cwd)
+ if err := jirix.Run().Chdir(projectDir); err != nil {
t.Fatalf("%v", err)
}
- if err := ctx.Git().CommitFile(path, "creating README"); err != nil {
+ if err := jirix.Git().CommitFile(path, "creating README"); err != nil {
t.Fatalf("%v", err)
}
}
func TestCreate(t *testing.T) {
- ctx := tool.NewDefaultContext()
-
// Setup a fake JIRI_ROOT instance.
- root, err := project.NewFakeJiriRoot(ctx)
+ root, err := project.NewFakeJiriRoot()
if err != nil {
t.Fatalf("%v", err)
}
defer func() {
- if err := root.Cleanup(ctx); err != nil {
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}()
@@ -211,10 +204,10 @@
// Setup the initial remote and local projects.
numProjects, remoteProjects := 2, []string{}
for i := 0; i < numProjects; i++ {
- if err := root.CreateRemoteProject(ctx, remoteProjectName(i)); err != nil {
+ if err := root.CreateRemoteProject(remoteProjectName(i)); err != nil {
t.Fatalf("%v", err)
}
- if err := root.AddProject(ctx, project.Project{
+ if err := root.AddProject(project.Project{
Name: remoteProjectName(i),
Path: localProjectName(i),
Remote: root.Projects[remoteProjectName(i)],
@@ -233,24 +226,24 @@
// Create initial commits in the remote projects and use
// UpdateUniverse() to mirror them locally.
for i := 0; i < numProjects; i++ {
- writeReadme(t, ctx, root.Projects[remoteProjectName(i)], "revision 1")
+ writeReadme(t, root.X, root.Projects[remoteProjectName(i)], "revision 1")
}
- if err := project.UpdateUniverse(ctx, true); err != nil {
+ if err := project.UpdateUniverse(root.X, true); err != nil {
t.Fatalf("%v", err)
}
// Create a local snapshot.
var stdout bytes.Buffer
- env := &cmdline.Env{Stdout: &stdout}
+ root.X.Context = tool.NewContext(tool.ContextOpts{Stdout: &stdout})
remoteFlag = false
- if err := runSnapshotCreate(env, []string{"test-local"}); err != nil {
+ if err := runSnapshotCreate(root.X, []string{"test-local"}); err != nil {
t.Fatalf("%v", err)
}
// Remove the local project repositories.
for i, _ := range remoteProjects {
localProject := filepath.Join(root.Dir, localProjectName(i))
- if err := ctx.Run().RemoveAll(localProject); err != nil {
+ if err := root.X.Run().RemoveAll(localProject); err != nil {
t.Fatalf("%v", err)
}
}
@@ -262,28 +255,28 @@
t.Fatalf("%v", err)
}
snapshotFile := filepath.Join(snapshotDir, "test-local")
- localCtx := ctx.Clone(tool.ContextOpts{
+ localX := root.X.Clone(tool.ContextOpts{
Manifest: &snapshotFile,
})
- if err := project.UpdateUniverse(localCtx, true); err != nil {
+ if err := project.UpdateUniverse(localX, true); err != nil {
t.Fatalf("%v", err)
}
for i, _ := range remoteProjects {
localProject := filepath.Join(root.Dir, localProjectName(i))
- checkReadme(t, ctx, localProject, "revision 1")
+ checkReadme(t, root.X, localProject, "revision 1")
}
// Create a remote snapshot.
remoteFlag = true
- root.EnableRemoteManifestPush(ctx)
- if err := runSnapshotCreate(env, []string{"test-remote"}); err != nil {
+ root.EnableRemoteManifestPush()
+ if err := runSnapshotCreate(root.X, []string{"test-remote"}); err != nil {
t.Fatalf("%v", err)
}
// Remove the local project repositories.
for i, _ := range remoteProjects {
localProject := filepath.Join(root.Dir, localProjectName(i))
- if err := ctx.Run().RemoveAll(localProject); err != nil {
+ if err := root.X.Run().RemoveAll(localProject); err != nil {
t.Fatalf("%v", err)
}
}
@@ -291,14 +284,14 @@
// Check that invoking the UpdateUniverse() with the remote snapshot
// restores the local repositories.
manifest := "snapshot/test-remote"
- remoteCtx := ctx.Clone(tool.ContextOpts{
+ remoteX := root.X.Clone(tool.ContextOpts{
Manifest: &manifest,
})
- if err := project.UpdateUniverse(remoteCtx, true); err != nil {
+ if err := project.UpdateUniverse(remoteX, true); err != nil {
t.Fatalf("%v", err)
}
for i, _ := range remoteProjects {
localProject := filepath.Join(root.Dir, localProjectName(i))
- checkReadme(t, ctx, localProject, "revision 1")
+ checkReadme(t, root.X, localProject, "revision 1")
}
}
diff --git a/update.go b/update.go
index 5576500..ab1f60d 100644
--- a/update.go
+++ b/update.go
@@ -8,6 +8,7 @@
"path/filepath"
"time"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/retry"
"v.io/jiri/tool"
@@ -28,7 +29,7 @@
// cmdUpdate represents the "jiri update" command.
var cmdUpdate = &cmdline.Command{
- Runner: cmdline.RunnerFunc(runUpdate),
+ Runner: jiri.RunnerFunc(runUpdate),
Name: "update",
Short: "Update all jiri tools and projects",
Long: `
@@ -42,9 +43,7 @@
`,
}
-func runUpdate(env *cmdline.Env, _ []string) error {
- ctx := tool.NewContextFromEnv(env)
-
+func runUpdate(jirix *jiri.X, _ []string) error {
// Create a snapshot of the current state of all projects and
// write it to the $JIRI_ROOT/.update_history folder.
root, err := project.JiriRoot()
@@ -52,14 +51,14 @@
return err
}
snapshotFile := filepath.Join(root, ".update_history", time.Now().Format(time.RFC3339))
- if err := project.CreateSnapshot(ctx, snapshotFile); err != nil {
+ if err := project.CreateSnapshot(jirix, snapshotFile); err != nil {
return err
}
// Update all projects to their latest version.
// Attempt <attemptsFlag> times before failing.
updateFn := func() error {
- return project.UpdateUniverse(ctx, gcFlag)
+ return project.UpdateUniverse(jirix, gcFlag)
}
- return retry.Function(ctx, updateFn, retry.AttemptsOpt(attemptsFlag))
+ return retry.Function(jirix.Context, updateFn, retry.AttemptsOpt(attemptsFlag))
}
diff --git a/util/config.go b/util/config.go
index 84249cd..9268b83 100644
--- a/util/config.go
+++ b/util/config.go
@@ -11,7 +11,7 @@
"path/filepath"
"sort"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
"v.io/x/lib/set"
)
@@ -282,16 +282,16 @@
// LoadConfig returns the configuration stored in the tools
// configuration file.
-func LoadConfig(ctx *tool.Context) (*Config, error) {
- configPath, err := ConfigFilePath(ctx)
+func LoadConfig(jirix *jiri.X) (*Config, error) {
+ configPath, err := ConfigFilePath(jirix)
if err != nil {
return nil, err
}
- return loadConfig(ctx, configPath)
+ return loadConfig(jirix, configPath)
}
-func loadConfig(ctx *tool.Context, path string) (*Config, error) {
- configBytes, err := ctx.Run().ReadFile(path)
+func loadConfig(jirix *jiri.X, path string) (*Config, error) {
+ configBytes, err := jirix.Run().ReadFile(path)
if err != nil {
return nil, err
}
@@ -340,15 +340,15 @@
// SaveConfig writes the given configuration to the tools
// configuration file.
-func SaveConfig(ctx *tool.Context, config *Config) error {
- configPath, err := ConfigFilePath(ctx)
+func SaveConfig(jirix *jiri.X, config *Config) error {
+ configPath, err := ConfigFilePath(jirix)
if err != nil {
return err
}
- return saveConfig(ctx, config, configPath)
+ return saveConfig(jirix, config, configPath)
}
-func saveConfig(ctx *tool.Context, config *Config, path string) error {
+func saveConfig(jirix *jiri.X, config *Config, path string) error {
var data configSchema
data.APICheckProjects = set.String.ToSlice(config.apiCheckProjects)
sort.Strings(data.APICheckProjects)
@@ -398,10 +398,10 @@
if err != nil {
return fmt.Errorf("MarshalIndent(%v) failed: %v", data, err)
}
- if err := ctx.Run().MkdirAll(filepath.Dir(path), os.FileMode(0755)); err != nil {
+ if err := jirix.Run().MkdirAll(filepath.Dir(path), os.FileMode(0755)); err != nil {
return err
}
- if err := ctx.Run().WriteFile(path, bytes, os.FileMode(0644)); err != nil {
+ if err := jirix.Run().WriteFile(path, bytes, os.FileMode(0644)); err != nil {
return err
}
return nil
diff --git a/util/config_test.go b/util/config_test.go
index bf99242..87204f5 100644
--- a/util/config_test.go
+++ b/util/config_test.go
@@ -10,7 +10,6 @@
"testing"
"v.io/jiri/project"
- "v.io/jiri/tool"
)
var (
@@ -112,14 +111,12 @@
}
func TestConfigSerialization(t *testing.T) {
- ctx := tool.NewDefaultContext()
-
- root, err := project.NewFakeJiriRoot(ctx)
+ root, err := project.NewFakeJiriRoot()
if err != nil {
t.Fatalf("%v", err)
}
defer func() {
- if err := root.Cleanup(ctx); err != nil {
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}()
@@ -141,10 +138,10 @@
VDLWorkspacesOpt(vdlWorkspaces),
)
- if err := SaveConfig(ctx, config); err != nil {
+ if err := SaveConfig(root.X, config); err != nil {
t.Fatalf("%v", err)
}
- gotConfig, err := LoadConfig(ctx)
+ gotConfig, err := LoadConfig(root.X)
if err != nil {
t.Fatalf("%v", err)
}
diff --git a/util/env_test.go b/util/env_test.go
index 47f47cb..5e2d0c4 100644
--- a/util/env_test.go
+++ b/util/env_test.go
@@ -17,14 +17,14 @@
// of the JIRI_ROOT environment variable as a path, evaluates any
// symlinks the path might contain, and returns the result.
func TestJiriRootSymlink(t *testing.T) {
- ctx := tool.NewDefaultContext()
+ jirix := tool.NewDefaultContext()
// Create a temporary directory.
- tmpDir, err := ctx.Run().TempDir("", "")
+ tmpDir, err := jirix.Run().TempDir("", "")
if err != nil {
t.Fatalf("TempDir() failed: %v", err)
}
- defer ctx.Run().RemoveAll(tmpDir)
+ defer jirix.Run().RemoveAll(tmpDir)
// Make sure tmpDir is not a symlink itself.
tmpDir, err = filepath.EvalSymlinks(tmpDir)
@@ -34,11 +34,11 @@
// Create a directory and a symlink to it.
root, perm := filepath.Join(tmpDir, "root"), os.FileMode(0700)
- if err := ctx.Run().MkdirAll(root, perm); err != nil {
+ if err := jirix.Run().MkdirAll(root, perm); err != nil {
t.Fatalf("%v", err)
}
symRoot := filepath.Join(tmpDir, "sym_root")
- if err := ctx.Run().Symlink(root, symRoot); err != nil {
+ if err := jirix.Run().Symlink(root, symRoot); err != nil {
t.Fatalf("%v", err)
}
diff --git a/util/oncall.go b/util/oncall.go
index 643d968..4cab5a9 100644
--- a/util/oncall.go
+++ b/util/oncall.go
@@ -10,7 +10,7 @@
"io/ioutil"
"time"
- "v.io/jiri/tool"
+ "v.io/jiri/jiri"
)
type OncallRotation struct {
@@ -25,8 +25,8 @@
}
// LoadOncallRotation parses the default oncall schedule file.
-func LoadOncallRotation(ctx *tool.Context) (*OncallRotation, error) {
- oncallRotationsFile, err := OncallRotationPath(ctx)
+func LoadOncallRotation(jirix *jiri.X) (*OncallRotation, error) {
+ oncallRotationsFile, err := OncallRotationPath(jirix)
if err != nil {
return nil, err
}
@@ -43,9 +43,9 @@
// Oncall finds the oncall shift at the given time from the
// oncall configuration file by comparing timestamps.
-func Oncall(ctx *tool.Context, targetTime time.Time) (*OncallShift, error) {
+func Oncall(jirix *jiri.X, targetTime time.Time) (*OncallShift, error) {
// Parse oncall configuration file.
- rotation, err := LoadOncallRotation(ctx)
+ rotation, err := LoadOncallRotation(jirix)
if err != nil {
return nil, err
}
diff --git a/util/oncall_test.go b/util/oncall_test.go
index 32536a4..85b0d39 100644
--- a/util/oncall_test.go
+++ b/util/oncall_test.go
@@ -12,11 +12,11 @@
"testing"
"time"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
- "v.io/jiri/tool"
)
-func createOncallFile(t *testing.T, ctx *tool.Context) {
+func createOncallFile(t *testing.T, jirix *jiri.X) {
content := `<?xml version="1.0" ?>
<rotation>
<shift>
@@ -35,13 +35,13 @@
<startDate>Nov 19, 2014 12:00:00 PM</startDate>
</shift>
</rotation>`
- oncallRotationsFile, err := OncallRotationPath(ctx)
+ oncallRotationsFile, err := OncallRotationPath(jirix)
if err != nil {
t.Fatalf("%v", err)
}
dir := filepath.Dir(oncallRotationsFile)
dirMode := os.FileMode(0700)
- if err := ctx.Run().MkdirAll(dir, dirMode); err != nil {
+ if err := jirix.Run().MkdirAll(dir, dirMode); err != nil {
t.Fatalf("MkdirAll(%q, %v) failed: %v", dir, dirMode, err)
}
fileMode := os.FileMode(0644)
@@ -51,13 +51,12 @@
}
func TestOncall(t *testing.T) {
- ctx := tool.NewDefaultContext()
- root, err := project.NewFakeJiriRoot(ctx)
+ root, err := project.NewFakeJiriRoot()
if err != nil {
t.Fatalf("%v", err)
}
defer func() {
- if err := root.Cleanup(ctx); err != nil {
+ if err := root.Cleanup(); err != nil {
t.Fatalf("%v", err)
}
}()
@@ -71,7 +70,7 @@
defer os.Setenv("JIRI_ROOT", oldRoot)
// Create a oncall.v1.xml file.
- createOncallFile(t, ctx)
+ createOncallFile(t, root.X)
type testCase struct {
targetTime time.Time
expectedShift *OncallShift
@@ -107,7 +106,7 @@
},
}
for _, test := range testCases {
- got, err := Oncall(ctx, test.targetTime)
+ got, err := Oncall(root.X, test.targetTime)
if err != nil {
t.Fatalf("want no errors, got: %v", err)
}
diff --git a/util/paths.go b/util/paths.go
index e0f2893..a68d10d 100644
--- a/util/paths.go
+++ b/util/paths.go
@@ -10,14 +10,15 @@
"path/filepath"
"runtime"
+ "v.io/jiri/jiri"
"v.io/jiri/project"
"v.io/jiri/tool"
"v.io/x/lib/host"
)
// ConfigFilePath returns the path to the tools configuration file.
-func ConfigFilePath(ctx *tool.Context) (string, error) {
- dataDir, err := project.DataDirPath(ctx, tool.Name)
+func ConfigFilePath(jirix *jiri.X) (string, error) {
+ dataDir, err := project.DataDirPath(jirix, tool.Name)
if err != nil {
return "", err
}
@@ -25,8 +26,8 @@
}
// OncallRotationPath returns the path to the oncall rotation file.
-func OncallRotationPath(ctx *tool.Context) (string, error) {
- dataDir, err := project.DataDirPath(ctx, tool.Name)
+func OncallRotationPath(jirix *jiri.X) (string, error) {
+ dataDir, err := project.DataDirPath(jirix, tool.Name)
if err != nil {
return "", err
}