diff options
author | Andrew Gregory <andrew.gregory.8@gmail.com> | 2016-02-03 14:23:41 +0100 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2016-02-21 08:10:11 +0100 |
commit | fd936c9e732348ed754087576d67d1b2fe04afd4 (patch) | |
tree | f84112e4add9fde9dc369850c054e4ba4021fcd1 | |
parent | 169287e494a5348687260a00697be06b36ba4434 (diff) | |
download | pacman-fd936c9e732348ed754087576d67d1b2fe04afd4.tar.gz pacman-fd936c9e732348ed754087576d67d1b2fe04afd4.tar.xz |
only remove pacnew file if it is new
Check if we overwrote an exiting pacnew file before unlinking it.
Otherwise, updating to a version with an unchanged file would delete
existing pacnew files.
FS#47993
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r-- | lib/libalpm/add.c | 10 | ||||
-rw-r--r-- | test/pacman/tests/TESTS | 1 | ||||
-rw-r--r-- | test/pacman/tests/backup001.py | 20 |
3 files changed, 28 insertions, 3 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 18a81755..2639fa79 100644 --- a/lib/libalpm/add.c +++ b/lib/libalpm/add.c @@ -178,7 +178,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, char filename[PATH_MAX]; /* the actual file we're extracting */ int needbackup = 0, notouch = 0; const char *hash_orig = NULL; - int errors = 0; + int isnewfile = 0, errors = 0; struct stat lsbuf; size_t filename_len; @@ -226,7 +226,8 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, * 6- skip extraction, dir already exists. */ - if(llstat(filename, &lsbuf) != 0) { + isnewfile = llstat(filename, &lsbuf) != 0; + if(isnewfile) { /* cases 1,2: file doesn't exist, skip all backup checks */ } else if(S_ISDIR(lsbuf.st_mode) && S_ISDIR(entrymode)) { #if 0 @@ -301,6 +302,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, return 1; } strcpy(filename + filename_len, ".pacnew"); + isnewfile = (llstat(filename, &lsbuf) != 0 && errno == ENOENT); } _alpm_log(handle, ALPM_LOG_DEBUG, "extracting %s\n", filename); @@ -354,7 +356,9 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive, * including any user changes */ _alpm_log(handle, ALPM_LOG_DEBUG, "action: leaving existing file in place\n"); - unlink(filename); + if(isnewfile) { + unlink(filename); + } } else if(hash_orig && hash_local && strcmp(hash_orig, hash_local) == 0) { /* installed file has NOT been changed by user, * update to the new version */ diff --git a/test/pacman/tests/TESTS b/test/pacman/tests/TESTS index f35ec1a0..acdf769b 100644 --- a/test/pacman/tests/TESTS +++ b/test/pacman/tests/TESTS @@ -1,3 +1,4 @@ +TESTS += test/pacman/tests/backup001.py TESTS += test/pacman/tests/clean001.py TESTS += test/pacman/tests/clean002.py TESTS += test/pacman/tests/clean003.py diff --git a/test/pacman/tests/backup001.py b/test/pacman/tests/backup001.py new file mode 100644 index 00000000..e87b5f55 --- /dev/null +++ b/test/pacman/tests/backup001.py @@ -0,0 +1,20 @@ +self.description = "Upgrade a package, with a file in 'backup' (local modified, new unchanged)" + +self.filesystem = ["etc/dummy.conf.pacnew"] + +lp = pmpkg("dummy") +lp.files = ["etc/dummy.conf*"] +lp.backup = ["etc/dummy.conf"] +self.addpkg2db("local", lp) + +p = pmpkg("dummy", "1.0-2") +p.files = ["etc/dummy.conf"] +p.backup = ["etc/dummy.conf"] +self.addpkg(p) + +self.args = "-U %s" % p.filename() + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_VERSION=dummy|1.0-2") +self.addrule("FILE_PACNEW=etc/dummy.conf") +self.addrule("!FILE_MODIFIED=etc/dummy.conf") |