/*
-goredo -- redo implementation on pure Go
-Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
+goredo -- djb's redo implementation on pure Go
+Copyright (C) 2020-2022 Sergey Matveev <stargrave@stargrave.org>
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
"flag"
"fmt"
"os"
- "runtime"
- "strings"
)
const (
- Version = "0.10.0"
- Warranty = `This program is free software: you can redistribute it and/or modify
+ Version = "1.25.0"
+ Warranty = `Copyright (C) 2020-2022 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.
along with this program. If not, see <http://www.gnu.org/licenses/>.`
)
-func versionGet() string {
- return strings.Join([]string{
- "goredo", Version, "built with", runtime.Version(),
- }, " ")
-}
+func usage(cmd string) {
+ var d string
+ switch cmd {
+ case CmdNameRedo:
+ d = `Usage: redo [-j X] [-k] [-s] [-x|-xx] [options] [target ...]
+
+Forcefully and *sequentially* build specified targets.
+If no targets specified, then use "all" one.`
+ case CmdNameRedoIfchange:
+ d = `Usage: redo-ifchange [-j X] [-k] [-s] [-x|-xx] target [...]
+
+Build specified targets in parallel, if they are changed.
+Record them as dependencies for current target.`
+ case CmdNameRedoIfcreate:
+ d = `Usage: redo-ifcreate target [...]
+
+Record ifcreate dependency for current target. Unusable outside .do.`
+ case CmdNameRedoAlways:
+ d = `Usage: redo-always
+
+Always build current target. Unusable outside .do.`
+ case CmdNameRedoCleanup:
+ d = `Usage: redo-cleanup [-n] {full,log,tmp} [...]
+
+Remove either all goredo's related temporary files, or kept stderr
+logs, or everything (including .redo directories) related.`
+ case CmdNameRedoLog:
+ d = `Usage: redo-log [-c] [-r] 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. -c option show the exact command invoked, start and
+finish time. -r option recursively and linearly show also all deeper
+redo calls and their logs.`
+ case CmdNameRedoDot:
+ d = `Usage: redo-dot target [...]
+
+Write dependency DOT graph to stdout.`
+ case CmdNameRedoStamp:
+ d = `Usage: redo-stamp < [$3]
-func usage() {
- fmt.Fprintf(os.Stderr, versionGet()+`
-Copyright (C) 2020-2021 Sergey Matveev
-License GPLv3: GNU GPL version 3 <http://gnu.org/licenses/gpl.html>
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-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.
-
-* redo [options] [target ...]
- forcefully and *sequentially* build specified targets
-* redo-always
- always build current target. Unusable outside .do
-* redo-cleanup {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
-
-Options:
-`)
+Record stamp dependency for current target. Unusable outside .do.
+Stamp dependency does not play any role, as all targets are hashed
+anyway.`
+ case CmdNameRedoWhichdo:
+ d = `Usage: redo-whichdo target
+
+Display .do search paths for specified target. Exits successfully
+if the last .do in output if the found existing one.`
+ case CmdNameRedoTargets:
+ d = `Usage: redo-targets [target ...]
+
+List all currently known targets.`
+ case CmdNameRedoSources:
+ d = `Usage: redo-sources [target ...]
+
+List all currently known source files.`
+ case CmdNameRedoOOD:
+ d = `Usage: redo-ood [target ...]
+
+List all currently known out-of-date targets.`
+ case CmdNameRedoAffects:
+ d = `Usage: redo-affects target [...]
+
+List all targets that will be affected by changing the specified ones.`
+ case CmdNameRedoDepFix:
+ d = `Usage: redo-depfix
+
+Traverse over all .redo directories beneath and check if inode's information
+(ctime/mtime) differs. Update dependency if file's content is still the same.`
+ default:
+ d = `Usage: goredo -symlinks
+
+goredo expects to be called through the symbolic link to it.
+Available commands: redo, redo-affects, redo-always, redo-cleanup,
+redo-depfix, redo-dot, redo-ifchange, redo-ifcreate, redo-log,
+redo-ood, redo-sources, redo-stamp, redo-targets, redo-whichdo.`
+ }
+ fmt.Fprintf(os.Stderr, "%s\n\nCommon options:\n", d)
flag.PrintDefaults()
fmt.Fprintln(os.Stderr, `
Additional environment variables:
NO_COLOR -- disable messages colouring
- REDO_NO_SYNC -- disable files/directories explicit filesystem syncing
REDO_TOP_DIR -- do not search for .do above that directory
(it can contain .redo/top as an alternative)`)
+ if cmd == CmdNameRedo || cmd == CmdNameRedoIfchange {
+ fmt.Fprintln(os.Stderr, `
+ REDO_NO_SYNC -- disable files/directories explicit filesystem syncing
+ REDO_INODE_TRUST -- {none,ctime,mtime}, either do not trust inode
+ information at all (always check size and hash), or
+ trust its ctime (the default one), or be satisfied
+ with its mtime
+ REDO_MAKE -- bmake/gmake/none(default) jobserver protocol compatibility`)
+ }
}