Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ansible-navigator for openSUSE:Factory checked in at 2026-09-24 22:58:14 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ansible-navigator (Old) and /work/SRC/openSUSE:Factory/.ansible-navigator.new.383539 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-navigator" Thu Sep 24 22:58:14 2026 rev:25 rq:1380099 version:26.9.0 Changes: -------- --- /work/SRC/openSUSE:Factory/ansible-navigator/ansible-navigator.changes 2026-08-12 16:15:13.189345408 +0200 +++ /work/SRC/openSUSE:Factory/.ansible-navigator.new.383539/ansible-navigator.changes 2026-09-24 23:00:53.427836482 +0200 @@ -1,0 +2,23 @@ +Thu Sep 24 05:12:30 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 26.9.0: + * fix: request explicit columns when listing images (#2172) + * chore(deps): update all dependencies (#2171) + * chore(deps): update all dependencies (#2170) + * chore: Add SECURITY.md (#2169) + * docs: enhance CONTRIBUTING.md linting section and update + pre-commit hooks (#2168) + * chore(deps): update all dependencies (#2167) + * Add limited Apple Container support as container engine (#2163) + * fix: handle undeterminable home directory when expanding a path + (#2165) + * fix: handle invalid artifact filename formats (#2160) + * fix: handle OSError when checking a playbook path (#2164) + * docs: clarify shell pipelines in execution environments (#2154) + * chore(deps): update all dependencies (#2162) + * Enhance CONTRIBUTING.md with patching fixture guidance (#2155) + * fix(docs): remove conflicting keys from .readthedocs.yml + (#2159) + * chore(deps): update all dependencies (#2157) + +------------------------------------------------------------------- Old: ---- ansible-navigator-26.8.0.obscpio New: ---- ansible-navigator-26.9.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ansible-navigator.spec ++++++ --- /var/tmp/diff_new_pack.YIj9bQ/_old 2026-09-24 23:00:54.184868137 +0200 +++ /var/tmp/diff_new_pack.YIj9bQ/_new 2026-09-24 23:00:54.185868178 +0200 @@ -38,7 +38,7 @@ %endif Name: ansible-navigator -Version: 26.8.0 +Version: 26.9.0 Release: 0 Summary: A text-based user interface (TUI) for Ansible License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.YIj9bQ/_old 2026-09-24 23:00:54.217869517 +0200 +++ /var/tmp/diff_new_pack.YIj9bQ/_new 2026-09-24 23:00:54.220869642 +0200 @@ -3,7 +3,7 @@ <param name="url">https://github.com/ansible/ansible-navigator.git</param> <param name="scm">git</param> <param name="package-meta">yes</param> - <param name="revision">refs/tags/v26.8.0</param> + <param name="revision">refs/tags/v26.9.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.YIj9bQ/_old 2026-09-24 23:00:54.241870520 +0200 +++ /var/tmp/diff_new_pack.YIj9bQ/_new 2026-09-24 23:00:54.246870729 +0200 @@ -3,6 +3,6 @@ <param name="url">https://github.com/ansible/ansible-navigator</param> <param name="changesrevision">bd496c36423fba07be078739335f047adfbabe6e</param></service><service name="tar_scm"> <param name="url">https://github.com/ansible/ansible-navigator.git</param> - <param name="changesrevision">30e0b3d0f454a524e3520f9de0cbf18620b1b790</param></service></servicedata> + <param name="changesrevision">968b23182d726eb6691290651b533a3aa7db8d79</param></service></servicedata> (No newline at EOF) ++++++ ansible-navigator-26.8.0.obscpio -> ansible-navigator-26.9.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.config/dictionary.txt new/ansible-navigator-26.9.0/.config/dictionary.txt --- old/ansible-navigator-26.8.0/.config/dictionary.txt 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.config/dictionary.txt 2026-09-16 08:32:25.000000000 +0200 @@ -19,6 +19,7 @@ devel dumpable dunder +enametoolong escdelay facelessuser fedoraproject @@ -41,6 +42,7 @@ lentext levelname libonig +lifecycle lightbulbs linenums lintable @@ -87,6 +89,7 @@ tracebacks truecolor usefixtures +userland volmount withast workdir diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/HEAD new/ansible-navigator-26.9.0/.git/HEAD --- old/ansible-navigator-26.8.0/.git/HEAD 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/HEAD 2026-09-16 08:32:25.000000000 +0200 @@ -1 +1 @@ -30e0b3d0f454a524e3520f9de0cbf18620b1b790 +968b23182d726eb6691290651b533a3aa7db8d79 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/ORIG_HEAD new/ansible-navigator-26.9.0/.git/ORIG_HEAD --- old/ansible-navigator-26.8.0/.git/ORIG_HEAD 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/ORIG_HEAD 2026-09-16 08:32:25.000000000 +0200 @@ -1 +1 @@ -30e0b3d0f454a524e3520f9de0cbf18620b1b790 +968b23182d726eb6691290651b533a3aa7db8d79 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/applypatch-msg.sample new/ansible-navigator-26.9.0/.git/hooks/applypatch-msg.sample --- old/ansible-navigator-26.8.0/.git/hooks/applypatch-msg.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/applypatch-msg.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to check the commit log message taken by # applypatch from an e-mail message. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/commit-msg.sample new/ansible-navigator-26.9.0/.git/hooks/commit-msg.sample --- old/ansible-navigator-26.8.0/.git/hooks/commit-msg.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/commit-msg.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to check the commit log message. # Called by "git commit" with one argument, the name of the file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/fsmonitor-watchman.sample new/ansible-navigator-26.9.0/.git/hooks/fsmonitor-watchman.sample --- old/ansible-navigator-26.8.0/.git/hooks/fsmonitor-watchman.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/fsmonitor-watchman.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/z1230rx4kj280i04m38dzqqjgm207vn4-perl-5.42.0/bin/perl +#!/nix/store/myzwgd3ylpl3d8zrl7kl3l97i7zl8mw6-perl-5.42.0/bin/perl use strict; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/post-update.sample new/ansible-navigator-26.9.0/.git/hooks/post-update.sample --- old/ansible-navigator-26.8.0/.git/hooks/post-update.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/post-update.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to prepare a packed repository for use over # dumb transports. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-applypatch.sample new/ansible-navigator-26.9.0/.git/hooks/pre-applypatch.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-applypatch.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-applypatch.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to verify what is about to be committed # by applypatch from an e-mail message. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-commit.sample new/ansible-navigator-26.9.0/.git/hooks/pre-commit.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-commit.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-commit.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to verify what is about to be committed. # Called by "git commit" with no arguments. The hook should diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-merge-commit.sample new/ansible-navigator-26.9.0/.git/hooks/pre-merge-commit.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-merge-commit.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-merge-commit.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to verify what is about to be committed. # Called by "git merge" with no arguments. The hook should diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-push.sample new/ansible-navigator-26.9.0/.git/hooks/pre-push.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-push.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-push.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # An example hook script to verify what is about to be pushed. Called by "git # push" after it has checked the remote status, but before anything has been diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-rebase.sample new/ansible-navigator-26.9.0/.git/hooks/pre-rebase.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-rebase.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-rebase.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # Copyright (c) 2006, 2008 Junio C Hamano # @@ -65,7 +65,7 @@ fi else not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` - /nix/store/z1230rx4kj280i04m38dzqqjgm207vn4-perl-5.42.0/bin/perl -e ' + /nix/store/myzwgd3ylpl3d8zrl7kl3l97i7zl8mw6-perl-5.42.0/bin/perl -e ' my $topic = $ARGV[0]; my $msg = "* $topic has commits already merged to public branch:\n"; my (%not_in_next) = map { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/pre-receive.sample new/ansible-navigator-26.9.0/.git/hooks/pre-receive.sample --- old/ansible-navigator-26.8.0/.git/hooks/pre-receive.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/pre-receive.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to make use of push options. # The example simply echoes all push options that start with 'echoback=' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/prepare-commit-msg.sample new/ansible-navigator-26.9.0/.git/hooks/prepare-commit-msg.sample --- old/ansible-navigator-26.8.0/.git/hooks/prepare-commit-msg.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/prepare-commit-msg.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to prepare the commit log message. # Called by "git commit" with the name of the file that has the @@ -24,11 +24,11 @@ COMMIT_SOURCE=$2 SHA1=$3 -/nix/store/z1230rx4kj280i04m38dzqqjgm207vn4-perl-5.42.0/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" +/nix/store/myzwgd3ylpl3d8zrl7kl3l97i7zl8mw6-perl-5.42.0/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE" # case "$COMMIT_SOURCE,$SHA1" in # ,|template,) -# /nix/store/z1230rx4kj280i04m38dzqqjgm207vn4-perl-5.42.0/bin/perl -i.bak -pe ' +# /nix/store/myzwgd3ylpl3d8zrl7kl3l97i7zl8mw6-perl-5.42.0/bin/perl -i.bak -pe ' # print "\n" . `git diff --cached --name-status -r` # if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;; # *) ;; @@ -38,5 +38,5 @@ # git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE" # if test -z "$COMMIT_SOURCE" # then -# /nix/store/z1230rx4kj280i04m38dzqqjgm207vn4-perl-5.42.0/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" +# /nix/store/myzwgd3ylpl3d8zrl7kl3l97i7zl8mw6-perl-5.42.0/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE" # fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/push-to-checkout.sample new/ansible-navigator-26.9.0/.git/hooks/push-to-checkout.sample --- old/ansible-navigator-26.8.0/.git/hooks/push-to-checkout.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/push-to-checkout.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # An example hook script to update a checked-out tree on a git push. # diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/sendemail-validate.sample new/ansible-navigator-26.9.0/.git/hooks/sendemail-validate.sample --- old/ansible-navigator-26.8.0/.git/hooks/sendemail-validate.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/sendemail-validate.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # An example hook script to validate a patch (and/or patch series) before # sending it via email. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/hooks/update.sample new/ansible-navigator-26.9.0/.git/hooks/update.sample --- old/ansible-navigator-26.8.0/.git/hooks/update.sample 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/hooks/update.sample 2026-09-16 08:32:25.000000000 +0200 @@ -1,4 +1,4 @@ -#!/nix/store/1sr8rmx4v0v994lkbzhwc1f0qr1gxxs9-bash-5.3p9/bin/bash +#!/nix/store/7n1hai8jk6vgc967drgkqi6k7j6ff28q-bash-5.3p9/bin/bash # # An example hook script to block unannotated tags from entering. # Called by "git receive-pack" with arguments: refname sha1-old sha1-new Binary files old/ansible-navigator-26.8.0/.git/index and new/ansible-navigator-26.9.0/.git/index differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/logs/HEAD new/ansible-navigator-26.9.0/.git/logs/HEAD --- old/ansible-navigator-26.8.0/.git/logs/HEAD 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/logs/HEAD 2026-09-16 08:32:25.000000000 +0200 @@ -1,2 +1,2 @@ -0000000000000000000000000000000000000000 30e0b3d0f454a524e3520f9de0cbf18620b1b790 kastl <[email protected]> 1786533245 +0200 clone: from https://github.com/ansible/ansible-navigator.git -30e0b3d0f454a524e3520f9de0cbf18620b1b790 30e0b3d0f454a524e3520f9de0cbf18620b1b790 kastl <[email protected]> 1786533245 +0200 checkout: moving from main to refs/tags/v26.8.0 +0000000000000000000000000000000000000000 968b23182d726eb6691290651b533a3aa7db8d79 kastl <[email protected]> 1790226750 +0200 clone: from https://github.com/ansible/ansible-navigator.git +968b23182d726eb6691290651b533a3aa7db8d79 968b23182d726eb6691290651b533a3aa7db8d79 kastl <[email protected]> 1790226750 +0200 checkout: moving from main to refs/tags/v26.9.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/logs/refs/heads/main new/ansible-navigator-26.9.0/.git/logs/refs/heads/main --- old/ansible-navigator-26.8.0/.git/logs/refs/heads/main 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/logs/refs/heads/main 2026-09-16 08:32:25.000000000 +0200 @@ -1 +1 @@ -0000000000000000000000000000000000000000 30e0b3d0f454a524e3520f9de0cbf18620b1b790 kastl <[email protected]> 1786533245 +0200 clone: from https://github.com/ansible/ansible-navigator.git +0000000000000000000000000000000000000000 968b23182d726eb6691290651b533a3aa7db8d79 kastl <[email protected]> 1790226750 +0200 clone: from https://github.com/ansible/ansible-navigator.git diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/logs/refs/remotes/origin/HEAD new/ansible-navigator-26.9.0/.git/logs/refs/remotes/origin/HEAD --- old/ansible-navigator-26.8.0/.git/logs/refs/remotes/origin/HEAD 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/logs/refs/remotes/origin/HEAD 2026-09-16 08:32:25.000000000 +0200 @@ -1 +1 @@ -0000000000000000000000000000000000000000 30e0b3d0f454a524e3520f9de0cbf18620b1b790 kastl <[email protected]> 1786533245 +0200 clone: from https://github.com/ansible/ansible-navigator.git +0000000000000000000000000000000000000000 968b23182d726eb6691290651b533a3aa7db8d79 kastl <[email protected]> 1790226750 +0200 clone: from https://github.com/ansible/ansible-navigator.git Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.idx and new/ansible-navigator-26.9.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.idx differ Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.pack and new/ansible-navigator-26.9.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.pack differ Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.rev and new/ansible-navigator-26.9.0/.git/objects/pack/pack-7729053cdb857094b006fec6e048e82f08f1801e.rev differ Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.idx and new/ansible-navigator-26.9.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.idx differ Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.pack and new/ansible-navigator-26.9.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.pack differ Binary files old/ansible-navigator-26.8.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.rev and new/ansible-navigator-26.9.0/.git/objects/pack/pack-f7c1c998c55ad7643c7acab901ba6430a27a05f7.rev differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/packed-refs new/ansible-navigator-26.9.0/.git/packed-refs --- old/ansible-navigator-26.8.0/.git/packed-refs 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/packed-refs 2026-09-16 08:32:25.000000000 +0200 @@ -5,10 +5,11 @@ 0d667089697257c904031e581abb4f9d31d0ffdb refs/remotes/origin/chore/tmuxlib d958dbade56ba9465b8789791b85c87256627bb4 refs/remotes/origin/chore/update-python-deps a75b8efc517146c4dce9b2e7f91cd77f5aef2ca8 refs/remotes/origin/community-comms -30e0b3d0f454a524e3520f9de0cbf18620b1b790 refs/remotes/origin/main +968b23182d726eb6691290651b533a3aa7db8d79 refs/remotes/origin/main +fa8a6a623f59833687dc0e192a525249b32a6703 refs/remotes/origin/recreate-pr-2134 f2fe70d862609d68f64df4901f69ee932cda434b refs/remotes/origin/release-1.0 fa5ab6f372b6134e681c87cbfc35341c546eb68d refs/remotes/origin/release-1.1 -8069fd0766a802b2eddf8ab2f17f1444c90e783e refs/remotes/origin/renovate/all +b9a394dbe620280420e35e6937e75cc5b0edbd12 refs/remotes/origin/renovate/all 4f74e2e63965ca3706cb27b0e39c3041341a02fa refs/remotes/origin/test e64273cb31afedb0f5fa395fd3c92908268f07cf refs/tags/0.6.2 c9030367e0346bce2f04d6ca0d15432f3bd7e297 refs/tags/0.7.0 @@ -70,6 +71,7 @@ bd496c36423fba07be078739335f047adfbabe6e refs/tags/v26.4.0 ca1c523de70786460d054612bb89af9786913ee8 refs/tags/v26.6.0 30e0b3d0f454a524e3520f9de0cbf18620b1b790 refs/tags/v26.8.0 +968b23182d726eb6691290651b533a3aa7db8d79 refs/tags/v26.9.0 d60324c5ed81f9936ad0221cffa8074c8d79b4a7 refs/tags/v3.0.0 3041afbcd0471eaf3e069daa4884519cb8b44907 refs/tags/v3.0.0a1 ^d60324c5ed81f9936ad0221cffa8074c8d79b4a7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.git/refs/heads/main new/ansible-navigator-26.9.0/.git/refs/heads/main --- old/ansible-navigator-26.8.0/.git/refs/heads/main 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.git/refs/heads/main 2026-09-16 08:32:25.000000000 +0200 @@ -1 +1 @@ -30e0b3d0f454a524e3520f9de0cbf18620b1b790 +968b23182d726eb6691290651b533a3aa7db8d79 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.github/CONTRIBUTING.md new/ansible-navigator-26.9.0/.github/CONTRIBUTING.md --- old/ansible-navigator-26.8.0/.github/CONTRIBUTING.md 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.github/CONTRIBUTING.md 2026-09-16 08:32:25.000000000 +0200 @@ -17,23 +17,8 @@ Prerequisites: 1. Have {doc}`tox <tox:index>`. - 2. Use {doc}`tox <tox:index>` to run the tests. - -3. Before sending a PR, make sure that `lint` passes: - - ```shell-session - $ tox -e lint - lint create: .tox/lint - lint installdeps: .[test] - lint installed: ... - lint run-test-pre: PYTHONHASHSEED='4242713142' - lint run-test: commands[0] | pylint ansible_navigator tests ... - ... - _________________________________ summary __________________________________ - lint: commands succeeded - congratulations :) - ``` +3. Before sending a PR, make sure that `lint` passes: `tox -e lint` !!! notice @@ -44,6 +29,39 @@ indicates the version of python that needs to be installed for tox to run locally. In this case, the version of python that needs to be installed is +## Linting and formatting + +`tox -e lint` runs the project's [pre-commit] hooks over the repository. The +main checks are: + +- [Ruff] for Python formatting and lint rules. +- [pyupgrade] for modern Python syntax. +- [mypy] for static type checking. +- [Pylint] and [Flake8] for additional Python checks. +- [pydoclint] for docstring consistency. +- [markdownlint], [codespell], and [yamllint] for documentation and + configuration files. +- [Prettier], [toml-sort], and [tox-ini-fmt] for supported configuration file + formats. The [cspell] hook is configured separately but skipped by + `tox -e lint`. Run it with `tox -e lint -- cspell --all-files` when needed. + Many hooks can fix files automatically. Review those changes, then rerun + `tox -e lint` until it succeeds. To run one hook while iterating, use + `tox -e lint -- HOOK_ID --all-files`. Do not add a project-wide exception for + a new local warning. Keep a necessary Pylint suppression next to the affected + statement and use its symbolic message name, for example + `# pylint: disable=too-many-arguments`. A mypy suppression must include the + specific error code, for example `# type: ignore[arg-type]`. [pre-commit]: + <https://pre-commit.com/> [Ruff]: <https://docs.astral.sh/ruff/> [pyupgrade]: + <https://github.com/asottile/pyupgrade> [mypy]: <https://mypy.readthedocs.io/> + [Pylint]: <https://pylint.readthedocs.io/> [Flake8]: + <https://flake8.pycqa.org/> [pydoclint]: <https://jsh9.github.io/pydoclint/> + [markdownlint]: <https://github.com/igorshubovych/markdownlint-cli> [cspell]: + <https://cspell.org/> [codespell]: + <https://github.com/codespell-project/codespell> [yamllint]: + <https://yamllint.readthedocs.io/> [Prettier]: <https://prettier.io/> + [toml-sort]: <https://github.com/pappasam/toml-sort> [tox-ini-fmt]: + <https://github.com/tox-dev/tox-ini-fmt> + ## Getting started with Ansible Navigator ### Building from the source and installing packages for testing @@ -137,9 +155,8 @@ - Put breakpoint(s) in the code where needed. - Hover to the **Run and Debug** icon in the Activity Bar to start the debugger. - -At this point, the debugger should hit your breakpoint and start the debugging -session. + At this point, the debugger should hit your breakpoint and start the debugging + session. ### Debug Ansible-Navigator Subcommands @@ -194,7 +211,6 @@ We use [mkdocs](https://www.mkdocs.org/) to generate our docs website. You can trigger the process locally by executing: - <!-- cspell:disable --> ```shell diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.github/workflows/release.yml new/ansible-navigator-26.9.0/.github/workflows/release.yml --- old/ansible-navigator-26.8.0/.github/workflows/release.yml 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.github/workflows/release.yml 2026-09-16 08:32:25.000000000 +0200 @@ -23,7 +23,7 @@ steps: - name: Switch to using Python 3.10 by default - uses: actions/setup-python@v6 + uses: actions/setup-python@v7 with: python-version: "3.14" - name: Install tox diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.github/workflows/tox.yml new/ansible-navigator-26.9.0/.github/workflows/tox.yml --- old/ansible-navigator-26.8.0/.github/workflows/tox.yml 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.github/workflows/tox.yml 2026-09-16 08:32:25.000000000 +0200 @@ -68,7 +68,7 @@ key: ${{ runner.os }}-${{ hashFiles('src/ansible_navigator/data/images_dockerfile') }} - name: Set up Python ${{ matrix.python_version }} - uses: actions/setup-python@v6 + uses: actions/setup-python@v7 with: python-version: ${{ matrix.python_version }} cache: pip @@ -149,7 +149,7 @@ - uses: actions/checkout@v7 - name: Set up Python - uses: actions/setup-python@v6 + uses: actions/setup-python@v7 with: python-version: "3.14" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.pre-commit-config.yaml new/ansible-navigator-26.9.0/.pre-commit-config.yaml --- old/ansible-navigator-26.8.0/.pre-commit-config.yaml 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.pre-commit-config.yaml 2026-09-16 08:32:25.000000000 +0200 @@ -7,7 +7,7 @@ exclude: "(?x)^(\n _readthedocs|\n .tox\n)$\n" repos: - repo: https://github.com/renovatebot/pre-commit-hooks - rev: 43.280.4 + rev: 44.82.2 hooks: - id: renovate-config-validator alias: renovate @@ -30,11 +30,11 @@ hooks: - id: toml-sort-fix - repo: https://github.com/tox-dev/tox-ini-fmt - rev: 1.8.0 + rev: 1.9.0 hooks: - id: tox-ini-fmt - repo: https://github.com/streetsidesoftware/cspell-cli - rev: v10.0.1 + rev: v10.2.0 hooks: - id: cspell name: Spell check with cspell @@ -109,14 +109,14 @@ alias: toml - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.16.0 + rev: v0.16.7 hooks: - id: ruff-format alias: ruff - id: ruff-check alias: ruff - repo: https://github.com/pre-commit/mirrors-mypy.git - rev: v2.3.0 + rev: v2.3.1 hooks: - id: mypy additional_dependencies: @@ -132,7 +132,7 @@ - types-setuptools - types-typed-ast - repo: https://github.com/pycqa/pylint.git - rev: v4.0.6 + rev: v4.0.8 hooks: - id: pylint args: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/.readthedocs.yml new/ansible-navigator-26.9.0/.readthedocs.yml --- old/ansible-navigator-26.8.0/.readthedocs.yml 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/.readthedocs.yml 2026-09-16 08:32:25.000000000 +0200 @@ -1,10 +1,6 @@ --- version: 2 -mkdocs: - fail_on_warning: true - configuration: mkdocs.yml - build: os: ubuntu-24.04 tools: @@ -12,14 +8,3 @@ commands: - pip install --user tox - python3 -m tox -e docs -- build --strict --site-dir=_readthedocs/html/ -python: - install: - - method: pip - path: tox - - method: pip - path: . - extra_requirements: - - docs -submodules: - include: all - recursive: true diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/SECURITY.md new/ansible-navigator-26.9.0/SECURITY.md --- old/ansible-navigator-26.8.0/SECURITY.md 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible-navigator-26.9.0/SECURITY.md 2026-09-16 08:32:25.000000000 +0200 @@ -0,0 +1,53 @@ +# Security Policy + +## Reporting a security vulnerability + +All security vulnerability reports MUST be submitted by email to: +[[email protected]](mailto:[email protected]) + +Security vulnerabilities MUST NOT be reported through public channels such as +GitHub issues, pull requests, the Ansible Forum, or social media. + +## What to include + +When submitting a vulnerability report, include the following: + +- **Title** (required): Clear, concise, descriptive summary. +- **Impacted project** (required): Ideally a link to the GitHub project. +- **Reporter details** (optional): Your name or handle and affiliation. +- **Vulnerability description** (required): Technical details of the issue. +- **Affected versions** (required): Known affected version(s), and ideally all + affected versions. +- **Reproduction steps** (required): Minimal example to reproduce the issue. +- **Impact assessment** (required): Potential exploit scenarios and severity. +- **Suggested fix** (optional): Proposed remediation, if any. +- **Disclosure status** (required): Whether this has been shared with other + parties or published and your plan for future sharing (e.g., at a conference). + +## Timeline + +- The Ansible Security Team aims to confirm receipt of vulnerability reports + within one (1) business day. +- Our goal is to assess the report, coordinate fix and disclosure as quickly as + possible. +- All confirmed vulnerabilities are addressed according to severity and impact. + +## Backports + +Generally, only the latest release of this project receives security updates. +Earlier versions may receive critical fixes on a best-effort basis. + +## Ansible Security Policy + +For the complete Ansible Security Policy, including what qualifies as a +reportable vulnerability, severity classification, the response process, +coordinated disclosure, and the vulnerability management process, see +[ansible.com/security](https://ansible.com/security). + +## EU Cyber Resilience Act: Open-Source Steward Statement + +This project is stewarded by **Red Hat, Inc.**, an open-source software steward +as defined in Article 3(14) of the +[EU Cyber Resilience Act (Regulation 2024/2847)](https://eur-lex.europa.eu/eli/reg/2024/2847/oj/eng). + +Contact: [[email protected]](mailto:[email protected]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/docs/apple-container.md new/ansible-navigator-26.9.0/docs/apple-container.md --- old/ansible-navigator-26.8.0/docs/apple-container.md 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible-navigator-26.9.0/docs/apple-container.md 2026-09-16 08:32:25.000000000 +0200 @@ -0,0 +1,198 @@ +<!-- cspell:ignore handicaps --> + +# Apple Container Guide + +This document gathers the `ansible-navigator`-specific behavior, requirements, +trade-offs, and usage notes for using +[apple/container](https://github.com/apple/container) as the execution +environment container engine. + +## What this guide is for + +Use this guide when: + +- `--container-engine container` or + `execution-environment.container-engine: container` is selected +- execution-environment behavior differs from Docker or Podman +- you need Apple Container-specific setup, troubleshooting, or operational notes + +## Requirements + +Using Apple Container with `ansible-navigator` currently assumes: + +- macOS +- Apple Container installed and working +- the `container` CLI available on `PATH` +- internet access for pulling execution-environment images +- pre-existing registry authentication for private images via + `container registry login <registry>` + +## Installation + +Basic installation flow on macOS: + +1. Install the Apple Container CLI. +2. Ensure `container --version` works from your shell. +3. Install `ansible-navigator`. +4. Run with `--ce container` when using execution environments. + +Example: + +```bash +ansible-navigator run site.yml --ee true --ce container --mode stdout +``` + +## Runtime behavior + +When Apple Container is selected, `ansible-navigator` now uses Apple-style image +commands: + +- `container image pull` +- `container image inspect` +- `container image list` + +For execution-environment runs, `ansible-navigator` passes `container` through +to `ansible-runner`, which launches the EE using `container run`. + +## Passing Apple-specific engine options + +`ansible-navigator` does not hide Apple Container runtime flags. When you need +runtime-specific behavior, pass those options through the normal +execution-environment container-options setting. + +### CLI examples + +Use repeated `--co` values to pass Apple Container flags. + +Forward the host SSH agent using Apple Container's native SSH support: + +```bash +ansible-navigator run site.yml --ee true --ce container --co=--ssh +``` + +Enable nested virtualization: + +```bash +ansible-navigator run site.yml --ee true --ce container --co=--virtualization +``` + +Enable Rosetta in the container: + +```bash +ansible-navigator run site.yml --ee true --ce container --co=--rosetta +``` + +You can combine them: + +```bash +ansible-navigator run site.yml --ee true --ce container --co=--ssh --co=--rosetta +``` + +### Settings file example + +Use `execution-environment.container-options` when you want these flags to be +persistent: + +```yaml +ansible-navigator: + execution-environment: + enabled: true + container-engine: container + container-options: + - "--ssh" + - "--rosetta" +``` + +### Notes on important flags + +`--ssh` Usually the most useful Apple-specific option. Prefer this when your +execution-environment workflow needs access to private Git repositories or other +SSH-agent-backed credentials. It is generally cleaner than trying to hand-build +equivalent socket mounts. + +`--virtualization` Exposes virtualization capabilities to the container. Use +this only when the workload explicitly requires nested virtualization and the +host platform supports it. + +`--rosetta` Enables Rosetta in the container. This is mainly useful for +compatibility scenarios where the container workload needs x86_64 userland +support on Apple Silicon. It should not be treated as a default setting. + +## Authentication model + +Apple Container uses its own registry login state. + +That means: + +- private-registry access should be prepared with + `container registry login <registry>` +- `ansible-navigator` does not log in or log out on the user's behalf +- if a private image pull fails, the recommended recovery is to authenticate + first and retry + +## Advantages + +Using Apple Container has some practical strengths on macOS: + +- native Apple tooling for execution environments +- no requirement to depend on Docker Desktop or Podman for the validated + Apple-specific path +- Apple-native image lifecycle commands +- working end-to-end execution-environment run and cancel behavior in the + validated prototype and parity paths + +## Handicaps and trade-offs + +Apple Container support is functional, but it is not the same operational model +as Docker or Podman. + +Important trade-offs: + +- registry authentication is based on prior login state, not runner-managed + auth-file injection +- some Docker/Podman-specific flags and mount-label assumptions do not apply +- container-runtime-specific output shapes required dedicated parsing in a few + places +- auto-detection order may still prefer Podman or Docker before Apple Container + when `container-engine: auto` is used + +## FAQ + +### How do I authenticate to a private registry? + +Run: + +```bash +container registry login <registry> +``` + +before invoking `ansible-navigator` against a private execution-environment +image. + +### Why doesn’t `ansible-navigator` log me in automatically? + +Because Apple Container login is persistent host state. The chosen design keeps +that authentication step explicit instead of hiding host-state mutation inside +runner or navigator. + +### What should I do if an Apple Container image pull fails? + +First confirm: + +1. the image name is correct +2. the registry is reachable +3. you have already authenticated with `container registry login <registry>` if + the image is private + +Then retry the `ansible-navigator` command. + +### Does `auto` always choose Apple Container? + +No. `auto` still preserves its configured preference order. If another supported +engine is preferred and available, it may be selected first. + +### Are Docker and Podman behaviors changed by this guide? + +No. This guide exists specifically because Apple Container has runtime-specific +differences that should be documented without changing the meaning of the +existing Docker/Podman paths. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/docs/index.md new/ansible-navigator-26.9.0/docs/index.md --- old/ansible-navigator-26.8.0/docs/index.md 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/docs/index.md 2026-09-16 08:32:25.000000000 +0200 @@ -14,6 +14,7 @@ [Getting started with Execution Environments guide](https://docs.ansible.com/ansible/devel/getting_started_ee/index.html). - [Installation](installation.md) +- [Apple Container Guide](apple-container.md) - [Settings](settings.md) - [Subcommands](subcommands.md) - [FAQ](faq.md) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/docs/installation.md new/ansible-navigator-26.9.0/docs/installation.md --- old/ansible-navigator-26.8.0/docs/installation.md 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/docs/installation.md 2026-09-16 08:32:25.000000000 +0200 @@ -61,7 +61,7 @@ ### Requirements (macos) -- [Docker Desktop for Mac] or [Podman on macOS] +- [Docker Desktop for Mac], [Podman on macOS], or [Apple Container] - macOS command line developer tools - Internet access (during initial installation) @@ -69,6 +69,9 @@ - [Docker Desktop for Mac] installation instructions - [Podman on MacOS] installation instructions +- [Apple Container] installation instructions +- For Apple Container-specific requirements, trade-offs, and private-registry + usage, see the [Apple Container Guide](apple-container.md) ### Install ansible-navigator (macos) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/docs/subcommands.md new/ansible-navigator-26.9.0/docs/subcommands.md --- old/ansible-navigator-26.8.0/docs/subcommands.md 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/docs/subcommands.md 2026-09-16 08:32:25.000000000 +0200 @@ -10,7 +10,9 @@ ### `ansible` Use `ansible-navigator exec -- ansible` from shell. The exec subcommand requires -execution environment support. +execution environment support. When the selected execution-environment engine is +Apple Container, see the [Apple Container Guide](apple-container.md) for +runtime-specific differences. ### `ansible-builder` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/actions/run.py new/ansible-navigator-26.9.0/src/ansible_navigator/actions/run.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/actions/run.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/actions/run.py 2026-09-16 08:32:25.000000000 +0200 @@ -316,17 +316,30 @@ self._subaction_type = "playbook" self._logger = logging.getLogger(f"{__name__}_{self._subaction_type}") self._run_runner() - while True: - self._dequeue() - if self.runner.finished: + try: + while True: + self._dequeue() + if self.runner.finished: + self._dequeue() + if self._args.playbook_artifact_enable: + self.write_artifact() + self._logger.debug("runner finished") + break + # Sleep briefly to prevent 100% CPU utilization + # in mode stdout, the delay introduced by the curses key read is not present + time.sleep(0.01) + except KeyboardInterrupt: + self._logger.warning("Keyboard interrupt received, requesting runner cancellation") + self.runner.cancelled = True + while not self.runner.finished: self._dequeue() - if self._args.playbook_artifact_enable: - self.write_artifact() - self._logger.debug("runner finished") - break - # Sleep briefly to prevent 100% CPU utilization - # in mode stdout, the delay introduced by the curses key read is not present - time.sleep(0.01) + time.sleep(0.01) + self._dequeue() + return_code = self.runner.ansible_runner_instance.rc or 1 + return RunStdoutReturn( + message="Please review the log for errors.", + return_code=return_code, + ) return_code = self.runner.ansible_runner_instance.rc if return_code != 0: return RunStdoutReturn( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/configuration_subsystem/navigator_configuration.py new/ansible-navigator-26.9.0/src/ansible_navigator/configuration_subsystem/navigator_configuration.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/configuration_subsystem/navigator_configuration.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/configuration_subsystem/navigator_configuration.py 2026-09-16 08:32:25.000000000 +0200 @@ -299,10 +299,12 @@ ), SettingsEntry( name="container_engine", - choices=["auto", "podman", "docker"], + choices=["auto", "podman", "docker", "container"], cli_parameters=CliParameters(short="--ce"), settings_file_path_override="execution-environment.container-engine", - short_description="Specify the container engine (auto=podman then docker)", + short_description=( + "Specify the container engine (auto=podman then docker then container)" + ), value=SettingsEntryValue(default="auto"), version_added="v1.0", ), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py new/ansible-navigator-26.9.0/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/configuration_subsystem/navigator_post_processor.py 2026-09-16 08:32:25.000000000 +0200 @@ -1205,12 +1205,26 @@ """ messages: list[LogMessage] = [] exit_messages: list[ExitMessage] = [] - # literal_text, fname, format_spec, conversion - found = {f for _, f, _, _ in Formatter().parse(entry.value.current) if f} available = {f for _, f, _, _ in Formatter().parse(entry.value.default) if f} non_defaults_also_available = {"playbook_status"} available.update(non_defaults_also_available) + # literal_text, fname, format_spec, conversion + try: + found = {f for _, f, _, _ in Formatter().parse(entry.value.current) if f} + except ValueError: + # Handle invalid artifact filename formats (malformed braces) + exit_msg = ( + f"The playbook artifact file name '{entry.value.current}', set by" + f" {entry.value.source.value.lower()}, is not a valid format string." + ) + exit_messages.append(ExitMessage(message=exit_msg)) + exit_msg = ( + "Invalid format string. Ensure braces are properly matched and only" + f" supported variables are used: {oxfordcomma(available, 'and/or')}" + ) + exit_messages.append(ExitMessage(message=exit_msg, prefix=ExitPrefix.HINT)) + return messages, exit_messages unknown = found - available if not unknown: return messages, exit_messages diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/data/ansible-navigator.json new/ansible-navigator-26.9.0/src/ansible_navigator/data/ansible-navigator.json --- old/ansible-navigator-26.8.0/src/ansible_navigator/data/ansible-navigator.json 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/data/ansible-navigator.json 2026-09-16 08:32:25.000000000 +0200 @@ -285,11 +285,12 @@ "properties": { "container-engine": { "default": "auto", - "description": "Specify the container engine (auto=podman then docker)", + "description": "Specify the container engine (auto=podman then docker then container)", "enum": [ "auto", "podman", - "docker" + "docker", + "container" ], "type": "string" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/image_manager/inspector.py new/ansible-navigator-26.9.0/src/ansible_navigator/image_manager/inspector.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/image_manager/inspector.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/image_manager/inspector.py 2026-09-16 08:32:25.000000000 +0200 @@ -33,10 +33,11 @@ Returns: List of image inspection command objects """ + inspect_command = "image inspect" if self._container_engine == "container" else "inspect" return [ Command( identity=image_id, - command=f"{self._container_engine} inspect {image_id}", + command=f"{self._container_engine} {inspect_command} {image_id}", post_process=self.parse, ) for image_id in self._image_ids @@ -55,7 +56,17 @@ class ImagesList: - """Functionality for listing container images.""" + """Functionality for listing container images. + + Attributes: + APPLE_HEADER_MAP: Mapping of Apple Container headers to standard ones. + FORMAT: Output template for docker and podman, one tab separated line per image. + FORMAT_KEYS: Keys for the fields in ``FORMAT``, in the same order. + """ + + APPLE_HEADER_MAP: dict[str, str] = {"name": "repository", "digest": "image_id"} + FORMAT = r"{{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}}\t{{.Size}}" + FORMAT_KEYS = ("repository", "tag", "image_id", "created", "size") def __init__(self, container_engine: str) -> None: """Initialize the container image lister. @@ -72,28 +83,45 @@ Returns: List of the image lister commands """ + # The default table layout of ``images`` varies between engine versions + # (e.g. docker 29) and user configuration, so request the fields explicitly + list_command = ( + "image list" + if self._container_engine == "container" + else f"images --format '{self.FORMAT}'" + ) return [ Command( identity="images", - command=f"{self._container_engine} images", + command=f"{self._container_engine} {list_command}", post_process=self.parse, ), ] - @staticmethod - def parse(command: Command) -> None: + @classmethod + def parse(cls, command: Command) -> None: """Parse the image lister command output. Args: command: Image lister command object """ if command.stdout: - images = command.stdout.splitlines() - re_2omo = re.compile(r"\s{2,}") - headers = [key.lower().replace(" ", "_") for key in re_2omo.split(images.pop(0))] - local_images = [ - dict(zip(headers, re_2omo.split(line), strict=False)) for line in images - ] + is_apple = command.command.startswith("container ") + images = [line for line in command.stdout.splitlines() if line.strip()] + if not images: + command.details = [] + return + if is_apple: + re_2omo = re.compile(r"\s{2,}") + headers = [key.lower().replace(" ", "_") for key in re_2omo.split(images.pop(0))] + headers = [cls.APPLE_HEADER_MAP.get(h, h) for h in headers] + local_images = [ + dict(zip(headers, re_2omo.split(line), strict=False)) for line in images + ] + else: + local_images = [ + dict(zip(cls.FORMAT_KEYS, line.split("\t"), strict=True)) for line in images + ] valid_images = [image for image in local_images if image.get("tag") != "<none>"] command.details = valid_images diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/image_manager/puller.py new/ansible-navigator-26.9.0/src/ansible_navigator/image_manager/puller.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/image_manager/puller.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/image_manager/puller.py 2026-09-16 08:32:25.000000000 +0200 @@ -199,7 +199,10 @@ Returns: The command """ - command_line = [self._container_engine, "pull"] + if self._container_engine == "container": + command_line = [self._container_engine, "image", "pull"] + else: + command_line = [self._container_engine, "pull"] command_line.extend(self._arguments) command_line.append(self._image) joined_command = " ".join(command_line) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/src/ansible_navigator/utils/functions.py new/ansible-navigator-26.9.0/src/ansible_navigator/utils/functions.py --- old/ansible-navigator-26.8.0/src/ansible_navigator/utils/functions.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/src/ansible_navigator/utils/functions.py 2026-09-16 08:32:25.000000000 +0200 @@ -3,6 +3,7 @@ from __future__ import annotations import ast +import contextlib import datetime import decimal import html @@ -64,7 +65,9 @@ Resolved file path """ _path = Path(os.path.expandvars(path)) - _path = _path.expanduser() + # The home directory may not be determinable, e.g. ~ names an unknown user + with contextlib.suppress(RuntimeError): + _path = _path.expanduser() return _path.resolve() @@ -110,10 +113,13 @@ """ playbook_type = "file" playbook_path = str(playbook) - if Path(playbook_path).exists() is False: - playbook_type = "missing" - if Path(playbook_path).exists() is False and len(playbook_path.split(".")) >= 3: - playbook_type = "fqcn" + try: + exists = Path(playbook_path).exists() + except OSError: + # The path cannot name a file on this system, e.g. it is too long + return "missing" + if exists is False: + playbook_type = "fqcn" if len(playbook_path.split(".")) >= 3 else "missing" return playbook_type diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/tests/unit/configuration_subsystem/post_processors/test_playbook_artifact_save_as.py new/ansible-navigator-26.9.0/tests/unit/configuration_subsystem/post_processors/test_playbook_artifact_save_as.py --- old/ansible-navigator-26.8.0/tests/unit/configuration_subsystem/post_processors/test_playbook_artifact_save_as.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/tests/unit/configuration_subsystem/post_processors/test_playbook_artifact_save_as.py 2026-09-16 08:32:25.000000000 +0200 @@ -66,6 +66,15 @@ " has unrecognized variables: 'name'" ), ), + Scenario( + name="4", + current="{playbook_name}.json{", + exit_message_substr=( + "The playbook artifact file name" + " '{playbook_name}.json{', set by command line," + " is not a valid format string" + ), + ), ) @@ -93,3 +102,10 @@ if data.exit_message_substr: assert data.exit_message_substr in exit_messages[0].message + assert len(exit_messages) >= 2, "Expected a HINT message with supported variables" + hint_msg = exit_messages[1].message + assert "playbook_dir" in hint_msg + assert "playbook_name" in hint_msg + assert "playbook_status" in hint_msg + assert "time_stamp" in hint_msg + assert "inventory" not in hint_msg diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/tests/unit/image_manager/test_image_inspector.py new/ansible-navigator-26.9.0/tests/unit/image_manager/test_image_inspector.py --- old/ansible-navigator-26.8.0/tests/unit/image_manager/test_image_inspector.py 1970-01-01 01:00:00.000000000 +0100 +++ new/ansible-navigator-26.9.0/tests/unit/image_manager/test_image_inspector.py 2026-09-16 08:32:25.000000000 +0200 @@ -0,0 +1,162 @@ +"""Unit tests for image inspector.""" + +import pytest + +from ansible_navigator.command_runner import Command +from ansible_navigator.image_manager.inspector import ImagesInspect +from ansible_navigator.image_manager.inspector import ImagesList + + [email protected]( + ("container_engine", "expected_inspect_cmd"), + ( + pytest.param("podman", "podman inspect image_id", id="podman-inspect"), + pytest.param("docker", "docker inspect image_id", id="docker-inspect"), + pytest.param("container", "container image inspect image_id", id="container-image-inspect"), + ), +) +def test_images_inspect_command( + container_engine: str, + expected_inspect_cmd: str, +) -> None: + """Test image inspect command generation. + + Args: + container_engine: Container engine identifier + expected_inspect_cmd: Expected command string + """ + inspector = ImagesInspect(container_engine=container_engine, ids=["image_id"]) + commands = inspector.commands + assert len(commands) == 1 + assert commands[0].command == expected_inspect_cmd + + [email protected]( + ("container_engine", "expected_list_cmd"), + ( + pytest.param( + "podman", + f"podman images --format '{ImagesList.FORMAT}'", + id="podman-images", + ), + pytest.param( + "docker", + f"docker images --format '{ImagesList.FORMAT}'", + id="docker-images", + ), + pytest.param("container", "container image list", id="container-image-list"), + ), +) +def test_images_list_command( + container_engine: str, + expected_list_cmd: str, +) -> None: + """Test image list command generation. + + Args: + container_engine: Container engine identifier + expected_list_cmd: Expected command string + """ + lister = ImagesList(container_engine=container_engine) + commands = lister.commands + assert len(commands) == 1 + assert commands[0].command == expected_list_cmd + + [email protected]( + "container_engine", + ( + pytest.param("docker", id="docker"), + pytest.param("podman", id="podman"), + ), +) +def test_images_list_parse(container_engine: str) -> None: + """Test that Docker/Podman list output from the requested format is parsed. + + Images without a tag are dropped. + + Args: + container_engine: Container engine identifier + """ + stdout = ( + "my-image\tlatest\tabc123def456\t2 days ago\t250 MB\n" + "<none>\t<none>\t0123456789ab\t3 weeks ago\t1.2GB\n" + ) + cmd = ImagesList(container_engine=container_engine).commands[0] + cmd.stdout = stdout + ImagesList.parse(cmd) + assert cmd.details == [ + { + "repository": "my-image", + "tag": "latest", + "image_id": "abc123def456", + "created": "2 days ago", + "size": "250 MB", + }, + ] + + +def test_images_list_parse_skips_blank_lines() -> None: + """Test that blank lines in the list output do not become rows.""" + stdout = "my-image\tlatest\tabc123def456\t2 days ago\t250 MB\n\n" + cmd = ImagesList(container_engine="docker").commands[0] + cmd.stdout = stdout + ImagesList.parse(cmd) + assert cmd.details == [ + { + "repository": "my-image", + "tag": "latest", + "image_id": "abc123def456", + "created": "2 days ago", + "size": "250 MB", + }, + ] + + +def test_images_list_parse_rejects_malformed_line() -> None: + """Test that a line not matching the requested format fails the parse.""" + cmd = ImagesList(container_engine="docker").commands[0] + cmd.stdout = "my-image\tlatest\tabc123def456\n" + with pytest.raises(ValueError, match="zip"): + ImagesList.parse(cmd) + + +def test_images_list_parse_apple_container() -> None: + """Test that Apple Container list output headers are normalized.""" + stdout = "NAME TAG DIGEST\nmy-image latest sha256:abc123" + cmd = Command( + identity="images", + command="container image list", + post_process=ImagesList.parse, + ) + cmd.stdout = stdout + ImagesList.parse(cmd) + assert isinstance(cmd.details, list) + assert len(cmd.details) == 1 + assert cmd.details[0]["repository"] == "my-image" + assert cmd.details[0]["tag"] == "latest" + assert cmd.details[0]["image_id"] == "sha256:abc123" + + [email protected]( + ("container_engine", "command"), + ( + pytest.param("docker", "docker images", id="docker"), + pytest.param("container", "container image list", id="container-image-list"), + ), +) +def test_images_list_parse_blank_output(container_engine: str, command: str) -> None: + """Test that output with no image lines yields no images. + + Args: + container_engine: Container engine identifier + command: Image lister command string + """ + cmd = Command( + identity="images", + command=command, + post_process=ImagesList.parse, + ) + cmd.stdout = "\n\n" + ImagesList.parse(cmd) + assert cmd.details == [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/tests/unit/image_manager/test_image_puller.py new/ansible-navigator-26.9.0/tests/unit/image_manager/test_image_puller.py --- old/ansible-navigator-26.8.0/tests/unit/image_manager/test_image_puller.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/tests/unit/image_manager/test_image_puller.py 2026-09-16 08:32:25.000000000 +0200 @@ -219,3 +219,33 @@ ) assert "XDG_RUNTIME_DIR" not in proc.stdout assert "containers/auth.json" in proc.stdout + + +def test_pull_with_container_engine() -> None: + """Ensure command uses 'image pull' for container engine.""" + image_puller = ImagePuller( + container_engine="container", + image="my_image", + arguments=Constants.NOT_SET, + pull_policy="tag", + ) + result = image_puller._generate_pull_command() + expected_string = "container image pull my_image" + assert result == expected_string + expected_list = ["container", "image", "pull", "my_image"] + assert shlex.split(result) == expected_list + + +def test_pull_with_container_engine_and_args() -> None: + """Ensure command with container engine and additional arguments.""" + image_puller = ImagePuller( + container_engine="container", + image="my_image", + arguments=["--tls-verify", "false"], + pull_policy="tag", + ) + result = image_puller._generate_pull_command() + expected_string = "container image pull --tls-verify false my_image" + assert result == expected_string + expected_list = ["container", "image", "pull", "--tls-verify", "false", "my_image"] + assert shlex.split(result) == expected_list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/tests/unit/utils/test_functions.py new/ansible-navigator-26.9.0/tests/unit/utils/test_functions.py --- old/ansible-navigator-26.8.0/tests/unit/utils/test_functions.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/tests/unit/utils/test_functions.py 2026-09-16 08:32:25.000000000 +0200 @@ -116,6 +116,22 @@ assert result == anticipated_result +def test_expand_path_unknown_user(monkeypatch: pytest.MonkeyPatch) -> None: + """Test expand_path when expanduser raises RuntimeError. + + Args: + monkeypatch: The monkeypatch fixture + """ + + def mock_expanduser(self: Path) -> Path: + msg = "unknown user" + raise RuntimeError(msg) + + monkeypatch.setattr(Path, "expanduser", mock_expanduser) + result = expand_path("~/path") + assert str(result).endswith("~/path") + + @pytest.mark.parametrize( ("value", "anticipated_result"), ( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ansible-navigator-26.8.0/tests/unit/utils/test_functions_extended.py new/ansible-navigator-26.9.0/tests/unit/utils/test_functions_extended.py --- old/ansible-navigator-26.8.0/tests/unit/utils/test_functions_extended.py 2026-08-11 18:01:46.000000000 +0200 +++ new/ansible-navigator-26.9.0/tests/unit/utils/test_functions_extended.py 2026-09-16 08:32:25.000000000 +0200 @@ -2,9 +2,10 @@ from __future__ import annotations +import errno import shutil -from typing import TYPE_CHECKING +from pathlib import Path from unittest.mock import patch # pylint: disable=preferred-module import pytest @@ -28,10 +29,6 @@ from ansible_navigator.utils.functions import to_list -if TYPE_CHECKING: - from pathlib import Path - - def test_check_for_ansible_found(monkeypatch: pytest.MonkeyPatch) -> None: """Test check_for_ansible when ansible-playbook is found.""" monkeypatch.setattr(shutil, "which", lambda _: "/usr/bin/ansible-playbook") @@ -67,6 +64,20 @@ assert check_playbook_type("namespace.collection.playbook") == "fqcn" +def test_check_playbook_type_name_too_long(monkeypatch: pytest.MonkeyPatch) -> None: + """Test check_playbook_type when the path cannot name a file on this system. + + Args: + monkeypatch: The monkeypatch fixture + """ + + def raise_name_too_long(_self: Path) -> bool: + raise OSError(errno.ENAMETOOLONG, "File name too long") + + monkeypatch.setattr(Path, "exists", raise_name_too_long) + assert check_playbook_type("a" * 300) == "missing" + + def test_clear_screen_vscode( monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], ++++++ ansible-navigator.obsinfo ++++++ --- /var/tmp/diff_new_pack.YIj9bQ/_old 2026-09-24 23:00:55.087905896 +0200 +++ /var/tmp/diff_new_pack.YIj9bQ/_new 2026-09-24 23:00:55.091906063 +0200 @@ -1,5 +1,5 @@ name: ansible-navigator -version: 26.8.0 -mtime: 1786464106 -commit: 30e0b3d0f454a524e3520f9de0cbf18620b1b790 +version: 26.9.0 +mtime: 1789540345 +commit: 968b23182d726eb6691290651b533a3aa7db8d79
