summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gregory <andrew.gregory.8@gmail.com>2016-02-03 14:23:41 +0100
committerAllan McRae <allan@archlinux.org>2016-02-21 08:10:11 +0100
commitfd936c9e732348ed754087576d67d1b2fe04afd4 (patch)
treef84112e4add9fde9dc369850c054e4ba4021fcd1
parent169287e494a5348687260a00697be06b36ba4434 (diff)
downloadpacman-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.c10
-rw-r--r--test/pacman/tests/TESTS1
-rw-r--r--test/pacman/tests/backup001.py20
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")