mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2025-03-19 00:21:40 +00:00
core/pacman to 4.0.3-3
This commit is contained in:
parent
0a9158c33d
commit
b987c5086f
3 changed files with 220 additions and 2 deletions
|
@ -0,0 +1,151 @@
|
||||||
|
From 717fdb8ee0fd23cf72fc7d2832317f513caefa2c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Allan McRae <allan@archlinux.org>
|
||||||
|
Date: Sun, 8 Jul 2012 21:36:36 +1000
|
||||||
|
Subject: [PATCH 1/4] Add conflict for replacing owned empty directory
|
||||||
|
|
||||||
|
When two packages own an empty directory, pacman finds no conflict when
|
||||||
|
one of those packages wants to replace the directory with a file or a
|
||||||
|
symlink. When it comes to actually extracting the new file/symlink,
|
||||||
|
pacman sees the directory is still there (we do not remove empty
|
||||||
|
directories if they are owned by a package) and refuses to extract.
|
||||||
|
|
||||||
|
Detect this potential conflict early and bail. Note that it is a
|
||||||
|
_potential_ conflict and not a guaranteed one as the other package owning
|
||||||
|
the directory could be updated or removed first which would remove
|
||||||
|
the conflict. However, pacman currently can not sort package installation
|
||||||
|
order to ensure this, so this conflict requires manual upgrade ordering.
|
||||||
|
|
||||||
|
Signed-off-by: Allan McRae <allan@archlinux.org>
|
||||||
|
Signed-off-by: Dan McGee <dan@archlinux.org>
|
||||||
|
---
|
||||||
|
lib/libalpm/conflict.c | 32 ++++++++++++++++++++++++++------
|
||||||
|
test/pacman/tests/fileconflict009.py | 20 ++++++++++++++++++++
|
||||||
|
test/pacman/tests/fileconflict010.py | 20 ++++++++++++++++++++
|
||||||
|
3 files changed, 66 insertions(+), 6 deletions(-)
|
||||||
|
create mode 100644 test/pacman/tests/fileconflict009.py
|
||||||
|
create mode 100644 test/pacman/tests/fileconflict010.py
|
||||||
|
|
||||||
|
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
|
||||||
|
index 32f6f30..efa1a87 100644
|
||||||
|
--- a/lib/libalpm/conflict.c
|
||||||
|
+++ b/lib/libalpm/conflict.c
|
||||||
|
@@ -328,15 +328,35 @@ const alpm_file_t *_alpm_filelist_contains(alpm_filelist_t *filelist,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int dir_belongsto_pkg(const char *root, const char *dirpath,
|
||||||
|
+static int dir_belongsto_pkg(alpm_handle_t *handle, const char *dirpath,
|
||||||
|
alpm_pkg_t *pkg)
|
||||||
|
{
|
||||||
|
+ alpm_list_t *i;
|
||||||
|
struct stat sbuf;
|
||||||
|
char path[PATH_MAX];
|
||||||
|
char abspath[PATH_MAX];
|
||||||
|
- struct dirent *ent = NULL;
|
||||||
|
DIR *dir;
|
||||||
|
+ struct dirent *ent = NULL;
|
||||||
|
+ const char *root = handle->root;
|
||||||
|
+
|
||||||
|
+ /* TODO: this is an overly strict check but currently pacman will not
|
||||||
|
+ * overwrite a directory with a file (case 10/11 in add.c). Adjusting that
|
||||||
|
+ * is not simple as even if the directory is being unowned by a conflicting
|
||||||
|
+ * package, pacman does not sort this to ensure all required directory
|
||||||
|
+ * "removals" happen before installation of file/symlink */
|
||||||
|
+
|
||||||
|
+ /* check that no other _installed_ package owns the directory */
|
||||||
|
+ for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = i->next) {
|
||||||
|
+ if(pkg == i->data) {
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if(_alpm_filelist_contains(alpm_pkg_get_files(i->data), dirpath)) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
+ /* check all files in directory are owned by the package */
|
||||||
|
snprintf(abspath, PATH_MAX, "%s%s", root, dirpath);
|
||||||
|
dir = opendir(abspath);
|
||||||
|
if(dir == NULL) {
|
||||||
|
@@ -349,13 +369,13 @@ static int dir_belongsto_pkg(const char *root, const char *dirpath,
|
||||||
|
if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- snprintf(path, PATH_MAX, "%s/%s", dirpath, name);
|
||||||
|
+ snprintf(path, PATH_MAX, "%s%s", dirpath, name);
|
||||||
|
snprintf(abspath, PATH_MAX, "%s%s", root, path);
|
||||||
|
if(stat(abspath, &sbuf) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(S_ISDIR(sbuf.st_mode)) {
|
||||||
|
- if(dir_belongsto_pkg(root, path, pkg)) {
|
||||||
|
+ if(dir_belongsto_pkg(handle, path, pkg)) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
closedir(dir);
|
||||||
|
@@ -529,9 +549,9 @@ alpm_list_t *_alpm_db_find_fileconflicts(alpm_handle_t *handle,
|
||||||
|
sprintf(dir, "%s/", filestr);
|
||||||
|
if(_alpm_filelist_contains(alpm_pkg_get_files(dbpkg), dir)) {
|
||||||
|
_alpm_log(handle, ALPM_LOG_DEBUG,
|
||||||
|
- "check if all files in %s belongs to %s\n",
|
||||||
|
+ "check if all files in %s belong to %s\n",
|
||||||
|
dir, dbpkg->name);
|
||||||
|
- resolved_conflict = dir_belongsto_pkg(handle->root, filestr, dbpkg);
|
||||||
|
+ resolved_conflict = dir_belongsto_pkg(handle, dir, dbpkg);
|
||||||
|
}
|
||||||
|
free(dir);
|
||||||
|
}
|
||||||
|
diff --git a/test/pacman/tests/fileconflict009.py b/test/pacman/tests/fileconflict009.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..904af4a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/test/pacman/tests/fileconflict009.py
|
||||||
|
@@ -0,0 +1,20 @@
|
||||||
|
+self.description = "dir->symlink change during package upgrade (directory conflict)"
|
||||||
|
+
|
||||||
|
+lp1 = pmpkg("pkg1")
|
||||||
|
+lp1.files = ["dir/"]
|
||||||
|
+self.addpkg2db("local", lp1)
|
||||||
|
+
|
||||||
|
+lp2 = pmpkg("pkg2")
|
||||||
|
+lp2.files = ["dir/"]
|
||||||
|
+self.addpkg2db("local", lp2)
|
||||||
|
+
|
||||||
|
+p = pmpkg("pkg1", "1.0-2")
|
||||||
|
+p.files = ["dir -> /usr/dir"]
|
||||||
|
+self.addpkg2db("sync", p)
|
||||||
|
+
|
||||||
|
+self.args = "-S pkg1"
|
||||||
|
+
|
||||||
|
+self.addrule("PACMAN_RETCODE=1")
|
||||||
|
+self.addrule("PKG_VERSION=pkg1|1.0-1")
|
||||||
|
+self.addrule("PKG_VERSION=pkg2|1.0-1")
|
||||||
|
+self.addrule("DIR_EXIST=dir/")
|
||||||
|
diff --git a/test/pacman/tests/fileconflict010.py b/test/pacman/tests/fileconflict010.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..0a3ce83
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/test/pacman/tests/fileconflict010.py
|
||||||
|
@@ -0,0 +1,20 @@
|
||||||
|
+self.description = "dir->file change during package upgrade (directory conflict)"
|
||||||
|
+
|
||||||
|
+lp1 = pmpkg("pkg1")
|
||||||
|
+lp1.files = ["dir/"]
|
||||||
|
+self.addpkg2db("local", lp1)
|
||||||
|
+
|
||||||
|
+lp2 = pmpkg("pkg2")
|
||||||
|
+lp2.files = ["dir/"]
|
||||||
|
+self.addpkg2db("local", lp2)
|
||||||
|
+
|
||||||
|
+p = pmpkg("pkg1", "1.0-2")
|
||||||
|
+p.files = ["dir"]
|
||||||
|
+self.addpkg2db("sync", p)
|
||||||
|
+
|
||||||
|
+self.args = "-S pkg1"
|
||||||
|
+
|
||||||
|
+self.addrule("PACMAN_RETCODE=1")
|
||||||
|
+self.addrule("PKG_VERSION=pkg1|1.0-1")
|
||||||
|
+self.addrule("PKG_VERSION=pkg2|1.0-1")
|
||||||
|
+self.addrule("DIR_EXIST=dir/")
|
||||||
|
--
|
||||||
|
1.7.11.1
|
60
core/pacman/0002-Check-empty-subdirectory-ownership.patch
Normal file
60
core/pacman/0002-Check-empty-subdirectory-ownership.patch
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
From 44e9fdd0e848382337edb97d41e7317638a67bac Mon Sep 17 00:00:00 2001
|
||||||
|
From: Allan McRae <allan@archlinux.org>
|
||||||
|
Date: Sun, 8 Jul 2012 23:58:37 +1000
|
||||||
|
Subject: [PATCH 2/4] Check empty subdirectory ownership
|
||||||
|
|
||||||
|
When checking if a package owns a directory, it is important to check
|
||||||
|
not only that all the files in the directory are part of the package,
|
||||||
|
but also if the directory is part of a package. This catches empty
|
||||||
|
subdirectories during conflict checking for directory to file/symlink
|
||||||
|
replacements.
|
||||||
|
|
||||||
|
Signed-off-by: Allan McRae <allan@archlinux.org>
|
||||||
|
Signed-off-by: Dan McGee <dan@archlinux.org>
|
||||||
|
---
|
||||||
|
lib/libalpm/conflict.c | 5 +++++
|
||||||
|
test/pacman/tests/fileconflict012.py | 17 +++++++++++++++++
|
||||||
|
2 files changed, 22 insertions(+)
|
||||||
|
create mode 100644 test/pacman/tests/fileconflict012.py
|
||||||
|
|
||||||
|
diff --git a/lib/libalpm/conflict.c b/lib/libalpm/conflict.c
|
||||||
|
index efa1a87..d6e5d8c 100644
|
||||||
|
--- a/lib/libalpm/conflict.c
|
||||||
|
+++ b/lib/libalpm/conflict.c
|
||||||
|
@@ -339,6 +339,11 @@ static int dir_belongsto_pkg(alpm_handle_t *handle, const char *dirpath,
|
||||||
|
struct dirent *ent = NULL;
|
||||||
|
const char *root = handle->root;
|
||||||
|
|
||||||
|
+ /* check directory is actually in package - used for subdirectory checks */
|
||||||
|
+ if(!_alpm_filelist_contains(alpm_pkg_get_files(pkg), dirpath)) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* TODO: this is an overly strict check but currently pacman will not
|
||||||
|
* overwrite a directory with a file (case 10/11 in add.c). Adjusting that
|
||||||
|
* is not simple as even if the directory is being unowned by a conflicting
|
||||||
|
diff --git a/test/pacman/tests/fileconflict012.py b/test/pacman/tests/fileconflict012.py
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..421b739
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/test/pacman/tests/fileconflict012.py
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+self.description = "dir->file change during package upgrade (filesystem file conflict)"
|
||||||
|
+
|
||||||
|
+lp1 = pmpkg("pkg1")
|
||||||
|
+lp1.files = ["dir/"]
|
||||||
|
+self.addpkg2db("local", lp1)
|
||||||
|
+
|
||||||
|
+self.filesystem = ["dir/file"]
|
||||||
|
+
|
||||||
|
+p = pmpkg("pkg1", "1.0-2")
|
||||||
|
+p.files = ["dir"]
|
||||||
|
+self.addpkg2db("sync", p)
|
||||||
|
+
|
||||||
|
+self.args = "-S pkg1"
|
||||||
|
+
|
||||||
|
+self.addrule("PACMAN_RETCODE=1")
|
||||||
|
+self.addrule("PKG_VERSION=pkg1|1.0-1")
|
||||||
|
+self.addrule("DIR_EXIST=dir/")
|
||||||
|
--
|
||||||
|
1.7.11.1
|
|
@ -12,13 +12,13 @@ noautobuild=1
|
||||||
|
|
||||||
pkgname=pacman
|
pkgname=pacman
|
||||||
pkgver=4.0.3
|
pkgver=4.0.3
|
||||||
pkgrel=2.1
|
pkgrel=3
|
||||||
pkgdesc="A library-based package manager with dependency support"
|
pkgdesc="A library-based package manager with dependency support"
|
||||||
arch=('i686' 'x86_64')
|
arch=('i686' 'x86_64')
|
||||||
url="http://www.archlinux.org/pacman/"
|
url="http://www.archlinux.org/pacman/"
|
||||||
license=('GPL')
|
license=('GPL')
|
||||||
groups=('base')
|
groups=('base')
|
||||||
depends=('bash' 'glibc>=2.15' 'libarchive>=3.0.2' 'curl>=7.19.4'
|
depends=('bash' 'glibc>=2.16.0' 'libarchive>=3.0.2' 'curl>=7.19.4'
|
||||||
'gpgme' 'pacman-mirrorlist')
|
'gpgme' 'pacman-mirrorlist')
|
||||||
makedepends=('asciidoc')
|
makedepends=('asciidoc')
|
||||||
optdepends=('fakeroot: for makepkg usage as normal user')
|
optdepends=('fakeroot: for makepkg usage as normal user')
|
||||||
|
@ -26,9 +26,13 @@ backup=(etc/pacman.conf etc/makepkg.conf)
|
||||||
install=pacman.install
|
install=pacman.install
|
||||||
options=(!libtool)
|
options=(!libtool)
|
||||||
source=(ftp://ftp.archlinux.org/other/pacman/$pkgname-$pkgver.tar.gz{,.sig}
|
source=(ftp://ftp.archlinux.org/other/pacman/$pkgname-$pkgver.tar.gz{,.sig}
|
||||||
|
0001-Add-conflict-for-replacing-owned-empty-directory.patch
|
||||||
|
0002-Check-empty-subdirectory-ownership.patch
|
||||||
pacman.conf
|
pacman.conf
|
||||||
makepkg.conf)
|
makepkg.conf)
|
||||||
md5sums=('387965c7125e60e5f0b9ff3b427fe0f9'
|
md5sums=('387965c7125e60e5f0b9ff3b427fe0f9'
|
||||||
|
'0c1d326d0ca48c9a9819ea8060ea3bba'
|
||||||
|
'02db451be806335ce189ffadb5cf84b9'
|
||||||
'1a70392526c8768470da678b31905a6e'
|
'1a70392526c8768470da678b31905a6e'
|
||||||
'9a7d914def620cc4dd1a94ed53892175'
|
'9a7d914def620cc4dd1a94ed53892175'
|
||||||
'e6d44e71b847d2c98bb38087e33cd76b')
|
'e6d44e71b847d2c98bb38087e33cd76b')
|
||||||
|
@ -39,6 +43,9 @@ PKGEXT='.pkg.tar.gz'
|
||||||
build() {
|
build() {
|
||||||
cd $srcdir/$pkgname-$pkgver
|
cd $srcdir/$pkgname-$pkgver
|
||||||
|
|
||||||
|
patch -p1 -i $srcdir/0001-Add-conflict-for-replacing-owned-empty-directory.patch
|
||||||
|
patch -p1 -i $srcdir/0002-Check-empty-subdirectory-ownership.patch
|
||||||
|
|
||||||
./configure --prefix=/usr --sysconfdir=/etc \
|
./configure --prefix=/usr --sysconfdir=/etc \
|
||||||
--localstatedir=/var --enable-doc
|
--localstatedir=/var --enable-doc
|
||||||
make
|
make
|
||||||
|
|
Loading…
Reference in a new issue