Skip to content

ci: use ast-grep to check that platform code stays in brush_core::sys - #1430

Merged
reubeno merged 1 commit into
mainfrom
ast-grep-platform-lint
Oct 2, 2026
Merged

reubeno merged 1 commit into
mainfrom
ast-grep-platform-lint

Conversation

@reubeno

@reubeno reubeno commented Oct 2, 2026

Copy link
Copy Markdown
Owner
  • Adds a pre-commit hook to run ast-grep with a new rule checking that platform-specific code is confined to the sys module.
  • Baseline existing violations.
  • Pin all pre-commit hooks to a full commit SHA.

Assisted-by: Claude Code:claude-opus-5-5

@reubeno
reubeno marked this pull request as ready for review October 2, 2026 16:13
Add ast-grep pre-commit hooks and a first rule, platform-cfg-outside-sys,
which flags target cfgs in brush-core outside the sys module: cfg and
cfg_attr attributes, cfg! and cfg_select!, and #[cfg] inside macro
bodies such as cfg_if! and macro_rules!. Platform code outside sys can
only exist behind such a cfg -- otherwise a cross-compiled CI target
fails to build -- so flagging the cfgs is enough to keep it out, and
matching the syntax tree sees every platform's code in one pass.

The 12 existing gates are baselined in place. The hook runs with
--error=unused-suppression, so the baseline can only shrink. Rule tests
pin down which forms the rule must and mustn't match, and run whenever
the rules change. sgconfig.yml points at rules and tests kept under
.config/ast-grep/.

Also pin every third-party hook to a full commit SHA, with a
`# frozen: <tag>` comment, as GitHub Actions are, since a tag can be
moved to point at different code. Dependabot updates both the SHA and
the comment, except for lychee, whose prefixed tags it can't rewrite in
the comment.

Assisted-by: Claude Code:claude-opus-5-5
@reubeno
reubeno force-pushed the ast-grep-platform-lint branch from 85a6cf2 to 9bc9f51 Compare October 2, 2026 16:13
@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Test Results

     5 files      53 suites   21m 12s ⏱️
 3 236 tests  3 236 ✅ 0 💤 0 ❌
10 121 runs  10 121 ✅ 0 💤 0 ❌

Results for commit 9bc9f51.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Performance Benchmark Report

Benchmark name Baseline (μs) Test/PR (μs) Delta (μs) Delta %
clone_shell_object 16.86 μs 16.57 μs -0.29 μs ⚪ Unchanged
eval_arithmetic 0.14 μs 0.12 μs -0.01 μs 🟢 -7.41%
expand_one_string 1.47 μs 1.47 μs 0.00 μs ⚪ Unchanged
for_loop 25.75 μs 25.81 μs 0.05 μs ⚪ Unchanged
full_peg_complex 51.79 μs 49.86 μs -1.93 μs 🟢 -3.73%
full_peg_for_loop 5.87 μs 5.62 μs -0.25 μs 🟢 -4.24%
full_peg_nested_expansions 16.78 μs 16.27 μs -0.51 μs 🟢 -3.02%
full_peg_pipeline 3.91 μs 3.81 μs -0.10 μs ⚪ Unchanged
full_peg_simple 1.56 μs 1.56 μs -0.01 μs ⚪ Unchanged
function_call 3.15 μs 3.09 μs -0.06 μs ⚪ Unchanged
instantiate_shell 50.65 μs 49.71 μs -0.94 μs ⚪ Unchanged
instantiate_shell_with_init_scripts 22510.31 μs 22118.90 μs -391.42 μs ⚪ Unchanged
parse_peg_bash_completion 2022.61 μs 1970.26 μs -52.35 μs ⚪ Unchanged
parse_peg_complex 16.54 μs 16.11 μs -0.43 μs ⚪ Unchanged
parse_peg_for_loop 1.66 μs 1.71 μs 0.06 μs ⚪ Unchanged
parse_peg_pipeline 1.76 μs 1.73 μs -0.03 μs ⚪ Unchanged
parse_peg_simple 0.94 μs 0.92 μs -0.02 μs ⚪ Unchanged
run_echo_builtin_command 11.13 μs 10.97 μs -0.16 μs ⚪ Unchanged
tokenize_sample_script 3.14 μs 3.07 μs -0.08 μs ⚪ Unchanged

Code Coverage Report: Only Changed Files listed

Package Base Coverage New Coverage Difference
brush-builtins/src/bind.rs 🟢 86.05% 🟢 86.01% 🔴 -0.04%
brush-builtins/src/kill.rs 🟠 59.52% 🟠 65.26% 🟢 5.74%
brush-core/src/commands.rs 🟢 93.79% 🟢 94.01% 🟢 0.22%
brush-core/src/completion.rs 🟠 74.32% 🟢 75.2% 🟢 0.88%
brush-core/src/error.rs 🟢 90.91% 🟢 94.81% 🟢 3.9%
brush-core/src/expansion/fieldsplit.rs 🔴 0% 🟢 100% 🟢 100%
brush-core/src/extendedtests.rs 🟠 75% 🟢 75.76% 🟢 0.76%
brush-core/src/jobs.rs 🟠 51.13% 🟠 50% 🔴 -1.13%
brush-core/src/openfiles.rs 🟠 64.15% 🟠 64.62% 🟢 0.47%
brush-core/src/patterns.rs 🟢 97.63% 🟢 97.97% 🟢 0.34%
brush-core/src/prompt.rs 🟢 94.48% 🟢 94.51% 🟢 0.03%
brush-core/src/regex.rs 🟢 99.17% 🟢 100% 🟢 0.83%
brush-core/src/results.rs 🟢 80.16% 🟢 81.4% 🟢 1.24%
brush-core/src/shell.rs 🟢 94.78% 🟢 95.32% 🟢 0.54%
brush-core/src/shell/expansion.rs 🔴 27.27% 🔴 40.74% 🟢 13.47%
brush-core/src/shell/prompts.rs 🟢 97.62% 🟢 97.37% 🔴 -0.25%
brush-core/src/sourceinfo.rs 🟢 94.74% 🟢 100% 🟢 5.26%
brush-core/src/sys/unix/signal.rs 🟠 61.82% 🟠 63.49% 🟢 1.67%
brush-core/src/wellknownvars.rs 🟢 84.53% 🟢 84.72% 🟢 0.19%
brush-interactive/src/basic/input_backend.rs 🟠 52.54% 🟠 55.93% 🟢 3.39%
brush-interactive/src/completeness.rs 🟢 97.44% 🟢 97.89% 🟢 0.45%
brush-interactive/src/interactive_shell.rs 🟠 65.67% 🟢 88.24% 🟢 22.57%
brush-interactive/src/term_integration.rs 🔴 46.02% 🟢 81.82% 🟢 35.8%
brush-interactive/src/zsh_hooks.rs 🔴 0% 🟢 100% 🟢 100%
brush-parser/src/ast.rs 🟠 58.16% 🟠 59.81% 🟢 1.65%
brush-parser/src/parser/peg.rs 🟢 95.39% 🟢 95.47% 🟢 0.08%
brush-parser/src/tokenizer.rs 🟢 93.7% 🟢 97.02% 🟢 3.32%
brush-parser/src/tokenizer/char_reader.rs 🔴 0% 🟢 100% 🟢 100%
brush-parser/src/word.rs 🟢 94.14% 🟢 95.2% 🟢 1.06%
brush-shell/src/config.rs 🟢 95.77% 🟢 95.65% 🔴 -0.12%
brush-shell/src/entry.rs 🟢 91.1% 🟢 94.12% 🟢 3.02%
brush-shell/src/error_formatter.rs 🟢 90% 🟢 100% 🟢 10%
brush-test-harness/src/runner.rs 🟢 84.18% 🟢 85.6% 🟢 1.42%
xtask/src/e2e.rs 🔴 0% 🟠 70.05% 🟢 70.05%
Overall Coverage 🟢 77.7% 🟢 79.37% 🟢 1.67%

Minimum allowed coverage is 70%, this run produced 79.37%
Maximum allowed coverage difference is -5%, this run produced 1.67%

🧪 End-to-end suites

🟡 7/7 adapters passed · 2324 tests · 2053 ✅ (93.5%) · 108 ❌ · 34 ❎ · 129 ⏩ · ⏱ 11m28.6s

adapter % pass ✅ pass ❌ fail ❎ xfail ⏩ skip ⏱ time
🟡 atuin 80.0% 4 1 40.0s
📊 bash-completion 94.0% 1993 108 20 128 5m58.8s
🟡 fzf 75.8% 25 8 1 2m57.3s
🟡 mise 50.0% 4 4 28.2s
🟡 nvm 95.0% 19 1 35.8s
✅ starship 100.0% 4 26.2s
✅ zoxide 100.0% 4 22.2s
❌ bash-completion · 108 failed
  • t.test_7z.Test7z::test_6
    AssertionError: assert <CompletionResult []> == ['-air@a.7z',...hello.7z.002']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'Test7z and test_6'
  • t.test_export.TestExport::test_4
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestExport and test_4'
  • t.test_find.TestFind::test_4
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestFind and test_4'
  • test_exec
    AssertionError: assert <CompletionResult []> == 'p'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_exec
  • t.test_finger.TestFinger::test_partial_hostname
    AssertionError: assert <CompletionResult []> == ['test@4a718570f4ba']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestFinger and test_partial_hostname'
  • t.test_function.TestFunction::test_3
    AssertionError: Unexpected output: [() {
        echo
    } ]
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestFunction and test_3'
  • t.test_inotifywait.TestInotifywait::test_5
    assert '@ab/' in <CompletionResult ['a\\ b/', 'a\\$b/', 'a\\&b/', "a\\'b/", 'ab/', 'aé/']>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestInotifywait and test_5'
  • test_alias_at_point
    failed on setup with "pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7f24de299a90>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): 'alias foo'
    before (last 100 chars): 'alias foo'
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_alias_at_point
  • t.test_javadoc.TestJavadoc::test_2
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestJavadoc and test_2'
  • t.test_javadoc.TestJavadoc::test_3
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestJavadoc and test_3'
  • test_4_comp_dequote_incomplete
    assert <CompletionResult ['\x08\x08\x08\x08\x08\x08\x08\x08\x08shared.default']> == "efault'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_4_comp_dequote_incomplete
  • test_jobs
    AssertionError: assert 'bash' in <CompletionResult []>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_jobs
  • t.test_make.TestMake::test_8n
    failed on teardown with "FileNotFoundError: [Errno 2] No such file or directory: '/bash-completion/test/fixtures/make/extra_makefile'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestMake and test_8n'
  • t.test_make.TestMake::test_8n
    failed on teardown with "FileNotFoundError: [Errno 2] No such file or directory: '/bash-completion/test/fixtures/make/extra_makefile'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestMake and test_8n'
  • t.test_mkdir.TestMkdir::test_2
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestMkdir and test_2'
  • test_special_at_point
    failed on setup with "pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7f24de298910>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): 'apt-cache  add foo'
    before (last 100 chars): 'apt-cache  add foo'
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_special_at_point
  • t.test_cd.TestCd::test_1
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestCd and test_1'
  • t.test_cd.TestCd::test_2
    AssertionError: assert <CompletionResult ['.d']> == '.d/'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestCd and test_2'
  • t.test_mock.TestMock::test_2
    failed on setup with "pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7fb888b6ca50>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): '\r\n'
    before (last 100 chars): '\r\n'
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestMock and test_2'
  • t.test_mr.TestMr::test_4
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestMr and test_4'
  • t.test_perl.TestPerl::test_12
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPerl and test_12'
  • t.test_perl.TestPerl::test_13
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPerl and test_13'
  • t.test_perl.TestPerl::test_15
    AssertionError: assert <CompletionRe...ar\\ bar.d/']> == ['bar', 'bar bar.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPerl and test_15'
  • test_dir_at_point
    failed on setup with "pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7f24de2991d0>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): 'cd shared/default/foo.d/'
    before (last 100 chars): 'cd shared/default/foo.d/'
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_dir_at_point
  • test_cdpath_leading_colon
    AssertionError: assert <CompletionRe...d.so.conf.d']> == ['.ssh/', 'ba...'foo.d/', ...]
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_cdpath_leading_colon
  • t.test_chown.TestChown::test_2
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestChown and test_2'
  • t.test_chown.TestChown::test_3
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestChown and test_3'
  • t.test_chroot.TestChroot::test_2
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestChroot and test_2'
  • test_all_out
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_all_out
  • t.test_curl.TestCurl::test_3
    AssertionError: assert <CompletionResult []> == 'oo'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestCurl and test_3'
  • test_data_atfile_dir
    AssertionError: assert <CompletionResult []> == 'd/'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_data_atfile_dir
  • test_interface_ipv6
    AssertionError: assert ':1' in <CompletionResult ['1']>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_interface_ipv6
  • test_options[-]
    AssertionError: assert '-o' in <CompletionResult []>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_options[-]
  • test_options[+]
    AssertionError: assert '+o' in <CompletionResult []>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'test_options[+]'
  • test_async_class_methods
    AssertionError: assert <CompletionResult ['\x08\x08test_positive']> == 'test_positive'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_async_class_methods
  • t.test_python.TestPython::test_4
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPython and test_4'
  • t.test_python.TestPython::test_5
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPython and test_5'
  • test_O_application
    AssertionError: assert <CompletionResult ['\x08ssh:']> == 'ssh:'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_O_application
  • t.test_python3.TestPython3::test_4
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPython3 and test_4'
  • t.test_python3.TestPython3::test_5
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestPython3 and test_5'
  • t.test_tar.TestTar::test_17
    AssertionError: assert <CompletionResult ['\x08e2e']> == ['e2e']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestTar and test_17'
  • t.test_tar.TestTar::test_18
    AssertionError: assert <CompletionResult ['\x08e2e']> == ['e2e']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestTar and test_18'
  • t.test_rmdir.TestRmdir::test_2
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestRmdir and test_2'
  • t.test_time.TestTime::test_3
    AssertionError: assert <CompletionResult []> == ['arp', 'ifconfig', 'ip']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestTime and test_3'
  • t.test_tree.TestTree::test_basic
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestTree and test_basic'
  • test_fromfile
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_fromfile
  • t.test_sbcl.TestSbcl::test_1
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestSbcl and test_1'
  • t.test_sbcl_mt.TestSbclMt::test_1
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestSbclMt and test_1'
  • t.test_screen.TestScreen::test_2
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestScreen and test_2'
  • t.test_useradd.TestUseradd::test_chroot_shells
    AssertionError: assert <CompletionResult ['\x08/bash/completion/canary']> == '/bash/completion/canary'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUseradd and test_chroot_shells'
  • t.test_userdel.TestUserdel::test_2
    AssertionError: assert (<CompletionResult []> == 't' or 'root' in <CompletionResult []>)
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUserdel and test_2'
  • t.test_valgrind.TestValgrind::test_5
    AssertionError: assert <CompletionResult []> == ['arp', 'ifconfig', 'ip']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestValgrind and test_5'
  • test_3[cmd7 l-expected_completion1]
    AssertionError: assert <CompletionRe...two', 'long']> == <CompletionRe...long', 'two']>
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'test_3[cmd7 l-expected_completion1]'
  • test_3[cmd7 line-expected_completion3]
    AssertionError: Unexpected output: [\
    two ]
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'test_3[cmd7 line-expected_completion3]'
  • test_4[f]
    AssertionError: assert <CompletionResult []> == 'c'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_4[f]
  • test_4[f2]
    AssertionError: assert <CompletionResult []> == 'c'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_4[f2]
  • test_7[f]
    assert <CompletionResult ['\x08\x08\x08\x08ab/e']> == "e'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_7[f]
  • test_7[f2]
    assert <CompletionResult ['\x08\x08\x08\x08ab/e']> == "e'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_7[f2]
  • test_11[f]
    assert <CompletionResult ['\x08\x08\x08\x08ab/e']> == 'e"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_11[f]
  • test_11[f2]
    assert <CompletionResult ['\x08\x08\x08\x08ab/e']> == 'e"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_11[f2]
  • test_13[f]
    assert <CompletionResult ['\x08\x08\x08\x08\x08ab/e']> == 'c"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_13[f]
  • test_13[f2]
    assert <CompletionResult ['\x08\x08\x08\x08\x08ab/e']> == 'c"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_13[f2]
  • test_17[f]
    AssertionError: assert <CompletionResult []> == 'h'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_17[f]
  • test_17[f2]
    AssertionError: assert <CompletionResult []> == 'h'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_17[f2]
  • test_19[f]
    AssertionError: assert <CompletionResult []> == 'd'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_19[f]
  • test_19[f2]
    AssertionError: assert <CompletionResult []> == 'd'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_19[f2]
  • test_20[f]
    AssertionError: assert <CompletionResult []> == 'g'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_20[f]
  • test_20[f2]
    AssertionError: assert <CompletionResult []> == 'g'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_20[f2]
  • test_21[f]
    assert <CompletionResult []> == "d'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_21[f]
  • test_21[f2]
    assert <CompletionResult []> == "d'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_21[f2]
  • test_22[f]
    assert <CompletionResult []> == "g'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_22[f]
  • test_22[f2]
    assert <CompletionResult []> == "g'"
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_22[f2]
  • test_23[f]
    assert <CompletionResult []> == 'd"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_23[f]
  • test_23[f2]
    assert <CompletionResult []> == 'd"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_23[f2]
  • test_24[f]
    assert <CompletionResult []> == 'g"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_24[f]
  • test_24[f2]
    assert <CompletionResult []> == 'g"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_24[f2]
  • test_25[f]
    assert <CompletionResult ['\x08\x08\x08\x08\x08ab/e']> == '\x08\x08\x08b/e"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_25[f]
  • test_25[f2]
    assert <CompletionResult ['\x08\x08\x08\x08\x08ab/e']> == '\x08\x08\x08b/e"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_25[f2]
  • test_26[f]
    assert <CompletionResult []> == 'h"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_26[f]
  • test_26[f2]
    assert <CompletionResult []> == 'h"'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_26[f2]
  • test_28_dot_4[f]
    AssertionError: assert <CompletionResult []> == '/'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_28_dot_4[f]
  • test_28_dot_4[f2]
    AssertionError: assert <CompletionResult []> == '/'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_28_dot_4[f2]
  • test_closing_brackets_after_at
    AssertionError: assert <CompletionResult []> == ']}'
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_closing_brackets_after_at
  • test_incomplete_1
    AssertionError: Error running "__tester 'a\'": exit status=1, output="
      "
    assert '1' == '0'
    
      - 0
      + 1
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_incomplete_1
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_1
    AssertionError: Unexpected output from "_comp__test_unit '()' 0": exit status=0, output="
      local: words=(): not a valid variable name"
    assert False
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_1'
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_2
    AssertionError: assert 'local: words...: ${words[i]}' == 'b'
    
      - b
      + local: words=(a b): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_2'
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_3
    AssertionError: assert 'local: words...: ${words[i]}' == 'bc'
    
      - bc
      + local: words=(a bc): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_3'
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_4
    AssertionError: assert 'local: words...: ${words[i]}' == 'b'
    
      - b
      + local: words=(a b c): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_4'
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_5
    AssertionError: assert 'local: words...variable name' == ''
    
      + local: words=(a b c): not a valid variable name
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_5'
  • t.unit.test_unit_get_first_arg.TestUnitGetFirstArg::test_6
    AssertionError: assert 'local: words...: ${words[i]}' == 'd'
    
      - d
      + local: words=(a -b -c d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestUnitGetFirstArg and test_6'
  • test_7_single_hyphen
    AssertionError: assert 'local: words...: ${words[i]}' == '-'
    
      - -
      + local: words=(a -b - c -d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_7_single_hyphen
  • test_8_double_hyphen_1
    AssertionError: assert 'local: words...: ${words[i]}' == '-c'
    
      - -c
      + local: words=(a -b -- -c -d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_8_double_hyphen_1
  • test_8_double_hyphen_2
    AssertionError: assert 'local: words...: ${words[i]}' == 'b'
    
      - b
      + local: words=(a b -- -c -d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_8_double_hyphen_2
  • test_9_skip_optarg_1
    AssertionError: assert 'local: words...: ${words[i]}' == 'e'
    
      - e
      + local: words=(a -b -c d e f): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_1
  • test_9_skip_optarg_2
    AssertionError: assert 'local: words...: ${words[i]}' == 'e'
    
      - e
      + local: words=(a -b --foo d e f): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_2
  • test_9_skip_optarg_3
    AssertionError: assert 'local: words...: ${words[i]}' == 'c'
    
      - c
      + local: words=(a -b - c d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_3
  • test_9_skip_optarg_4
    AssertionError: assert 'local: words...: ${words[i]}' == 'd'
    
      - d
      + local: words=(a -b -c d e f): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_4
  • test_9_skip_optarg_5
    AssertionError: assert 'local: words...: ${words[i]}' == 'c'
    
      - c
      + local: words=(a +o b c d): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_5
  • test_9_skip_optarg_6
    AssertionError: assert 'local: words...: ${words[i]}' == 'b'
    
      - b
      + local: words=(a -o -o -o -o b c): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_6
  • test_9_skip_optarg_7
    AssertionError: assert 'local: words...: ${words[i]}' == 'd'
    
      - d
      + local: words=(a -o -- -b -c d e): not a valid variable name
      + #x1B[31merror:#x1B[39m expanding unset variable: ${words[i]}
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_9_skip_optarg_7
  • test_github_issue_526_1
    pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7f24de298b90>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): "alpha\\tbeta/' b"
    before (last 100 chars): "echo alpha\\\x08\x08\x08\x08\x08\x08$'alpha\\tbeta/' b"
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_github_issue_526_1
  • t.test_vpnc.TestVpnc::test_1
    failed on teardown with "pexpect.exceptions.TIMEOUT: Timeout exceeded.
    <pexpect.pty_spawn.spawn object at 0x7fb888b6ead0>
    command: /shell/brush
    args: [b'/shell/brush', b'--noprofile', b'--no-config', b'--input-backend=basic', b'--norc']
    buffer (last 100 chars): ''
    before (last 100 chars): ''
    …
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestVpnc and test_1'
  • t.test_wget.TestWget::test_3
    AssertionError: assert ':1' in <CompletionResult ['\x08\x08:1']>
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestWget and test_3'
  • t.test_wine.TestWine::test_1
    AssertionError: assert <CompletionRe.../', 'foo.d/']> == ['bar bar.d/', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestWine and test_1'
  • t.test_wine.TestWine::test_2
    AssertionError: assert <CompletionRe...o', 'foo.d/']> == ['bar', 'bar ...oo', 'foo.d/']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestWine and test_2'
  • t.test_write.TestWrite::test_1
    AssertionError: assert (<CompletionResult []> == 't' or 'root' in <CompletionResult []>)
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'TestWrite and test_1'
  • test_hosts[+]
    AssertionError: assert <CompletionRe...a718570f4ba']> == ['+4a718570f4ba']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k 'test_hosts[+]'
  • test_hosts[-]
    AssertionError: assert <CompletionRe...a718570f4ba']> == ['-4a718570f4ba']
    
      Use -v to get more diff
    
    Reproduce: cargo xtask test e2e bash-completion -- -k test_hosts[-]
⏩ bash-completion · 128 did not run
  • t.test_2to3.Test2to3::test_2
  • t.test_acroread.TestAcroread::test_1
  • t.test_dpkg_query.TestDpkgQuery::test_show
  • t.test_faillog.TestFaillog::test_1
  • t.test_finger.TestFinger::test_2
  • test_finger
  • t.test_freebsd_update.TestFreebsdUpdate::test_1
  • t.test_freeciv.TestFreeciv::test_1
  • t.test_gnome_mplayer.TestGnomeMplayer::test_2
  • t.test_grub.TestGrub::test_1
  • test_parens
  • t.test_ifdown.TestIfdown::test_1
  • t.test_ifup.TestIfup::test_1
  • t.test_ifup.TestIfup::test_2
  • t.test_influx.TestInflux::test_options
  • t.test_influx.TestInflux::test_format
  • test_stats
  • t.test_appdata_validate.TestAppdataValidate::test_2
  • t.test_javaws.TestJavaws::test_2
  • t.test_jshint.TestJshint::test_2
  • t.test_kdvi.TestKdvi::test_1
  • t.test_kldload.TestKldload::test_1
  • t.test_kldunload.TestKldunload::test_1
  • t.test_kpdf.TestKpdf::test_1
  • t.test_lastlog.TestLastlog::test_1
  • t.test_lintian_info.TestLintianInfo::test_2
  • t.test_locale_gen.TestLocaleGen::test_1
  • t.test_locale_gen.TestLocaleGen::test_2
  • t.test_lrzip.TestLrzip::test_3
  • test_longopt
  • t.test_ls.TestLs::test_3
  • t.test_mencoder.TestMencoder::test_2
  • t.test_aptitude.TestAptitude::test_options
  • test_long_options
  • t.test_arch.TestArch::test_1
  • t.test_arpspoof.TestArpspoof::test_1
  • t.test_cancel.TestCancel::test_1
  • t.test_ccze.TestCcze::test_1
  • t.test_ccze.TestCcze::test_4
  • t.test_module.TestModule::test_1
  • t.test_monodevelop.TestMonodevelop::test_2
  • t.test_mplayer.TestMplayer::test_2
  • t.test_newlist.TestNewlist::test_1
  • t.test_opera.TestOpera::test_2
  • t.test_phing.TestPhing::test_1
  • t.test_phing.TestPhing::test_2
  • t.test_pine.TestPine::test_1
  • t.test_cfagent.TestCfagent::test_1
  • t.test_pkg_deinstall.TestPkgDeinstall::test_1
  • t.test_chflags.TestChflags::test_basic
  • t.test_chflags.TestChflags::test_options
  • test_options_after_R
  • test_first_word
  • t.test_pkg_info.TestPkgInfo::test_1
  • t.test_pkgadd.TestPkgadd::test_1
  • t.test_pkgrm.TestPkgrm::test_1
  • t.test_chown.TestChown::test_1
  • t.test_pkgutil.TestPkgutil::test_1
  • t.test_portsnap.TestPortsnap::test_1
  • t.test_civclient.TestCivclient::test_1
  • t.test_civserver.TestCivserver::test_1
  • t.test_postfix.TestPostfix::test_options
  • t.test_prelink.TestPrelink::test_2
  • t.test_curlie.TestCurlie::test_options
  • t.test_dcop.TestDcop::test_1
  • t.test_sitecopy.TestSitecopy::test_1
  • t.test_slapt_get.TestSlaptGet::test_1
  • t.test_slapt_get.TestSlaptGet::test_2
  • t.test_slapt_get.TestSlaptGet::test_install
  • t.test_slapt_src.TestSlaptSrc::test_1
  • t.test_slapt_src.TestSlaptSrc::test_2
  • t.test_slapt_src.TestSlaptSrc::test_3
  • t.test_slapt_src.TestSlaptSrc::test_install
  • t.test_pyston.TestPyston::test_options
  • t.test_pyston.TestPyston::test_bb
  • t.test_qemu.TestQemu::test_2
  • t.test_qemu.TestQemu::test_keymaps
  • t.test_querybts.TestQuerybts::test_1
  • t.test_rdict.TestRdict::test_1
  • t.test_reportbug.TestReportbug::test_1
  • test_bts
  • test_parse_usage_alternative_options
  • test_value_command
  • test_value_directory
  • test_value_file
  • test_option_with_value
  • test_option_multiple_with_value
  • test_option_with_value_with_dash
  • test_option_explicit_end
  • test_option_with_attached_value
  • test_option_multiple_with_attached_value
  • test_option_without_value
  • test_option_multiple_without_value
  • test_nested_arguments_tmux_subcommand
  • test_subcommand_unknown
  • test_subcommand_option_value
  • t.test_tmux.TestTmux::test_subcommand_options
  • test_subcommand_no_positional_arg_completion
  • test_subcommand_repetition
  • test_subcommand_positional_arg_1
  • test_subcommand_positional_arg_2
  • test_subcommand_no_positional_args
  • test_subcommand_too_many_positional_args
  • test_tmux_option_value
  • test_tmux_options
  • test_tmux_multiple_commands[foo ';']
  • test_tmux_multiple_commands[foo';']
  • test_tmux_multiple_commands[foo '\\\\;']
  • test_tmux_multiple_commands[foo'\\\\;']
  • test_tmux_semicolon_within_subcommand[foo '\\;']
  • test_tmux_semicolon_within_subcommand[foo'\\;']
  • test_tmux_semicolon_within_subcommand[foo '\\\\\\;']
  • test_tmux_semicolon_within_subcommand[foo'\\\\\\;']
  • test_tmux_semicolon_within_subcommand[foo';'bar]
  • test_tmux_subcommand
  • t.test_totem.TestTotem::test_basic
  • t.test_sbopkg.TestSbopkg::test_1
  • test_live
  • test_xfunc_remote_files
  • t.test_unshunt.TestUnshunt::test_1
  • t.test_vi.TestVi::test_1
  • t.test_vi.TestVi::test_2
  • t.unit.test_unit_compgen_ip_addresses.TestUnitCompgenIpAddresses::test_4
  • t.test_wsimport.TestWsimport::test_2
  • t.test_xfreerdp.TestXfreerdp::test_1
  • t.test_xfreerdp.TestXfreerdp::test_3
  • t.test_xfreerdp.TestXfreerdp::test_4
  • t.test_xmms.TestXmms::test_1
⏩ fzf · 1 did not run
  • test_ctrl_r_abort

📎 Run logs · artifact e2e-logs

@reubeno
reubeno merged commit f29eb32 into main Oct 2, 2026
53 checks passed
@reubeno
reubeno deleted the ast-grep-platform-lint branch October 2, 2026 16:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant