diff --git a/cmd/version/version.go b/cmd/version/version.go index 64dd124fd..92a1b2908 100644 --- a/cmd/version/version.go +++ b/cmd/version/version.go @@ -3,10 +3,13 @@ package version import ( "context" + "debug/buildinfo" "errors" "fmt" "io" "net/http" + "os" + "runtime/debug" "strings" "time" @@ -20,12 +23,14 @@ import ( var ( check = false + deps = false ) func init() { cmd.Root.AddCommand(commandDefinition) cmdFlags := commandDefinition.Flags() flags.BoolVarP(cmdFlags, &check, "check", "", false, "Check for new version", "") + flags.BoolVarP(cmdFlags, &deps, "deps", "", false, "Show the Go dependencies", "") } var commandDefinition = &cobra.Command{ @@ -67,18 +72,25 @@ Or beta: 1.42.0.5 (released 2018-06-17) upgrade: https://beta.rclone.org/v1.42-005-g56e1e820 +If you supply the --deps flag then rclone will print a list of all the +packages it depends on and their versions along with some other +information about the build. `, Annotations: map[string]string{ "versionIntroduced": "v1.33", }, - Run: func(command *cobra.Command, args []string) { + RunE: func(command *cobra.Command, args []string) error { ctx := context.Background() cmd.CheckArgs(0, 0, command, args) + if deps { + return printDependencies() + } if check { CheckVersion(ctx) } else { cmd.ShowVersion() } + return nil }, } @@ -151,3 +163,36 @@ func CheckVersion(ctx context.Context) { fmt.Println("Your version is compiled from git so comparisons may be wrong.") } } + +// Print info about a build module +func printModule(module *debug.Module) { + if module.Replace != nil { + fmt.Printf("- %s %s (replaced by %s %s)\n", + module.Path, module.Version, module.Replace.Path, module.Replace.Version) + } else { + fmt.Printf("- %s %s\n", module.Path, module.Version) + } +} + +// printDependencies shows the packages we use in a format like go.mod +func printDependencies() error { + info, err := buildinfo.ReadFile(os.Args[0]) + if err != nil { + return fmt.Errorf("error reading build info: %w", err) + } + fmt.Println("Go Version:") + fmt.Printf("- %s\n", info.GoVersion) + fmt.Println("Main package:") + printModule(&info.Main) + fmt.Println("Binary path:") + fmt.Printf("- %s\n", info.Path) + fmt.Println("Settings:") + for _, setting := range info.Settings { + fmt.Printf("- %s: %s\n", setting.Key, setting.Value) + } + fmt.Println("Dependencies:") + for _, dep := range info.Deps { + printModule(dep) + } + return nil +}