selector: --org and --business in land-work

land-work takes --org as --business in one scope. A repeated, conflicting,
missing, empty or flag-shaped value exits 4 before the config is read. The
id keeps its old grammar (none): any other text names businesses/<ID>.json
and a missing file exits 3. A value of --subject or --attribution is never
read as a selector.
This commit is contained in:
jason.woltje committed 2026-11-08 22:35:24 -06:00
1 parent 381039fe5f
commit 4fa6995c13
2 files changed
+48 -1

No files matched your search

+8 -1
View File
@@ -6,6 +6,10 @@
# [--subject TEXT] [--attribution LINE] [--business ID]
# [--project ID]
#
# --org ID is --business ID (rename r2): each spelling once, both only with one value. A missing,
# empty or flag-shaped value exits 4 before the config is read. The id keeps its old grammar: any
# other text names businesses/<ID>.json, and a missing file exits 3.
#
# Checks, in order; each refusal names its reason on stderr and exits 2:
# bus-schema the bus database's schema isn't the Store's
# decision-not-found no decision with that id and one raise in the business
@@ -48,6 +52,9 @@ REPO="$(cd "$SCRIPT_DIR/.." && pwd)"
usage() { echo "usage: land-work.sh <decision-id> [--base refactor] [--dry-run] [--subject TEXT] [--attribution LINE] [--business ID] [--project ID]" >&2; exit 4; }
fail() { echo "land-work: $1" >&2; exit "${2:-1}"; }
refuse() { echo "land-work: refused: $1${2:+: $2}" >&2; exit 2; }
# shellcheck source=scripts/selector.sh
. "$SCRIPT_DIR/selector.sh" || fail "cannot read $SCRIPT_DIR/selector.sh" 4
lw_selector_refused() { fail "$2" 4; }
DECISION=""; BASE="refactor"; DRY_RUN="no"; SUBJECT=""; ATTRIBUTION=""
BUSINESS=""; PROJECT=""
@@ -57,7 +64,7 @@ while [ $# -gt 0 ]; do
--dry-run) DRY_RUN="yes"; shift ;;
--subject) [ $# -ge 2 ] || usage; SUBJECT="$2"; shift 2 ;;
--attribution) [ $# -ge 2 ] || usage; ATTRIBUTION="$2"; shift 2 ;;
--business) [ $# -ge 2 ] || usage; BUSINESS="$2"; shift 2 ;;
--business|--org) selector_take args id lw_selector_refused - "$1" "${@:2:1}"; BUSINESS="$2"; shift 2 ;;
--project) [ $# -ge 2 ] || usage; PROJECT="$2"; shift 2 ;;
-*) usage ;;
*) [ -z "$DECISION" ] || usage; DECISION="$1"; shift ;;
+40
View File
@@ -242,6 +242,46 @@ cp "$SANDBOX/c/args/businesses/fx.json" "$SANDBOX/c/nobus/businesses/"
sed "s#$SANDBOX/c/args/data#$SANDBOX/c/nobus/data#" "$SANDBOX/c/args/config.json" > "$SANDBOX/c/nobus/config.json"
expect nobus 3 "" "$D"
# ---- rename r2: --org is --business, each spelling once ----
# Against a missing config: exit 4 and the message mean the parse refused before any read (3 otherwise).
sel() { # want-rc want-stderr args...
local want="$1" text="$2" rc=0 err
shift 2
err="$(MOSAIC_CONFIG="$SANDBOX/missing.json" TMPDIR="$SANDBOX/c/args/tmp" bash scripts/land-work.sh "$@" 2>&1 >/dev/null)" || rc=$?
check "selector: $* exits $want: $text (got $rc: $err)" "$([ "$rc" -eq "$want" ] && [ "$err" = "$text" ]; echo $?)"
}
sel 4 "land-work: --business fx and --org other conflict" "$D" --business fx --org other
sel 4 "land-work: --org other and --business fx conflict" "$D" --org other --business fx
sel 4 "land-work: --business given twice" "$D" --business fx --business fx
sel 4 "land-work: --org given twice" "$D" --org fx --org fx
sel 4 "land-work: --org given twice" "$D" --org fx --business fx --org fx
sel 4 "land-work: --org needs one value" "$D" --org
sel 4 "land-work: --business needs one value" "$D" --business ""
sel 4 "land-work: --org needs one value, not --dry-run" "$D" --org --dry-run
sel 4 "land-work: --business needs one value, not -fx" "$D" --business -fx
USAGE="$(bash scripts/land-work.sh 2>&1)"
sel 4 "$USAGE" --org fx
sel 4 "$USAGE" "$D" --org fx extra
# A value another option takes is text, not a selector: the config read is what refuses.
rc=0; err="$(MOSAIC_CONFIG="$SANDBOX/missing.json" TMPDIR="$SANDBOX/c/args/tmp" bash scripts/land-work.sh "$D" --subject --org 2>&1 >/dev/null)" || rc=$?
check "selector: --subject --org is a subject, and the config read refuses (got $rc)" \
"$([ "$rc" -eq 3 ] && [ "${err##*$'\n'}" = "land-work: system config is missing or invalid" ]; echo $?)"
# Each spelling alone and both together name the business file read.
# land-work never had an id grammar and keeps none, so text that is not an id is a missing file too.
for args in "--business other" "--org other" "--org other --business other" "--org Other" "--business ../other"; do
# shellcheck disable=SC2086
expect args 3 "" "$D" $args
check "selector: $args names businesses/${args##* }.json" \
"$([ "$(tail -n1 "$SANDBOX/c/args/err")" = "land-work: no business file: $SANDBOX/c/args/businesses/${args##* }.json" ]; echo $?)"
done
expect args 2 decision-not-found "d0000000-0000-4000-8000-00000000000f" --org fx
expect args 2 decision-not-found "d0000000-0000-4000-8000-00000000000f" --business fx --org fx
expect args 2 decision-not-found "d0000000-0000-4000-8000-00000000000f" --org fx --business fx
setup dry-org ok 42 "$W_OK"
expect dry-org 0 "" "$D" --dry-run --org fx
grep -q "no ref was written" "$SANDBOX/c/dry-org/out"
check "selector: --org fx runs the dry run" "$?"
# ---- the bus database ----
setup schema-table ok 42 "$W_OK"
node -e 'const {DatabaseSync}=require("node:sqlite"); const db=new DatabaseSync(process.argv[1]); db.exec("CREATE TABLE extra(x)"); db.close()' \