Skip to content
Merged
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
9 changes: 7 additions & 2 deletions devloop
Original file line number Diff line number Diff line change
Expand Up @@ -810,13 +810,18 @@ EOF
}

list_spec_files() {
local dir
local dir path
spec_search_dirs |
while IFS= read -r dir; do
if [ -d "$dir" ]; then
find "$dir" -type f -name '*.md'
fi
done | LC_ALL=C sort
done |
while IFS= read -r path; do
printf '%s\t%s\n' "${path##*/}" "$path"
done |
LC_ALL=C sort -t $'\t' -k1,1r -k2,2r |
cut -f2-
}

spec_dir_status() {
Expand Down
15 changes: 13 additions & 2 deletions scripts/devloop_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -1037,19 +1037,24 @@ printf '%s\n' "spec_dir=.specs" > "$clean_status_repo/.devloop/config"
if ! has_user_dirty_paths "$clean_status_repo"; then fail "devloop config was not treated as user dirt"; fi
equals "$(clean_candidate_status "$clean_status_track" "$clean_status_repo" "$work/source-repo")" "dirty" "clean candidate sees config dirt"

config_repo="$work/config-repo"
config_repo="$work/a-repo"
config_home="$work/config-home"
git init -q "$config_repo"
config_repo_real="$(cd "$config_repo" && pwd -P)"
config_default_specs="$config_repo_real/.devloop/specs"
mkdir -p "$config_repo/.devloop/specs" "$config_home"
equals "$(HOME="$config_home" devloop_config_file)" "$config_home/.devloop/config" "default config file"
printf '%s\n' "# Devloop" > "$config_repo/.devloop/specs/devloop.md"
printf '%s\n' "# Older" > "$config_repo/.devloop/specs/2026-07-23-older.md"
printf '%s\n' "# Latest" > "$config_repo/.devloop/specs/2026-07-25-latest.md"
config_specs="$(cd "$config_repo" && HOME="$config_home" list_spec_files)"
[[ -f "$config_home/.devloop/config" ]] || fail "global config was not created"
if grep -q "spec_dir=" "$config_home/.devloop/config"; then fail "global config seeded a default spec dir"; fi
contains "$(cat "$config_home/.devloop/config")" "timeout_minutes=30" "global config default timeout"
contains "$config_specs" "$config_default_specs/devloop.md" "default spec search uses repo .devloop/specs"
equals "$config_specs" "$config_default_specs/devloop.md
$config_default_specs/2026-07-25-latest.md
$config_default_specs/2026-07-23-older.md" "spec files sort descending with latest ISO date first"
equals "$(cd "$config_repo" && HOME="$config_home" devloop_spec_dir)" "$config_default_specs" "default spec dir is repo .devloop/specs"
equals "$(cd "$config_repo" && HOME="$config_home" spec_search_label)" "$config_default_specs" "spec search label is single default dir"
if (cd "$config_repo" && HOME="$config_home" configured_spec_dir) >/dev/null 2>&1; then fail "default spec dir reported as custom"; fi
Expand All @@ -1064,15 +1069,21 @@ contains "$configured_specs" "custom-specs/custom.md" "configured spec search in
contains "$configured_specs" "$config_default_specs/devloop.md" "configured spec search still includes default"
if (cd "$config_repo" && HOME="$config_home" write_config_spec_dir "../bad") >/dev/null 2>&1; then fail "write_config_spec_dir accepted path traversal"; fi

absolute_specs="$work/shared-specs"
absolute_specs="$work/z-shared"
equals "$(cd "$config_repo" && HOME="$config_home" write_config_spec_dir local "$absolute_specs")" "$absolute_specs" "write absolute config spec dir"
equals "$(cd "$config_repo" && HOME="$config_home" devloop_spec_dir)" "$absolute_specs" "absolute configured spec dir"
equals "$(cd "$config_repo" && HOME="$config_home" configured_spec_dir)" "$absolute_specs" "absolute custom spec dir"
[[ -d "$absolute_specs" ]] || fail "absolute configured spec dir was not created"
printf '%s\n' "# Shared" > "$absolute_specs/shared.md"
printf '%s\n' "# Older shared" > "$absolute_specs/2026-07-01-older.md"
absolute_configured_specs="$(cd "$config_repo" && HOME="$config_home" list_spec_files)"
contains "$absolute_configured_specs" "$absolute_specs/shared.md" "configured spec search includes absolute dir"
contains "$absolute_configured_specs" "$config_default_specs/devloop.md" "absolute spec search still includes default"
equals "$absolute_configured_specs" "$absolute_specs/shared.md
$config_default_specs/devloop.md
$config_default_specs/2026-07-25-latest.md
$config_default_specs/2026-07-23-older.md
$absolute_specs/2026-07-01-older.md" "spec files sort by basename across directories"
equals "$(spec_dir_status "$absolute_specs")" "exists" "spec dir status exists"
equals "$(spec_dir_status "$work/missing-specs")" "missing" "spec dir status missing"
(cd "$config_repo" && HOME="$config_home" remove_config_spec_dir local)
Expand Down
Loading