main.go | 5 +++-- usage.go | 97 +++++++++++++++++++++++++++++------------------------ diff --git a/main.go b/main.go index b7d5ad6a75b8b149dcf929477c5241d393de12dbe5f9eaeff7fcf86f6de0f7bb..4271a669b29f14029a7a7233bc28093dad3e11661485bb99a2d438f891a37eab 100644 --- a/main.go +++ b/main.go @@ -29,6 +29,7 @@ "log" "os" "path" "path/filepath" + "runtime" "strconv" "go.cypherpunks.ru/recfile" @@ -63,14 +64,14 @@ version := flag.Bool("version", false, "print version") warranty := flag.Bool("warranty", false, "print warranty information") symlinks := flag.Bool("symlinks", false, "create necessary symlinks in current directory") - flag.Usage = usage + flag.Usage = func() { usage(os.Args[0]) } flag.Parse() if *warranty { fmt.Println(Warranty) return } if *version { - fmt.Println(versionGet()) + fmt.Println("goredo", Version, "built with", runtime.Version()) return } if *symlinks { diff --git a/usage.go b/usage.go index 1945e50184702b4b87a4d02a205161c772e996f7ec0850e609d2a250ff859b63..852e9dbe73f98c3f24dec0550324c8680faf24b0f353dbf64b8135d7361631f2 100644 --- a/usage.go +++ b/usage.go @@ -21,13 +21,13 @@ import ( "flag" "fmt" "os" - "runtime" - "strings" ) const ( Version = "1.3.0" - Warranty = `This program is free software: you can redistribute it and/or modify + Warranty = `Copyright (C) 2020-2021 Sergey Matveev + +This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 of the License. @@ -40,51 +40,60 @@ You should have received a copy of the GNU General Public License along with this program. If not, see .` ) -func versionGet() string { - return strings.Join([]string{ - "goredo", Version, "built with", runtime.Version(), - }, " ") -} +func usage(cmd string) { + var d string + switch cmd { + case "redo": + d = `Usage: redo [options] [target ...] + +Forcefully and *sequentially* build specified targets.` + case "redo-ifchange": + d = `Usage: redo-ifchange target [...] + +Build specified targets in parallel, if they are changed. +Record them as dependencies for current target.` + case "redo-ifcreate": + d = `Usage: redo-ifcreate target [...] + +Record ifcreate dependency for current target. Unusable outside .do.` + case "redo-always": + d = `Usage: redo-always + +Always build current target. Unusable outside .do.` + case "redo-cleanup": + d = `Usage: redo-cleanup [-dry-run] {full,log,tmp} [...] -func usage() { - fmt.Fprintf(os.Stderr, versionGet()+` -Copyright (C) 2020-2021 Sergey Matveev -License GPLv3: GNU GPL version 3 -This is free software: you are free to change and redistribute it. -There is NO WARRANTY, to the extent permitted by law. +Remove either all goredo's related temporary files, or kept stderr +logs, or everything (including .redo directories) related.` + case "redo-log": + d = `Usage: redo-log target [ | tai64nlocal ] + +Display kept target's stderr with TAI64N timestamped lines. Only the +last build is kept. You must enable stderr keeping with either -logs, +or REDO_LOGS=1.` + case "redo-dot": + d = `Usage: redo-dot target [...] + +Write dependency DOT graph to stdout.` + case "redo-stamp": + d = `Usage: redo-stamp < [$3] -redo, redo-{always,cleanup,dot,ifchange,ifcreate,log,stamp,whichdo} must -be linked to goredo executable. It determines the command by its own name. -You can create them by running: goredo -symlinks. +Record stamp dependency for current target. Unusable outside .do. +Stamp dependency does not play any role, as all targets are hashed +anyway.` + case "redo-whichdo": + d = `Usage: redo-whichdo target -* redo [options] [target ...] - forcefully and *sequentially* build specified targets -* redo-always - always build current target. Unusable outside .do -* redo-cleanup [-dry-run] {full,log,tmp} [...] - remove either all goredo's related temporary files, or kept stderr - logs, or everything (including .redo directories) related -* redo-dot target [...] - write dependency DOT graph to stdout -* redo-ifchange target [...] - build specified targets in parallel, if they are changed. Record them - as dependencies for current target -* redo-ifcreate target [...] - record ifcreate dependency for current target. Unusable outside .do -* redo-log target [ | tai64nlocal ] - display kept target's stderr with TAI64N timestamped lines. Only the - last build is kept. You must enable stderr keeping with either -logs, - or REDO_LOGS=1 -* redo-stamp < [$3] - record stamp dependency for current target. Unusable outside .do. - Stamp dependency does not play any role, as all targets are hashed - anyway -* redo-whichdo target - display .do search paths for specified target. Exits successfully - if the last .do in output if the found existing one +Display .do search paths for specified target. Exits successfully +if the last .do in output if the found existing one.` + default: + d = `Usage: goredo -symlinks -Options: -`) +goredo expects to be called through the symbolic link to it. +Available commands: redo, redo-always, redo-cleanup, redo-dot, +redo-ifchange, redo-ifcreate, redo-log, redo-stamp, redo-whichdo.` + } + fmt.Fprintf(os.Stderr, "%s\n\nOptions:\n", d) flag.PrintDefaults() fmt.Fprintln(os.Stderr, ` Additional environment variables: