Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: go/src/infra/tools/cipd/apps/cipd/main.go

Issue 1358533003: cipd: Implement 'init', 'install' and 'installed' subcommands. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /* 5 /*
6 Client side of for Chrome Infra Package Deployer. 6 Client side of for Chrome Infra Package Deployer.
7 7
8 TODO: write more. 8 TODO: write more.
9 9
10 Subcommand starting with 'pkg-' are low level commands operating on package 10 Subcommand starting with 'pkg-' are low level commands operating on package
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 // init initializes subcommand state (including global logger). It ensures all 60 // init initializes subcommand state (including global logger). It ensures all
61 // required positional and flag-like parameters are set. Returns true if they 61 // required positional and flag-like parameters are set. Returns true if they
62 // are, or false (and prints to stderr) if not. 62 // are, or false (and prints to stderr) if not.
63 func (c *Subcommand) init(args []string, minPosCount, maxPosCount int) bool { 63 func (c *Subcommand) init(args []string, minPosCount, maxPosCount int) bool {
64 // Check number of expected positional arguments. 64 // Check number of expected positional arguments.
65 if maxPosCount == 0 && len(args) != 0 { 65 if maxPosCount == 0 && len(args) != 0 {
66 c.printError(makeCLIError("unexpected arguments %v", args)) 66 c.printError(makeCLIError("unexpected arguments %v", args))
67 return false 67 return false
68 } 68 }
69 » if len(args) < minPosCount || len(args) > maxPosCount { 69 » if len(args) < minPosCount || (maxPosCount >= 0 && len(args) > maxPosCou nt) {
70 var err error 70 var err error
71 if minPosCount == maxPosCount { 71 if minPosCount == maxPosCount {
72 err = makeCLIError("expecting %d positional argument, go t %d instead", minPosCount, len(args)) 72 err = makeCLIError("expecting %d positional argument, go t %d instead", minPosCount, len(args))
73 } else { 73 } else {
74 » » » err = makeCLIError( 74 » » » if maxPosCount >= 0 {
75 » » » » "expecting from %d to %d positional arguments, g ot %d instead", 75 » » » » err = makeCLIError(
76 » » » » minPosCount, maxPosCount, len(args)) 76 » » » » » "expecting from %d to %d positional argu ments, got %d instead",
77 » » » » » minPosCount, maxPosCount, len(args))
78 » » » } else {
79 » » » » err = makeCLIError(
80 » » » » » "expecting at least %d positional argume nts, got %d instead",
81 » » » » » minPosCount, len(args))
82 » » » }
77 } 83 }
78 c.printError(err) 84 c.printError(err)
79 return false 85 return false
80 } 86 }
81 87
82 // Check required unset flags. 88 // Check required unset flags.
83 unset := []*flag.Flag{} 89 unset := []*flag.Flag{}
84 c.Flags.VisitAll(func(f *flag.Flag) { 90 c.Flags.VisitAll(func(f *flag.Flag) {
85 if strings.HasPrefix(f.DefValue, "<") && f.Value.String() == f.D efValue { 91 if strings.HasPrefix(f.DefValue, "<") && f.Value.String() == f.D efValue {
86 unset = append(unset, f) 92 unset = append(unset, f)
(...skipping 20 matching lines...) Expand all
107 log = loggerConfig.Get() 113 log = loggerConfig.Get()
108 return true 114 return true
109 } 115 }
110 116
111 // printError prints error to stderr (recognizing commandLineError). 117 // printError prints error to stderr (recognizing commandLineError).
112 func (c *Subcommand) printError(err error) { 118 func (c *Subcommand) printError(err error) {
113 if _, ok := err.(commandLineError); ok { 119 if _, ok := err.(commandLineError); ok {
114 fmt.Fprintf(os.Stderr, "Bad command line: %s.\n\n", err) 120 fmt.Fprintf(os.Stderr, "Bad command line: %s.\n\n", err)
115 c.Flags.Usage() 121 c.Flags.Usage()
116 } else { 122 } else {
117 » » fmt.Fprintln(os.Stderr, err) 123 » » fmt.Fprintf(os.Stderr, "Error: %s.\n", err)
118 } 124 }
119 } 125 }
120 126
121 // writeJSONOutput writes result to JSON output file. It returns original error 127 // writeJSONOutput writes result to JSON output file. It returns original error
122 // if it is non-nil. 128 // if it is non-nil.
123 func (c *Subcommand) writeJSONOutput(result interface{}, err error) error { 129 func (c *Subcommand) writeJSONOutput(result interface{}, err error) error {
124 // -json-output flag wasn't specified. 130 // -json-output flag wasn't specified.
125 if c.jsonOutput == "" { 131 if c.jsonOutput == "" {
126 return err 132 return err
127 } 133 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 // process exit code. 169 // process exit code.
164 func (c *Subcommand) done(result interface{}, err error) int { 170 func (c *Subcommand) done(result interface{}, err error) int {
165 err = c.writeJSONOutput(result, err) 171 err = c.writeJSONOutput(result, err)
166 if err != nil { 172 if err != nil {
167 c.printError(err) 173 c.printError(err)
168 return 1 174 return 1
169 } 175 }
170 return 0 176 return 0
171 } 177 }
172 178
179 // doneWithPins is a handy shortcut that prints array of pinOrError and deduces
nodir 2015/09/21 22:26:59 it is a slice, but whatever
Vadim Sh. 2015/09/29 01:43:34 renamed to "list"
180 // process exit code based on presence of errors there.
181 func (c *Subcommand) doneWithPins(pins []pinOrError, err error) int {
182 if len(pins) == 0 {
183 fmt.Println("No packages.")
184 } else {
185 printPinsAndError(pins)
186 }
187 ret := c.done(pins, err)
188 if hasErrors(pins) && ret == 0 {
189 return 1
190 }
191 return ret
192 }
193
173 // commandLineError is used to tag errors related to CLI. 194 // commandLineError is used to tag errors related to CLI.
174 type commandLineError struct { 195 type commandLineError struct {
175 error 196 error
176 } 197 }
177 198
178 // makeCLIError returns new commandLineError. 199 // makeCLIError returns new commandLineError.
179 func makeCLIError(msg string, args ...interface{}) error { 200 func makeCLIError(msg string, args ...interface{}) error {
180 return commandLineError{fmt.Errorf(msg, args...)} 201 return commandLineError{fmt.Errorf(msg, args...)}
181 } 202 }
182 203
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 // batchOperation defines what to do with a packages matching a prefix. 437 // batchOperation defines what to do with a packages matching a prefix.
417 type batchOperation struct { 438 type batchOperation struct {
418 client cipd.Client 439 client cipd.Client
419 packagePrefix string // a package name or a prefix 440 packagePrefix string // a package name or a prefix
420 packages []string // packages to operate on, overrides packagePrefi x 441 packages []string // packages to operate on, overrides packagePrefi x
421 callback func(pkg string) (common.Pin, error) 442 callback func(pkg string) (common.Pin, error)
422 } 443 }
423 444
424 // pinOrError is passed through channels and also dumped to JSON results file. 445 // pinOrError is passed through channels and also dumped to JSON results file.
425 type pinOrError struct { 446 type pinOrError struct {
426 » Pkg string `json:"package"` 447 » Pkg string `json:"package"`
427 » Pin *common.Pin `json:"pin,omitempty"` 448 » Pin *common.Pin `json:"pin,omitempty"`
428 » Err string `json:"error,omitempty"` 449 » Err string `json:"error,omitempty"`
450 » Tracking string `json:"tracking,omitempty"`
429 } 451 }
430 452
431 // expandPkgDir takes a package name or '<prefix>/' and returns a list 453 // expandPkgDir takes a package name or '<prefix>/' and returns a list
432 // of matching packages (asking backend if necessary). Doesn't recurse, returns 454 // of matching packages (asking backend if necessary). Doesn't recurse, returns
433 // only direct children. 455 // only direct children.
434 func expandPkgDir(c cipd.Client, packagePrefix string) ([]string, error) { 456 func expandPkgDir(c cipd.Client, packagePrefix string) ([]string, error) {
435 if !strings.HasSuffix(packagePrefix, "/") { 457 if !strings.HasSuffix(packagePrefix, "/") {
436 return []string{packagePrefix}, nil 458 return []string{packagePrefix}, nil
437 } 459 }
438 pkgs, err := c.ListPackages(packagePrefix, false) 460 pkgs, err := c.ListPackages(packagePrefix, false)
(...skipping 20 matching lines...) Expand all
459 if len(pkgs) == 0 { 481 if len(pkgs) == 0 {
460 var err error 482 var err error
461 pkgs, err = expandPkgDir(op.client, op.packagePrefix) 483 pkgs, err = expandPkgDir(op.client, op.packagePrefix)
462 if err != nil { 484 if err != nil {
463 return nil, err 485 return nil, err
464 } 486 }
465 } 487 }
466 return callConcurrently(pkgs, func(pkg string) pinOrError { 488 return callConcurrently(pkgs, func(pkg string) pinOrError {
467 pin, err := op.callback(pkg) 489 pin, err := op.callback(pkg)
468 if err != nil { 490 if err != nil {
469 » » » return pinOrError{pkg, nil, err.Error()} 491 » » » return pinOrError{pkg, nil, err.Error(), ""}
470 } 492 }
471 » » return pinOrError{pkg, &pin, ""} 493 » » return pinOrError{pkg, &pin, "", ""}
472 }), nil 494 }), nil
473 } 495 }
474 496
475 func callConcurrently(pkgs []string, callback func(pkg string) pinOrError) []pin OrError { 497 func callConcurrently(pkgs []string, callback func(pkg string) pinOrError) []pin OrError {
476 // Push index through channel to make results ordered as 'pkgs'. 498 // Push index through channel to make results ordered as 'pkgs'.
477 ch := make(chan struct { 499 ch := make(chan struct {
478 int 500 int
479 pinOrError 501 pinOrError
480 }) 502 })
481 for idx, pkg := range pkgs { 503 for idx, pkg := range pkgs {
482 go func(idx int, pkg string) { 504 go func(idx int, pkg string) {
483 ch <- struct { 505 ch <- struct {
484 int 506 int
485 pinOrError 507 pinOrError
486 }{idx, callback(pkg)} 508 }{idx, callback(pkg)}
487 }(idx, pkg) 509 }(idx, pkg)
488 } 510 }
489 pins := make([]pinOrError, len(pkgs)) 511 pins := make([]pinOrError, len(pkgs))
490 for i := 0; i < len(pkgs); i++ { 512 for i := 0; i < len(pkgs); i++ {
491 res := <-ch 513 res := <-ch
492 pins[res.int] = res.pinOrError 514 pins[res.int] = res.pinOrError
493 } 515 }
494 return pins 516 return pins
495 } 517 }
496 518
497 func printPinsAndError(pins []pinOrError) { 519 func printPinsAndError(pins []pinOrError) {
498 hasPins := false 520 hasPins := false
499 hasErrors := false 521 hasErrors := false
500 for _, p := range pins { 522 for _, p := range pins {
501 » » if p.Err == "" { 523 » » if p.Err != "" {
524 » » » hasErrors = true
525 » » } else if p.Pin != nil {
502 hasPins = true 526 hasPins = true
503 } else {
504 hasErrors = true
505 } 527 }
506 } 528 }
507 if hasPins { 529 if hasPins {
508 » » fmt.Println("Instances:") 530 » » fmt.Println("Packages:")
509 for _, p := range pins { 531 for _, p := range pins {
510 » » » if p.Err == "" { 532 » » » if p.Err != "" || p.Pin == nil {
533 » » » » continue
534 » » » }
535 » » » if p.Tracking == "" {
511 fmt.Printf(" %s\n", p.Pin) 536 fmt.Printf(" %s\n", p.Pin)
537 } else {
538 fmt.Printf(" %s (tracking %q)\n", p.Pin, p.Trac king)
512 } 539 }
513 } 540 }
514 } 541 }
515 if hasErrors { 542 if hasErrors {
516 fmt.Fprintln(os.Stderr, "Errors:") 543 fmt.Fprintln(os.Stderr, "Errors:")
517 for _, p := range pins { 544 for _, p := range pins {
518 if p.Err != "" { 545 if p.Err != "" {
519 » » » » fmt.Fprintf(os.Stderr, " %s\n", p.Err) 546 » » » » fmt.Fprintf(os.Stderr, " %s: %s.\n", p.Pkg, p.E rr)
520 } 547 }
521 } 548 }
522 } 549 }
523 } 550 }
524 551
525 func hasErrors(pins []pinOrError) bool { 552 func hasErrors(pins []pinOrError) bool {
526 for _, p := range pins { 553 for _, p := range pins {
527 if p.Err != "" { 554 if p.Err != "" {
528 return true 555 return true
529 } 556 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 } 606 }
580 return registerInstanceFile(f.Name(), refsOpts, tagsOpts, serviceOpts) 607 return registerInstanceFile(f.Name(), refsOpts, tagsOpts, serviceOpts)
581 } 608 }
582 609
583 //////////////////////////////////////////////////////////////////////////////// 610 ////////////////////////////////////////////////////////////////////////////////
584 // 'ensure' subcommand. 611 // 'ensure' subcommand.
585 612
586 var cmdEnsure = &subcommands.Command{ 613 var cmdEnsure = &subcommands.Command{
587 UsageLine: "ensure [options]", 614 UsageLine: "ensure [options]",
588 ShortDesc: "installs, removes and updates packages in one go", 615 ShortDesc: "installs, removes and updates packages in one go",
589 » LongDesc: "Installs, removes and updates packages in one go.", 616 » LongDesc: "Installs, removes and updates packages in one go.\n\n" +
617 » » "Supposed to be used from scripts and automation. Alternative to 'init', " +
618 » » "'install' and 'remove'. As such, it doesn't try to discover sit e root " +
619 » » "directory on its own.",
590 CommandRun: func() subcommands.CommandRun { 620 CommandRun: func() subcommands.CommandRun {
591 c := &ensureRun{} 621 c := &ensureRun{}
592 c.registerBaseFlags() 622 c.registerBaseFlags()
593 c.ServiceOptions.registerFlags(&c.Flags) 623 c.ServiceOptions.registerFlags(&c.Flags)
594 » » c.Flags.StringVar(&c.rootDir, "root", "<path>", "Path to a insta llation site root directory.") 624 » » c.Flags.StringVar(&c.rootDir, "root", "<path>", "Path to an inst allation site root directory.")
595 c.Flags.StringVar(&c.listFile, "list", "<path>", "A file with a list of '<package name> <version>' pairs.") 625 c.Flags.StringVar(&c.listFile, "list", "<path>", "A file with a list of '<package name> <version>' pairs.")
596 return c 626 return c
597 }, 627 },
598 } 628 }
599 629
600 type ensureRun struct { 630 type ensureRun struct {
601 Subcommand 631 Subcommand
602 ServiceOptions 632 ServiceOptions
603 633
604 rootDir string 634 rootDir string
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 Subcommand 682 Subcommand
653 ServiceOptions 683 ServiceOptions
654 684
655 version string 685 version string
656 } 686 }
657 687
658 func (c *resolveRun) Run(a subcommands.Application, args []string) int { 688 func (c *resolveRun) Run(a subcommands.Application, args []string) int {
659 if !c.init(args, 1, 1) { 689 if !c.init(args, 1, 1) {
660 return 1 690 return 1
661 } 691 }
662 » pins, err := resolveVersion(args[0], c.version, c.ServiceOptions) 692 » return c.doneWithPins(resolveVersion(args[0], c.version, c.ServiceOption s))
663 » printPinsAndError(pins)
664 » ret := c.done(pins, err)
665 » if hasErrors(pins) && ret == 0 {
666 » » return 1
667 » }
668 » return ret
669 } 693 }
670 694
671 func resolveVersion(packagePrefix, version string, serviceOpts ServiceOptions) ( []pinOrError, error) { 695 func resolveVersion(packagePrefix, version string, serviceOpts ServiceOptions) ( []pinOrError, error) {
672 client, err := serviceOpts.makeCipdClient("") 696 client, err := serviceOpts.makeCipdClient("")
673 if err != nil { 697 if err != nil {
674 return nil, err 698 return nil, err
675 } 699 }
676 return performBatchOperation(batchOperation{ 700 return performBatchOperation(batchOperation{
677 client: client, 701 client: client,
678 packagePrefix: packagePrefix, 702 packagePrefix: packagePrefix,
(...skipping 28 matching lines...) Expand all
707 version string 731 version string
708 } 732 }
709 733
710 func (c *setRefRun) Run(a subcommands.Application, args []string) int { 734 func (c *setRefRun) Run(a subcommands.Application, args []string) int {
711 if !c.init(args, 1, 1) { 735 if !c.init(args, 1, 1) {
712 return 1 736 return 1
713 } 737 }
714 if len(c.refs) == 0 { 738 if len(c.refs) == 0 {
715 return c.done(nil, makeCLIError("at least one -ref must be provi ded")) 739 return c.done(nil, makeCLIError("at least one -ref must be provi ded"))
716 } 740 }
717 » pins, err := setRef(args[0], c.version, c.RefsOptions, c.ServiceOptions) 741 » return c.doneWithPins(setRef(args[0], c.version, c.RefsOptions, c.Servic eOptions))
718 » printPinsAndError(pins)
719 » ret := c.done(pins, err)
720 » if hasErrors(pins) && ret == 0 {
721 » » return 1
722 » }
723 » return ret
724 } 742 }
725 743
726 func setRef(packagePrefix, version string, refsOpts RefsOptions, serviceOpts Ser viceOptions) ([]pinOrError, error) { 744 func setRef(packagePrefix, version string, refsOpts RefsOptions, serviceOpts Ser viceOptions) ([]pinOrError, error) {
727 client, err := serviceOpts.makeCipdClient("") 745 client, err := serviceOpts.makeCipdClient("")
728 if err != nil { 746 if err != nil {
729 return nil, err 747 return nil, err
730 } 748 }
731 749
732 // Do not touch anything if some packages do not have requested version. So 750 // Do not touch anything if some packages do not have requested version. So
733 // resolve versions first and only then move refs. 751 // resolve versions first and only then move refs.
734 pins, err := performBatchOperation(batchOperation{ 752 pins, err := performBatchOperation(batchOperation{
735 client: client, 753 client: client,
736 packagePrefix: packagePrefix, 754 packagePrefix: packagePrefix,
737 callback: func(pkg string) (common.Pin, error) { 755 callback: func(pkg string) (common.Pin, error) {
738 return client.ResolveVersion(pkg, version) 756 return client.ResolveVersion(pkg, version)
739 }, 757 },
740 }) 758 })
741 if err != nil { 759 if err != nil {
742 return nil, err 760 return nil, err
743 } 761 }
744 if hasErrors(pins) { 762 if hasErrors(pins) {
745 printPinsAndError(pins) 763 printPinsAndError(pins)
746 » » return nil, fmt.Errorf("can't find %q version in all packages, a borting.", version) 764 » » return nil, fmt.Errorf("can't find %q version in all packages, a borting", version)
747 } 765 }
748 766
749 // Prepare for the next batch call. 767 // Prepare for the next batch call.
750 packages := []string{} 768 packages := []string{}
751 pinsToUse := map[string]common.Pin{} 769 pinsToUse := map[string]common.Pin{}
752 for _, p := range pins { 770 for _, p := range pins {
753 packages = append(packages, p.Pkg) 771 packages = append(packages, p.Pkg)
754 pinsToUse[p.Pkg] = *p.Pin 772 pinsToUse[p.Pkg] = *p.Pin
755 } 773 }
756 774
(...skipping 11 matching lines...) Expand all
768 return pin, nil 786 return pin, nil
769 }, 787 },
770 }) 788 })
771 } 789 }
772 790
773 //////////////////////////////////////////////////////////////////////////////// 791 ////////////////////////////////////////////////////////////////////////////////
774 // 'ls' subcommand. 792 // 'ls' subcommand.
775 793
776 var cmdListPackages = &subcommands.Command{ 794 var cmdListPackages = &subcommands.Command{
777 UsageLine: "ls [-r] [<prefix string>]", 795 UsageLine: "ls [-r] [<prefix string>]",
778 » ShortDesc: "lists matching packages", 796 » ShortDesc: "queries backend for a list of matching packages",
nodir 2015/09/21 22:26:59 looks like mentioning impl details. I'd move them
Vadim Sh. 2015/09/29 01:43:34 Done. I wanted to clarify that it lists packages o
tandrii(chromium) 2015/09/29 14:21:25 weak suggestion: maybe then say in short version "
779 LongDesc: "List packages in the given path to which the user has access , optionally recursively.", 797 LongDesc: "List packages in the given path to which the user has access , optionally recursively.",
780 CommandRun: func() subcommands.CommandRun { 798 CommandRun: func() subcommands.CommandRun {
781 c := &listPackagesRun{} 799 c := &listPackagesRun{}
782 c.registerBaseFlags() 800 c.registerBaseFlags()
783 c.ServiceOptions.registerFlags(&c.Flags) 801 c.ServiceOptions.registerFlags(&c.Flags)
784 c.Flags.BoolVar(&c.recursive, "r", false, "Whether to list packa ges in subdirectories.") 802 c.Flags.BoolVar(&c.recursive, "r", false, "Whether to list packa ges in subdirectories.")
785 return c 803 return c
786 }, 804 },
787 } 805 }
788 806
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 //////////////////////////////////////////////////////////////////////////////// 1058 ////////////////////////////////////////////////////////////////////////////////
1041 // 'pkg-deploy' subcommand. 1059 // 'pkg-deploy' subcommand.
1042 1060
1043 var cmdDeploy = &subcommands.Command{ 1061 var cmdDeploy = &subcommands.Command{
1044 UsageLine: "pkg-deploy <package instance file> [options]", 1062 UsageLine: "pkg-deploy <package instance file> [options]",
1045 ShortDesc: "deploys a package instance file", 1063 ShortDesc: "deploys a package instance file",
1046 LongDesc: "Deploys a *.cipd package instance into a site root.", 1064 LongDesc: "Deploys a *.cipd package instance into a site root.",
1047 CommandRun: func() subcommands.CommandRun { 1065 CommandRun: func() subcommands.CommandRun {
1048 c := &deployRun{} 1066 c := &deployRun{}
1049 c.registerBaseFlags() 1067 c.registerBaseFlags()
1050 » » c.Flags.StringVar(&c.rootDir, "root", "<path>", "Path to a insta llation site root directory.") 1068 » » c.Flags.StringVar(&c.rootDir, "root", "<path>", "Path to an inst allation site root directory.")
1051 return c 1069 return c
1052 }, 1070 },
1053 } 1071 }
1054 1072
1055 type deployRun struct { 1073 type deployRun struct {
1056 Subcommand 1074 Subcommand
1057 1075
1058 rootDir string 1076 rootDir string
1059 } 1077 }
1060 1078
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
1263 //////////////////////////////////////////////////////////////////////////////// 1281 ////////////////////////////////////////////////////////////////////////////////
1264 // Main. 1282 // Main.
1265 1283
1266 var application = &subcommands.DefaultApplication{ 1284 var application = &subcommands.DefaultApplication{
1267 Name: "cipd", 1285 Name: "cipd",
1268 Title: "Chrome Infra Package Deployer", 1286 Title: "Chrome Infra Package Deployer",
1269 Commands: []*subcommands.Command{ 1287 Commands: []*subcommands.Command{
1270 subcommands.CmdHelp, 1288 subcommands.CmdHelp,
1271 cipd_lib.SubcommandVersion, 1289 cipd_lib.SubcommandVersion,
1272 1290
1291 // User friendly subcommands that operates within a site root. I mplemented
1292 // in friendly.go.
1293 cmdInit,
1294 cmdInstall,
1295 cmdInstalled,
1296
1273 // Authentication related commands. 1297 // Authentication related commands.
1274 authcli.SubcommandInfo(auth.Options{Logger: log}, "auth-info"), 1298 authcli.SubcommandInfo(auth.Options{Logger: log}, "auth-info"),
1275 authcli.SubcommandLogin(auth.Options{Logger: log}, "auth-login") , 1299 authcli.SubcommandLogin(auth.Options{Logger: log}, "auth-login") ,
1276 authcli.SubcommandLogout(auth.Options{Logger: log}, "auth-logout "), 1300 authcli.SubcommandLogout(auth.Options{Logger: log}, "auth-logout "),
1277 1301
1278 // High level commands. 1302 // High level commands.
1279 cmdListPackages, 1303 cmdListPackages,
1280 cmdCreate, 1304 cmdCreate,
1281 cmdEnsure, 1305 cmdEnsure,
1282 cmdResolve, 1306 cmdResolve,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1328 newArgs = append(newArgs, cmd) 1352 newArgs = append(newArgs, cmd)
1329 } 1353 }
1330 newArgs = append(newArgs, flags...) 1354 newArgs = append(newArgs, flags...)
1331 newArgs = append(newArgs, positional...) 1355 newArgs = append(newArgs, positional...)
1332 return newArgs 1356 return newArgs
1333 } 1357 }
1334 1358
1335 func main() { 1359 func main() {
1336 os.Exit(subcommands.Run(application, fixFlagsPosition(os.Args[1:]))) 1360 os.Exit(subcommands.Run(application, fixFlagsPosition(os.Args[1:])))
1337 } 1361 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698