Hello community, here is the log from the commit of package snapper for openSUSE:Factory checked in at 2019-09-07 11:28:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/snapper (Old) and /work/SRC/openSUSE:Factory/.snapper.new.7948 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "snapper" Sat Sep 7 11:28:08 2019 rev:108 rq:727331 version:0.8.3 Changes: -------- --- /work/SRC/openSUSE:Factory/snapper/snapper.changes 2019-04-01 12:33:52.833806015 +0200 +++ /work/SRC/openSUSE:Factory/.snapper.new.7948/snapper.changes 2019-09-07 11:28:11.158473567 +0200 @@ -1,0 +2,6 @@ +Fri Aug 30 17:29:34 CET 2019 - ifors...@suse.com + +- reusing existing subvolumes on mksubvolume run + (bsc#1138725, bsc#1126900, gh#openSUSE/snapper#236) + +------------------------------------------------------------------- New: ---- snapper-xUbuntu_19.04.dsc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ debian.tar.gz ++++++ ++++++ snapper-0.8.3.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/Makefile.am new/snapper-0.8.3/Makefile.am --- old/snapper-0.8.3/Makefile.am 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/Makefile.am 2019-08-30 02:00:00.000000000 +0200 @@ -28,7 +28,8 @@ xUbuntu_17.04 \ xUbuntu_17.10 \ xUbuntu_18.04 \ - xUbuntu_18.10 + xUbuntu_18.10 \ + xUbuntu_19.04 show-debian: @echo "Debian flavors: $(DEBIAN_FLAVOURS)" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/Makefile.in new/snapper-0.8.3/Makefile.in --- old/snapper-0.8.3/Makefile.in 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/Makefile.in 2019-08-30 02:00:00.000000000 +0200 @@ -409,7 +409,8 @@ xUbuntu_17.04 \ xUbuntu_17.10 \ xUbuntu_18.04 \ - xUbuntu_18.10 + xUbuntu_18.10 \ + xUbuntu_19.04 # Create all the files necessary for building the package with OBS: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/aclocal.m4 new/snapper-0.8.3/aclocal.m4 --- old/snapper-0.8.3/aclocal.m4 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/aclocal.m4 2019-08-30 02:00:00.000000000 +0200 @@ -9049,7 +9049,7 @@ m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# serial 12 (pkg-config-0.29.2) +# serial 11 (pkg-config-0.29.1) dnl Copyright © 2004 Scott James Remnant <sc...@netsplit.com>. dnl Copyright © 2012-2015 Dan Nicholson <dbn.li...@gmail.com> @@ -9091,7 +9091,7 @@ dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], -[m4_define([PKG_MACROS_VERSION], [0.29.2]) +[m4_define([PKG_MACROS_VERSION], [0.29.1]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ @@ -9192,7 +9192,7 @@ AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no -AC_MSG_CHECKING([for $2]) +AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) @@ -9202,11 +9202,11 @@ See the pkg-config man page for more details.]) if test $pkg_failed = yes; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` - else + else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs @@ -9223,7 +9223,7 @@ _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then - AC_MSG_RESULT([no]) + AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full @@ -9324,6 +9324,74 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR +dnl PKG_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [ACTION-IF-FOUND],[ACTION-IF-NOT-FOUND], +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------ +dnl +dnl Prepare a "--with-" configure option using the lowercase +dnl [VARIABLE-PREFIX] name, merging the behaviour of AC_ARG_WITH and +dnl PKG_CHECK_MODULES in a single macro. +AC_DEFUN([PKG_WITH_MODULES], +[ +m4_pushdef([with_arg], m4_tolower([$1])) + +m4_pushdef([description], + [m4_default([$5], [build with ]with_arg[ support])]) + +m4_pushdef([def_arg], [m4_default([$6], [auto])]) +m4_pushdef([def_action_if_found], [AS_TR_SH([with_]with_arg)=yes]) +m4_pushdef([def_action_if_not_found], [AS_TR_SH([with_]with_arg)=no]) + +m4_case(def_arg, + [yes],[m4_pushdef([with_without], [--without-]with_arg)], + [m4_pushdef([with_without],[--with-]with_arg)]) + +AC_ARG_WITH(with_arg, + AS_HELP_STRING(with_without, description[ @<:@default=]def_arg[@:>@]),, + [AS_TR_SH([with_]with_arg)=def_arg]) + +AS_CASE([$AS_TR_SH([with_]with_arg)], + [yes],[PKG_CHECK_MODULES([$1],[$2],$3,$4)], + [auto],[PKG_CHECK_MODULES([$1],[$2], + [m4_n([def_action_if_found]) $3], + [m4_n([def_action_if_not_found]) $4])]) + +m4_popdef([with_arg]) +m4_popdef([description]) +m4_popdef([def_arg]) + +])dnl PKG_WITH_MODULES + +dnl PKG_HAVE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ----------------------------------------------- +dnl +dnl Convenience macro to trigger AM_CONDITIONAL after PKG_WITH_MODULES +dnl check._[VARIABLE-PREFIX] is exported as make variable. +AC_DEFUN([PKG_HAVE_WITH_MODULES], +[ +PKG_WITH_MODULES([$1],[$2],,,[$3],[$4]) + +AM_CONDITIONAL([HAVE_][$1], + [test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"]) +])dnl PKG_HAVE_WITH_MODULES + +dnl PKG_HAVE_DEFINE_WITH_MODULES(VARIABLE-PREFIX, MODULES, +dnl [DESCRIPTION], [DEFAULT]) +dnl ------------------------------------------------------ +dnl +dnl Convenience macro to run AM_CONDITIONAL and AC_DEFINE after +dnl PKG_WITH_MODULES check. HAVE_[VARIABLE-PREFIX] is exported as make +dnl and preprocessor variable. +AC_DEFUN([PKG_HAVE_DEFINE_WITH_MODULES], +[ +PKG_HAVE_WITH_MODULES([$1],[$2],[$3],[$4]) + +AS_IF([test "$AS_TR_SH([with_]m4_tolower([$1]))" = "yes"], + [AC_DEFINE([HAVE_][$1], 1, [Enable ]m4_tolower([$1])[ support])]) +])dnl PKG_HAVE_DEFINE_WITH_MODULES + # Copyright (C) 2002-2018 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/client/mksubvolume.cc new/snapper-0.8.3/client/mksubvolume.cc --- old/snapper-0.8.3/client/mksubvolume.cc 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/client/mksubvolume.cc 2019-08-30 02:00:00.000000000 +0200 @@ -89,7 +89,15 @@ if (fd < 0) throw runtime_error_with_errno("open failed", errno); - create_subvolume(fd, basename(subvolume_name)); + try + { + create_subvolume(fd, basename(subvolume_name)); + } + catch(...) + { + close(fd); + throw; + } close(fd); } @@ -120,13 +128,10 @@ } -void -do_add_fstab_and_mount(MntTable& mnt_table, const libmnt_fs* fs, const string& subvol_option, - const string& subvolume_name) +libmnt_fs* +create_fstab_line(const libmnt_fs* fs, const string& subvol_option, + const string& subvolume_name) { - if (verbose) - cout << "do-add-fstab-and-mount" << endl; - libmnt_fs* x = mnt_copy_fs(NULL, fs); if (!x) throw runtime_error("mnt_copy_fs failed"); @@ -144,20 +149,41 @@ mnt_fs_set_options(x, options); free(options); - // Caution: mnt_context_mount may change the source of x so the fstab - // functions must be called first. - mnt_table.add_fs(x); - mnt_table.replace_file(); + return x; +} + + +void +do_add_fstab_and_mount(MntTable& mnt_table, libmnt_fs* x) +{ + if (verbose) + cout << "do-add-fstab-and-mount" << endl; + + if (mnt_table.find_target(target.c_str(), MNT_ITER_FORWARD) == NULL) + { + // Caution: mnt_context_mount may change the source of x so the fstab + // functions must be called first. + mnt_table.add_fs(x); + mnt_table.replace_file(); + } + else + cout << "reusing existing fstab entry" << endl; if (mkdir(target.c_str(), 0777) != 0 && errno != EEXIST) throw runtime_error_with_errno("mkdir failed", errno); struct libmnt_context* cxt = mnt_new_context(); - mnt_context_set_fs(cxt, x); + libmnt_fs* y; + if (mnt_context_find_umount_fs(cxt, target.c_str(), &y)) + { + mnt_context_set_fs(cxt, x); - int ret = mnt_context_mount(cxt); - if (ret != 0) - throw runtime_error(sformat("mnt_context_mount failed, ret:%d", ret)); + int ret = mnt_context_mount(cxt); + if (ret != 0) + throw runtime_error(sformat("mnt_context_mount failed, ret:%d", ret)); + } + else + cout << "reusing mounted target" << endl; mnt_free_context(cxt); @@ -166,13 +192,10 @@ void -do_set_nocow() +do_set_cow_flag() { - if (!set_nocow) - return; - if (verbose) - cout << "do-set-nocow" << endl; + cout << "do-set-cow-flag" << endl; int fd = open(target.c_str(), O_RDONLY); if (fd == -1) @@ -188,7 +211,10 @@ throw runtime_error_with_errno("ioctl(EXT2_IOC_GETFLAGS) failed", errno); } - flags |= FS_NOCOW_FL; + if (set_nocow) + flags |= FS_NOCOW_FL; + else + flags &= ~FS_NOCOW_FL; if (ioctl(fd, EXT2_IOC_SETFLAGS, &flags) == -1) { @@ -201,16 +227,12 @@ bool -is_subvol_mount(const string& fs_options) +is_subvol_mount(libmnt_fs* fs) { - vector<string> tmp1; - boost::split(tmp1, fs_options, boost::is_any_of(","), boost::token_compress_on); - for (const string& tmp2 : tmp1) - { - if (boost::starts_with(tmp2, "subvol=") || boost::starts_with(tmp2, "subvolid=")) - return true; - } - + if (mnt_fs_get_option(fs, "subvol", NULL, NULL) == 0) + return true; + if (mnt_fs_get_option(fs, "subvolid", NULL, NULL) == 0) + return true; return false; } @@ -242,10 +264,7 @@ if (fs_fstype != "btrfs") throw runtime_error("filesystem is not btrfs"); - if (fs_target == target) - throw runtime_error("target exists in fstab"); - - if (!is_subvol_mount(fs_options)) + if (!is_subvol_mount(fs)) return fs; if (verbose) @@ -259,6 +278,111 @@ } +string +get_abs_subvol_path(string subvolume) +{ + if(!boost::starts_with(subvolume, "/")) + subvolume.insert(0, "/"); + return subvolume; +} + + +void +do_consistency_checks(MntTable& mnt_table, libmnt_fs* fs, libmnt_fs* expected_fs) +{ + // Set up cache for UUID / LABEL resolution in mnt_table_find_source + libmnt_cache* cache = mnt_new_cache(); + MntTable mtab_table("/"); + mtab_table.set_cache(cache); + mtab_table.parse_mtab(); + + char* subvol_expected; + if (mnt_fs_get_option(expected_fs, "subvol", &subvol_expected, NULL) != 0) + throw runtime_error("mnt_fs_get_option failed"); + + // Consistency checks on (partially) existing entries + libmnt_fs* fstab_entry = mnt_table.find_target(target, MNT_ITER_FORWARD); + libmnt_fs* mounted_entry = mtab_table.find_target(mnt_fs_get_target(expected_fs), + MNT_ITER_BACKWARD); + // Map UUID / LABEL to a physical device name + const char* dev_expected = mnt_resolve_spec(mnt_fs_get_source(expected_fs), cache); + const char* dev_fstab = mnt_resolve_spec(mnt_fs_get_source(fstab_entry), cache); + if (dev_expected == NULL) + throw runtime_error("parent volume in fstab does not match expected device"); + if (fstab_entry != NULL && dev_fstab == NULL) + throw runtime_error("fstab entry does not map to a real device"); + if (fstab_entry != NULL && strcmp(dev_fstab, dev_expected) != 0) + throw runtime_error("existing fstab entry doesn't match target device"); + if (fstab_entry != NULL) + { + char* subvol_fstab; + if (mnt_fs_get_option(fstab_entry, "subvol", &subvol_fstab, NULL) != 0 || + get_abs_subvol_path(subvol_fstab) != get_abs_subvol_path(subvol_expected)) + throw runtime_error("existing fstab entry's subvolume doesn't match"); + } + + // Something is mounted there already. Is it the correct device? + if (mounted_entry != NULL) + { + if (strcmp(dev_expected, mnt_fs_get_source(mounted_entry)) != 0) + { + // In case of multi device btrfs the device name can differ, so compare the UUIDs. + const char* uuid_expected = mnt_cache_find_tag_value(cache, dev_expected, "UUID"); + const char* uuid_mounted = mnt_cache_find_tag_value(cache, mnt_fs_get_source(mounted_entry), "UUID"); + + if (!uuid_expected || !uuid_mounted) + throw runtime_error("failed to get uuid"); + + if (strcmp(uuid_expected, uuid_mounted) != 0) + throw runtime_error("different device mounted on target"); + } + + char* subvol_real; + if (mnt_fs_get_option(mounted_entry, "subvol", &subvol_real, NULL) != 0 || + get_abs_subvol_path(subvol_expected) != get_abs_subvol_path(subvol_real)) + throw runtime_error("subvolume of mounted target doesn't match"); + } + + mnt_unref_cache(cache); +} + + +class TmpMountpoint { + unique_ptr<char[]> mountpoint; + const libmnt_fs* fs; + +public: + TmpMountpoint(const string& tmpMountpoint, const libmnt_fs* libmntfs, const string& subvol_opts) + : mountpoint(strdup(tmpMountpoint.c_str())), fs(libmntfs) + { + if (!mkdtemp(mountpoint.get())) + throw runtime_error_with_errno("mkdtemp failed", errno); + + try + { + do_tmp_mount(fs, mountpoint.get(), subvol_opts); + } + catch (...) + { + rmdir(mountpoint.get()); + throw; + } + } + + ~TmpMountpoint() + { + do_tmp_umount(fs, mountpoint.get()); + rmdir(mountpoint.get()); + } + + const string + get_path() + { + return mountpoint.get(); + } +}; + + /* * The used algorithm is as follow: * @@ -286,7 +410,13 @@ throw runtime_error("invalid target"); if (access(target.c_str(), F_OK) == 0) - throw runtime_error("target exists"); + { + struct stat sb; + if (lstat(target.c_str(), &sb) == 0 && sb.st_mode & S_IFDIR) + cout << "reusing existing target dir" << endl; + else + throw runtime_error("target exists"); + } if (access(dirname(target).c_str(), F_OK) != 0) throw runtime_error("parent of target does not exist"); @@ -326,45 +456,45 @@ // Determine name for new subvolume: It is the target name without the // leading filesystem target. - string subvolume_name = target.substr(fs_target.size() + (fs_target == "/" ? 0 : 1)); + string subvolume_name = target.substr(fs_target.size() + + (fs_target == "/" || fs_target == target ? 0 : 1)); + if (subvolume_name.empty()) + throw runtime_error("target is a dedicated mountpoint"); if (verbose) cout << "subvolume-name:" << subvolume_name << endl; - // Execute all steps. + // Create the new subvolume in memory and check system environment - char* tmp_mountpoint = strdup("/tmp/mksubvolume-XXXXXX"); - if (!mkdtemp(tmp_mountpoint)) - throw runtime_error_with_errno("mkdtemp failed", errno); + libmnt_fs* expected_fs = create_fstab_line(fs, subvol_option, subvolume_name); + do_consistency_checks(mnt_table, fs, expected_fs); - do_tmp_mount(fs, tmp_mountpoint, subvol_option); + // Execute all steps. + + TmpMountpoint tmp_mountpoint("/tmp/mksubvolume-XXXXXX", fs, subvol_option); try { - do_create_subvolume(tmp_mountpoint, subvolume_name); + do_create_subvolume(tmp_mountpoint.get_path(), subvolume_name); } - catch (...) + catch (const runtime_error_with_errno& e) { - // Rethrow the original exception, not a potential exception of do_tmp_umount. - try - { - do_tmp_umount(fs, tmp_mountpoint); - rmdir(tmp_mountpoint); - free(tmp_mountpoint); - } - catch (...) + if (e.error_number == EEXIST) { - } + const string path = tmp_mountpoint.get_path() + "/" + subvolume_name; + struct stat sb; - throw; + if (lstat(path.c_str(), &sb) == 0 && is_subvolume(sb)) + cout << "reusing existing subvolume" << endl; + else + throw runtime_error_with_errno("cannot reuse path as subvolume", e.error_number); + } + else + throw; } - do_tmp_umount(fs, tmp_mountpoint); - rmdir(tmp_mountpoint); - free(tmp_mountpoint); - - do_add_fstab_and_mount(mnt_table, fs, subvol_option, subvolume_name); + do_add_fstab_and_mount(mnt_table, expected_fs); - do_set_nocow(); + do_set_cow_flag(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/configure new/snapper-0.8.3/configure --- old/snapper-0.8.3/configure 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/configure 2019-08-30 02:00:00.000000000 +0200 @@ -16939,8 +16939,8 @@ fi pkg_failed=no -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dbus-1" >&5 -$as_echo_n "checking for dbus-1... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DBUS" >&5 +$as_echo_n "checking for DBUS... " >&6; } if test -n "$DBUS_CFLAGS"; then pkg_cv_DBUS_CFLAGS="$DBUS_CFLAGS" @@ -16980,7 +16980,7 @@ if test $pkg_failed = yes; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then @@ -17007,7 +17007,7 @@ and DBUS_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/po/ca.po new/snapper-0.8.3/po/ca.po --- old/snapper-0.8.3/po/ca.po 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/po/ca.po 2019-08-30 02:00:00.000000000 +0200 @@ -3,7 +3,7 @@ "Project-Id-Version: @PACKAGE@\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-29 14:27+0100\n" -"PO-Revision-Date: 2019-03-01 20:28+0000\n" +"PO-Revision-Date: 2019-05-28 09:49+0000\n" "Last-Translator: David Medina <medi...@gmail.com>\n" "Language-Team: Catalan <https://l10n.opensuse.org/projects/snapper/master/ca/" ">\n" @@ -12,7 +12,7 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.3\n" +"X-Generator: Weblate 3.6.1\n" msgid "\t--all-configs, -a\t\tList snapshots from all accessible configs." msgstr "\t--all-configs, -a\t\tLlista les instantànies des de totes les configuracions accessibles." @@ -604,7 +604,7 @@ msgstr "Opció desconeguda '%s' per a l'ordre '%s'." msgid "Unknown type of snapshot." -msgstr "Tipus desconegut d'instantània." +msgstr "Tipus d'instantània desconegut." msgid "Unknown type of snapshots." msgstr "Tipus desconegut d'instantànies." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/po/de.po new/snapper-0.8.3/po/de.po --- old/snapper-0.8.3/po/de.po 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/po/de.po 2019-08-30 02:00:00.000000000 +0200 @@ -7,8 +7,8 @@ "Project-Id-Version: snapper\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2018-10-29 14:27+0100\n" -"PO-Revision-Date: 2019-03-26 16:46+0000\n" -"Last-Translator: Maximilian Trummer <opens...@trummer.xyz>\n" +"PO-Revision-Date: 2019-04-04 18:42+0000\n" +"Last-Translator: Sarah Kriesch <ada.lovel...@gmx.de>\n" "Language-Team: German <https://l10n.opensuse.org/projects/snapper/master/de/>" "\n" "Language: de\n" @@ -43,10 +43,12 @@ msgstr "\t--diff-cmd <Kommando>\t\tKommando zum Vergleichen von Dateien." msgid "\t--disable-used-space\t\tDisable showing used space." -msgstr "\t--disable-used-space\t\tVerbrauchten Platz nicht anzeigen." +msgstr "\t--disable-used-space\t\tBenutzten Platz nicht anzeigen." msgid "\t--extensions, -x <options>\tExtra options passed to the diff command." -msgstr "\t--extensions, -x <Optionen>\tZusätzliche Optionen, die an den diff-Befehl übergeben wurden." +msgstr "" +"\t--extensions, -x <Optionen>\tExtra Optionen, die an den diff-Befehl " +"übergeben wurden." msgid "\t--fstype, -f <fstype>\t\tManually set filesystem type." msgstr "\t--fstype, -f <fstype>\t\tDateisystem-Typ manuell setzen." @@ -263,19 +265,19 @@ #, c-format msgid "Cannot delete snapshot %d since it is the current system." msgstr "" -"Schnappschuss %d kann nicht gelöscht werden, weil es das derzeit laufende " +"Schnappschuss %d kann nicht gelöscht werden, seitdem es das derzeit laufende " "System ist." #, c-format msgid "Cannot delete snapshot %d since it is the currently mounted snapshot." msgstr "" -"Schnappschuss %d kann nicht gelöscht werden, weil es der derzeit gemountete " -"Schnappschuss ist." +"Schnappschuss %d kann nicht gelöscht werden, seitdem es der derzeit " +"gemountete Schnappschuss ist." #, c-format msgid "Cannot delete snapshot %d since it is the next to be mounted snapshot." msgstr "" -"Schnappschuss %d kann nicht gelöscht werden, weil es der nächste zu " +"Schnappschuss %d kann nicht gelöscht werden, seitdem es der nächste zu " "mountende Schnappschuss ist." msgid "Cleanup" @@ -381,11 +383,11 @@ msgstr "Nur-Lesen-Schnappschuss des derzeit laufenden Systems erstellen." msgid "Creating read-only snapshot of default subvolume." -msgstr "Nur-Lesen-Schnappschuss des Standard-Subvolumens erstellen." +msgstr "Nur-Lesen-Schnappschuss des Standard-Subvolumes erstellen." msgid "Creating read-write snapshot of current subvolume." msgstr "" -"Lesen-Schreiben-Schnappschuss des derzeit laufenden Subvolumens erstellen." +"Lesen-Schreiben-Schnappschuss des derzeit laufenden Subvolumes erstellen." #, c-format msgid "Creating read-write snapshot of snapshot %d." @@ -449,7 +451,7 @@ #, c-format msgid "Free space error (%s)." -msgstr "Freier Speicherplatz-Fehler (%s)." +msgstr "Speicherplatz-Fehler (%s)." #. TRANSLATORS: symbol for "gibi bytes" (best keep untranslated) msgid "GiB" @@ -561,11 +563,11 @@ msgstr "Quota-Fehler (%s)." msgid "See 'man snapper' for further instructions." -msgstr "Weitere Anweisungen finden Sie in \"man snapper\"." +msgstr "Weitere Anweisungen finden Sie in 'man snapper'." #, c-format msgid "Setting default subvolume to snapshot %d." -msgstr "Einstellung des Standard-Subvolumens zu Schnappschuss %d." +msgstr "Einstellung des Standard-Subvolumes zu Schnappschuss %d." #, c-format msgid "Snapshot '%u' not found." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/snapper-0.8.3/snapper/MntTable.h new/snapper-0.8.3/snapper/MntTable.h --- old/snapper-0.8.3/snapper/MntTable.h 2019-03-27 01:00:00.000000000 +0100 +++ new/snapper-0.8.3/snapper/MntTable.h 2019-08-30 02:00:00.000000000 +0200 @@ -52,7 +52,7 @@ ~MntTable() { - mnt_reset_table(table); + mnt_unref_table(table); } void parse_fstab() @@ -61,6 +61,18 @@ throw runtime_error("mnt_table_parse_fstab failed"); } + void parse_mtab() + { + if (mnt_table_parse_mtab(table, NULL)) + throw runtime_error("mnt_table_parse_mtab failed"); + } + + void set_cache(libmnt_cache* cache) + { + if (cache == NULL || mnt_table_set_cache(table, cache) != 0) + throw runtime_error("Setting the file system cache failed"); + } + void replace_file() { if (mnt_table_replace_file(table, target_fstab().c_str()) != 0) @@ -96,7 +108,6 @@ const string root_prefix; struct libmnt_table* table; - }; } ++++++ snapper-Debian_7.0.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.070473452 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.074473452 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-Debian_8.0.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.086473451 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.086473451 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-Debian_9.0.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.098473449 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.098473449 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_14.04.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.114473447 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.114473447 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_14.10.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.126473446 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.126473446 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_15.04.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.138473444 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.142473444 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_15.10.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.154473442 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.154473442 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_16.04.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.166473441 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.170473440 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_16.10.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.186473438 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.186473438 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_17.04.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.198473437 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.198473437 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_17.10.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.210473435 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.214473435 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_18.04.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.230473432 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.230473432 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_18.10.dsc ++++++ --- /var/tmp/diff_new_pack.8RxzOn/_old 2019-09-07 11:28:12.242473431 +0200 +++ /var/tmp/diff_new_pack.8RxzOn/_new 2019-09-07 11:28:12.246473431 +0200 @@ -11,4 +11,4 @@ # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: -19808f5fa6d846e742fef8cc5ddc6d9c 592418 snapper-0.8.3.tar.bz2 +1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2 ++++++ snapper-xUbuntu_19.04.dsc ++++++ Format: 1.0 Source: snapper Version: 0.8.3 Binary: snapper Maintainer: Arvin Schnell <aschn...@suse.com> Architecture: any Build-Depends: debhelper (>= 4.1.16), acl-dev, g++, libboost-dev, libboost-thread-dev, libboost-system-dev, libboost-test-dev, libxml2-dev, libz-dev, libdbus-1-dev, libpam-dev, xsltproc, docbook-xsl, language-pack-en, language-pack-de # # The 'Files' line is generated during 'make package': # Files: # 423a20ae6e882d44e65a4eff97f2269f 630905 snapper-0.2.8.tar.gz # Files: 1d4c6785d99c3d2573fc29877d9ea05e 593794 snapper-0.8.3.tar.bz2