From 7586072beb8fde6631fe43a2eee5ca76255055d0 Mon Sep 17 00:00:00 2001 From: Nagy Gabor Date: Sat, 9 Feb 2008 17:51:05 +0100 Subject: Fixes file relocation pactests This patch fixes upgrade040.py and upgrade041.py (041 now fails!): * the old pactests didn't check the existence of the relocated file * upgrade041.py was broken due to a typo (missing comma) New upgrade046.py pactest was added (derived from the fixed upgrade041.py). This fails because the file relocation check is _hacked_ to conflict.c, and _alpm_db_find_fileconflicts is not called in case of --force. Signed-off-by: Nagy Gabor Signed-off-by: Chantry Xavier --- pactest/tests/upgrade040.py | 1 + pactest/tests/upgrade041.py | 3 ++- pactest/tests/upgrade046.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 pactest/tests/upgrade046.py (limited to 'pactest') diff --git a/pactest/tests/upgrade040.py b/pactest/tests/upgrade040.py index bc40f337..e17c7176 100644 --- a/pactest/tests/upgrade040.py +++ b/pactest/tests/upgrade040.py @@ -27,4 +27,5 @@ for p in p1, p2: self.addrule("PKG_EXIST=%s" % p.name) self.addrule("FILE_MODIFIED=bin/dummy") self.addrule("FILE_MODIFIED=bin/foobar") +self.addrule("FILE_EXIST=usr/share/file") self.addrule("FILE_MODIFIED=usr/share/file") diff --git a/pactest/tests/upgrade041.py b/pactest/tests/upgrade041.py index 347c2c4b..20da4f14 100644 --- a/pactest/tests/upgrade041.py +++ b/pactest/tests/upgrade041.py @@ -4,7 +4,7 @@ lp1 = pmpkg("dummy") lp1.files = ["bin/dummy"] lp2 = pmpkg("foobar") -lp2.files = ["bin/foobar" +lp2.files = ["bin/foobar", "usr/share/file"] for p in lp1, lp2: @@ -27,4 +27,5 @@ for p in p1, p2: self.addrule("PKG_EXIST=%s" % p.name) self.addrule("FILE_MODIFIED=bin/dummy") self.addrule("FILE_MODIFIED=bin/foobar") +self.addrule("FILE_EXIST=usr/share/file") self.addrule("FILE_MODIFIED=usr/share/file") diff --git a/pactest/tests/upgrade046.py b/pactest/tests/upgrade046.py new file mode 100644 index 00000000..60164b72 --- /dev/null +++ b/pactest/tests/upgrade046.py @@ -0,0 +1,31 @@ +self.description = "File relocation between two packages (reverse order, --force)" + +lp1 = pmpkg("dummy") +lp1.files = ["bin/dummy"] + +lp2 = pmpkg("foobar") +lp2.files = ["bin/foobar", + "usr/share/file"] + +for p in lp1, lp2: + self.addpkg2db("local", p) + +p1 = pmpkg("dummy") +p1.files = ["bin/dummy", + "usr/share/file"] + +p2 = pmpkg("foobar") +p2.files = ["bin/foobar"] + +for p in p1, p2: + self.addpkg(p) + +self.args = "-Uf %s" % " ".join([p.filename() for p in p1, p2]) + +self.addrule("PACMAN_RETCODE=0") +for p in p1, p2: + self.addrule("PKG_EXIST=%s" % p.name) +self.addrule("FILE_MODIFIED=bin/dummy") +self.addrule("FILE_MODIFIED=bin/foobar") +self.addrule("FILE_EXIST=usr/share/file") +self.addrule("FILE_MODIFIED=usr/share/file") -- cgit v1.2.3-70-g09d2 From fbf3beb8d281e85c69f1683df2d9c7b2fb5c1ab7 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 11 Feb 2008 09:51:34 -0600 Subject: ensure chk_fileconflicts reads entire file list If the end of the pB list was reached before the end of pA, we failed to read any remaining files from the pA list. Add an additional loop to ensure all entries of pA are added to the return list regardless of whether we have reached the end of pB. This new loop also eliminates the now-unnecessary check for a null pB, as we need to ensure we are excluding directories in the resulting output anyway. Signed-off-by: Dan McGee --- lib/libalpm/conflict.c | 14 ++++++++++---- pactest/tests/upgrade011.py | 16 ++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 pactest/tests/upgrade011.py (limited to 'pactest') diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c index c093705a..3442902c 100644 --- a/lib/libalpm/conflict.c +++ b/lib/libalpm/conflict.c @@ -251,10 +251,7 @@ static alpm_list_t *chk_filedifference(alpm_list_t *filesA, alpm_list_t *filesB) alpm_list_t *ret = NULL; alpm_list_t *pA = filesA, *pB = filesB; - if(pB == NULL) { - return(alpm_list_strdup(pA)); - } - + /* if both filesA and filesB have entries, do this loop */ while(pA && pB) { const char *strA = pA->data; const char *strB = pB->data; @@ -279,6 +276,15 @@ static alpm_list_t *chk_filedifference(alpm_list_t *filesA, alpm_list_t *filesB) } } } + /* ensure we have completely emptied pA */ + while(pA) { + const char *strA = pA->data; + /* skip directories */ + if(strA[strlen(strA)-1] != '/') { + ret = alpm_list_add(ret, strdup(strA)); + } + pA = pA->next; + } return(ret); } diff --git a/pactest/tests/upgrade011.py b/pactest/tests/upgrade011.py new file mode 100644 index 00000000..d8ed8734 --- /dev/null +++ b/pactest/tests/upgrade011.py @@ -0,0 +1,16 @@ +self.description = "Upgrade a package with a filesystem conflict" + +p = pmpkg("dummy", "2.0-1") +p.files = ["bin/dummy", "usr/share/file"] +self.addpkg(p) + +lp = pmpkg("dummy", "1.0-1") +lp.files = ["bin/dummy"] +self.addpkg2db("local", lp) + +self.filesystem = ["usr/share/file"] + +self.args = "-U %s" % p.filename() + +self.addrule("PACMAN_RETCODE=1") +self.addrule("PKG_VERSION=dummy|1.0-1") -- cgit v1.2.3-70-g09d2 From b206aaee881abd6e256428f2146212cfc1c69be2 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 13 Feb 2008 22:42:34 -0600 Subject: Ensure DESC infolevel is loaded before checking pkg->filename This is the first step of fixing FS#9547. This should not break any existing code that may rely on this function behaving the way it did, and should be good for inclusion in a maint release. In addition, update pactest so it fills the FILENAME field in the DB entries it creates so we can move forward with a real fix to this issue. Signed-off-by: Dan McGee --- lib/libalpm/be_files.c | 4 ---- lib/libalpm/package.c | 7 ++++--- pactest/pmdb.py | 1 + 3 files changed, 5 insertions(+), 7 deletions(-) (limited to 'pactest') diff --git a/lib/libalpm/be_files.c b/lib/libalpm/be_files.c index 724e3c8f..4cd0985e 100644 --- a/lib/libalpm/be_files.c +++ b/lib/libalpm/be_files.c @@ -297,10 +297,6 @@ int _alpm_db_read(pmdb_t *db, pmpkg_t *info, pmdbinfrq_t inforeq) } _alpm_strtrim(line); if(!strcmp(line, "%FILENAME%")) { - /* filename is _new_ - it provides the real name of the package, on the - * server, to allow for us to not tie the name of the actual file to the - * data of the package - */ if(fgets(info->filename, sizeof(info->filename), fp) == NULL) { goto error; } diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 937ee3e0..363cf313 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -162,11 +162,12 @@ const char SYMEXPORT *alpm_pkg_get_filename(pmpkg_t *pkg) ASSERT(handle != NULL, return(NULL)); ASSERT(pkg != NULL, return(NULL)); + if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { + _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); + } + if(!strlen(pkg->filename)) { /* construct the file name, it's not in the desc file */ - if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) { - _alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC); - } if(pkg->arch && strlen(pkg->arch) > 0) { snprintf(pkg->filename, PKG_FILENAME_LEN, "%s-%s-%s" PKGEXT, pkg->name, pkg->version, pkg->arch); diff --git a/pactest/pmdb.py b/pactest/pmdb.py index af392000..e0f328ef 100755 --- a/pactest/pmdb.py +++ b/pactest/pmdb.py @@ -261,6 +261,7 @@ class pmdb: if pkg.reason: data.append(_mksection("REASON", pkg.reason)) else: + data.append(_mksection("FILENAME", pkg.filename())) if pkg.replaces: data.append(_mksection("REPLACES", pkg.replaces)) if pkg.force: -- cgit v1.2.3-70-g09d2