From 33a06da2325037adf267f770645c08e621faee5b Mon Sep 17 00:00:00 2001 From: Sam Date: Fri, 13 Nov 2026 17:27:14 +1100 Subject: [PATCH] office: every subcommand answers --help, and delete refuses a system folder like /tmp or /home --- bin/board | 3 +++ bin/lib/project.py | 2 +- bin/merge | 3 +++ bin/project-delete | 7 +++++++ bin/project-reset | 3 +++ bin/review | 3 +++ bin/triage | 3 +++ 7 files changed, 23 insertions(+), 1 deletion(-) diff --git a/bin/board b/bin/board index 887ef14..2137364 100755 --- a/bin/board +++ b/bin/board @@ -64,6 +64,9 @@ def pages(cfg, folder): def main(): + if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]: + h.say(__doc__.strip()) + return 0 opts = parse(sys.argv[1:]) folder = os.path.abspath(os.path.expanduser(opts["folder"])) cfg = pj.load(folder) diff --git a/bin/lib/project.py b/bin/lib/project.py index 72faaa0..be2a9a6 100644 --- a/bin/lib/project.py +++ b/bin/lib/project.py @@ -33,7 +33,7 @@ def exists(root): def load(root): p = path(root) if not os.path.isfile(p): - raise h.Refused(2, "no %s here; run bin/office %s first" % (REL, root)) + raise h.Refused(2, "no %s here; run: office %s" % (REL, root)) with open(p, "rb") as f: return tomllib.load(f) diff --git a/bin/merge b/bin/merge index 9907a62..4e0e403 100755 --- a/bin/merge +++ b/bin/merge @@ -29,6 +29,9 @@ LOCK = "/tmp/paperclip-harness-merge.lock" def main(): + if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]: + h.say(__doc__.strip()) + return 0 args = [a for a in sys.argv[1:]] check_only = "--check" in args args = [a for a in args if not a.startswith("--")] diff --git a/bin/project-delete b/bin/project-delete index 056a35f..bef0bcb 100755 --- a/bin/project-delete +++ b/bin/project-delete @@ -81,6 +81,13 @@ def main(): if not os.path.isdir(folder): raise h.Refused(2, "no folder at %s" % folder) + # A project folder is a leaf, not a place where other things live. Refusing + # these is the difference between a mistake and a disaster. + forbidden = {"/", "/home", "/tmp", "/var", "/etc", "/usr", "/nix", + os.path.expanduser("~")} + if folder.rstrip("/") in forbidden: + raise h.Refused(2, "%s is not a project folder; give the folder of one project" % folder) + cfg = {} if pj.exists(folder): try: diff --git a/bin/project-reset b/bin/project-reset index 4b2e20e..94c0b98 100755 --- a/bin/project-reset +++ b/bin/project-reset @@ -33,6 +33,9 @@ PAGES = ["tree", "reply", "log", "new"] def main(): + if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]: + h.say(__doc__.strip()) + return 0 argv = sys.argv[1:] args = [a for a in argv if not a.startswith("--")] if not args: diff --git a/bin/review b/bin/review index cbf22a5..2e05572 100755 --- a/bin/review +++ b/bin/review @@ -17,6 +17,9 @@ import harness as h # noqa: E402 def main(): + if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]: + h.say(__doc__.strip()) + return 0 args = [a for a in sys.argv[1:] if not a.startswith("--")] post = "--post" in sys.argv if len(args) != 1: diff --git a/bin/triage b/bin/triage index 132a81a..4114c33 100755 --- a/bin/triage +++ b/bin/triage @@ -83,6 +83,9 @@ def ask(state, question): def main(): + if "-h" in sys.argv[1:] or "--help" in sys.argv[1:]: + h.say(__doc__.strip()) + return 0 args = [a for a in sys.argv[1:] if not a.startswith("--")] if not args: h.say("usage: office triage [--ask next|failure]")