Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package duply for openSUSE:Factory checked in at 2026-02-16 13:09:06 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/duply (Old) and /work/SRC/openSUSE:Factory/.duply.new.1977 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "duply" Mon Feb 16 13:09:06 2026 rev:27 rq:1333043 version:2.5.6 Changes: -------- --- /work/SRC/openSUSE:Factory/duply/duply.changes 2023-12-03 20:49:16.834805918 +0100 +++ /work/SRC/openSUSE:Factory/.duply.new.1977/duply.changes 2026-02-16 13:14:40.979406294 +0100 @@ -1,0 +2,22 @@ +Wed Feb 11 08:18:19 UTC 2026 - Dirk Müller <[email protected]> + +- update to 2.5.6: + * bugfix #144: '--exclude-other-filesystems' corrupted + generated command line, thx David Epping + * bugfix #143: parse duplicity 3.0.4 version fails, thx Mischa + ter Smitten + * clean out some compatibility code with ancient duplicity + versions + * bugfix #142: batch cmds with consecutive '_' fail, thx + Dominik Sommer + * allow undocumented space separated batch cmd list e.g. "pre + bkp post" + * fix mawk incompatibility in gpg version detection + * fix and/or conditions skipped one too many commands + * simplify batch command parsing, remove superfluous 'read -ra' + * bugfix #140,141: "GPG_OPTS broken" + * detect gpg version and add '--pinentry-mode loopback' as + duplicity does + * no need to add it manually in GPG_OPTS anymore + +------------------------------------------------------------------- Old: ---- duply_2.5.2.tgz New: ---- duply_2.5.6.tgz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ duply.spec ++++++ --- /var/tmp/diff_new_pack.gvlo0X/_old 2026-02-16 13:14:42.171455776 +0100 +++ /var/tmp/diff_new_pack.gvlo0X/_new 2026-02-16 13:14:42.171455776 +0100 @@ -1,7 +1,7 @@ # # spec file for package duply # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2011-2019 Malcolm J Lewis <[email protected]> # # All modifications and additions to the file contributed by third parties @@ -18,7 +18,7 @@ Name: duply -Version: 2.5.2 +Version: 2.5.6 Release: 0 Summary: A frontend for the "duplicity" backup program License: GPL-2.0-only ++++++ duply_2.5.2.tgz -> duply_2.5.6.tgz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duply_2.5.2/CHANGELOG.txt new/duply_2.5.6/CHANGELOG.txt --- old/duply_2.5.2/CHANGELOG.txt 2023-11-30 15:40:29.000000000 +0100 +++ new/duply_2.5.6/CHANGELOG.txt 2025-08-29 15:15:25.000000000 +0200 @@ -17,8 +17,29 @@ - remove url_encode, test for invalid chars n throw error instead CHANGELOG: +2.5.6 (2025-08-28) +- bugfix #144: '--exclude-other-filesystems' corrupted generated + command line, thx David Epping + +2.5.5 (2025-02-11) +- bugfix #143: parse duplicity 3.0.4 version fails, thx Mischa ter Smitten +- clean out some compatibility code with ancient duplicity versions + +2.5.4 (2025-01-01) +- bugfix #142: batch cmds with consecutive '_' fail, thx Dominik Sommer +- allow undocumented space separated batch cmd list e.g. "pre bkp post" +- fix mawk incompatibility in gpg version detection +- fix and/or conditions skipped one too many commands +- simplify batch command parsing, remove superfluous 'read -ra' + +2.5.3 (10.7.2024) +- bugfix #140,141: "GPG_OPTS broken" + see also https://duplicity.us/stable/duplicity.1.html#argparse-problem +- detect gpg version and add '--pinentry-mode loopback' as duplicity does + no need to add it manually in GPG_OPTS anymore + 2.5.2 (30.11.2023) -- bug #139: "ampersand (&) in gpg passphrase breaks gpg tests" +- bugfix #139: "ampersand (&) in gpg passphrase breaks gpg tests" 2.5.1 (4.10.2023) - quotewrap only strings with quotes ('") or spaces from now on diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/duply_2.5.2/duply new/duply_2.5.6/duply --- old/duply_2.5.2/duply 2023-11-30 15:40:29.000000000 +0100 +++ new/duply_2.5.6/duply 2025-08-29 15:15:25.000000000 +0200 @@ -33,8 +33,29 @@ # - remove url_encode, test for invalid chars n throw error instead # # CHANGELOG: +# 2.5.6 (2025-08-28) +# - bugfix #144: '--exclude-other-filesystems' corrupted generated +# command line, thx David Epping +# +# 2.5.5 (2025-02-11) +# - bugfix #143: parse duplicity 3.0.4 version fails, thx Mischa ter Smitten +# - clean out some compatibility code with ancient duplicity versions +# +# 2.5.4 (2025-01-01) +# - bugfix #142: batch cmds with consecutive '_' fail, thx Dominik Sommer +# - allow undocumented space separated batch cmd list e.g. "pre bkp post" +# - fix mawk incompatibility in gpg version detection +# - fix and/or conditions skipped one too many commands +# - simplify batch command parsing, remove superfluous 'read -ra' +# +# 2.5.3 (10.7.2024) +# - bugfix #140,141: "GPG_OPTS broken" +# see also https://duplicity.us/stable/duplicity.1.html#argparse-problem +# - detect gpg version and add '--pinentry-mode loopback' as duplicity does +# no need to add it manually in GPG_OPTS anymore +# # 2.5.2 (30.11.2023) -# - bug #139: "ampersand (&) in gpg passphrase breaks gpg tests" +# - bugfix #139: "ampersand (&) in gpg passphrase breaks gpg tests" # # 2.5.1 (4.10.2023) # - quotewrap only strings with quotes ('") or spaces from now on @@ -554,9 +575,9 @@ # important definitions ####################################################### ME_LONG="$0" -ME="$(basename $0)" +ME="$(basename "$0")" ME_NAME="${ME%%.*}" -ME_VERSION="2.5.2" +ME_VERSION="2.5.6" ME_WEBSITE="https://duply.net" # default config values @@ -637,9 +658,9 @@ # openbsd awk (-V, exitcode 0 when any program string is given regardless .e.g. "-W version", so place it last) # some awks wait for input if they misinterpret/don't know the options, pipe '' as a precaution AWK_VERSION=$( lookup awk && ( - echo | awk --version ||\ - echo | awk -V ||\ - echo | awk -W version ) 2>/dev/null | awk 'NR<=2&&tolower($0)~/(busybox|awk)/{success=1;print;exit} END{if(success<1) print "unknown"}' || echo "$NOTFOUND" ) + echo | awk --version ||\ + echo | awk -V ||\ + echo | awk -W version ) 2>/dev/null | awk 'NR<=2&&tolower($0)~/(busybox|awk)/{success=1;print;exit} END{if(success<1) print "unknown"}' || echo "$NOTFOUND" ) GREP_VERSION=$( lookup grep && grep --version 2>&1 | awk 'NR<=2&&tolower($0)~/(busybox|grep.*[0-9]+\.[0-9]+)/{success=1;print;exit} END{if(success<1) print "unknown"}' || echo "$NOTFOUND" ) if [ -n "$PYTHON" ]; then @@ -915,8 +936,6 @@ # or "--compress-algo=bzip2 --bzip2-compress-level=9" # or "--personal-cipher-preferences AES256,AES192,AES..." # or "--homedir ~/.duply" - keep keyring and gpg settings duply specific -# or "--pinentry-mode loopback" - needed for GPG 2.1+ _and_ -# also enable allow-loopback-pinentry in your .gnupg/gpg-agent.conf #GPG_OPTS='' # disable preliminary tests with the following setting @@ -1193,7 +1212,8 @@ CMD="$PYTHON $(qw "$(which duplicity)")" DUPL_VERSION_OUT=$($CMD --version) - DUPL_VERSION=$(echo $DUPL_VERSION_OUT | awk '/^duplicity/{print $2; exit;}') + # keep "$DUPL_VERSION_OUT" in quotes to maintain line breaks of output + DUPL_VERSION=$(echo "$DUPL_VERSION_OUT" | awk '/^duplicity +/{print $2; exit;}') #DUPL_VERSION='1.2.3' #'0.7.03' #'0.6.08b' #,0.4.4.RC4,0.6.08b DUPL_VERSION_VALUE=0 DUPL_VERSION_AWK=$(awk -v v="$DUPL_VERSION" 'BEGIN{ @@ -1213,7 +1233,7 @@ if [ $DUPL_VERSION_VALUE -eq 0 ]; then inform "duplicity version check failed (please report, this is a bug) the command - $CMD + $CMD --version resulted in $DUPL_VERSION_OUT " @@ -1228,12 +1248,16 @@ fi } +function duplicity_version_isvalid { + awk '!/^[0-9]+$/{exit 1}' <<< "$DUPL_VERSION_VALUE" && [ "$DUPL_VERSION_VALUE" -gt 0 ] +} + function duplicity_version_ge { - [ "$DUPL_VERSION_VALUE" -ge "$1" ] + duplicity_version_isvalid && [ "$DUPL_VERSION_VALUE" -ge "$1" ] } function duplicity_version_lt { - ! duplicity_version_ge "$1" + duplicity_version_isvalid && ! duplicity_version_ge "$1" } # parse interpreter from duplicity shebang @@ -1348,29 +1372,28 @@ var_isset 'GPG_PW_SIGN' && DUPL_ARG_ENC="${DUPL_ARG_ENC} SIGN_PASSPHRASE=$(qw "${GPG_PW_SIGN}")" fi - local GPG_OPTS=${GPG_OPTS:+"--gpg-options $(qw "${GPG_OPTS}")"} + # workaround python argparse issue https://duplicity.us/stable/duplicity.1.html#argparse-problem + local GPG_OPTS=${GPG_OPTS:+"--gpg-options=$(qw "${GPG_OPTS}")"} # set name for dupl archive folder, since 0.6.0 - if duplicity_version_ge 601; then - local DUPL_ARCHDIR='' - if var_isset 'ARCH_DIR'; then - DUPL_ARCHDIR="--archive-dir $(qw "${ARCH_DIR}")" - # reuse erronously duply_ prefixed folders from bug #117 - if [ -d "$ARCH_DIR/duply_${PROFILE}" ]; then - DUPL_ARCHDIR="${DUPL_ARCHDIR} --name $(qw "duply_${PROFILE}")" - else - DUPL_ARCHDIR="${DUPL_ARCHDIR} --name $(qw "${PROFILE}")" - fi + local DUPL_ARCHDIR='' + if var_isset 'ARCH_DIR'; then + DUPL_ARCHDIR="--archive-dir $(qw "${ARCH_DIR}")" + # reuse erronously duply_ prefixed folders from bug #117 + if [ -d "$ARCH_DIR/duply_${PROFILE}" ]; then + DUPL_ARCHDIR="${DUPL_ARCHDIR} --name $(qw "duply_${PROFILE}")" else - DUPL_ARCHDIR="--name $(qw "duply_${PROFILE}")" + DUPL_ARCHDIR="${DUPL_ARCHDIR} --name $(qw "${PROFILE}")" fi + else + DUPL_ARCHDIR="--name $(qw "duply_${PROFILE}")" fi -DUPL_PARAMS_GLOBAL="${DUPL_ARCHDIR} ${DUPL_PARAM_ENC}\ + DUPL_PARAMS_GLOBAL="${DUPL_ARCHDIR} ${DUPL_PARAM_ENC}\ ${DUPL_PARAM_SIGN} ${VERBOSITY:+--verbosity $VERBOSITY}\ ${GPG_OPTS}" -DUPL_VARS_GLOBAL="TMPDIR='$TEMP_DIR'\ + DUPL_VARS_GLOBAL="TMPDIR='$TEMP_DIR'\ ${DUPL_ARG_ENC}" } @@ -1387,6 +1410,7 @@ ;; esac + # TODO: this may be disabled as duplicity ignores irrelevant parameters again since v2.2.4rc1 (2024-05-15) case $cmd in bkp | incr | full ) # nothing to strip, we're backing up' @@ -1403,19 +1427,23 @@ # strip in/exclude parameters from param string function stripXcludes { local STRIPNEXT OUT; + for p in "$@"; do - #echo "calc =$p=" if [ -n "$STRIPNEXT" ]; then unset STRIPNEXT - # strip the value of previous parameter + # strip the value of previous parameter, unless it looks like another '--parameter'' + echo "$p" | awk '!/^\-\-/{exit 0;}{exit 1;}' && + continue + elif echo "$p" | awk '/^\-\-exclude\-(device\-files|other\-filesystems)$/{exit 0;}{exit 1;}'; then + # strips parameterless excludes e.g. --exclude-device-files + continue + elif echo "$p" | awk '/^\-\-(in|ex)clude(\-[a-zA-Z\-]+)?=/{exit 0;}{exit 1;}'; then + # strips e.g. --include=/foo/bar continue elif echo "$p" | awk '/^\-\-(in|ex)clude(\-[a-zA-Z\-]+)?$/{exit 0;}{exit 1;}'; then # strips e.g. --include /foo/bar STRIPNEXT="yes" continue - elif echo "$p" | awk '/^\-\-(in|ex)clude(\-[a-zA-Z\-]+)?=/{exit 0;}{exit 1;}'; then - # strips e.g. --include=/foo/bar - continue fi OUT="$OUT $(qw "$p")" @@ -1430,15 +1458,16 @@ for p in "$@"; do if [ -n "$STRIPNEXT" ]; then unset STRIPNEXT - # strip the value of previous parameter - continue + # strip the value of previous parameter, unless it looks like another '--parameter'' + echo "$p" | awk '!/^\-\-/{exit 0;}{exit 1;}' && + continue elif echo "$p" | awk '/^\-\-(allow-source-mismatch|asynchronous-upload|dry-run)$/{exit 0;}{exit 1;}'; then continue - elif echo "$p" | awk '/^\-\-(volsize)$/{exit 0;}{exit 1;}'; then + elif echo "$p" | awk '/^\-\-(volsize|full\-if\-older\-than)$/{exit 0;}{exit 1;}'; then # strips e.g. --volsize 100 STRIPNEXT="yes" continue - elif echo "$p" | awk '/^\-\-volsize=/{exit 0;}{exit 1;}'; then + elif echo "$p" | awk '/^\-\-(volsize|full\-if\-older\-than)=/{exit 0;}{exit 1;}'; then # strips e.g. --volsize=100 continue fi @@ -1898,6 +1927,44 @@ return $ERR } +# compare arg1 with "gpg --version" output, possible arg1 formats e.g. +# 2.5+ (greater equals), 1.3- (less or equals) or plain 2.2 (equals) +# returns 0 on success, 1 on failure or 255 on error +function gpg_version_compare { + [ -n "$GPGVERSION_ERROR" ] && return 255 + + GPGVERSION=$(gpg --version|awk '/^gpg \(GnuPG\) [0-9\.]+$/{print $NF;exit}') || echo warning + + ! awk '!/^[0-9\.]+$/{exit 1}' <<< "$GPGVERSION" && { + # silently ignore, currently only used for gpg tests anyway + GPGVERSION_ERROR=1 + return 255 + } + GPGVERSION=( ${GPGVERSION//./ } ) + + CMPIN=$( awk '{sub(/[\+\-]*$/,"");print}' <<< "$1" ) + CMPMODE=$( awk '{mode="-eq"}/-$/{mode="-le"}/\+$/{mode="-ge"}{print mode;exit}' <<< "$1") + CMPVERSION=( ${CMPIN//./ } ) + + #echo ${GPGVERSION[@]} "/" ${CMPVERSION[@]} "/" $CMPMODE + + local max=$( [ ${#GPGVERSION[@]} -gt ${#CMPVERSION[@]} ] && echo ${#GPGVERSION[@]} || echo ${#CMPVERSION[@]} ) + + #limit=$( [ $max -gt 0 ] && echo (($max-1)) || echo 0 ) + local i gpg cmp + for ((i=0; i<$max; i++)); do + gpg=${GPGVERSION[$i]} + [ -z "$gpg" ] && gpg=0 + cmp=${CMPVERSION[$i]} + [ -z "$cmp" ] && cmp=0 + #echo $gpg $CMPMODE $cmp + # compare n fail early + ! [ $gpg $CMPMODE $cmp ] && { return 1; } + done + + return 0 +} + function gpg_custom_binary { var_isset GPG && [ "$GPG" != "$DEFAULT_GPG" ] &&\ echo "--gpg-binary $(qw "$GPG")" @@ -2081,7 +2148,7 @@ cmds="$2"; shift 2 # complain if command(s) missing -[ -z $cmds ] && error " No command given. +[ -z "$cmds" ] && error " No command given. Hint: Use '$ME usage' to get usage help." @@ -2346,6 +2413,25 @@ rm "${GPG_TEST_PREFIX}"_* 2>/dev/null && echo "(OK)" || echo "(FAILED)" } +# add pinentry mode for gpg2.1+ and --use-agent not enabled, like duplicity does in gpg.py +GPG_PINENTRY='--pinentry-mode=loopback' +for p in $GPG_OPTS; do + # we respect already set --pinentry-mode though + $( awk '/^--pinentry-mode/{exit 0}{exit 1}' <<< "$p" ) && { + unset GPG_PINENTRY + break + } +done +for p in $GPG_USEAGENT "${dupl_opts[@]}" $DUPL_PARAMS; do + $( awk '/^--use-agent/{exit 0}{exit 1}' <<< "$p" ) && { + unset GPG_PINENTRY + break + } +done +gpg_version_compare "2.1+" && var_isset GPG_PINENTRY && { + GPG_OPTS="$GPG_OPTS $GPG_PINENTRY" +} + # signing enabled? if gpg_signing; then CMD_PARAM_SIGN="--sign --default-key $(qw ${GPG_KEY_SIGN})" @@ -2451,16 +2537,6 @@ warning "\ Swift will probably fail because the conf var SWIFT_AUTHURL was not exported!" ;; - 'rsync') - # everything in url (this backend does not support pass in env var) - # this is obsolete from version 0.6.10 (buggy), hopefully fixed in 0.6.11 - # print warning older version is detected - duplicity_version_lt 610 && - warning "\ -Duplicity version '$DUPL_VERSION' does not support providing the password as -env var for rsync backend. For security reasons you should consider to -update to a version greater than '0.6.10' of duplicity." - ;; esac @@ -2490,25 +2566,24 @@ SOURCE="$SOURCE" BACKEND_URL="$BACKEND_URL" EXCLUDE="$EXCLUDE" -# since 0.7.03 --exclude-globbing-filelist is deprecated -EXCLUDE_PARAM="--exclude$(duplicity_version_lt 703 && echo -globbing)-filelist" +EXCLUDE_PARAM="--exclude-filelist" -# replace magic separators to command equivalents (+=and,-=or,[=groupIn,]=groupOut) +# replace +# - magic separators to command equivalents (+=and,-=or,[=groupIn,]=groupOut) +# - multiple separator chars '_ ' with a single ' ' cmds=$(awk -v cmds="$cmds" "BEGIN{ \ - gsub(/\+/,\"_and_\",cmds);\ - gsub(/\-/,\"_or_\",cmds);\ - gsub(/\[/,\"_groupIn_\",cmds);\ - gsub(/\]/,\"_groupOut_\",cmds);\ + gsub(/\+/,\" and \",cmds);\ + gsub(/\-/,\" or \",cmds);\ + gsub(/\[/,\" groupIn \",cmds);\ + gsub(/\]/,\" groupOut \",cmds);\ + gsub(/[_ ]+/,\" \",cmds);\ print cmds}") -# split commands by '_', preserve spaces even if not allowed :) -IFS='_' read -ra CMDS_IN <<< "$(tolower "$cmds")" - # convert cmds to array, # post process, translate batch commands # ATTENTION: commands are lowercase from here on out declare -a CMDS -for cmd in "${CMDS_IN[@]}"; do +for cmd in $(tolower "$cmds"); do case "$cmd" in # backup -> [pre_bkp_post] 'backup') @@ -2618,14 +2693,10 @@ SKIP_NOW="yes" elif ! var_isset 'PREVIEW' && [ "$cmd" == 'and' ] && [ "$CMD_ERR" -ne "0" ]; then CMD_SKIP=$(get_cmd_skip_count) - # incl. this "cmd" - CMD_SKIP=$(( $CMD_SKIP + 1 )) unset CMD_SKIPPED SKIP_NOW="yes" elif ! var_isset 'PREVIEW' && [ "$cmd" == 'or' ] && [ "$CMD_ERR" -eq "0" ]; then CMD_SKIP=$(get_cmd_skip_count) - # incl. this "cmd" - CMD_SKIP=$(( $CMD_SKIP + 1 )) unset CMD_SKIPPED SKIP_NOW="yes" elif is_condition "$cmd" || is_groupMarker "$cmd"; then
