Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package bup for openSUSE:Factory checked in 
at 2024-08-09 16:14:55
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/bup (Old)
 and      /work/SRC/openSUSE:Factory/.bup.new.7232 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "bup"

Fri Aug  9 16:14:55 2024 rev:7 rq:1192587 version:0.33.3

Changes:
--------
--- /work/SRC/openSUSE:Factory/bup/bup.changes  2023-09-02 22:08:10.676389048 
+0200
+++ /work/SRC/openSUSE:Factory/.bup.new.7232/bup.changes        2024-08-09 
16:15:29.425001252 +0200
@@ -1,0 +2,9 @@
+Thu Aug  8 09:53:55 UTC 2024 - ecsos <ec...@opensuse.org>
+
+- Update to 0.33.3
+  - See https://github.com/bup/bup/blob/main/note/0.33.3-from-0.33.2.md
+- Use BuildRequire perl(Time:HiRes) instead of 
+  BuildRequire perl-Time-HiRes 
+  to fix build error under Tumbleweed.
+
+-------------------------------------------------------------------
@@ -5 +14 @@
-  - See https://github.com/bup/bup/blob/main/note/0.33-from-0.32.md
+  - See https://github.com/bup/bup/blob/main/note/0.33.2-from-0.33.1.md

Old:
----
  bup-0.33.2.tar.gz

New:
----
  bup-0.33.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ bup.spec ++++++
--- /var/tmp/diff_new_pack.7zqhwD/_old  2024-08-09 16:15:30.133030805 +0200
+++ /var/tmp/diff_new_pack.7zqhwD/_new  2024-08-09 16:15:30.133030805 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package bup
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -23,7 +23,7 @@
 %define pythons python311
 %endif
 Name:           bup
-Version:        0.33.2
+Version:        0.33.3
 Release:        0
 Summary:        Backup program based on git
 License:        LGPL-2.0-only
@@ -39,7 +39,7 @@
 BuildRequires:  %{python_module pylibacl}
 BuildRequires:  %{python_module pyxattr}
 BuildRequires:  %{python_module tornado}
-BuildRequires:  perl-Time-HiRes
+BuildRequires:  perl(Time::HiRes)
 %if %{with_test}
 BuildRequires:  %{python_module pylint}
 BuildRequires:  %{python_module pytest-xdist}

++++++ bup-0.33.2.tar.gz -> bup-0.33.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/Documentation/bup-damage.md 
new/bup-0.33.3/Documentation/bup-damage.md
--- old/bup-0.33.2/Documentation/bup-damage.md  2023-07-01 22:08:43.000000000 
+0200
+++ new/bup-0.33.3/Documentation/bup-damage.md  2023-12-28 18:28:02.000000000 
+0100
@@ -24,6 +24,12 @@
 of data recovery tools, to reassure yourself that the tools
 actually work.
 
+Note that the details of the current behavior may change (particularly
+the details not documented here).  For example the moment, the damage
+is strictly probabilistic, and so may or may not actually alter any
+given block.  With a block size of 1, there should be a 1/256 chance
+that the block won't actually change.  This behavior may change.
+
 # OPTIONS
 
 -n, \--num=*numblocks*
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/Documentation/bup.md 
new/bup-0.33.3/Documentation/bup.md
--- old/bup-0.33.2/Documentation/bup.md 2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/Documentation/bup.md 2023-12-28 18:28:02.000000000 +0100
@@ -21,14 +21,13 @@
 once a backup set is created, it can still be accessed
 using git tools.
 
-The individual bup subcommands appear in their own man
-pages.
+Subcommands are described in separate man pages.  For example
+`bup-init`(1) covers `bup init`.
 
 # GLOBAL OPTIONS
 
 \--version
-:   print bup's version number.  Equivalent to
-    `bup-version`(1)
+:   print bup's version number.  Equivalent to `bup version`.
 
 -d, \--bup-dir=*BUP_DIR*
 :   use the given BUP_DIR parameter as the bup repository
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/README.md new/bup-0.33.3/README.md
--- old/bup-0.33.2/README.md    2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/README.md    2023-12-28 18:28:02.000000000 +0100
@@ -86,9 +86,12 @@
 Notable changes introduced by a release
 =======================================
 
+ - <a href="note/0.33.3-from-0.33.2.md">Changes in 0.33.3 as compared to 
0.33.2</a>
  - <a href="note/0.33.2-from-0.33.1.md">Changes in 0.33.2 as compared to 
0.33.1</a>
  - <a href="note/0.33.1-from-0.33.md">Changes in 0.33.1 as compared to 0.33</a>
  - <a href="note/0.33-from-0.32.md">Changes in 0.33 as compared to 0.32</a>
+ - <a href="note/0.32.2-from-0.32.1.md">Changes in 0.32.2 as compared to 
0.32.1</a>
+ - <a href="note/0.32.1-from-0.32.md">Changes in 0.32.1 as compared to 0.32</a>
  - <a href="note/0.32-from-0.31.md">Changes in 0.32 as compared to 0.31</a>
  - <a href="note/0.31-from-0.30.1.md">Changes in 0.31 as compared to 0.30.1</a>
  - <a href="note/0.30.1-from-0.30.md">Changes in 0.30.1 as compared to 0.30</a>
@@ -126,7 +129,7 @@
    bup, please check out the latest stable release like this:
 
     ```sh
-    git checkout 0.33.2
+    git checkout 0.33.3
     ```
 
    You can see the latest stable release here:
@@ -176,7 +179,15 @@
     ```sh
     make
     ```
-       
+
+   At the moment the build treats compiler warnings as errors.  If the
+   build fails as a result, try this:
+
+   ```sh
+   CFLAGS=-Wno-error ./configure
+   make
+   ```
+
  - Run the tests:
 
     ```sh
@@ -197,11 +208,12 @@
     make -j check
     ```
 
-    The tests should pass.  If they don't pass for you, stop here and
-    send an email to bup-l...@googlegroups.com.  Though if there are
-    symbolic links along the current working directory path, the tests
-    may fail.  Running something like this before "make test" should
-    sidestep the problem:
+    The tests should pass (with some skipped tests that weren't
+    applicable in your environment).  If they don't pass for you, stop
+    here and send an email to bup-l...@googlegroups.com.  Though if
+    there are symbolic links along the current working directory path,
+    the tests may fail.  Running something like this before "make
+    test" should sidestep the problem:
 
     ```sh
     cd "$(pwd -P)"
@@ -238,19 +250,12 @@
 
 Binary packages of bup are known to be built for the following OSes:
 
- - Debian:
-    http://packages.debian.org/search?searchon=names&keywords=bup
- - Ubuntu:
-    http://packages.ubuntu.com/search?searchon=names&keywords=bup
- - pkgsrc (NetBSD, Dragonfly, and others)
-    http://pkgsrc.se/sysutils/bup
-    http://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/
- - Arch Linux:
-    https://www.archlinux.org/packages/?sort=&q=bup
- - Fedora:
-    https://apps.fedoraproject.org/packages/bup
- - macOS (Homebrew):
-    https://formulae.brew.sh/formula/bup
+ - [Debian](https://packages.debian.org/bup)
+ - [Ubuntu](https://packages.ubuntu.com/bup)
+ - [pkgsrc.se (NetBSD, Dragonfly, and others)](https://pkgsrc.se/sysutils/bup)
+ - [NetBSD](https://cvsweb.netbsd.org/bsdweb.cgi/pkgsrc/sysutils/bup/)
+ - [Arch Linux](https://www.archlinux.org/packages/?sort=&q=bup)
+ - [macOS (Homebrew)](https://formulae.brew.sh/formula/bup)
 
 
 Using bup
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/dev/update-checkout-info 
new/bup-0.33.3/dev/update-checkout-info
--- old/bup-0.33.2/dev/update-checkout-info     2023-07-01 22:08:43.000000000 
+0200
+++ new/bup-0.33.3/dev/update-checkout-info     2023-12-28 18:28:02.000000000 
+0100
@@ -17,10 +17,8 @@
     exit 1
 fi
 
-git_top=$(git rev-parse --show-toplevel) || true
-if test "$git_top" != "$top"; then
-    # Not a checkout, or perhaps we're building from an archive dir
-    # unpacked somewhere in the source tree.
+if ! test -e .git; then
+    # Not building from a git tree
     rm -f "$dest"
     exit 0
 fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/client.py 
new/bup-0.33.3/lib/bup/client.py
--- old/bup-0.33.2/lib/bup/client.py    2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/client.py    2023-12-28 18:28:02.000000000 +0100
@@ -7,7 +7,7 @@
 import socket
 
 from bup import git, ssh, vfs
-from bup.compat import environ, pending_raise, reraise
+from bup.compat import environ, pending_raise
 from bup.helpers import (Conn, atomically_replaced_file, chunkyreader, debug1,
                          debug2, linereader, lines_until_sentinel,
                          mkdirp, nullcontext_if_not, progress, qprogress, 
DemuxConn)
@@ -100,7 +100,7 @@
                         self.pin = self.p.stdin
                         self.conn = Conn(self.pout, self.pin)
                     except OSError as e:
-                        reraise(ClientError('connect: %s' % e))
+                        raise ClientError('connect: %s' % e) from e
                 elif self.protocol == b'bup':
                     self.sock = socket.socket(socket.AF_INET, 
socket.SOCK_STREAM)
                     self.sock.connect((self.host,
@@ -181,9 +181,7 @@
         try:
             return self.conn.check_ok()
         except Exception as e:
-            reraise(ClientError(e))
-            # reraise doesn't return
-            return None
+            raise ClientError(e) from e
 
     def check_busy(self):
         if self._busy:
@@ -563,12 +561,12 @@
         self.remote_closed = True
         id = self._end()
         self.file = None
-        super(PackWriter_Remote, self).close()
+        super().close()
         return id
 
     def __del__(self):
         assert self.remote_closed
-        super(PackWriter_Remote, self).__del__()
+        super().__del__()
 
     def abort(self):
         raise ClientError("don't know how to abort remote pack writing")
@@ -590,7 +588,7 @@
             (self._bwcount, self._bwtime) = _raw_write_bwlimit(
                     self.file, outbuf, self._bwcount, self._bwtime)
         except IOError as e:
-            reraise(ClientError(e))
+            raise ClientError(e) from e
         self.outbytes += len(data)
         self.count += 1
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/cmd/damage.py 
new/bup-0.33.3/lib/bup/cmd/damage.py
--- old/bup-0.33.2/lib/bup/cmd/damage.py        2023-07-01 22:08:43.000000000 
+0200
+++ new/bup-0.33.3/lib/bup/cmd/damage.py        2023-12-28 18:28:02.000000000 
+0100
@@ -46,13 +46,13 @@
             else:
                 maxsize = 1
             chunks = opt.num or 10
-            chunksize = size // chunks
+            chunksize = (size // chunks) or 1
             for r in range(chunks):
                 sz = random.randrange(1, maxsize+1)
                 if sz > size:
                     sz = size
                 if opt.equal:
-                    ofs = r*chunksize
+                    ofs = (r * chunksize) % size
                 else:
                     ofs = random.randrange(0, size - sz + 1)
                 log('  %6d bytes at %d\n' % (sz, ofs))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/cmd/web.py 
new/bup-0.33.3/lib/bup/cmd/web.py
--- old/bup-0.33.2/lib/bup/cmd/web.py   2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/cmd/web.py   2023-12-28 18:28:02.000000000 +0100
@@ -116,7 +116,7 @@
     def decode_argument(self, value, name=None):
         if name == 'path':
             return value
-        return super(BupRequestHandler, self).decode_argument(value, name)
+        return super().decode_argument(value, name)
 
     def get(self, path):
         return self._process_request(path)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/compat.py 
new/bup-0.33.3/lib/bup/compat.py
--- old/bup-0.33.2/lib/bup/compat.py    2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/compat.py    2023-12-28 18:28:02.000000000 +0100
@@ -10,22 +10,6 @@
     """Return hex string (not bytes as with hexlify) representation of b."""
     return b.hex()
 
-def reraise(ex):
-    raise ex.with_traceback(sys.exc_info()[2])
-
-# These three functions (add_ex_tb, add_ex_ctx, and pending_raise) are
-# vestigial, and code that uses them can probably be rewritten more
-# simply now that we require Python versions that automatically
-# populate the tracebacks and automatically chain pending exceptions.
-
-def add_ex_tb(ex):
-    """Do nothing (already handled by Python 3 infrastructure)."""
-    return ex
-
-def add_ex_ctx(ex, context_ex):
-    """Do nothing (already handled by Python 3 infrastructure)."""
-    return ex
-
 class pending_raise:
     """If rethrow is true, rethrow ex (if any), unless the body throws.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/git.py 
new/bup-0.33.3/lib/bup/git.py
--- old/bup-0.33.2/lib/bup/git.py       2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/git.py       2023-12-28 18:28:02.000000000 +0100
@@ -16,8 +16,7 @@
 from bup.compat import (buffer,
                         byte_int, bytes_from_byte, bytes_from_uint,
                         environ,
-                        pending_raise,
-                        reraise)
+                        pending_raise)
 from bup.io import path_msg
 from bup.helpers import (Sha1, add_error, chunkyreader, debug1, debug2,
                          exo,
@@ -50,6 +49,7 @@
 
 
 def _gitenv(repo_dir=None):
+    # This is not always used, i.e. sometimes we just use --git-dir
     if not repo_dir:
         repo_dir = repo()
     return merge_dict(environ, {b'GIT_DIR': os.path.abspath(repo_dir)})
@@ -69,7 +69,7 @@
 
 def git_config_get(option, repo_dir=None, opttype=None, cfg_file=None):
     assert not (repo_dir and cfg_file), "repo_dir and cfg_file cannot both be 
used"
-    cmd = [b'git', b'config', b'--null']
+    cmd = [b'git', b'--git-dir', repo_dir or repo(), b'config', b'--null']
     if cfg_file:
         cmd.extend([b'--file', cfg_file])
     if opttype == 'int':
@@ -80,10 +80,7 @@
         assert opttype is None
     cmd.extend([b'--get', option])
     env=None
-    if repo_dir:
-        env = _gitenv(repo_dir=repo_dir)
-    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=env,
-                         close_fds=True)
+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, close_fds=True)
     # with --null, git writes out a trailing \0 after the value
     r = p.stdout.read()[:-1]
     rc = p.wait()
@@ -411,7 +408,7 @@
 class PackIdxV1(PackIdx):
     """Object representation of a Git pack index (version 1) file."""
     def __init__(self, filename, f):
-        super(PackIdxV1, self).__init__()
+        super().__init__()
         self.closed = False
         self.name = filename
         self.idxnames = [self.name]
@@ -465,7 +462,7 @@
 class PackIdxV2(PackIdx):
     """Object representation of a Git pack index (version 2) file."""
     def __init__(self, filename, f):
-        super(PackIdxV2, self).__init__()
+        super().__init__()
         self.closed = False
         self.name = filename
         self.idxnames = [self.name]
@@ -832,7 +829,7 @@
         try:
             f.write(oneblob)
         except IOError as e:
-            reraise(GitError(e))
+            raise GitError(e) from e
         nw = len(oneblob)
         crc = zlib.crc32(oneblob) & 0xffffffff
         self._update_idx(sha, crc, nw)
@@ -941,10 +938,10 @@
                 os.rename(tmpdir + b'/pack', nameprefix + b'.pack')
                 os.rename(tmpdir + b'/idx', nameprefix + b'.idx')
                 os.fsync(pfd)
-                if run_midx:
-                    auto_midx(os.path.join(self.repo_dir, b'objects/pack'))
                 if self.on_pack_finish:
                     self.on_pack_finish(nameprefix)
+                if run_midx:
+                    auto_midx(os.path.join(self.repo_dir, b'objects/pack'))
                 return nameprefix
         finally:
             if tmpdir:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/helpers.py 
new/bup-0.33.3/lib/bup/helpers.py
--- old/bup-0.33.2/lib/bup/helpers.py   2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/helpers.py   2023-12-28 18:28:02.000000000 +0100
@@ -986,11 +986,11 @@
     rows = len(l) // ncols
     for s in range(0, len(l), rows):
         cols.append(l[s:s+rows])
-    out = nothing
+    out = []
     fmt = b'%-*s' if binary else '%-*s'
     for row in zip(*cols):
-        out += prefix + nothing.join((fmt % (clen+2, s)) for s in row) + nl
-    return out
+        out.append(prefix + nothing.join((fmt % (clen+2, s)) for s in row) + 
nl)
+    return nothing.join(out)
 
 
 def parse_date_or_fatal(str, fatal):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/io.py new/bup-0.33.3/lib/bup/io.py
--- old/bup-0.33.2/lib/bup/io.py        2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/io.py        2023-12-28 18:28:02.000000000 +0100
@@ -37,17 +37,17 @@
 
     def close(self):
         self._bup_closed = True
-        super(mmap, self).close()
+        super().close()
 
     if hasattr(py_mmap.mmap, '__enter__'):
         def __enter__(self):
-            super(mmap, self).__enter__()
+            super().__enter__()
             return self
         def __exit__(self, type, value, traceback):
             # Don't call self.close() when the parent has its own __exit__;
             # defer to it.
             self._bup_closed = True
-            result = super(mmap, self).__exit__(type, value, traceback)
+            result = super().__exit__(type, value, traceback)
             return result
     else:
         def __enter__(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/main.py 
new/bup-0.33.3/lib/bup/main.py
--- old/bup-0.33.2/lib/bup/main.py      2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/main.py      2023-12-28 18:28:02.000000000 +0100
@@ -18,13 +18,10 @@
 
 from bup import compat, path, helpers
 from bup.compat import (
-    add_ex_ctx,
-    add_ex_tb,
     environ,
     fsdecode,
     wrap_main
 )
-from bup.compat import add_ex_tb, add_ex_ctx, wrap_main
 from bup.helpers import (
     columnate,
     handle_ctrl_c,
@@ -129,6 +126,7 @@
 do_profile = False
 bup_dir = None
 args = args[1:]
+subcmd = None
 while args:
     arg = args[0]
     if arg in (b'-?', b'--help'):
@@ -155,7 +153,7 @@
     else:
         break
 
-subcmd = args
+subcmd = subcmd or args
 
 # Make BUP_DIR absolute, so we aren't affected by chdir (i.e. save -C, etc.).
 if bup_dir:
@@ -189,7 +187,7 @@
         usage('error: unknown command "%s"' % path_msg(subcmd_name))
 
 already_fixed = int(environ.get(b'BUP_FORCE_TTY', 0))
-if subcmd_name in [b'mux', b'ftp', b'help']:
+if subcmd_name in (b'mux', b'ftp', b'help', b'fuse'):
     fix_stdout = False
     fix_stderr = False
 else:
@@ -238,7 +236,6 @@
     srcs = tuple(srcs)
     dest_for = dict(zip(srcs, dests))
     pending = {}
-    pending_ex = None
     try:
         while srcs:
             ready_fds, _, _ = select.select(srcs, [], [])
@@ -262,21 +259,19 @@
                     if split[0]:
                         pending.setdefault(fd, []).extend(split)
     except BaseException as ex:
-        pending_ex = add_ex_ctx(add_ex_tb(ex), pending_ex)
-    try:
+        pending_ex = ex
         # Try to finish each of the streams
-        for fd, pending_items in pending.items():
-            dest = dest_for[fd]
-            width = tty_width()
-            try:
-                print_clean_line(dest, pending_items, width)
-            except (EnvironmentError, EOFError) as ex:
-                pending_ex = add_ex_ctx(add_ex_tb(ex), pending_ex)
-    except BaseException as ex:
-        pending_ex = add_ex_ctx(add_ex_tb(ex), pending_ex)
-    if pending_ex:
-        raise pending_ex
-
+        try:
+            for fd, pending_items in pending.items():
+                dest = dest_for[fd]
+                width = tty_width()
+                try:
+                    print_clean_line(dest, pending_items, width)
+                except (EnvironmentError, EOFError) as ex:
+                    ex.__cause__ = pending_ex
+                    pending_ex = ex
+        finally:
+            raise pending_ex
 
 def import_and_run_main(module, args):
     if do_profile:
@@ -299,7 +294,6 @@
     dests = []
     real_out_fd = real_err_fd = stdout_pipe = stderr_pipe = None
     filter_thread = filter_thread_started = None
-    pending_ex = None
     try:
         if fix_stdout:
             sys.stdout.flush()
@@ -321,42 +315,29 @@
         filter_thread.start()
         filter_thread_started = True
         import_and_run_main(module, args)
-    except Exception as ex:
-        add_ex_tb(ex)
-        pending_ex = ex
-        raise
     finally:
         # Try to make sure that whatever else happens, we restore
         # stdout and stderr here, if that's possible, so that we don't
-        # risk just losing some output.
-        try:
-            real_out_fd is not None and os.dup2(real_out_fd, 
sys.stdout.fileno())
-        except Exception as ex:
-            add_ex_tb(ex)
-            add_ex_ctx(ex, pending_ex)
-        try:
-            real_err_fd is not None and os.dup2(real_err_fd, 
sys.stderr.fileno())
-        except Exception as ex:
-            add_ex_tb(ex)
-            add_ex_ctx(ex, pending_ex)
-        # Kick filter loose
-        try:
-            stdout_pipe is not None and os.close(stdout_pipe[1])
-        except Exception as ex:
-            add_ex_tb(ex)
-            add_ex_ctx(ex, pending_ex)
-        try:
-            stderr_pipe is not None and os.close(stderr_pipe[1])
-        except Exception as ex:
-            add_ex_tb(ex)
-            add_ex_ctx(ex, pending_ex)
+        # risk just losing some output.  Nest the finally blocks so we
+        # try each one no matter what happens, and accumulate alll
+        # exceptions in the pending exception __context__.
         try:
+            try:
+                try:
+                    try:
+                        real_out_fd is not None and \
+                            os.dup2(real_out_fd, sys.stdout.fileno())
+                    finally:
+                        real_err_fd is not None and \
+                            os.dup2(real_err_fd, sys.stderr.fileno())
+                finally:
+                    # Kick filter loose
+                    stdout_pipe is not None and os.close(stdout_pipe[1])
+            finally:
+                stderr_pipe is not None and os.close(stderr_pipe[1])
+        finally:
             close_catpipes()
-        except Exception as ex:
-            add_ex_tb(ex)
-            add_ex_ctx(ex, pending_ex)
-    if pending_ex:
-        raise pending_ex
+
     # There's no point in trying to join unless we finished the finally block.
     if filter_thread_started:
         filter_thread.join()
@@ -394,14 +375,10 @@
         filter_output(srcs, dests)
         return p.wait()
     except BaseException as ex:
-        add_ex_tb(ex)
-        try:
-            if p and p.poll() == None:
-                os.kill(p.pid, signal.SIGTERM)
-                p.wait()
-        except BaseException as kill_ex:
-            raise add_ex_ctx(add_ex_tb(kill_ex), ex)
-        raise ex
+        if p and p.poll() == None:
+            os.kill(p.pid, signal.SIGTERM)
+            p.wait()
+        raise
 
 
 def run_subcmd(module, args):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/metadata.py 
new/bup-0.33.3/lib/bup/metadata.py
--- old/bup-0.33.2/lib/bup/metadata.py  2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/metadata.py  2023-12-28 18:28:02.000000000 +0100
@@ -741,6 +741,7 @@
                      'path', 'size', 'symlink_target', 'hardlink_target',
                      'linux_attr', 'linux_xattr', 'posix1e_acl')
         self.mode = self.uid = self.gid = self.user = self.group = None
+        self.rdev = None
         self.atime = self.mtime = self.ctime = None
         # optional members
         self.path = None
@@ -757,6 +758,7 @@
         if self.mtime != other.mtime: return False
         if self.ctime != other.ctime: return False
         if self.atime != other.atime: return False
+        if self.rdev != other.rdev: return False
         if self.path != other.path: return False
         if self.uid != other.uid: return False
         if self.gid != other.gid: return False
@@ -777,6 +779,7 @@
                      self.mtime,
                      self.ctime,
                      self.atime,
+                     self.rdev,
                      self.path,
                      self.uid,
                      self.gid,
@@ -802,6 +805,8 @@
             result += ' user:' + repr(self.user)
         if self.group is not None:
             result += ' group:' + repr(self.group)
+        if self.rdev is not None:
+            result += ' rdev:' + repr(self.group)
         if self.size is not None:
             result += ' size:' + repr(self.size)
         for name, val in (('atime', self.atime),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/source_info.py 
new/bup-0.33.3/lib/bup/source_info.py
--- old/bup-0.33.2/lib/bup/source_info.py       2023-07-01 22:08:43.000000000 
+0200
+++ new/bup-0.33.3/lib/bup/source_info.py       2023-12-28 18:28:02.000000000 
+0100
@@ -1,3 +1,3 @@
-commit='b1c19fb0142ac4bdc60b07640734e0c2d256f423'
-date='2023-07-01 15:08:43 -0500'
+commit='85fdce08bdb752eb81f5954e1dffae185b5a43c6'
+date='2023-12-28 11:28:02 -0600'
 modified=False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/version.py 
new/bup-0.33.3/lib/bup/version.py
--- old/bup-0.33.2/lib/bup/version.py   2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/version.py   2023-12-28 18:28:02.000000000 +0100
@@ -22,7 +22,7 @@
 
 # The ~ in a version is a Debian-style "always less than" marker:
 # https://www.debian.org/doc/debian-policy/ch-controlfields.html#version
-base_version = b'0.33.2'
+base_version = b'0.33.3'
 
 version = base_version
 if version.endswith(b'~'):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/bup/vfs.py 
new/bup-0.33.3/lib/bup/vfs.py
--- old/bup-0.33.2/lib/bup/vfs.py       2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/bup/vfs.py       2023-12-28 18:28:02.000000000 +0100
@@ -677,7 +677,7 @@
 
     # Assumes the tree is properly formed, i.e. there are no
     # duplicates, and entries will be in git tree order.
-    if isinstance(names, (frozenset, set)):
+    if not isinstance(names, (frozenset, set)):
         names = frozenset(names)
     remaining = len(names)
 
@@ -855,7 +855,7 @@
         return
 
     # Assumes no duplicate refs
-    if isinstance(names, (frozenset, set)):
+    if not isinstance(names, (frozenset, set)):
         names = frozenset(names)
     remaining = len(names)
     last_name = max(names)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/lib/cmd/bup.c new/bup-0.33.3/lib/cmd/bup.c
--- old/bup-0.33.2/lib/cmd/bup.c        2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/lib/cmd/bup.c        2023-12-28 18:28:02.000000000 +0100
@@ -201,8 +201,6 @@
 # define PROC_SELF_EXE "/proc/self/exe"
 #elif defined(__sun) || defined (sun)
 # define PROC_SELF_EXE "/proc/self/path/a.out"
-#else
-# define PROC_SELF_EXE NULL
 #endif
 
 static char *find_in_path(const char * const name, const char * const path)
@@ -286,40 +284,40 @@
 
 static char *exe_parent_dir(const char * const argv_0)
 {
-    if (PROC_SELF_EXE != NULL) {
-        char sbuf[2048];
-        char *path = sbuf;
-        size_t path_n = sizeof(sbuf);
-        ssize_t len;
-        while (1) {
-            len = readlink(PROC_SELF_EXE, path, path_n);
-            if (len == -1 || (size_t) len != path_n)
-                break;
-            if (!INT_MULTIPLY_OK(path_n, 2, &path_n))
-                die(2, "memory buffer for executable path would be too big\n");
-            if (path != sbuf) free(path);
-            path = malloc(path_n);
-            if (!path)
-                die(2, "unable to allocate memory for executable path\n");
-        }
-        if (len != -1) {
-            path[len] = '\0';
-            char *result = strdup(dirname(path));
-            if (path != sbuf)
-                free(path);
-            return result;
-        }
-        switch (errno) {
-        case ENOENT: case EACCES: case EINVAL: case ELOOP: case ENOTDIR:
-        case ENAMETOOLONG:
-            break;
-        default:
-            die(2, "cannot resolve %s: %s\n", path, strerror(errno));
+#ifdef PROC_SELF_EXE
+    char sbuf[2048];
+    char *path = sbuf;
+    size_t path_n = sizeof(sbuf);
+    ssize_t len;
+    while (1) {
+        len = readlink(PROC_SELF_EXE, path, path_n);
+        if (len == -1 || (size_t) len != path_n)
             break;
-        }
+        if (!INT_MULTIPLY_OK(path_n, 2, &path_n))
+            die(2, "memory buffer for executable path would be too big\n");
+        if (path != sbuf) free(path);
+        path = malloc(path_n);
+        if (!path)
+            die(2, "unable to allocate memory for executable path\n");
+    }
+    if (len != -1) {
+        path[len] = '\0';
+        char *result = strdup(dirname(path));
         if (path != sbuf)
             free(path);
+        return result;
     }
+    switch (errno) {
+    case ENOENT: case EACCES: case EINVAL: case ELOOP: case ENOTDIR:
+    case ENAMETOOLONG:
+        break;
+    default:
+        die(2, "cannot resolve %s: %s\n", path, strerror(errno));
+        break;
+    }
+    if (path != sbuf)
+        free(path);
+#endif
     return find_exe_parent(argv_0);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/note/0.32.1-from-0.32.md 
new/bup-0.33.3/note/0.32.1-from-0.32.md
--- old/bup-0.33.2/note/0.32.1-from-0.32.md     1970-01-01 01:00:00.000000000 
+0100
+++ new/bup-0.33.3/note/0.32.1-from-0.32.md     2023-12-28 18:28:02.000000000 
+0100
@@ -0,0 +1,38 @@
+
+Notable changes in 0.32.1 since 0.32
+====================================
+
+Bugs
+----
+
+* POSIX1e ACLs should be restored more correctly now.
+
+  Previously bup incorrectly restored default (`ACL_TYPE_DEFAULT`)
+  ACLs as access acls (`ACL_TYPE_ACCESS`).  When both existed, it
+  restored the access ACL first and then the default ACL as an access
+  ACL.  Now, bup should restore each with the proper type.  This issue
+  only affects saves created on platforms where bup currently supports
+  ACLs, so presumably mostly just saves created on Linux since the
+  current ACL support depends on non-standard functions like
+  `acl_extended(3)`.
+
+  There is one remaining issue, which isn't fixed in this release, but
+  is fixed in 0.33.1 (because fixing it here could create saves that
+  are backward incompatible with 0.33).
+
+  The problem is that in this version and older versions, bup stores
+  ACLs in the `acl_to_any_text(3)` format with a newline delimiter,
+  when the standard (and `acl_from_text(3)` which restore depends on)
+  requires commas.  This may cause restores that include ACLs (likely
+  only those from Linux right now) to fail on some platforms
+  (e.g. Cygwin).
+
+Build and install
+-----------------
+
+* pytest 7 is now supported.
+
+Thanks to (at least)
+====================
+
+Johannes Berg and Rob Browning
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/note/0.32.2-from-0.32.1.md 
new/bup-0.33.3/note/0.32.2-from-0.32.1.md
--- old/bup-0.33.2/note/0.32.2-from-0.32.1.md   1970-01-01 01:00:00.000000000 
+0100
+++ new/bup-0.33.3/note/0.32.2-from-0.32.1.md   2023-12-28 18:28:02.000000000 
+0100
@@ -0,0 +1,26 @@
+
+Notable changes in 0.32.2 since 0.32.1
+======================================
+
+Bugs
+----
+
+* `bup gc` should no longer remove stale packfiles before it creates
+  the new midx at the end of a run.  This could cause midx to complain
+  about missing files, e.g.:
+
+        warning: index pack-....idx missing
+
+Build system
+------------
+
+* The automated FreeBSD tests have moved from 12.1 to 12.4 and to
+  Python 3.9, and have dropped testing of Python 2.
+
+* The automated macOS tests have moved from Catalina to Monterey and
+  from x86 to ARM.
+
+Thanks to (at least)
+====================
+
+Johannes Berg and Rob Browning
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/note/0.33.3-from-0.33.2.md 
new/bup-0.33.3/note/0.33.3-from-0.33.2.md
--- old/bup-0.33.2/note/0.33.3-from-0.33.2.md   1970-01-01 01:00:00.000000000 
+0100
+++ new/bup-0.33.3/note/0.33.3-from-0.33.2.md   2023-12-28 18:28:02.000000000 
+0100
@@ -0,0 +1,57 @@
+
+Notable changes in 0.33.3 since 0.33.2
+======================================
+
+General
+-------
+
+* The performance of `bup ls` when columnating a large number of
+  results should be *much* better.
+
+Bugs
+----
+
+* `bup fuse` should no longer linger after its mount point has been
+  unmounted: https://bugs.debian.org/cgi-bin/1050040
+
+* `bup --version` should work again.
+
+* `bup gc` should no longer remove stale packfiles before it creates
+  the new midx at the end of a run.  This could cause midx to complain
+  about missing files, e.g.:
+
+        warning: index pack-....idx missing
+
+* `bup` will no longer (since 0.33) ignore `BUP_DIR` looking for a
+  `pack.packSizeLimit`.
+
+* A VFS optimization of the handling of requests for specific names
+  within a given tree has been restored.
+
+* Incorrect uses of some exception handling code designed for
+  compatibility with Python 2 have been replaced with the built-in
+  Python 3 equivalents.
+
+* Some client calls to `super(CLASS, self)` have been replaced by
+  `super()` to avoid errors during `__del__`.
+
+Build system
+------------
+
+* `test-help` should no longer hang when run interactively, and should
+  no longer be affected by the current locale.  Previously it might
+  fail in a non-C locale.
+
+* The `bup damage` invocation in `test-fsck` has been made much more
+  aggressive in order to avoid transient failures caused both by
+  unpredictable `par2` behavior and the (currently) probabilstic
+  nature of the damage.
+
+* OpenBSD builds should no longer fail on `-Werror` related issues
+  involving `PROC_SELF_EXE`.
+
+Thanks to (at least)
+====================
+
+Alain Cochard, Austin Schuh, Johannes Berg, Julian Smith, Lucas
+Nussbaum, Nix, Rob Browning, Rob Leslie, and Robert Edmonds
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/test/ext/conftest.py 
new/bup-0.33.3/test/ext/conftest.py
--- old/bup-0.33.2/test/ext/conftest.py 2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/test/ext/conftest.py 2023-12-28 18:28:02.000000000 +0100
@@ -14,7 +14,7 @@
 
 class BupSubprocFailure(Exception):
     def __init__(self, msg, cmd, status, failures):
-        super(BupSubprocFailure, self).__init__(msg)
+        super().__init__(msg)
         self.cmd = cmd
         self.status = status
         self.failures = failures
@@ -22,7 +22,7 @@
 class BupSubprocTestRunner(pytest.Item):
 
     def __init__(self, name, parent):
-        super(BupSubprocTestRunner, self).__init__(name, parent)
+        super().__init__(name, parent)
 
     def runtest(self):
         cmd = str(self.fspath)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/test/ext/test-fsck 
new/bup-0.33.3/test/ext/test-fsck
--- old/bup-0.33.2/test/ext/test-fsck   2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/test/ext/test-fsck   2023-12-28 18:28:02.000000000 +0100
@@ -45,7 +45,20 @@
 WVFAIL bup fsck --quick -rvv -j99   # fails because repairs were needed
 if bup fsck --par2-ok; then
     WVPASS bup fsck -r # ok because of repairs from last time
-    WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n202 -s1 --equal -S0
+
+    # This must do "too much" damage.  Currently par2 is invoked with
+    # -c200, which should allow up to 200 damaged "blocks", but since
+    # we don't specify the block size, it's dynamically computed.
+    # Even if we did specify a size, the actual size appears to be
+    # affected by the input file sizes, and the specific behavior
+    # doesn't appear to be documented/promised -- see par2
+    # comandline.cpp.  Also worth noting that bup damage's output is
+    # currently probabilistic, so it might not actually damage any
+    # given byte.  For now, just try to overdo it -- randomly change
+    # (or not 1/256th of the time) 600 evenly spaced bytes in each
+    # pack file.
+    WVPASS bup damage "$BUP_DIR"/objects/pack/*.pack -n600 -s1 --equal -S0
+
     WVFAIL bup fsck
     WVFAIL bup fsck -rvv   # too many errors to be repairable
     WVFAIL bup fsck -r   # too many errors to be repairable
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/test/ext/test-help 
new/bup-0.33.3/test/ext/test-help
--- old/bup-0.33.2/test/ext/test-help   2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/test/ext/test-help   2023-12-28 18:28:02.000000000 +0100
@@ -30,9 +30,9 @@
 (cd "$tmpdir/man" && ln -s "$top/Documentation" man1)
 export MANPATH="$tmpdir/man"
 
-WVPASS bup help save
-WVPASS bup save --help
-WVPASSEQ 1 $(bup help save | head -1 | grep -cF 'bup-save(1)')
-WVPASSEQ 1 $(bup save --help | head -1 | grep -cF 'bup-save(1)')
+PAGER=cat WVPASS bup help save
+PAGER=cat WVPASS bup save --help
+WVPASSEQ 1 $(bup help save | grep -cE 'bup.save . create a new bup backup set')
+WVPASSEQ 1 $(bup save --help | grep -cE 'bup.save . create a new bup backup 
set')
 
 WVPASS rm -rf "$tmpdir"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bup-0.33.2/test/int/test_git.py 
new/bup-0.33.3/test/int/test_git.py
--- old/bup-0.33.2/test/int/test_git.py 2023-07-01 22:08:43.000000000 +0200
+++ new/bup-0.33.3/test/int/test_git.py 2023-12-28 18:28:02.000000000 +0100
@@ -541,7 +541,7 @@
             # check that we don't have it open anymore
             WVPASSEQ(False, b'deleted' in fn)
 
-def test_config():
+def test_config(tmpdir):
     cfg_file = os.path.join(os.path.dirname(__file__), 'sample.conf')
     no_such_file = os.path.join(os.path.dirname(__file__), 'nosuch.conf')
     git_config_get = partial(git.git_config_get, cfg_file=cfg_file)
@@ -568,3 +568,10 @@
     WVPASSEQ(2, git_config_get(b'bup.istrue2', opttype='int'))
     WVPASSEQ(0, git_config_get(b'bup.isfalse2', opttype='int'))
     WVPASSEQ(0x777, git_config_get(b'bup.hex', opttype='int'))
+
+    # Make sure get_config respects the repo()
+    git_dir = tmpdir + b'/repo'
+    git.init_repo(git_dir)
+    git.check_repo_or_die(git_dir)
+    exc(b'git', b'--git-dir', git_dir, b'config', b'bup.foo', b'yep')
+    assert b'yep' == git.git_config_get(b'bup.foo')

Reply via email to