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-01-13 21:31:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ansible-navigator (Old)
and /work/SRC/openSUSE:Factory/.ansible-navigator.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ansible-navigator"
Tue Jan 13 21:31:44 2026 rev:19 rq:1326911 version:26.1.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/ansible-navigator/ansible-navigator.changes
2025-12-05 16:58:56.554227533 +0100
+++
/work/SRC/openSUSE:Factory/.ansible-navigator.new.1928/ansible-navigator.changes
2026-01-13 21:33:13.928694415 +0100
@@ -1,0 +2,19 @@
+Tue Jan 13 06:52:23 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- Update to version 26.1.1:
+ * Fixes
+ - fix: Update version and tests (#2084) @alisonlhart
+
+-------------------------------------------------------------------
+Tue Jan 13 06:47:52 UTC 2026 - Johannes Kastl
<[email protected]>
+
+- Update to version 26.1.0:
+ * Fixes
+ - fix: mount docker's proxy ssh agent socket when running on
+ macOS (#2055) (#2076) @joonashak
+ - fix: Use sys.executable instead of hardcoded Python paths for
+ introspection (#2072) @alisonlhart
+ - fix: Improve compatiblity with restrictive shell environments
+ (#2073) @alisonlhart
+
+-------------------------------------------------------------------
Old:
----
ansible-navigator-25.12.0.obscpio
New:
----
ansible-navigator-26.1.1.obscpio
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ansible-navigator.spec ++++++
--- /var/tmp/diff_new_pack.tWTtmg/_old 2026-01-13 21:33:14.800730433 +0100
+++ /var/tmp/diff_new_pack.tWTtmg/_new 2026-01-13 21:33:14.804730597 +0100
@@ -1,7 +1,7 @@
#
# spec file for package ansible-navigator
#
-# Copyright (c) 2025 SUSE LLC and contributors
+# Copyright (c) 2026 SUSE LLC and contributors
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -38,7 +38,7 @@
%endif
Name: ansible-navigator
-Version: 25.12.0
+Version: 26.1.1
Release: 0
Summary: A text-based user interface (TUI) for Ansible
License: Apache-2.0
++++++ _service ++++++
--- /var/tmp/diff_new_pack.tWTtmg/_old 2026-01-13 21:33:14.844732250 +0100
+++ /var/tmp/diff_new_pack.tWTtmg/_new 2026-01-13 21:33:14.848732415 +0100
@@ -3,7 +3,7 @@
<param name="url">https://github.com/ansible/ansible-navigator</param>
<param name="scm">git</param>
<param name="package-meta">yes</param>
- <param name="revision">v25.12.0</param>
+ <param name="revision">v26.1.1</param>
<param name="versionformat">@PARENT_TAG@</param>
<param name="versionrewrite-pattern">v(.*)</param>
<param name="changesgenerate">enable</param>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.tWTtmg/_old 2026-01-13 21:33:14.872733407 +0100
+++ /var/tmp/diff_new_pack.tWTtmg/_new 2026-01-13 21:33:14.876733572 +0100
@@ -1,6 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">https://github.com/ansible/ansible-navigator</param>
- <param
name="changesrevision">2a49e00ce1008ebf6df4e68c9910187b6d97639c</param></service></servicedata>
+ <param
name="changesrevision">8eda9ce382df653570693a781930c61a5e3b7c19</param></service></servicedata>
(No newline at EOF)
++++++ ansible-navigator-25.12.0.obscpio -> ansible-navigator-26.1.1.obscpio
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.git/HEAD
new/ansible-navigator-26.1.1/.git/HEAD
--- old/ansible-navigator-25.12.0/.git/HEAD 2025-12-02 17:56:18.000000000
+0100
+++ new/ansible-navigator-26.1.1/.git/HEAD 2026-01-08 20:24:48.000000000
+0100
@@ -1 +1 @@
-2a49e00ce1008ebf6df4e68c9910187b6d97639c
+8eda9ce382df653570693a781930c61a5e3b7c19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.git/ORIG_HEAD
new/ansible-navigator-26.1.1/.git/ORIG_HEAD
--- old/ansible-navigator-25.12.0/.git/ORIG_HEAD 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/ORIG_HEAD 2026-01-08 20:24:48.000000000
+0100
@@ -1 +1 @@
-2a49e00ce1008ebf6df4e68c9910187b6d97639c
+8eda9ce382df653570693a781930c61a5e3b7c19
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/.git/hooks/applypatch-msg.sample
new/ansible-navigator-26.1.1/.git/hooks/applypatch-msg.sample
--- old/ansible-navigator-25.12.0/.git/hooks/applypatch-msg.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/applypatch-msg.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/commit-msg.sample
new/ansible-navigator-26.1.1/.git/hooks/commit-msg.sample
--- old/ansible-navigator-25.12.0/.git/hooks/commit-msg.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/commit-msg.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/fsmonitor-watchman.sample
new/ansible-navigator-26.1.1/.git/hooks/fsmonitor-watchman.sample
--- old/ansible-navigator-25.12.0/.git/hooks/fsmonitor-watchman.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/fsmonitor-watchman.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/k9lfh0l007sp61rag7d9bf3nn5bg3qy7-perl-5.40.0/bin/perl
+#!/nix/store/j1scam1h5xmpnsn5ss02nbyhhyc7hwq3-perl-5.40.0/bin/perl
use strict;
use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/.git/hooks/post-update.sample
new/ansible-navigator-26.1.1/.git/hooks/post-update.sample
--- old/ansible-navigator-25.12.0/.git/hooks/post-update.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/post-update.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/pre-applypatch.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-applypatch.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-applypatch.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-applypatch.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/pre-commit.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-commit.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-commit.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-commit.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/pre-merge-commit.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-merge-commit.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-merge-commit.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-merge-commit.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/pre-push.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-push.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-push.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-push.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/pre-rebase.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-rebase.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-rebase.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-rebase.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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/k9lfh0l007sp61rag7d9bf3nn5bg3qy7-perl-5.40.0/bin/perl -e '
+ /nix/store/j1scam1h5xmpnsn5ss02nbyhhyc7hwq3-perl-5.40.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-25.12.0/.git/hooks/pre-receive.sample
new/ansible-navigator-26.1.1/.git/hooks/pre-receive.sample
--- old/ansible-navigator-25.12.0/.git/hooks/pre-receive.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/pre-receive.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/prepare-commit-msg.sample
new/ansible-navigator-26.1.1/.git/hooks/prepare-commit-msg.sample
--- old/ansible-navigator-25.12.0/.git/hooks/prepare-commit-msg.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/prepare-commit-msg.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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/k9lfh0l007sp61rag7d9bf3nn5bg3qy7-perl-5.40.0/bin/perl -i.bak -ne
'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
+/nix/store/j1scam1h5xmpnsn5ss02nbyhhyc7hwq3-perl-5.40.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/k9lfh0l007sp61rag7d9bf3nn5bg3qy7-perl-5.40.0/bin/perl -i.bak
-pe '
+# /nix/store/j1scam1h5xmpnsn5ss02nbyhhyc7hwq3-perl-5.40.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/k9lfh0l007sp61rag7d9bf3nn5bg3qy7-perl-5.40.0/bin/perl -i.bak
-pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
+# /nix/store/j1scam1h5xmpnsn5ss02nbyhhyc7hwq3-perl-5.40.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-25.12.0/.git/hooks/push-to-checkout.sample
new/ansible-navigator-26.1.1/.git/hooks/push-to-checkout.sample
--- old/ansible-navigator-25.12.0/.git/hooks/push-to-checkout.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/push-to-checkout.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/sendemail-validate.sample
new/ansible-navigator-26.1.1/.git/hooks/sendemail-validate.sample
--- old/ansible-navigator-25.12.0/.git/hooks/sendemail-validate.sample
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/sendemail-validate.sample
2026-01-08 20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/hooks/update.sample
new/ansible-navigator-26.1.1/.git/hooks/update.sample
--- old/ansible-navigator-25.12.0/.git/hooks/update.sample 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/hooks/update.sample 2026-01-08
20:24:48.000000000 +0100
@@ -1,4 +1,4 @@
-#!/nix/store/l9k32vj2aczxw62134j1x0dsh569jz2l-bash-5.2p37/bin/bash
+#!/nix/store/j8645yndikbrvn292zgvyv64xrrmwdcb-bash-5.3p3/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-25.12.0/.git/index and
new/ansible-navigator-26.1.1/.git/index differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.git/logs/HEAD
new/ansible-navigator-26.1.1/.git/logs/HEAD
--- old/ansible-navigator-25.12.0/.git/logs/HEAD 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/logs/HEAD 2026-01-08 20:24:48.000000000
+0100
@@ -1,2 +1,2 @@
-0000000000000000000000000000000000000000
5784048331c41513425446ace851e56098dae601 kastl <[email protected]>
1764917116 +0100 clone: from https://github.com/ansible/ansible-navigator
-5784048331c41513425446ace851e56098dae601
2a49e00ce1008ebf6df4e68c9910187b6d97639c kastl <[email protected]>
1764917116 +0100 checkout: moving from main to v25.12.0
+0000000000000000000000000000000000000000
12eaa0f5f130733bfed2d2e755888c91df9d3796 kastl <[email protected]>
1768287143 +0100 clone: from https://github.com/ansible/ansible-navigator
+12eaa0f5f130733bfed2d2e755888c91df9d3796
8eda9ce382df653570693a781930c61a5e3b7c19 kastl <[email protected]>
1768287143 +0100 checkout: moving from main to v26.1.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.git/logs/refs/heads/main
new/ansible-navigator-26.1.1/.git/logs/refs/heads/main
--- old/ansible-navigator-25.12.0/.git/logs/refs/heads/main 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/logs/refs/heads/main 2026-01-08
20:24:48.000000000 +0100
@@ -1 +1 @@
-0000000000000000000000000000000000000000
5784048331c41513425446ace851e56098dae601 kastl <[email protected]>
1764917116 +0100 clone: from https://github.com/ansible/ansible-navigator
+0000000000000000000000000000000000000000
12eaa0f5f130733bfed2d2e755888c91df9d3796 kastl <[email protected]>
1768287143 +0100 clone: from https://github.com/ansible/ansible-navigator
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/.git/logs/refs/remotes/origin/HEAD
new/ansible-navigator-26.1.1/.git/logs/refs/remotes/origin/HEAD
--- old/ansible-navigator-25.12.0/.git/logs/refs/remotes/origin/HEAD
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/logs/refs/remotes/origin/HEAD
2026-01-08 20:24:48.000000000 +0100
@@ -1 +1 @@
-0000000000000000000000000000000000000000
5784048331c41513425446ace851e56098dae601 kastl <[email protected]>
1764917116 +0100 clone: from https://github.com/ansible/ansible-navigator
+0000000000000000000000000000000000000000
12eaa0f5f130733bfed2d2e755888c91df9d3796 kastl <[email protected]>
1768287143 +0100 clone: from https://github.com/ansible/ansible-navigator
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.idx
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.idx
differ
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.pack
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.pack
differ
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.rev
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-0da1f306ed161573458ea2dc3b33dc0159cf6a49.rev
differ
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.idx
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.idx
differ
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.pack
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.pack
differ
Binary files
old/ansible-navigator-25.12.0/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.rev
and
new/ansible-navigator-26.1.1/.git/objects/pack/pack-d22ce94feea1549eaa32731b93f1d83cfea04fa1.rev
differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.git/packed-refs
new/ansible-navigator-26.1.1/.git/packed-refs
--- old/ansible-navigator-25.12.0/.git/packed-refs 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/packed-refs 2026-01-08
20:24:48.000000000 +0100
@@ -1,16 +1,14 @@
# pack-refs with: peeled fully-peeled sorted
84521c91ed341a41232cb388e3fc6d548fa5f2ee refs/remotes/origin/AAP-36287
05d169ed6d5531a58a86c3d051ee8c2e059eb529 refs/remotes/origin/chore/ci
-16eb0fca9f7e1659b1b76ce03563738540d7c860 refs/remotes/origin/chore/sonar-config
0d667089697257c904031e581abb4f9d31d0ffdb refs/remotes/origin/chore/tmuxlib
+d958dbade56ba9465b8789791b85c87256627bb4
refs/remotes/origin/chore/update-python-deps
a75b8efc517146c4dce9b2e7f91cd77f5aef2ca8 refs/remotes/origin/community-comms
-423fe1c051e03ef273a7db428bb232234fd03361 refs/remotes/origin/fix/gha
-32c88cbdca59e8694b20ff8dec902c7da3f67c22 refs/remotes/origin/fix/uv
-5784048331c41513425446ace851e56098dae601 refs/remotes/origin/main
+12eaa0f5f130733bfed2d2e755888c91df9d3796 refs/remotes/origin/main
f2fe70d862609d68f64df4901f69ee932cda434b refs/remotes/origin/release-1.0
fa5ab6f372b6134e681c87cbfc35341c546eb68d refs/remotes/origin/release-1.1
+e7caeeac82a0960d95217e1df65a476adef21095 refs/remotes/origin/renovate/all
4f74e2e63965ca3706cb27b0e39c3041341a02fa refs/remotes/origin/test
-3dcc27cbaeb4545dccb4d4a72f3b3f940887aa3d refs/remotes/origin/test-python-3.12
e64273cb31afedb0f5fa395fd3c92908268f07cf refs/tags/0.6.2
c9030367e0346bce2f04d6ca0d15432f3bd7e297 refs/tags/0.7.0
^85848ca0b48d1133e6782941fdd95412ebbd2b7f
@@ -64,6 +62,8 @@
74cc9c82be1de4ca093bcbbe1cc22a004b04fdc3 refs/tags/v25.5.0
08f335c0c6ef43c140ed3b66cbaf1ee8a382bf43 refs/tags/v25.8.0
d0aa3a1d37660f2d03f6c8dc76c20bbe109d9c5b refs/tags/v25.9.0
+341a6dea4d67a00ed7765a1e597ccd801b4a299d refs/tags/v26.1.0
+8eda9ce382df653570693a781930c61a5e3b7c19 refs/tags/v26.1.1
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-25.12.0/.git/refs/heads/main
new/ansible-navigator-26.1.1/.git/refs/heads/main
--- old/ansible-navigator-25.12.0/.git/refs/heads/main 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.git/refs/heads/main 2026-01-08
20:24:48.000000000 +0100
@@ -1 +1 @@
-5784048331c41513425446ace851e56098dae601
+12eaa0f5f130733bfed2d2e755888c91df9d3796
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/.github/workflows/release.yml
new/ansible-navigator-26.1.1/.github/workflows/release.yml
--- old/ansible-navigator-25.12.0/.github/workflows/release.yml 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.github/workflows/release.yml 2026-01-08
20:24:48.000000000 +0100
@@ -31,7 +31,7 @@
--user
tox
- name: Check out src from Git
- uses: actions/checkout@v5
+ uses: actions/checkout@v6
with:
fetch-depth: 0 # needed by setuptools-scm
- name: Build dists
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.github/workflows/tox.yml
new/ansible-navigator-26.1.1/.github/workflows/tox.yml
--- old/ansible-navigator-25.12.0/.github/workflows/tox.yml 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.github/workflows/tox.yml 2026-01-08
20:24:48.000000000 +0100
@@ -51,13 +51,13 @@
matrix: ${{ fromJson(needs.pre.outputs.matrix) }}
steps:
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
with:
fetch-depth: 0 # needed by setuptools-scm
- name: Cache container images
if: ${{ startsWith(matrix.name, 'py') }}
- uses: actions/cache@v4
+ uses: actions/cache@v5
with:
path: |
~/.local/share/containers
@@ -142,7 +142,7 @@
runs-on: ubuntu-24.04
steps:
# checkout needed for codecov action which needs codecov.yml file
- - uses: actions/checkout@v5
+ - uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
@@ -152,7 +152,7 @@
- run: pip3 install 'coverage>=7.5.1'
- name: Merge logs into a single archive
- uses: actions/upload-artifact/merge@v4
+ uses: actions/upload-artifact/merge@v6
with:
name: logs.zip
include-hidden-files: true
@@ -160,20 +160,20 @@
separate-directories: true
- name: Download artifacts
- uses: actions/download-artifact@v5
+ uses: actions/download-artifact@v7
with:
name: logs.zip
path: .
- name: Upload coverage data
- uses: codecov/[email protected]
+ uses: codecov/[email protected]
with:
name: ${{ matrix.name }}
fail_ci_if_error: true
use_oidc: ${{ !(github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.fork) }}
- name: Delete Merged Artifacts
- uses: actions/upload-artifact/merge@v4
+ uses: actions/upload-artifact/merge@v6
with:
include-hidden-files: true
delete-merged: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/ansible-navigator-25.12.0/.pre-commit-config.yaml
new/ansible-navigator-26.1.1/.pre-commit-config.yaml
--- old/ansible-navigator-25.12.0/.pre-commit-config.yaml 2025-12-02
17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/.pre-commit-config.yaml 2026-01-08
20:24:48.000000000 +0100
@@ -7,14 +7,14 @@
exclude: "(?x)^(\n _readthedocs|\n .tox\n)$\n"
repos:
- repo: https://github.com/renovatebot/pre-commit-hooks
- rev: 41.157.1
+ rev: 42.71.0
hooks:
- id: renovate-config-validator
alias: renovate
args:
- --strict
- repo: https://github.com/rbubley/mirrors-prettier
- rev: v3.6.2
+ rev: v3.7.4
hooks:
- id: prettier
entry:
@@ -30,11 +30,11 @@
hooks:
- id: toml-sort-fix
- repo: https://github.com/tox-dev/tox-ini-fmt
- rev: 1.7.0
+ rev: 1.7.1
hooks:
- id: tox-ini-fmt
- repo: https://github.com/streetsidesoftware/cspell-cli
- rev: v9.2.0
+ rev: v9.4.0
hooks:
- id: cspell
name: Spell check with cspell
@@ -55,11 +55,11 @@
- id: check-ast
- id: debug-statements
- repo: https://gitlab.com/bmares/check-json5
- rev: v1.0.0
+ rev: v1.0.1
hooks:
- id: check-json5
- repo: https://github.com/igorshubovych/markdownlint-cli
- rev: v0.45.0
+ rev: v0.47.0
hooks:
- id: markdownlint
exclude:
@@ -93,11 +93,11 @@
additional_dependencies:
- flake8-docstrings
- repo: https://github.com/jsh9/pydoclint
- rev: 0.7.3
+ rev: 0.8.3
hooks:
- id: pydoclint
- repo: https://github.com/asottile/pyupgrade
- rev: v3.21.0
+ rev: v3.21.2
hooks:
- id: pyupgrade
args:
@@ -109,14 +109,14 @@
alias: toml
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: v0.14.1
+ rev: v0.14.10
hooks:
- id: ruff-format
alias: ruff
- id: ruff-check
alias: ruff
- repo: https://github.com/pre-commit/mirrors-mypy.git
- rev: v1.18.2
+ rev: v1.19.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.2
+ rev: v4.0.4
hooks:
- id: pylint
args:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/src/ansible_navigator/actions/collections.py
new/ansible-navigator-26.1.1/src/ansible_navigator/actions/collections.py
--- old/ansible-navigator-25.12.0/src/ansible_navigator/actions/collections.py
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/src/ansible_navigator/actions/collections.py
2026-01-08 20:24:48.000000000 +0100
@@ -236,8 +236,15 @@
msgs = ["humph. Something went really wrong while cataloging
collections."]
msgs.append("Details have been added to the log file")
closing = ["[HINT] Please log an issue about this one, it shouldn't
have happened"]
- warning = warning_notification(messages=msgs + closing)
- self._interaction.ui.show_form(warning)
+
+ # Only show UI notification in interactive mode
+ if self._args.mode == "interactive" and hasattr(self, "_interaction"):
+ warning = warning_notification(messages=msgs + closing)
+ self._interaction.ui.show_form(warning)
+ else:
+ # In stdout mode, just log the error
+ for msg in msgs + closing:
+ self._logger.error(msg)
def notify_none(self) -> None:
"""Notify no collections were found."""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/src/ansible_navigator/data/ansible-navigator.json
new/ansible-navigator-26.1.1/src/ansible_navigator/data/ansible-navigator.json
---
old/ansible-navigator-25.12.0/src/ansible_navigator/data/ansible-navigator.json
2025-12-02 17:56:18.000000000 +0100
+++
new/ansible-navigator-26.1.1/src/ansible_navigator/data/ansible-navigator.json
2026-01-08 20:24:48.000000000 +0100
@@ -525,7 +525,7 @@
"required": [
"ansible-navigator"
],
- "title": "ansible-navigator settings v25",
+ "title": "ansible-navigator settings v26",
"type": "object",
- "version": "25"
+ "version": "26"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/src/ansible_navigator/data/catalog_collections.py
new/ansible-navigator-26.1.1/src/ansible_navigator/data/catalog_collections.py
---
old/ansible-navigator-25.12.0/src/ansible_navigator/data/catalog_collections.py
2025-12-02 17:56:18.000000000 +0100
+++
new/ansible-navigator-26.1.1/src/ansible_navigator/data/catalog_collections.py
2026-01-08 20:24:48.000000000 +0100
@@ -512,19 +512,30 @@
Returns:
Errors or the configured collection directories
"""
- cmd = ["ansible-config", "dump", "|", "grep", "COLLECTIONS_PATHS"]
+ cmd = ["ansible-config", "dump"]
proc_out = run_command(cmd)
if "error" in proc_out:
return proc_out
+
+ # Filter for COLLECTIONS_PATHS instead of using shell pipe and grep
+ collections_paths_line = None
+ for line in proc_out["stdout"].splitlines():
+ if "COLLECTIONS_PATHS" in line:
+ collections_paths_line = line
+ break
+
+ if not collections_paths_line:
+ return {"error": "COLLECTIONS_PATHS not found in ansible-config
output"}
+
regex =
re.compile(r"^(?P<variable>\S+)\((?P<source>.*)\)\s=\s(?P<current>.*)$")
- parsed = regex.match(proc_out["stdout"])
+ parsed = regex.match(collections_paths_line)
if parsed:
try:
current = yaml.load(parsed.groupdict()["current"],
Loader=SafeLoader)
except (YAMLError, KeyError) as exc:
return {"error": str(exc)}
return {"result": current}
- return {"error": f"corrupt current collection path: {proc_out['stdout']}"}
+ return {"error": f"corrupt current collection path:
{collections_paths_line}"}
def retrieve_docs(
@@ -611,14 +622,16 @@
"""
try:
proc_out = subprocess.run(
- " ".join(cmd),
+ cmd,
capture_output=True,
check=True,
text=True,
- shell=True,
+ shell=False,
)
except subprocess.CalledProcessError as exc:
return {"error": str(exc)}
+ except (FileNotFoundError, PermissionError) as exc:
+ return {"error": f"{type(exc).__name__}: {exc}"}
return {"stdout": proc_out.stdout}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/src/ansible_navigator/data/image_introspect.py
new/ansible-navigator-26.1.1/src/ansible_navigator/data/image_introspect.py
---
old/ansible-navigator-25.12.0/src/ansible_navigator/data/image_introspect.py
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/src/ansible_navigator/data/image_introspect.py
2026-01-08 20:24:48.000000000 +0100
@@ -325,7 +325,7 @@
"""
pre = Command(
id_="pip_freeze",
- command="/usr/bin/python3 -m pip freeze",
+ command=f"{sys.executable} -m pip freeze",
parse=self.parse_freeze,
)
run_command(pre)
@@ -334,7 +334,7 @@
return [
Command(
id_="python_packages",
- command=f"/usr/bin/python3 -m pip show {pkgs}",
+ command=f"{sys.executable} -m pip show {pkgs}",
parse=self.parse,
),
]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/src/ansible_navigator/runner/base.py
new/ansible-navigator-26.1.1/src/ansible_navigator/runner/base.py
--- old/ansible-navigator-25.12.0/src/ansible_navigator/runner/base.py
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/src/ansible_navigator/runner/base.py
2026-01-08 20:24:48.000000000 +0100
@@ -103,12 +103,22 @@
self.status: str | None = None
self._runner_args: dict[str, Any] = {}
+ container_options = container_options or []
+
# when the ce is podman, set the container user to root
if self._ce == "podman":
- if container_options:
- container_options.append("--user=root")
- else:
- container_options = ["--user=root"]
+ container_options.append("--user=root")
+
+ # Fix SSH agent socket when running Docker on macOS.
+ if sys.platform == "darwin" and self._ce == "docker":
+ ssh_agent_socket_opts = [
+ # Docker exposes this proxy socket for SSH agent on macOS.
+
"--volume=/run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock:ro",
+ "--env=SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock",
+ ]
+
+ # Prepend to existing container options to allow overriding this
fix.
+ container_options = ssh_agent_socket_opts + container_options
if self._ee:
self._runner_args.update(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/integration/test_execution_environment_image.py
new/ansible-navigator-26.1.1/tests/integration/test_execution_environment_image.py
---
old/ansible-navigator-25.12.0/tests/integration/test_execution_environment_image.py
2025-12-02 17:56:18.000000000 +0100
+++
new/ansible-navigator-26.1.1/tests/integration/test_execution_environment_image.py
2026-01-08 20:24:48.000000000 +0100
@@ -3,6 +3,7 @@
from __future__ import annotations
import shlex
+import sys
from pathlib import Path
from typing import TYPE_CHECKING
@@ -22,7 +23,12 @@
from unittest.mock import MagicMock # pylint: disable=preferred-module
test_data = [
- ("defaults", "", "ansible-navigator_empty.yml", {"container_image":
default_ee_image_name()}),
+ (
+ "defaults",
+ "",
+ "ansible-navigator_empty.yml",
+ {"container_image": default_ee_image_name()},
+ ),
(
"set at command line",
f"--execution-environment-image {small_image_name()}",
@@ -106,3 +112,17 @@
for item in expected.items():
assert item in kwargs.items()
+
+ # MacOS SSH options should not be included when running in another OS
or on Podman.
+ container_options = kwargs["container_options"] or []
+
+ macos_container_options = [
+
"--volume=/run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock:ro",
+ "--env=SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock",
+ ]
+
+ for opt in macos_container_options:
+ if sys.platform == "darwin" and
kwargs["process_isolation_executable"] == "docker":
+ assert opt in container_options
+ else:
+ assert opt not in container_options
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/integration/version_migration/test_v1_v2_settings.py
new/ansible-navigator-26.1.1/tests/integration/version_migration/test_v1_v2_settings.py
---
old/ansible-navigator-25.12.0/tests/integration/version_migration/test_v1_v2_settings.py
2025-12-02 17:56:18.000000000 +0100
+++
new/ansible-navigator-26.1.1/tests/integration/version_migration/test_v1_v2_settings.py
2026-01-08 20:24:48.000000000 +0100
@@ -68,7 +68,7 @@
if os.environ.get("ANSIBLE_NAVIGATOR_UPDATE_TEST_FIXTURES") == "true":
shutil.copy(destination, corrected)
- assert any("ansible-navigator 25." in line for line in result), (
+ assert any("ansible-navigator 26." in line for line in result), (
"(Note: requires recent tags, `git fetch --all`)"
)
assert filecmp.cmp(destination, corrected)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/unit/actions/collections/test_notify_failed.py
new/ansible-navigator-26.1.1/tests/unit/actions/collections/test_notify_failed.py
---
old/ansible-navigator-25.12.0/tests/unit/actions/collections/test_notify_failed.py
1970-01-01 01:00:00.000000000 +0100
+++
new/ansible-navigator-26.1.1/tests/unit/actions/collections/test_notify_failed.py
2026-01-08 20:24:48.000000000 +0100
@@ -0,0 +1,47 @@
+"""Test the notify_failed method in collections action."""
+
+from unittest.mock import MagicMock # pylint: disable=preferred-module
+from unittest.mock import patch # pylint: disable=preferred-module
+
+from ansible_navigator.actions.collections import Action
+
+
+def test_notify_failed_in_stdout_mode() -> None:
+ """Test that notify_failed doesn't crash in stdout mode when _interaction
is not set.
+
+ This tests the fix for the AttributeError that occurred when trying to
access
+ _interaction.ui.show_form() in stdout mode.
+ """
+ # Create minimal args mock with mode set to stdout
+ args = MagicMock()
+ args.mode = "stdout"
+ action = Action(args=args)
+
+ # Ensure _interaction is not set (not in stdout mode)
+ assert not hasattr(action, "_interaction")
+
+ # Expected AttributesError
+ with patch.object(action._logger, "error") as mock_logger:
+ action.notify_failed()
+
+ assert mock_logger.call_count > 0
+ logged_messages = [call[0][0] for call in mock_logger.call_args_list]
+ assert any("Something went really wrong" in msg for msg in
logged_messages)
+ assert any("log file" in msg for msg in logged_messages)
+
+
+def test_notify_failed_in_interactive_mode() -> None:
+ """Test that notify_failed works correctly in interactive mode with
_interaction set."""
+ args = MagicMock()
+ args.mode = "interactive"
+ action = Action(args=args)
+
+ mock_interaction = MagicMock()
+ mock_ui = MagicMock()
+ mock_interaction.ui = mock_ui
+ action._interaction = mock_interaction
+
+ action.notify_failed()
+
+ # Verify that show_form was called
+ mock_ui.show_form.assert_called_once()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/unit/runner/test_base.py
new/ansible-navigator-26.1.1/tests/unit/runner/test_base.py
--- old/ansible-navigator-25.12.0/tests/unit/runner/test_base.py
1970-01-01 01:00:00.000000000 +0100
+++ new/ansible-navigator-26.1.1/tests/unit/runner/test_base.py 2026-01-08
20:24:48.000000000 +0100
@@ -0,0 +1,69 @@
+"""Unit tests for the Base runner class."""
+
+import sys
+
+import pytest
+
+from ansible_navigator.runner.base import Base
+
+
+macos_docker_ssh_opts = [
+
"--volume=/run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock:ro",
+ "--env=SSH_AUTH_SOCK=/run/host-services/ssh-auth.sock",
+]
+
+
[email protected](
+ ("platform", "container_engine"),
+ (
+ ("darwin", "docker"),
+ ("darwin", "podman"),
+ ("linux", "docker"),
+ ("linux", "podman"),
+ ),
+)
+def test_ssh_agent_options_mac_docker(
+ monkeypatch: pytest.MonkeyPatch, platform: str, container_engine: str
+) -> None:
+ """Test that SSH agent options are correctly set for different platforms
and container engines.
+
+ Args:
+ monkeypatch: The monkeypatch fixture
+ platform: The platform string
+ container_engine: The container engine to use
+ """
+ monkeypatch.setattr(sys, "platform", platform)
+
+ base = Base(
+ container_engine=container_engine,
+ execution_environment=True,
+ )
+
+ opts = base._runner_args.get("container_options") or []
+
+ for expected_opt in macos_docker_ssh_opts:
+ if platform == "darwin" and container_engine == "docker":
+ assert expected_opt in opts
+ else:
+ assert expected_opt not in opts
+
+
+def test_ssh_agent_options_order(monkeypatch: pytest.MonkeyPatch) -> None:
+ """Test that custom container options are appended after SSH agent options
on macOS with Docker.
+
+ Args:
+ monkeypatch: The monkeypatch fixture
+ """
+ monkeypatch.setattr(sys, "platform", "darwin")
+
+ base = Base(
+ container_engine="docker",
+ execution_environment=True,
+ container_options=["--test"],
+ )
+
+ opts = base._runner_args.get("container_options") or []
+
+ assert "--test" in opts
+ # Assert that SSH agent fix options are set first to allow overriding them.
+ assert opts[2] == "--test"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/unit/test_catalog_collections.py
new/ansible-navigator-26.1.1/tests/unit/test_catalog_collections.py
--- old/ansible-navigator-25.12.0/tests/unit/test_catalog_collections.py
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/tests/unit/test_catalog_collections.py
2026-01-08 20:24:48.000000000 +0100
@@ -4,7 +4,11 @@
from pathlib import Path
from typing import Any
+from unittest.mock import MagicMock # pylint: disable=preferred-module
+from unittest.mock import patch # pylint: disable=preferred-module
+from ansible_navigator.data.catalog_collections import
retrieve_collections_paths
+from ansible_navigator.data.catalog_collections import run_command
from ansible_navigator.data.catalog_collections import worker
@@ -56,3 +60,85 @@
plugin_path, data = completed_queue.get()
assert plugin_path == "error"
assert "FileNotFoundError (get_docstring)" in data[2]
+
+
+@patch("ansible_navigator.data.catalog_collections.subprocess.run")
+def test_run_command_without_shell(mock_subprocess: MagicMock) -> None:
+ """Test that run_command executes without shell=True.
+
+ Args:
+ mock_subprocess: Mock subprocess.run
+ """
+ # Mock successful command execution
+ mock_process = MagicMock()
+ mock_process.stdout = "test output"
+ mock_subprocess.return_value = mock_process
+
+ cmd = ["ansible-config", "dump"]
+ result = run_command(cmd)
+
+ # Verify subprocess.run was called with shell=False
+ mock_subprocess.assert_called_once()
+ call_args = mock_subprocess.call_args
+ assert call_args[0][0] == cmd
+ assert call_args[1]["shell"] is False
+ assert result == {"stdout": "test output"}
+
+
+@patch("ansible_navigator.data.catalog_collections.subprocess.run")
+def test_run_command_handles_permission_error(mock_subprocess: MagicMock) ->
None:
+ """Test that run_command handles PermissionError gracefully.
+
+ Args:
+ mock_subprocess: Mock subprocess.run
+ """
+ mock_subprocess.side_effect = PermissionError(1, "Operation not
permitted", "/bin/sh")
+
+ cmd = ["ansible-config", "dump"]
+ result = run_command(cmd)
+
+ assert "error" in result
+ assert "PermissionError" in result["error"]
+
+
+@patch("ansible_navigator.data.catalog_collections.run_command")
+def test_retrieve_collections_paths_without_pipe(mock_run_command: MagicMock)
-> None:
+ """Test that retrieve_collections_paths doesn't use shell pipes.
+
+ Args:
+ mock_run_command: Mock run_command function
+ """
+ config_output = """ANSIBLE_COW_ACCEPTLIST(default) = ['bud-frogs', 'bunny']
+COLLECTIONS_PATHS(default) = ['/home/user/.ansible/collections',
'/usr/share/ansible/collections']
+DEFAULT_FORKS(default) = 5"""
+
+ mock_run_command.return_value = {"stdout": config_output}
+
+ result = retrieve_collections_paths()
+
+ mock_run_command.assert_called_once_with(["ansible-config", "dump"])
+
+ assert "result" in result
+ assert isinstance(result["result"], list)
+ assert "/home/user/.ansible/collections" in result["result"]
+ assert "/usr/share/ansible/collections" in result["result"]
+
+
+@patch("ansible_navigator.data.catalog_collections.run_command")
+def test_retrieve_collections_paths_not_found(mock_run_command: MagicMock) ->
None:
+ """Test retrieve_collections_paths when COLLECTIONS_PATHS is not in output.
+
+ Args:
+ mock_run_command: Mock run_command function
+ """
+ # Mock ansible-config dump output without COLLECTIONS_PATHS
+ config_output = """ANSIBLE_COW_ACCEPTLIST(default) = ['bud-frogs', 'bunny']
+DEFAULT_FORKS(default) = 5"""
+
+ mock_run_command.return_value = {"stdout": config_output}
+
+ result = retrieve_collections_paths()
+
+ # Verify an error is returned
+ assert "error" in result
+ assert "COLLECTIONS_PATHS not found" in result["error"]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/ansible-navigator-25.12.0/tests/unit/test_image_introspection.py
new/ansible-navigator-26.1.1/tests/unit/test_image_introspection.py
--- old/ansible-navigator-25.12.0/tests/unit/test_image_introspection.py
2025-12-02 17:56:18.000000000 +0100
+++ new/ansible-navigator-26.1.1/tests/unit/test_image_introspection.py
2026-01-08 20:24:48.000000000 +0100
@@ -51,6 +51,51 @@
which contains NET-SNMP utilities.
"""
+PIP_FREEZE_OUTPUT = """ansible-core==2.19.4
+ansible-runner==2.4.2
+attrs==25.4.0
+bcrypt==5.0.0
+cffi==2.0.0
+cryptography==46.0.3
+Jinja2==3.1.6
+jsonschema==4.25.1
+MarkupSafe==3.0.2
+"""
+
+PIP_SHOW_OUTPUT = """Name: ansible-core
+Version: 2.19.4
+Summary: Radically simple IT automation
+Home-page: https://ansible.com/
+Author: Ansible, Inc.
+Author-email: [email protected]
+License: GPLv3+
+Location: /opt/app-root/lib/python3.11/site-packages
+Requires: cryptography, jinja2, packaging, PyYAML, resolvelib
+Required-by: ansible-runner
+---
+Name: Jinja2
+Version: 3.1.6
+Summary: A very fast and expressive template engine.
+Home-page: https://palletsprojects.com/p/jinja/
+Author:
+Author-email:
+License: BSD-3-Clause
+Location: /opt/app-root/lib/python3.11/site-packages
+Requires: MarkupSafe
+Required-by: ansible-core
+---
+Name: cryptography
+Version: 46.0.3
+Summary: cryptography is a package which provides cryptographic recipes and
primitives
+Home-page: https://github.com/pyca/cryptography
+Author:
+Author-email: The Python Cryptographic Authority <[email protected]>
+License:
+Location: /opt/app-root/lib64/python3.11/site-packages
+Requires: cffi
+Required-by: ansible-core, paramiko
+"""
+
@pytest.fixture(scope="module", name="imported_ii")
def image_introspection() -> types.ModuleType:
@@ -108,3 +153,67 @@
assert entry["description"].endswith("utilities.")
assert "summary: summary_string" in entry["description"]
assert "version: version_string" in entry["description"]
+
+
+def test_python_packages_parse_freeze(imported_ii: Any) -> None:
+ """Test parsing pip freeze output.
+
+ Args:
+ imported_ii: Image introspection
+ """
+ command = imported_ii.Command(id="test", parse=lambda x: x,
stdout=PIP_FREEZE_OUTPUT)
+ imported_ii.PythonPackages().parse_freeze(command)
+
+ assert isinstance(command.details, list)
+ assert len(command.details) == 1
+ packages = command.details[0]
+
+ # Verify some package names and versions were parsed correctly
+ assert packages["ansible-core"] == "2.19.4"
+ assert packages["jinja2"] == "3.1.6"
+ assert packages["cryptography"] == "46.0.3"
+ assert packages["ansible-runner"] == "2.4.2"
+ assert len(packages) == 9
+
+
+def test_python_packages_parse_show(imported_ii: Any) -> None:
+ """Test parsing pip show output.
+
+ Args:
+ imported_ii: Image introspection
+ """
+ command = imported_ii.Command(id="test", parse=lambda x: x,
stdout=PIP_SHOW_OUTPUT)
+ imported_ii.PythonPackages().parse(command)
+
+ assert isinstance(command.details, list)
+ assert len(command.details) == 3
+
+ # Check ansible-core details
+ ansible_core = command.details[0]
+ assert ansible_core["name"] == "ansible-core"
+ assert ansible_core["version"] == "2.19.4"
+ assert ansible_core["summary"] == "Radically simple IT automation"
+ assert ansible_core["location"] ==
"/opt/app-root/lib/python3.11/site-packages"
+ assert "cryptography" in ansible_core["requires"]
+ assert "jinja2" in ansible_core["requires"]
+ assert ansible_core["required-by"] == ["ansible-runner"]
+
+ # Check Jinja2 details
+ jinja2 = command.details[1]
+ assert jinja2["name"] == "Jinja2"
+ assert jinja2["version"] == "3.1.6"
+ assert jinja2["requires"] == ["MarkupSafe"]
+ assert jinja2["required-by"] == ["ansible-core"]
+
+ # Check cryptography details
+ crypto = command.details[2]
+ assert crypto["name"] == "cryptography"
+ assert crypto["version"] == "46.0.3"
+ expected_summary = (
+ "cryptography is a package which provides cryptographic recipes and
primitives"
+ )
+ assert crypto["summary"] == expected_summary
+ assert crypto["location"] == "/opt/app-root/lib64/python3.11/site-packages"
+ assert crypto["requires"] == ["cffi"]
+ assert "ansible-core" in crypto["required-by"]
+ assert "paramiko" in crypto["required-by"]
++++++ ansible-navigator.obsinfo ++++++
--- /var/tmp/diff_new_pack.tWTtmg/_old 2026-01-13 21:33:16.144785946 +0100
+++ /var/tmp/diff_new_pack.tWTtmg/_new 2026-01-13 21:33:16.148786112 +0100
@@ -1,5 +1,5 @@
name: ansible-navigator
-version: 25.12.0
-mtime: 1764694578
-commit: 2a49e00ce1008ebf6df4e68c9910187b6d97639c
+version: 26.1.1
+mtime: 1767900288
+commit: 8eda9ce382df653570693a781930c61a5e3b7c19