Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ Before you submit a pull request, ensure you follow the testing and linting inst
* [Task] 3.40 or higher
* [uv] 0.7.10 or higher

### macOS

The exported tasks use GNU utilities that are not always pre-installed on macOS. You may need to
install the following brew packages and add their executables to your PATH:

* [coreutils]\: `md5sum`
* [gnu-tar]\: `gtar`

## Testing

To run all tests:
Expand Down Expand Up @@ -42,5 +50,7 @@ To clean up any generated files:
task clean
```

[coreutils]: https://formulae.brew.sh/formula/coreutils
[gnu-tar]: https://formulae.brew.sh/formula/gnu-tar
[Task]: https://taskfile.dev/
[uv]: https://docs.astral.sh/uv
126 changes: 88 additions & 38 deletions exports/taskfiles/utils/checksum.yaml
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
version: "3"

set: ["u", "pipefail"]
shopt: ["globstar"]

tasks:

# Compute the checksum of the given path include/exclude patterns, saving the result to
# `CHECKSUM_FILE`. The calling task can set `FAIL` to "false" if they wish to continue if checksum
# computation fails.
#
# @param {string} CHECKSUM_FILE
# @param {string[]} INCLUDE_PATTERNS Path wildcard patterns to compute the checksum for.
# @param {string[]} [EXCLUDE_PATTERNS] Path wildcard patterns, relative to any `INCLUDE_PATTERNS`,
# to exclude from the checksum.
# @param {string} [FAIL="true"] If set to "false" the task will not fail.
compute:
desc: "Tries to compute a checksum for the given paths and output it to a file."
internal: true
label: "{{.TASK}}-{{.CHECKSUM_FILE}}"
silent: true
vars:
EXCLUDE_PATTERNS:
ref: "default (list) .EXCLUDE_PATTERNS"
FAIL: "{{if eq \"false\" .FAIL}}false{{else}}true{{end}}"

ARCHIVER: "{{if eq OS \"darwin\"}}gtar{{else}}tar{{end}}"
TMP_ERR_LOG: "{{.CHECKSUM_FILE}}.log.tmp"
requires:
vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"]
vars:
- "CHECKSUM_FILE"
- "INCLUDE_PATTERNS"
cmds:
# We explicitly set `--no-anchored` and `--wildcards` to make the inclusion behaviour match
# the default exclusion behaviour.
Expand All @@ -24,58 +35,97 @@ tasks:
# input patterns cannot be quoted since they're evaluated by the shell and the results are
# passed to `tar` as arguments. If the input patterns are passed to `tar` with quotes, the
# pattern won't be evaluated and will instead be treated literally.
- >-
tar
--create
--file -
--group 0
--mtime "UTC 1970-01-01"
--numeric-owner
--owner 0
--sort name
--no-anchored
--wildcards
{{- range .EXCLUDE_PATTERNS}}
--exclude="{{.}}"
{{- end}}
{{- range .INCLUDE_PATTERNS}}
{{.}}
{{- end}}
2> /dev/null
| md5sum > {{.CHECKSUM_FILE}}
# Ignore errors so that dependent tasks don't fail
ignore_error: true
- defer: "rm -f '{{.TMP_ERR_LOG}}'"
- |-
if ! \
{{.ARCHIVER}} \
--create \
--file - \
--group 0 \
--mtime "UTC 1970-01-01" \
--numeric-owner \
--owner 0 \
--sort name \
--no-anchored \
--wildcards \
{{- range .EXCLUDE_PATTERNS}}
--exclude="{{.}}" \
{{- end}}
{{- range .INCLUDE_PATTERNS}}
{{.}} \
{{- end}}
2> "{{.TMP_ERR_LOG}}" \
| md5sum > "{{.CHECKSUM_FILE}}" \
; then
rm -f "{{.CHECKSUM_FILE}}"
{{- if eq "true" .FAIL}}
printf "[{{.TASK}} error] failed with:\n%s\n" "$(cat {{.TMP_ERR_LOG}})"
exit 1
{{- else}}
exit 0
{{- end}}
fi

# Validates that the checksum computed from the given include/exclude path patterns matches the
# reference checksum stored in the given file. If validation fails, the checksum file is deleted,
# but the task succeeds so dependent tasks that list the checksum file under `generates` will
# rerun automatically. The calling task can set `FAIL` to "true" to make this task fail when the
# validation is expected to succeed.
#
# @param {string} CHECKSUM_FILE
# @param {string[]} INCLUDE_PATTERNS Path wildcard patterns to validate the checksum for.
# @param {string[]} [EXCLUDE_PATTERNS] Path wildcard patterns, relative to any `INCLUDE_PATTERNS`,
# to exclude from the checksum.
# @param {string} [FAIL="false"] If set to "true", the task fails when checksums mismatch.
validate:
desc: "Validates the checksum of the given directory matches the checksum in the given file, or
deletes the checksum file otherwise."
internal: true
label: "{{.TASK}}-{{.CHECKSUM_FILE}}"
silent: true
vars:
FAIL: "{{if eq \"true\" .FAIL}}true{{else}}false{{end}}"
TMP_CHECKSUM_FILE: "{{.CHECKSUM_FILE}}.tmp"
TMP_ERR_LOG: "{{.CHECKSUM_FILE}}.log.tmp"
requires:
vars: ["CHECKSUM_FILE", "INCLUDE_PATTERNS"]
vars:
- "CHECKSUM_FILE"
- "INCLUDE_PATTERNS"
cmds:
- task: "compute"
vars:
CHECKSUM_FILE: "{{.TMP_CHECKSUM_FILE}}"
INCLUDE_PATTERNS:
ref: ".INCLUDE_PATTERNS"
EXCLUDE_PATTERNS:
ref: "default (list) .EXCLUDE_PATTERNS"
CHECKSUM_FILE: "{{.TMP_CHECKSUM_FILE}}"
- defer: "rm -f '{{.TMP_CHECKSUM_FILE}}'"
# Check that all paths exist and the checksum matches; otherwise delete the checksum file.
ref: ".EXCLUDE_PATTERNS"
FAIL: "false"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
FAIL: "false"
ignore_error: true

Can we use ignore_error = true here and avoid introducing a new variable for checksum:compute? I don’t know the other cases where we’ll need to allow failures.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, the motivation is confusing since I split the PRs. This is necessary for better checksum workflows like in boost. I'll improve the description.
https://github.com/y-scope/yscope-dev-utils/pull/80/files#diff-a1f9d497b81cb7bdb53e553d8fce46fbee451bbe4629106955d2536ada79015dR116

In this case when we validate the source directory and it fails we want to completely fail.
One option is to just assume this cannot fail and not check it, but that seems a bit much to avoid a flag in rare cases.
The other option is to try and recover, but that is very complicated. We'd need boost:build-and-install to somehow re-run boost:generate, which is a bit ugly/complicated. More generally any tasks that implicitly depends on another task (but cannot be deps without a lot of work due to their library/helper style) will need to support a recovery pass in certain cases.

- defer: |-
rm -f "{{.TMP_CHECKSUM_FILE}}"
rm -f "{{.TMP_ERR_LOG}}"
- |-
(
{{- range .INCLUDE_PATTERNS}}
for path in {{.}}; do
test -e "$path"
done
for path in {{.}}; do
test -e "${path}" \
|| (
echo "Include path does not exist: ${path}" > "{{$.TMP_ERR_LOG}}"
exit 1
)
done && \
{{- end}}
diff -q "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}" 2> /dev/null
) || rm -f "{{.CHECKSUM_FILE}}"
(
cmp -s "{{.TMP_CHECKSUM_FILE}}" "{{.CHECKSUM_FILE}}" \
|| (
echo "cmp failed for '{{.TMP_CHECKSUM_FILE}}' '{{.CHECKSUM_FILE}}'" \
> "{{.TMP_ERR_LOG}}"
exit 1
)
)
) \
|| (
{{- if eq "true" .FAIL}}
printf "[{{.TASK}} error] failed with:\n%s\n" "$(cat {{.TMP_ERR_LOG}})"
exit 1
{{- else}}
rm -f "{{.CHECKSUM_FILE}}"
{{- end}}
)
148 changes: 148 additions & 0 deletions taskfiles/checksum/tests.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
version: "3"

includes:
checksum:
internal: true
taskfile: "../../exports/taskfiles/utils/checksum.yaml"

tasks:
default:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we add tests for testing FAIL flags for checksum:validate?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with you and want to, but afaik we cannot actually test if a task fails using task itself. E.g. if FAIL is true and the task fails, the entire task "run" will stop and exit.
Essentially, (afaik) there is no way to write a unit test (in task) that verifies a task fails.

We probably need to switch to using python to test tasks eventually.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

right. for now we can only manually test.

cmds:
- task: "checksum-test-rerun"
- task: "checksum-test-skip"
- task: "checksum-test-update"

checksum-test-rerun:
vars:
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
SRC_DIR: "{{.OUTPUT_DIR}}/src"

CHECKSUM_FILE: "{{.SRC_DIR}}.md5"
CHECKSUM_FILE_REF: "{{.CHECKSUM_FILE}}.ref"
FILE_0: "{{.SRC_DIR}}/0.txt"
FILE_1: "{{.SRC_DIR}}/1.txt"
cmds:
- task: "checksum-test-init"
vars:
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_0}}"
- "mv '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'"
- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_1}}"

# Test create-dir-with-checksum ran the second time and created a different checksum.
- "test ! -e '{{.FILE_0}}'"
- "test -e '{{.FILE_1}}'"
- |-
if ! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'; then
exit 0
fi
exit 1
Comment on lines +41 to +45
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- |-
if ! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}'; then
exit 0
fi
exit 1
- "( cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF}}' && exit 2 ) || [ $? -eq 1 ]"

The idea is that to only accept 1 as success. 0 when files are identical and >1 when file comparison has operational errors all results in failure.

checksum-test-skip:
vars:
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
SRC_DIR: "{{.OUTPUT_DIR}}/src"

CHECKSUM_FILE: "{{.SRC_DIR}}.md5"
CHECKSUM_MOD_TS: "{{.CHECKSUM_FILE}}-mod-ts.txt"
FILE_0: "{{.SRC_DIR}}/0.txt"
FILE_1: "{{.SRC_DIR}}/1.txt"
cmds:
- task: "checksum-test-init"
vars:
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_0}}"
- "date -r '{{.CHECKSUM_FILE}}' > '{{.CHECKSUM_MOD_TS}}'"
- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_1}}"

# Test create-dir-with-checksum didn't run the second time and the checksum is unmodified.
- "test -e '{{.FILE_0}}'"
- "test ! -e '{{.FILE_1}}'"
- "cmp -s '{{.CHECKSUM_MOD_TS}}' <(date -r '{{.CHECKSUM_FILE}}')"

checksum-test-update:
vars:
OUTPUT_DIR: "{{.G_OUTPUT_DIR}}/{{.TASK | replace \":\" \"#\"}}"
SRC_DIR: "{{.OUTPUT_DIR}}/src"

CHECKSUM_FILE: "{{.SRC_DIR}}.md5"
CHECKSUM_FILE_REF0: "{{.CHECKSUM_FILE}}.ref0"
CHECKSUM_FILE_REF1: "{{.CHECKSUM_FILE}}.ref1"
FILE_0: "{{.SRC_DIR}}/0.txt"
FILE_1: "{{.SRC_DIR}}/1.txt"
cmds:
- task: "checksum-test-init"
vars:
OUTPUT_DIR: "{{.OUTPUT_DIR}}"
- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_0}}"
- "cp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'"

- "cat '{{.CHECKSUM_FILE}}' > '{{.FILE_0}}'"
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.SRC_DIR}}"]
- "cp '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF1}}'"

- task: "create-dir-with-checksum"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
FILE_PATH: "{{.FILE_1}}"

# Test create-dir-with-checksum didn't run the second time and the updated checksum is
# different from the original.
- "test -e '{{.FILE_0}}'"
- "test ! -e '{{.FILE_1}}'"
- "cmp -s '{{.FILE_0}}' '{{.CHECKSUM_FILE_REF0}}'"
- "cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF1}}'"
- |-
if ! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'; then
exit 0
fi
exit 1
Comment on lines +113 to +117
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- |-
if ! cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}'; then
exit 0
fi
exit 1
- "( cmp -s '{{.CHECKSUM_FILE}}' '{{.CHECKSUM_FILE_REF0}}' && exit 2 ) || [ $? -eq 1 ]"

checksum-test-init:
internal: true
requires:
vars: ["OUTPUT_DIR"]
cmds:
- "rm -rf '{{.OUTPUT_DIR}}'"
- "mkdir -p '{{.OUTPUT_DIR}}'"

create-dir-with-checksum:
internal: true
vars:
DIR: "{{dir .FILE_PATH}}"
requires:
vars: ["CHECKSUM_FILE", "FILE_PATH"]
sources: ["{{.TASKFILE}}"]
generates: ["{{.CHECKSUM_FILE}}"]
deps:
- task: "checksum:validate"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.DIR}}"]
cmds:
- |-
rm -rf "{{.DIR}}"
mkdir -p "{{.DIR}}"
touch "{{.FILE_PATH}}"
- task: "checksum:compute"
vars:
CHECKSUM_FILE: "{{.CHECKSUM_FILE}}"
INCLUDE_PATTERNS: ["{{.DIR}}"]
2 changes: 2 additions & 0 deletions taskfiles/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ version: "3"

includes:
boost: "boost/tests.yaml"
checksum: "checksum/tests.yaml"
remote: "remote/tests.yaml"
ystdlib-py: "ystdlib-py/tests.yaml"

Expand All @@ -10,6 +11,7 @@ tasks:
internal: true
cmds:
- task: "boost"
- task: "checksum"
Copy link
Contributor

@coderabbitai coderabbitai bot Sep 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

🧩 Analysis chain

Broken task reference: calling an included Task requires a namespace or a wrapper.

- task: "checksum" will fail unless a local wrapper task named checksum exists. Match existing patterns (see remote, ystdlib-py) by adding a wrapper, or call the namespaced task directly.

Option A — add a wrapper (recommended for consistency with other entries):

 tasks:
   all:
     internal: true
     cmds:
       - task: "boost"
-      - task: "checksum"
+      - task: "checksum"
       - task: "remote"
       - task: "ystdlib-py"

+  checksum:
+    cmds:
+      - task: "checksum:default"

Option B — call the namespaced default directly:

-      - task: "checksum"
+      - task: "checksum:default"

🏁 Script executed:

#!/bin/bash
# Validate that the "checksum" task is resolvable after your change.
# 1) List tasks to ensure the wrapper shows up (if using Option A).
task --list || true

# 2) Dry-run the "all" task to confirm it can reach checksum without executing commands.
task -n all

Length of output: 85


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "PWD: $(pwd)"
echo

# helper to run rg if available, else grep fallback
if command -v rg >/dev/null 2>&1; then
  echo "Using rg for searches"
  RG_AVAIL=true
else
  echo "rg not found; using grep fallback"
  RG_AVAIL=false
fi

echo
echo "==> Check for taskfiles/tests.yaml"
if [ -f taskfiles/tests.yaml ]; then
  echo "FOUND: taskfiles/tests.yaml (showing first 200 lines):"
  nl -ba taskfiles/tests.yaml | sed -n '1,200p'
else
  echo "taskfiles/tests.yaml not found at path taskfiles/tests.yaml"
fi

echo
echo "==> Search for occurrences of the word 'checksum' across the repo (context included)"
if [ "$RG_AVAIL" = true ]; then
  rg -n --hidden -S '\bchecksum\b' -g '!node_modules/**' -g '!**/.git/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '\bchecksum\b' . || true
fi

echo
echo "==> Search for '- task:' entries (calls to included tasks)"
if [ "$RG_AVAIL" = true ]; then
  rg -n --hidden -S '^\s*-\s*task\s*:' -g '!node_modules/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '^\s*-\s*task\s*:' . || true
fi

echo
echo "==> Search for 'checksum' task wrapper definitions (e.g. 'checksum:' or 'checksum:default')"
if [ "$RG_AVAIL" = true ]; then
  rg -n --hidden -S '^\s*checksum\s*:' -g '!node_modules/**' -C3 || true
  rg -n --hidden -S 'checksum:default' -g '!node_modules/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '^\s*checksum\s*:' . || true
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E 'checksum:default' . || true
fi

Length of output: 179


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "PWD: $(pwd)"
echo

echo "==> List taskfiles directory"
ls -la taskfiles || true
echo

echo "==> Show taskfiles/tests.yaml (up to 400 lines) if present"
if [ -f taskfiles/tests.yaml ]; then
  echo "----- taskfiles/tests.yaml start -----"
  sed -n '1,400p' taskfiles/tests.yaml || true
  echo "----- taskfiles/tests.yaml end -----"
else
  echo "taskfiles/tests.yaml not found at taskfiles/tests.yaml"
fi
echo

echo "==> Search repository for occurrences of 'checksum' (3 lines context)"
if command -v rg >/dev/null 2>&1; then
  rg -n --hidden -S '\bchecksum\b' -g '!node_modules/**' -g '!**/.git/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '\bchecksum\b' . || true
fi
echo

echo "==> Search for '- task:' entries (calls to included tasks) with context"
if command -v rg >/dev/null 2>&1; then
  rg -n --hidden -S '^\s*-\s*task\s*:' -g '!node_modules/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '^\s*-\s*task\s*:' . || true
fi
echo

echo "==> Search for task wrapper/definition keys named 'checksum' or 'checksum:default'"
if command -v rg >/dev/null 2>&1; then
  rg -n --hidden -S '^\s*checksum\s*:' -g '!node_modules/**' -C3 || true
  rg -n --hidden -S 'checksum:default' -g '!node_modules/**' -C3 || true
else
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E '^\s*checksum\s*:' . || true
  grep -RIn --line-number --exclude-dir=node_modules --exclude-dir=.git -I -n -E 'checksum:default' . || true
fi

Length of output: 1913


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "PWD: $(pwd)"
echo

echo "==> Show taskfiles/checksum/tests.yaml (up to 400 lines)"
if [ -f taskfiles/checksum/tests.yaml ]; then
  sed -n '1,400p' taskfiles/checksum/tests.yaml || true
else
  echo "MISSING: taskfiles/checksum/tests.yaml"
fi

echo
echo "==> Show top-level keys in taskfiles/checksum/tests.yaml (yaml keys)"
if command -v python3 >/dev/null 2>&1; then
  python3 - <<'PY'
import sys, yaml, pathlib
p = pathlib.Path("taskfiles/checksum/tests.yaml")
if not p.exists():
    print("file not found")
    sys.exit(0)
try:
    data = yaml.safe_load(p.read_text())
except Exception as e:
    print("yaml parse error:", e)
    sys.exit(0)
if not isinstance(data, dict):
    print("yaml root is not a mapping")
    sys.exit(0)
for k in data.keys():
    print(k)
# If there is a 'tasks' key, print its top-level task names
if 'tasks' in data and isinstance(data['tasks'], dict):
    print("\nTop-level tasks in this file:")
    for t in data['tasks'].keys():
        print("-", t)
PY
else
  echo "python3 not available; skipping YAML introspection"
fi

Length of output: 4826


Fix broken task reference "checksum"

    • task: "checksum" in taskfiles/tests.yaml does not resolve to a local task; the included namespace taskfiles/checksum/tests.yaml exposes a default task. Replace the call with a namespaced reference or add a local wrapper.

Option A — add a wrapper (consistent with other entries):

 tasks:
   all:
     internal: true
     cmds:
       - task: "boost"
-      - task: "checksum"
+      - task: "checksum"
       - task: "remote"
       - task: "ystdlib-py"

+  checksum:
+    cmds:
+      - task: "checksum:default"

Option B — call the namespaced default directly:

-      - task: "checksum"
+      - task: "checksum:default"

Verified: taskfiles/checksum/tests.yaml defines a top-level "default" task.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- task: "checksum"
tasks:
all:
internal: true
cmds:
- task: "boost"
- task: "checksum"
- task: "remote"
- task: "ystdlib-py"
checksum:
cmds:
- task: "checksum:default"
🤖 Prompt for AI Agents
In taskfiles/tests.yaml around line 14, the task entry "- task: "checksum""
incorrectly references a non-existent local task; the included file
taskfiles/checksum/tests.yaml exposes a top-level "default" task. Fix by either
(A) adding a local wrapper task named "checksum" that delegates to the included
namespace’s default (consistent with other entries), or (B) replace the call
with the namespaced reference to the included file’s default task (e.g., use the
fully qualified namespace/task name). Ensure the chosen change matches the
repository convention for other entries and that task invocation resolves to the
checksum default task.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that we should add a wrapper task to stay consistent with remote:default and ystdlib-py:default.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Bill-hbrhbr, thank you for confirming! Adding the wrapper task will indeed maintain consistency with the existing patterns used for remote and ystdlib-py. The suggested code change above shows exactly how to implement this - it adds the local checksum task that delegates to checksum:default, matching the structure of the other test wrappers in the file.

- task: "remote"
- task: "ystdlib-py"

Expand Down