77# https://github.com/tommarshall/git-diff-ansible-vault
88#
99
10- VERSION=0.2 .0
10+ VERSION=0.3 .0
1111REVISION=
1212PATH_SCOPE=
1313GIT_DIFF_ARGS=
14+ NO_PAGER=0
1415VAULT_PASSWORD_FILE=' ./.vault-pass'
1516VAULT_ONLY=0
1617COLOR=
1718VERBOSE=0
1819GIT_CMD=' git --no-pager'
20+ PAGER_CMD=
1921
2022#
2123# Output version.
@@ -52,6 +54,7 @@ help() {
5254 -r, --revision <revision> show diff for git revision, e.g. master..some-branch
5355 -p, --path <path> restrict diff to path, e.g. support/config.yml
5456 --cached, --staged show diff for staged changes
57+ --no-pager do not pipe output into a pager
5558 --vault-password-file <path> vault password file path, defaults to .vault-pass
5659 --vault-only restrict diff to vault files only
5760 --color, --colour turn on coloured output
@@ -177,6 +180,33 @@ decrypted_vault_contents() {
177180 test $? -eq 0 || warn " Unable to open vault: $FILE_PATH "
178181}
179182
183+ #
184+ # Check if output is paged.
185+ #
186+
187+ is_paged () {
188+ test -n " $PAGER_CMD " && [[ " $PAGER_CMD " != ' cat' * ]]
189+ }
190+
191+ #
192+ # Set the default pager command and arguments.
193+ #
194+
195+ set_default_pager () {
196+ test $NO_PAGER -eq 1 && return 0;
197+ # ref: https://github.com/git/git/blob/v2.9.2/pager.c#L43-L74
198+ local default_pager=$GIT_PAGER
199+ test -n " $default_pager " || default_pager=$( git config --global pager.diff)
200+ test -n " $default_pager " || default_pager=$( git config --get core.pager)
201+ test -n " $default_pager " || default_pager=$PAGER
202+ case $default_pager in
203+ ' ' ) PAGER_CMD=' less -FRX' ;;
204+ less* ) PAGER_CMD=" $default_pager -FRX" ;;
205+ lv* ) PAGER_CMD=" $default_pager -c" ;;
206+ * ) PAGER_CMD=" $default_pager " ;;
207+ esac
208+ }
209+
180210#
181211# Ensure the `colordiff` binary is available.
182212#
@@ -226,6 +256,7 @@ set_default_color() {
226256 COLOR=' never'
227257 fi
228258 fi
259+ log " DEFAULT_COLOR: $COLOR "
229260}
230261
231262#
@@ -236,6 +267,7 @@ git_diff_ansible_vault() {
236267 log " REVISION: $REVISION "
237268 log " PATH_SCOPE: $PATH_SCOPE "
238269 log " GIT_DIFF_ARGS: $GIT_DIFF_ARGS "
270+ log " PAGER_CMD: $PAGER_CMD "
239271 log " VAULT_PASSWORD_FILE: $VAULT_PASSWORD_FILE "
240272 log " VAULT_ONLY: $VAULT_ONLY "
241273 log " COLOR: $COLOR "
@@ -252,7 +284,7 @@ git_diff_ansible_vault() {
252284 | grep -E ' ^\+[^\+]|\$ANSIBLE_VAULT' | sed -E ' s/^([^+ ]*)[+ ]/\1/' )
253285
254286 # print the diff heading from git diff so we get the real paths
255- $ GIT_CMD -c color.ui=$COLOR diff $GIT_DIFF_ARGS $REVISION $FILE_PATH | head -n 4
287+ echo " $( $ GIT_CMD -c color.ui=$COLOR diff $GIT_DIFF_ARGS $REVISION $FILE_PATH ) " | head -n 4
256288
257289 # print the diff body from the opened vault diff
258290 diff -u \
@@ -276,6 +308,7 @@ while test $# -ne 0; do
276308 -r|--revision) REVISION=$1 ; shift ;;
277309 -p|--path) PATH_SCOPE=$1 ; shift ;;
278310 --cached|--staged) GIT_DIFF_ARGS=" $GIT_DIFF_ARGS --cached" ;;
311+ --no-pager) NO_PAGER=1 ;;
279312 --vault-password-file) set_vault_password_file_path $1 ; shift ;;
280313 --vault-only) VAULT_ONLY=1 ;;
281314 --color|--colour) ensure_colordiff; COLOR=' always' ;;
@@ -301,8 +334,15 @@ ensure_git_repository
301334
302335ensure_vault_password
303336
337+ set_default_pager
338+
304339set_default_color
305340
306- git_diff_ansible_vault
341+ if is_paged && [ -t 1 ]; then
342+ test " $COLOR " == ' auto' && COLOR=' always'
343+ git_diff_ansible_vault | eval " $PAGER_CMD "
344+ else
345+ git_diff_ansible_vault
346+ fi
307347
308348delete_tmp_vault_password_file
0 commit comments