Package Details: backintime-cli 1.4.3-2

Git Clone URL: https://aur.archlinux.org/backintime.git (read-only, click to copy)
Package Base: backintime
Description: Simple backup system inspired from the Flyback Project and TimeVault. CLI version.
Upstream URL: https://github.com/bit-team/backintime
Licenses: GPL
Submitter: None
Maintainer: graysky
Last Packager: graysky
Votes: 298
Popularity: 0.31
First Submitted: 2009-01-09 20:46 (UTC)
Last Updated: 2024-02-03 12:23 (UTC)

Dependencies (19)

Required by (1)

Sources (2)

Pinned Comments

graysky commented on 2023-10-07 12:15 (UTC)

Using an AUR helper such as yay to build packages including backintime is HIGHLY discouraged. The recommended build method is to use a clean chroot. See: https://wiki.archlinux.org/title/DeveloperWiki:Building_in_a_clean_chroot

I wrote a script that automates much of that called clean-chroot-manager offered here in the AUR.

Please stop posting build failures because you insist on building with yay or other AUR helpers.

Latest Comments

1 2 3 4 5 6 .. 70 Next › Last »

szel commented on 2024-02-03 10:24 (UTC) (edited on 2024-02-03 10:26 (UTC) by szel)

Responding to @sunshe35.

This has worked for me:

  1. Remove backintime package.
  2. Do regular updates.
  3. Install the package back.

Perhaps it will work for you too? :-)

sunshe35 commented on 2024-02-03 06:23 (UTC) (edited on 2024-02-03 15:02 (UTC) by sunshe35)

There is a error for me:

#clean-up installed old files that were renamed or moved in later BiT versions
rm -f /etc/dbus-1/system.d/net.launchpad.backintime.serviceHelper.conf
rm: cannot remove '/etc/dbus-1/system.d/net.launchpad.backintime.serviceHelper.conf': Read-only file system
make: *** [Makefile:14: install] Error 1

what should I do?

In the newest version(1.4.3-2), the bug has been fixed. It works well now.

[sunshe35@archlinux tmp]$ yay -Qs backint
local/backintime 1.4.3-2
    Simple backup system inspired from the Flyback Project and TimeVault. Qt5 GUI version.
local/backintime-cli 1.4.3-2
    Simple backup system inspired from the Flyback Project and TimeVault. CLI version.

dev_aryoda commented on 2024-02-02 20:09 (UTC) (edited on 2024-02-02 20:21 (UTC) by dev_aryoda)

@graysky The python3 package "pylint" is missing and must be installed to run the unit tests (build & test dependency only). This dependency and "unit test" is new. It is just a static code analyzer and should not run during installation because it is very slow and does not add value to check the installation. I will ask the author of this code about options to improve this...

Edit: I have opened an issue for this: https://github.com/bit-team/backintime/issues/1634

graysky commented on 2024-02-02 19:56 (UTC)

Still fails for me:

==> Starting check()...
/usr/bin/pytest 
============================= test session starts ==============================
platform linux -- Python 3.11.7, pytest-7.4.4, pluggy-1.4.0
rootdir: /build/backintime/src/backintime-1.4.3/common
plugins: pyfakefs-5.3.2
collected 360 items

test/test_applicationinstance.py ...................                     [  5%]
test/test_argparser.py .....................                             [ 11%]
test/test_backintime.py ..s                                              [ 11%]
test/test_backup.py ...............                                      [ 16%]
test/test_config.py ...........                                          [ 19%]
test/test_configfile.py ................................................ [ 32%]
......                                                                   [ 34%]
test/test_diagnostics.py .....                                           [ 35%]
test/test_encfstools.py .                                                [ 35%]
test/test_lint.py F                                                      [ 36%]
test/test_restore.py .........ss                                         [ 39%]
test/test_sid.py ...........................................             [ 51%]
test/test_snapshotlog.py ..........                                      [ 53%]
test/test_snapshots.py .......................................s......... [ 67%]
.ssss                                                                    [ 68%]
test/test_sshtools.py sssssssssssssssssssssss...ssssss                   [ 77%]
test/test_takeSnapshot.py .........sssssssss                             [ 82%]
test/test_tools.py ..........s.........................s.......s........ [ 97%]
.........                                                                [100%]

=================================== FAILURES ===================================
____________________ MirrorMirrorOnTheWall.test_with_pylint ____________________

self = <test.test_lint.MirrorMirrorOnTheWall testMethod=test_with_pylint>

    def test_with_pylint(self):
        """Use Pylint to check for specific error codes.

        Some facts about PyLint
         - It is one of the slowest available linters.
         - It is able to catch lints none of the other linters
        """

        # Pylint base command
        cmd = [
            'pylint',
            # prevent false-positive no-module-member errors
            '--extension-pkg-whitelist=PyQt5',
            # Because of globally installed GNU gettext functions
            '--additional-builtins=_,ngettext',
            # Deactivate all checks by default
            '--disable=all'
        ]

        # Explicit activate checks
        err_codes = [
            'E1101',  # no-member
            'W1401',  # anomalous-backslash-in-string (invalid escape sequence)
        ]
        cmd.append('--enable=' + ','.join(err_codes))

        for fp in self._collect_py_files():
>           subprocess.run(cmd + [fp], check=True)

test/test_lint.py:65: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
/usr/lib/python3.11/subprocess.py:548: in run
    with Popen(*popenargs, **kwargs) as process:
/usr/lib/python3.11/subprocess.py:1026: in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Popen: returncode: 255 args: ['pylint', '--extension-pkg-whitelist=PyQt5', ...>
args = ['pylint', '--extension-pkg-whitelist=PyQt5', '--additional-builtins=_,ngettext', '--disable=all', '--enable=E1101,W1401', PosixPath('/build/backintime/src/backintime-1.4.3/common/applicationinstance.py')]
executable = b'pylint', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = None, env = None, startupinfo = None, creationflags = 0, shell = False
p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1
errwrite = -1, restore_signals = True, gid = None, gids = None, uid = None
umask = -1, start_new_session = False, process_group = -1

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals,
                       gid, gids, uid, umask,
                       start_new_session, process_group):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        elif isinstance(args, os.PathLike):
            if shell:
                raise TypeError('path-like args is not allowed when '
                                'shell is true')
            args = [args]
        else:
            args = list(args)

        if shell:
            # On Android the default shell is at '/system/bin/sh'.
            unix_shell = ('/system/bin/sh' if
                      hasattr(sys, 'getandroidapilevel') else '/bin/sh')
            args = [unix_shell, "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]

        sys.audit("subprocess.Popen", executable, args, cwd, env)

        if (_USE_POSIX_SPAWN
                and os.path.dirname(executable)
                and preexec_fn is None
                and not close_fds
                and not pass_fds
                and cwd is None
                and (p2cread == -1 or p2cread > 2)
                and (c2pwrite == -1 or c2pwrite > 2)
                and (errwrite == -1 or errwrite > 2)
                and not start_new_session
                and process_group == -1
                and gid is None
                and gids is None
                and uid is None
                and umask < 0):
            self._posix_spawn(args, executable, env, restore_signals,
                              p2cread, p2cwrite,
                              c2pread, c2pwrite,
                              errread, errwrite)
            return

        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session,
                        process_group, gid, gids, uid, umask,
                        preexec_fn, _USE_VFORK)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            self._close_pipe_fds(p2cread, p2cwrite,
                                 c2pread, c2pwrite,
                                 errread, errwrite)

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory: 'pylint'

/usr/lib/python3.11/subprocess.py:1950: FileNotFoundError
=========================== short test summary info ============================
FAILED test/test_lint.py::MirrorMirrorOnTheWall::test_with_pylint - FileNotFo...
================== 1 failed, 310 passed, 49 skipped in 10.24s ==================
make: *** [Makefile:562: unittest] Error 1

dev_aryoda commented on 2024-02-02 18:04 (UTC)

@uffe @graysky I have fixed the make install Makefile bug in our "dev" branch now and it works on my machine now. Retests and feedback welcome :-)

https://github.com/bit-team/backintime/commit/3b6de69e076ebeed6421312575c06dc8f762a335

dev_aryoda commented on 2024-02-02 10:22 (UTC) (edited on 2024-02-02 10:54 (UTC) by dev_aryoda)

@uffe

downloading the PKGBUILD and just executing makepkg gives the following error... I guess that messing with things outside the package staging-dir should not happen during the package phase..

I have introduced this clean-up code in BiT to support a migration scenario (as seen in the comment but indeed it looks like I forgot to prepend $(DEST)).

Is there a recommended way (best practice) for make install to make sure that old files (renamed or to be installed into another folder now) are removed during installation since make install does normally only overwrite files.

And if you use a different installation path with for make install (chroot/fakeroot) to copy it then into your system for installation: How can I as BiT developer make sure the old installed (but later renamed) file is removed for sure?

Edit: I have opened an issue, perhaps we continue our discussion there: https://github.com/bit-team/backintime/issues/1630

uffe commented on 2024-02-02 10:09 (UTC) (edited on 2024-02-02 10:09 (UTC) by uffe)

downloading the PKGBUILD and just executing makepkg gives the following error...

I guess that messing with things outside the package staging-dir should not happen during the package phase..

=> Starting check()...
==> Entering fakeroot environment...
==> Starting package_backintime()...
#clean-up installed old files that were renamed or moved in later BiT versions
rm -f /etc/dbus-1/system.d/net.launchpad.backintime.serviceHelper.conf
rm: cannot remove '/etc/dbus-1/system.d/net.launchpad.backintime.serviceHelper.conf': Permission denied
make: *** [Makefile:14: install] Error 1
==> ERROR: A failure occurred in package_backintime().
    Aborting...
zsh: exit 4     makepkg

leonardof commented on 2023-10-29 15:19 (UTC) (edited on 2023-10-29 16:54 (UTC) by leonardof)

@dev_aryoda

Indeed it was something to do with QGnomepPlatform. I use GNOME, and some time ago Back In Time stopped displaying the toolbar icons so I installed this both the Qt5 and the Qt6 versions (although in hindsight none of my apps use Qt6 yet) and it solved this problem back then. Now uninstalling the QGnomepPlatform packages allowed me to finally make the backintime packages and install them without error, and the icons are displaying just fine.

I was going to install QGnomePlatform again to look into this qqc2-desktop-style thing. Apparently just using adwaita-qt5-git and qgnomeplatform-qt5-git should work if I set QT_STYLE_OVERRIDE=adwaita. Apparently I installed such packages back when there were in the extras repository and now they are not anymore? Perhaps my problem was because they were old versions? Anyway, I was not able to install qgnomeplatform-qt5-git because its build script is failing for some strange reason; notifying its maintainer.

Thanks for your help!

UPDATE: Finally installed QGnomePlatform (and Qt-Adwaita) back, from the -git repositories linked to from the wiki page you linked to. My difficulty with installing then was solved by installing extra/qqc2-desktop-style5, which was also mentioned in the error message. Then I was able to compile Back In Time successfully and installing it without any problem.

dev_aryoda commented on 2023-10-23 07:20 (UTC) (edited on 2023-10-23 21:22 (UTC) by dev_aryoda)

@leonardof THX for the full unit test run output! I can see an unexpected INFO that causes the unit test to fail:

Create info file qt.qpa.qgnomeplatform.theme: The desktop style for QtQuick Controls 2 applications is not available on the system (qqc2-desktop-style). The application may look broken.

I don't know this specific Qt5 info and cannot reproduce it.

  • Which desktop environment are you using?
  • Have you changed the default desktop style to some other style (which one)?

I guess you can install a possibly missing qt5 package ("qqc2-desktop-style"?) to fix this:

https://wiki.archlinux.org/title/Uniform_look_for_Qt_and_GTK_applications#QGnomePlatform

It can be installed with the qgnomeplatform-qt5-git It does not provide a Qt style itself, instead it requires a style that support both Qt and GTK.

The source code of QGnomePlatform tells it is looking for a style name containing "org.kde.desktop":

https://github.com/FedoraQt/QGnomePlatform/blob/d86d6baab74c3e69094083715ffef4aef2e516dd/src/theme/qgnomeplatformtheme.cpp#L105-L111

#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    // Unfortunately we only have a way to check this on Qt5
    if (!QQuickStyle::availableStyles().contains(QStringLiteral("org.kde.desktop"))) {
        qCWarning(QGnomePlatformThemeLog) << "The desktop style for QtQuick Controls 2 applications"
                                          << "is not available on the system (qqc2-desktop-style)."
                                          << "The application may look broken.";
        return;
    }

leonardof commented on 2023-10-22 20:46 (UTC)

@dev_aryoda, thanks for checking!

The output follows. I don't know of any special configuration, I just git pull, makepkg --clean and, hopefully, sudo pacman -U. Optional dependencies meld, python-keyring and sshfs are installed, but kompare, enfs and pm-utils are not.

$ LC_ALL=C makepkg --clean
==> Making package: backintime 1.4.1-2 (Sun Oct 22 17:39:26 2023)
==> Checking runtime dependencies...
==> Checking buildtime dependencies...
==> Retrieving sources...
  -> Found backintime-1.4.1.tar.gz
==> Validating source files with sha256sums...
    backintime-1.4.1.tar.gz ... Passed
==> Extracting sources...
  -> Extracting backintime-1.4.1.tar.gz with bsdtar
==> Starting prepare()...
==> Removing existing $pkgdir/ directory...
==> Starting build()...
Unknown Arguments:  --no-fuse-group
All OK. Now run:
    make
    sudo make install
#man pages
for i in $(ls -1 man/C/); do case $i in *.gz|*~) continue;; *) gzip -n --best -c man/C/$i > man/C/${i}.gz;; esac; done
#config-examples
gzip -n --best -c config-example-local > config-example-local.gz
gzip -n --best -c config-example-ssh > config-example-ssh.gz
All OK. Now run:
    make
    sudo make install
#man pages
for i in $(ls -1 man/C/); do case $i in *.gz|*~) continue;; *) gzip -n --best -c man/C/$i > man/C/${i}.gz;; esac; done
==> Starting check()...
/usr/bin/pytest 
============================================================================================================ test session starts =============================================================================================================
platform linux -- Python 3.11.5, pytest-7.4.2, pluggy-1.3.0
rootdir: /home/leonardof/aur/backintime/src/backintime-1.4.1/common
plugins: pyfakefs-5.3.0
collected 359 items                                                                                                                                                                                                                          

test/test_applicationinstance.py ...................                                                                                                                                                                                   [  5%]
test/test_argparser.py .....................                                                                                                                                                                                           [ 11%]
test/test_backintime.py .Fs                                                                                                                                                                                                            [ 11%]
test/test_backup.py ...............                                                                                                                                                                                                    [ 16%]
test/test_config.py ...........                                                                                                                                                                                                        [ 19%]
test/test_configfile.py ......................................................                                                                                                                                                         [ 34%]
test/test_diagnostics.py .....                                                                                                                                                                                                         [ 35%]
test/test_encfstools.py .                                                                                                                                                                                                              [ 35%]
test/test_restore.py .........ss                                                                                                                                                                                                       [ 38%]
test/test_sid.py ...........................................                                                                                                                                                                           [ 50%]
test/test_snapshotlog.py ..........                                                                                                                                                                                                    [ 53%]
test/test_snapshots.py ..................................................ssss                                                                                                                                                          [ 68%]
test/test_sshtools.py sssssssssssssssssssssss...ssssss                                                                                                                                                                                 [ 77%]
test/test_takeSnapshot.py .........sssssssss                                                                                                                                                                                           [ 82%]
test/test_tools.py ..............................................................                                                                                                                                                      [100%]

================================================================================================================== FAILURES ==================================================================================================================
______________________________________________________________________________________________ TestBackInTime.test_local_snapshot_is_successful ______________________________________________________________________________________________

self = <test.test_backintime.TestBackInTime testMethod=test_local_snapshot_is_successful>

>   ???
E   AssertionError: Regex didn't match: 'INFO: Lock\nINFO: Take a new snapshot. Profile: 1 Main profile\nINFO: Call rsync to take the snapshot\nINFO: Save config file\nINFO: Save permissions\nINFO: Create info file\nINFO: Unlock' not found in 'INFO: Lock\nINFO: Take a new snapshot. Profile: 1 Main profile\nINFO: Call rsync to take the snapshot\nINFO: Save config file\nINFO: Save permissions\nINFO: Create info file\nqt.qpa.qgnomeplatform.theme: The desktop style for QtQuick Controls 2 applications is not available on the system (qqc2-desktop-style). The application may look broken.\nINFO: Unlock'

/home/leonardof/Linux/arch/backintime/src/backintime-1.4.1/common/test/test_backintime.py:182: AssertionError
========================================================================================================== short test summary info ===========================================================================================================
FAILED test/test_backintime.py::TestBackInTime::test_local_snapshot_is_successful - AssertionError: Regex didn't match: 'INFO: Lock\nINFO: Take a new snapshot. Profile: 1 Main profile\nINFO: Call rsync to take the snapshot\nINFO: Save config file\nINFO: Save permissions\nINFO: Create info file\nINFO: Unlock' not fou...
================================================================================================= 1 failed, 313 passed, 45 skipped in 43.67s =================================================================================================
make: *** [Makefile:562: unittest] Error 1
==> ERROR: A failure occurred in check().
    Aborting...