X-Git-Url: http://www.git.cypherpunks.ru/?p=goredo.git;a=blobdiff_plain;f=usage.go;h=e67077fdfd40c6a8c5bab6e376ed9301c92fd17f;hp=affd4540c56254502d11290fbb039fa514e65f99;hb=b4eefdd675c9aef9ff8bd1089d031ee05733195b;hpb=5ca39bfc0b769607db3f84213fc7f16f0c4019fa diff --git a/usage.go b/usage.go index affd454..e67077f 100644 --- a/usage.go +++ b/usage.go @@ -1,6 +1,6 @@ /* goredo -- djb's redo implementation on pure Go -Copyright (C) 2020-2021 Sergey Matveev +Copyright (C) 2020-2023 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 @@ -21,13 +21,13 @@ import ( "flag" "fmt" "os" - "runtime" - "strings" ) const ( - Version = "1.2.0" - Warranty = `This program is free software: you can redistribute it and/or modify + Version = "1.30.0" + Warranty = `Copyright (C) 2020-2023 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,58 +40,98 @@ 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 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,lock,tmp} [...] + +Remove either all of goredo's related temporary files, or kept stderr +logs, or lock files, 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 -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 [-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 - -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) - REDO_INODE_NO_TRUST -- do not trust inode information (except for size) - and always check file's hash`) + (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`) + } }