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

Reply via email to