Sign me up Login

Details about package apt-mirror2

Name: apt-mirror2 (PTS)
Uploader: Yuri Konotopov <ykonotopov@gnome.org> (Debian QA page)
Description: python3-apt-mirror2 - Python3 bindings for the apt-mirror2
apt-mirror2 - Python/asyncio reimplementation of the apt-mirror

Package uploads

Upload #3

Information

Version: 14-1
Uploaded: 2025-07-13 11:57
Source package: apt-mirror2_14-1.dsc
Distribution: unstable
Section: net
Priority: optional
Homepage: https://gitlab.com/apt-mirror2/apt-mirror2
Vcs-Browser: https://gitlab.com/apt-mirror2/debian-packaging
Vcs-Git: https://gitlab.com/apt-mirror2/debian-packaging.git [apt-mirror2]
Closes bugs: #1107259

Changelog

 apt-mirror2 (14-1) unstable; urgency=medium
 .
   [ Yuri Konotopov ]
   * Added python3-pytest to Build-Depends to match upstream
   * New upstream version 14:
       - removed applied upstream
         d/p/0001-tests-fix-tests-on-non-amd64-hosts.patch
       - added gpgpv build dependency to pass tests
       - New option `append_logs` is now available.
         Closes: #1107259
 .
   [ Evgeniy Rogov ]
   * Fix sed substitution in debian/rules

QA information

Comments

No comments

Upload #2

Information

Version: 14-1
Uploaded: 2025-07-13 07:57
Source package: apt-mirror2_14-1.dsc
Distribution: unstable
Section: net
Priority: optional
Homepage: https://gitlab.com/apt-mirror2/apt-mirror2
Vcs-Browser: https://gitlab.com/apt-mirror2/debian-packaging
Vcs-Git: https://gitlab.com/apt-mirror2/debian-packaging.git [apt-mirror2]

Changelog

 apt-mirror2 (14-1) unstable; urgency=medium
 .
   [ Yuri Konotopov ]
   * Added python3-pytest to Build-Depends to match upstream
   * New upstream version 14:
       - removed applied upstream
         d/p/0001-tests-fix-tests-on-non-amd64-hosts.patch
       - added gpgpv build dependency to pass tests
 .
   [ Evgeniy Rogov ]
   * Fix sed substitution in debian/rules

QA information

Comments

  1. Sunday mornin gso we will go with my usual Yorkshire friendly greetings. :-)
    
    Ay up Yuri,
    
    Looks really good. Two things.
    
    * Lintian:
    
    P: apt-mirror2: odd-mark-in-description comma not followed by whitespace (line 14)
    N: 
    N:   A punction mark was placed oddly in the description.
    N:   
    N:   This tag is currently only issued for a comma that is not followed by a
    N:   whitespace character or a number (eg. for "300,000").
    N: 
    N:   Please refer to Bug#591665 and Bug#591664 for details.
    N: 
    N:   Visibility: pedantic
    N:   Show-Always: no
    N:   Check: fields/description
    
    It is the lack of a space after the comma and the second argument in the description bit below.
    
      - Standard source.list [ arch=arch1,arch2 ] can be used to specify multiple
     repository architectures for mirroring
    
    Just need a space before 'arch2' to fix.
    
    * Copyright:
    
    philwyett@ks-tarkin:~/Builder/apt-mirror2-14$ lrc
    en: Versions: licenserecon '6.0'  licensecheck '3.3.9-1'
    
    Parsing Source Tree  ....
    Reading d/copyright  ....
    Running licensecheck ....
    
    d/copyright      | licensecheck
    
    MIT and Apache-2.0| Expat             apt_mirror/uvloop.py
    
    Should be 'and' not 'or'.
    
    It still flags when scanned, certainly one I would report against 'licenserecon' to see if it is an issue.
    
    If you correct these and do not have a sponsor, you can as you know, file an RFS. :-)
    
    Regards
    
    Phil
    Needs work Phil Wyett at July 13, 2025, 8:27 a.m.
  2. Phil, thanks for review!
    
    > It is the lack of a space after the comma and the second argument in the description bit
    
    The lack of a space is intentional, as it's part of the configuration syntax.
    
    > Should be 'and' not 'or'.
    
    According to [1]: "In case of multi-licensing, the license short names are separated by or when the user can chose between different licenses, and by and when use of the work must simultaneously comply with the terms of multiple licenses".
    
    Because uvloop is dual-licensed under MIT and Apache 2.0 we should use `or` here.
    
    [1] https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Yuri Konotopov at July 13, 2025, 11:17 a.m.
  3. Yuri,
    
    OK, I would ignore that lintian error for now as it is not major. Not seen that warning before, so I do not have a quck fix for it. :-)
    
    With regard that files dual licensing, we should go with what is in the file and the project it was derived from.
    
    In the file:
    
    # uvloop is dual-licensed under MIT and Apache 2.0 licenses.
    
    Upstream at: https://github.com/MagicStack/uvloop/blob/master/README.rst
    
    These both say 'and' so I would go with it unless upstream says otherwise. You may wish to email them for clarification, ask in #debian-mentors or email the legal list. I am very pragmatic on these things and would always go with what is in the files first.
    
    Regards
    
    Phil
    Phil Wyett at July 13, 2025, 11:31 a.m.
  4. Got it, thanks! I will consult xiao sheng wen, who is sponsoring this package (the `or` statement was added on his advice).
    
    I will also upload a new version now, with the added Debian bug ID.
    Yuri Konotopov at July 13, 2025, 11:52 a.m.

Upload #1

Information

Version: 14-1
Uploaded: 2025-07-12 16:57
Source package: apt-mirror2_14-1.dsc
Distribution: unstable
Section: net
Priority: optional
Homepage: https://gitlab.com/apt-mirror2/apt-mirror2
Vcs-Browser: https://gitlab.com/apt-mirror2/debian-packaging
Vcs-Git: https://gitlab.com/apt-mirror2/debian-packaging.git [apt-mirror2]

Changelog

 apt-mirror2 (14-1) unstable; urgency=medium
 .
   [ Yuri Konotopov ]
   * Added python3-pytest to Build-Depends to match upstream
   * New upstream version 14:
       - removed applied upstream
         d/p/0001-tests-fix-tests-on-non-amd64-hosts.patch
 .
   [ Evgeniy Rogov ]
   * Fix sed substitution in debian/rules

QA information

Comments

  1. Yuri,
    
    Builds for unstable are pushing error as below.
    
    ============================= test session starts ==============================
    platform linux -- Python 3.13.5, pytest-8.3.5, pluggy-1.5.0
    rootdir: /build/reproducible-path/apt-mirror2-14/.pybuild/cpython3_3.13/build
    configfile: pyproject.toml
    plugins: anyio-4.8.0, typeguard-4.4.2
    collected 56 items
    
    tests/test_clean.py .                                                    [  1%]
    tests/test_config.py ...................                                 [ 35%]
    tests/test_dependencies.py ..                                            [ 39%]
    tests/test_download.py ..                                                [ 42%]
    tests/test_main.py ...                                                   [ 48%]
    tests/test_repository.py ......................FF.....                   [100%]
    
    =================================== FAILURES ===================================
    ___________________ TestRepository.test_signature_inrelease ____________________
    
    self = <tests.test_repository.TestRepository testMethod=test_signature_inrelease>
    
        def test_signature_inrelease(self):
            repository = self.get_repository(
                codename="bookworm",
                components=["main"],
                arches=["amd64"],
                mirror_source=True,
            )
        
            test_data_folder = self.TEST_DATA / "DebianBookworm"
        
            repository.gpg_verify = GPGVerify.OFF
        
            repository.validate_release_files(
                test_data_folder,
                encode_tilde=False,
                etc_trusted=Path("/tmp/a/b/c/unknown"),
                etc_trusted_parts=Path("/tmp/a/b/c/unknown"),
            )
        
            repository.gpg_verify = GPGVerify.ON
        
            with self.assertRaisesRegex(
                InvalidSignatureError,
                "Unable to verify release file signature:.+/InRelease",
            ):
    >           repository.validate_release_files(
                    test_data_folder,
                    encode_tilde=False,
                    etc_trusted=Path("/tmp/a/b/c/unknown"),
                    etc_trusted_parts=Path("/tmp/a/b/c/unknown"),
                )
    
    tests/test_repository.py:737: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    apt_mirror/repository.py:820: in validate_release_files
        self._validate_release_file_signature(release_file, keyring)
    apt_mirror/repository.py:769: in _validate_release_file_signature
        gpg_info = GpgInfoExtended.from_file(
    apt_mirror/repository.py:408: in from_file
        return super().from_file(target, *args, keyrings=keyrings, **kwargs)
    /usr/lib/python3/dist-packages/debian/deb822.py:1394: in from_file
        return cls.from_sequence(target_file, *args, **kwargs)
    /usr/lib/python3/dist-packages/debian/deb822.py:1352: in from_sequence
        with subprocess.Popen(
    /usr/lib/python3.13/subprocess.py:1039: in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
    /usr/lib/python3.13/subprocess.py:1857: in _execute_child
        self._posix_spawn(args, executable, env, restore_signals, close_fds,
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    
        def _posix_spawn(self, args, executable, env, restore_signals, close_fds,
                         p2cread, p2cwrite,
                         c2pread, c2pwrite,
                         errread, errwrite):
            """Execute program using os.posix_spawn()."""
            kwargs = {}
            if restore_signals:
                # See _Py_RestoreSignals() in Python/pylifecycle.c
                sigset = []
                for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
                    signum = getattr(signal, signame, None)
                    if signum is not None:
                        sigset.append(signum)
                kwargs['setsigdef'] = sigset
        
            file_actions = []
            for fd in (p2cwrite, c2pread, errread):
                if fd != -1:
                    file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
            for fd, fd2 in (
                (p2cread, 0),
                (c2pwrite, 1),
                (errwrite, 2),
            ):
                if fd != -1:
                    file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
        
            if close_fds:
                file_actions.append((os.POSIX_SPAWN_CLOSEFROM, 3))
        
            if file_actions:
                kwargs['file_actions'] = file_actions
        
    >       self.pid = os.posix_spawn(executable, args, env, **kwargs)
    E       FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/gpgv'
    
    /usr/lib/python3.13/subprocess.py:1801: FileNotFoundError
    ____________________ TestRepository.test_signature_release _____________________
    
    self = <tests.test_repository.TestRepository testMethod=test_signature_release>
    
        def test_signature_release(self):
            repository = self.get_repository(
                codename="bookworm",
                components=["main"],
                arches=["amd64"],
                mirror_source=True,
                mirror_path=Path("repo1"),
            )
        
            test_data_folder = self.TEST_DATA / "DebianBookworm"
        
            repository.gpg_verify = GPGVerify.OFF
        
            repository.validate_release_files(
                test_data_folder,
                encode_tilde=False,
                etc_trusted=Path("/tmp/a/b/c/unknown"),
                etc_trusted_parts=Path("/tmp/a/b/c/unknown"),
            )
        
            repository.gpg_verify = GPGVerify.ON
        
            with self.assertRaisesRegex(
                InvalidSignatureError,
                "Unable to verify release file signature:.+/Release",
            ):
    >           repository.validate_release_files(
                    test_data_folder,
                    encode_tilde=False,
                    etc_trusted=Path("/tmp/a/b/c/unknown"),
                    etc_trusted_parts=Path("/tmp/a/b/c/unknown"),
                )
    
    tests/test_repository.py:657: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    apt_mirror/repository.py:820: in validate_release_files
        self._validate_release_file_signature(release_file, keyring)
    apt_mirror/repository.py:769: in _validate_release_file_signature
        gpg_info = GpgInfoExtended.from_file(
    apt_mirror/repository.py:423: in from_file
        with subprocess.Popen(
    /usr/lib/python3.13/subprocess.py:1039: in __init__
        self._execute_child(args, executable, preexec_fn, close_fds,
    /usr/lib/python3.13/subprocess.py:1857: in _execute_child
        self._posix_spawn(args, executable, env, restore_signals, close_fds,
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    
        def _posix_spawn(self, args, executable, env, restore_signals, close_fds,
                         p2cread, p2cwrite,
                         c2pread, c2pwrite,
                         errread, errwrite):
            """Execute program using os.posix_spawn()."""
            kwargs = {}
            if restore_signals:
                # See _Py_RestoreSignals() in Python/pylifecycle.c
                sigset = []
                for signame in ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ'):
                    signum = getattr(signal, signame, None)
                    if signum is not None:
                        sigset.append(signum)
                kwargs['setsigdef'] = sigset
        
            file_actions = []
            for fd in (p2cwrite, c2pread, errread):
                if fd != -1:
                    file_actions.append((os.POSIX_SPAWN_CLOSE, fd))
            for fd, fd2 in (
                (p2cread, 0),
                (c2pwrite, 1),
                (errwrite, 2),
            ):
                if fd != -1:
                    file_actions.append((os.POSIX_SPAWN_DUP2, fd, fd2))
        
            if close_fds:
                file_actions.append((os.POSIX_SPAWN_CLOSEFROM, 3))
        
            if file_actions:
                kwargs['file_actions'] = file_actions
        
    >       self.pid = os.posix_spawn(executable, args, env, **kwargs)
    E       FileNotFoundError: [Errno 2] No such file or directory: '/usr/bin/gpgv'
    
    /usr/lib/python3.13/subprocess.py:1801: FileNotFoundError
    =============================== warnings summary ===============================
    ../../../../../../usr/lib/python3/dist-packages/aiofile/version.py:11
      /usr/lib/python3/dist-packages/aiofile/version.py:11: DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors.
        project_home = package_metadata["Home-page"]
    
    -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
    =========================== short test summary info ============================
    FAILED tests/test_repository.py::TestRepository::test_signature_inrelease - F...
    FAILED tests/test_repository.py::TestRepository::test_signature_release - Fil...
    =================== 2 failed, 54 passed, 1 warning in 1.51s ====================
    E: pybuild pybuild:389: test: plugin pyproject failed with: exit code=1: cd /build/reproducible-path/apt-mirror2-14/.pybuild/cpython3_3.13/build; python3.13 -m pytest tests
    dh_auto_test: error: pybuild --test --test-pytest -i python{version} -p 3.13 returned exit code 13
    make: *** [debian/rules:7: binary] Error 25
    dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2
    --------------------------------------------------------------------------------
    
    Regards
    
    Phil
    Needs work Phil Wyett at July 12, 2025, 9:23 p.m.
  2. Phil, thanks for the review!
    I just uploaded new version which should fix this issue
    Yuri Konotopov at July 13, 2025, 7:43 a.m.