1*9e965d6fSRomain Jobredeaux// Copyright 2018 The Bazel Authors. All rights reserved. 2*9e965d6fSRomain Jobredeaux// 3*9e965d6fSRomain Jobredeaux// Licensed under the Apache License, Version 2.0 (the "License"); 4*9e965d6fSRomain Jobredeaux// you may not use this file except in compliance with the License. 5*9e965d6fSRomain Jobredeaux// You may obtain a copy of the License at 6*9e965d6fSRomain Jobredeaux// 7*9e965d6fSRomain Jobredeaux// http://www.apache.org/licenses/LICENSE-2.0 8*9e965d6fSRomain Jobredeaux// 9*9e965d6fSRomain Jobredeaux// Unless required by applicable law or agreed to in writing, software 10*9e965d6fSRomain Jobredeaux// distributed under the License is distributed on an "AS IS" BASIS, 11*9e965d6fSRomain Jobredeaux// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e965d6fSRomain Jobredeaux// See the License for the specific language governing permissions and 13*9e965d6fSRomain Jobredeaux// limitations under the License. 14*9e965d6fSRomain Jobredeaux 15*9e965d6fSRomain Jobredeaux// AK (Android Kit) is a command line tool that combines useful commands. 16*9e965d6fSRomain Jobredeauxpackage main 17*9e965d6fSRomain Jobredeaux 18*9e965d6fSRomain Jobredeauximport ( 19*9e965d6fSRomain Jobredeaux "flag" 20*9e965d6fSRomain Jobredeaux "fmt" 21*9e965d6fSRomain Jobredeaux "log" 22*9e965d6fSRomain Jobredeaux "os" 23*9e965d6fSRomain Jobredeaux "sort" 24*9e965d6fSRomain Jobredeaux 25*9e965d6fSRomain Jobredeaux _ "src/common/golang/flagfile" 26*9e965d6fSRomain Jobredeaux "src/tools/ak/akcommands" 27*9e965d6fSRomain Jobredeaux "src/tools/ak/types" 28*9e965d6fSRomain Jobredeaux) 29*9e965d6fSRomain Jobredeaux 30*9e965d6fSRomain Jobredeauxconst helpHeader = "AK Android Kit is a command line tool that combines useful commands.\n\nUsage: ak %s <options>\n\n" 31*9e965d6fSRomain Jobredeaux 32*9e965d6fSRomain Jobredeauxvar ( 33*9e965d6fSRomain Jobredeaux cmds = akcommands.Cmds 34*9e965d6fSRomain Jobredeaux) 35*9e965d6fSRomain Jobredeaux 36*9e965d6fSRomain Jobredeauxfunc helpDesc() string { 37*9e965d6fSRomain Jobredeaux return "Prints help for commands, or the index." 38*9e965d6fSRomain Jobredeaux} 39*9e965d6fSRomain Jobredeaux 40*9e965d6fSRomain Jobredeauxfunc main() { 41*9e965d6fSRomain Jobredeaux cmds["help"] = types.Command{ 42*9e965d6fSRomain Jobredeaux Init: func() {}, 43*9e965d6fSRomain Jobredeaux Run: printHelp, 44*9e965d6fSRomain Jobredeaux Desc: helpDesc, 45*9e965d6fSRomain Jobredeaux } 46*9e965d6fSRomain Jobredeaux 47*9e965d6fSRomain Jobredeaux switch len(os.Args) { 48*9e965d6fSRomain Jobredeaux case 1: 49*9e965d6fSRomain Jobredeaux printHelp() 50*9e965d6fSRomain Jobredeaux case 3: 51*9e965d6fSRomain Jobredeaux if os.Args[1] == "help" { 52*9e965d6fSRomain Jobredeaux cmdHelp(os.Args[2]) 53*9e965d6fSRomain Jobredeaux os.Exit(0) 54*9e965d6fSRomain Jobredeaux } 55*9e965d6fSRomain Jobredeaux fallthrough 56*9e965d6fSRomain Jobredeaux default: 57*9e965d6fSRomain Jobredeaux cmd := os.Args[1] 58*9e965d6fSRomain Jobredeaux if _, present := cmds[cmd]; present { 59*9e965d6fSRomain Jobredeaux runCmd(cmd) 60*9e965d6fSRomain Jobredeaux } else { 61*9e965d6fSRomain Jobredeaux log.Fatalf("Command %q not found. Try 'ak help'.", cmd) 62*9e965d6fSRomain Jobredeaux } 63*9e965d6fSRomain Jobredeaux } 64*9e965d6fSRomain Jobredeaux} 65*9e965d6fSRomain Jobredeaux 66*9e965d6fSRomain Jobredeauxfunc runCmd(cmd string) { 67*9e965d6fSRomain Jobredeaux cmds[cmd].Init() 68*9e965d6fSRomain Jobredeaux flag.CommandLine.Parse(os.Args[2:]) 69*9e965d6fSRomain Jobredeaux cmds[cmd].Run() 70*9e965d6fSRomain Jobredeaux} 71*9e965d6fSRomain Jobredeaux 72*9e965d6fSRomain Jobredeauxfunc printHelp() { 73*9e965d6fSRomain Jobredeaux fmt.Printf(helpHeader, "<command>") 74*9e965d6fSRomain Jobredeaux printCmds() 75*9e965d6fSRomain Jobredeaux fmt.Println("\nGetting more help:") 76*9e965d6fSRomain Jobredeaux fmt.Println(" ak help <command>") 77*9e965d6fSRomain Jobredeaux fmt.Println(" Prints help and options for <command>.") 78*9e965d6fSRomain Jobredeaux} 79*9e965d6fSRomain Jobredeaux 80*9e965d6fSRomain Jobredeauxfunc printCmds() { 81*9e965d6fSRomain Jobredeaux fmt.Println("Available commands:") 82*9e965d6fSRomain Jobredeaux var keys []string 83*9e965d6fSRomain Jobredeaux for k := range cmds { 84*9e965d6fSRomain Jobredeaux keys = append(keys, k) 85*9e965d6fSRomain Jobredeaux } 86*9e965d6fSRomain Jobredeaux sort.Strings(keys) 87*9e965d6fSRomain Jobredeaux for _, k := range keys { 88*9e965d6fSRomain Jobredeaux fmt.Printf(" %-10s %v\n", k, cmds[k].Desc()) 89*9e965d6fSRomain Jobredeaux } 90*9e965d6fSRomain Jobredeaux} 91*9e965d6fSRomain Jobredeaux 92*9e965d6fSRomain Jobredeauxfunc cmdHelp(cmd string) { 93*9e965d6fSRomain Jobredeaux if _, present := cmds[cmd]; present { 94*9e965d6fSRomain Jobredeaux cmds[cmd].Init() 95*9e965d6fSRomain Jobredeaux fmt.Printf(helpHeader, cmd) 96*9e965d6fSRomain Jobredeaux fmt.Println(cmds[cmd].Desc()) 97*9e965d6fSRomain Jobredeaux if cmds[cmd].Flags != nil { 98*9e965d6fSRomain Jobredeaux fmt.Println("\nOptions:") 99*9e965d6fSRomain Jobredeaux for _, f := range cmds[cmd].Flags { 100*9e965d6fSRomain Jobredeaux fmt.Println(flagDesc(f)) 101*9e965d6fSRomain Jobredeaux } 102*9e965d6fSRomain Jobredeaux } 103*9e965d6fSRomain Jobredeaux } else { 104*9e965d6fSRomain Jobredeaux fmt.Printf("Command %q not found.\n\n", cmd) 105*9e965d6fSRomain Jobredeaux printCmds() 106*9e965d6fSRomain Jobredeaux } 107*9e965d6fSRomain Jobredeaux} 108*9e965d6fSRomain Jobredeaux 109*9e965d6fSRomain Jobredeauxfunc flagDesc(name string) string { 110*9e965d6fSRomain Jobredeaux flag := flag.Lookup(name) 111*9e965d6fSRomain Jobredeaux if flag == nil { 112*9e965d6fSRomain Jobredeaux return fmt.Sprintf("Flag %q not found!", name) 113*9e965d6fSRomain Jobredeaux } 114*9e965d6fSRomain Jobredeaux flagType := fmt.Sprintf("%T", flag.Value) 115*9e965d6fSRomain Jobredeaux flagType = flagType[6 : len(flagType)-5] 116*9e965d6fSRomain Jobredeaux return fmt.Sprintf(" -%-16s %s (a %s; default: \"%s\")", flag.Name, flag.Usage, flagType, flag.DefValue) 117*9e965d6fSRomain Jobredeaux} 118