diff --git a/core/pacman/0001-Add-conflict-for-replacing-owned-empty-directory.patch b/core/pacman/0001-Add-conflict-for-replacing-owned-empty-directory.patch deleted file mode 100644 index 30481ebc8..000000000 --- a/core/pacman/0001-Add-conflict-for-replacing-owned-empty-directory.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 717fdb8ee0fd23cf72fc7d2832317f513caefa2c Mon Sep 17 00:00:00 2001 -From: Allan McRae -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 -Signed-off-by: Dan McGee ---- - 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 diff --git a/core/pacman/0002-Check-empty-subdirectory-ownership.patch b/core/pacman/0002-Check-empty-subdirectory-ownership.patch deleted file mode 100644 index 99bf33ca4..000000000 --- a/core/pacman/0002-Check-empty-subdirectory-ownership.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 44e9fdd0e848382337edb97d41e7317638a67bac Mon Sep 17 00:00:00 2001 -From: Allan McRae -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 -Signed-off-by: Dan McGee ---- - 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 diff --git a/core/pacman/0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch b/core/pacman/0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch deleted file mode 100644 index ae3a57ecd..000000000 --- a/core/pacman/0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 1bf05e706b5edac92e9c913a69ca8686c6440f8b Mon Sep 17 00:00:00 2001 -From: Dan McGee -Date: Fri, 04 May 2012 16:41:40 +0000 -Subject: Ensure pre_upgrade scriptlet gets old package version - -This was accidentally broken in the refactor done in commit 73139ccb. - -Fixes FS#29371. - -Signed-off-by: Dan McGee ---- -diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c -index 6c2f0cb..c49d99b 100644 ---- a/lib/libalpm/add.c -+++ b/lib/libalpm/add.c -@@ -488,8 +488,9 @@ static int commit_single_pkg(alpm_handle_t *handle, alpm_pkg_t *newpkg, - if(alpm_pkg_has_scriptlet(newpkg) && - !(trans->flags & ALPM_TRANS_FLAG_NOSCRIPTLET)) { - const char *scriptlet_name = is_upgrade ? "pre_upgrade" : "pre_install"; -- _alpm_runscriptlet(handle, pkgfile, -- scriptlet_name, newpkg->version, NULL, 1); -+ -+ _alpm_runscriptlet(handle, pkgfile, scriptlet_name, -+ newpkg->version, oldpkg ? oldpkg->version : NULL, 1); - } - - /* we override any pre-set reason if we have alldeps or allexplicit set */ --- -cgit v0.9.0.2-13-g2bd3 diff --git a/core/pacman/PKGBUILD b/core/pacman/PKGBUILD index 4f7516679..48601e56a 100644 --- a/core/pacman/PKGBUILD +++ b/core/pacman/PKGBUILD @@ -9,33 +9,30 @@ # - makepkg.conf: adjusted C/CXX/LDFLAGS pkgname=pacman -pkgver=4.0.3 -pkgrel=7 +pkgver=4.1.0 +pkgrel=2 pkgdesc="A library-based package manager with dependency support" arch=('i686' 'x86_64') url="http://www.archlinux.org/pacman/" license=('GPL') groups=('base' 'base-devel') -depends=('bash' 'glibc>=2.16.0' 'libarchive>=3.1.2' 'curl>=7.19.4' +depends=('bash>=4.2.042-2' 'glibc>=2.17-2' 'libarchive>=3.1.2' 'curl>=7.19.4' 'gpgme' 'pacman-mirrorlist') -makedepends=('asciidoc') +checkdepends=('python2' 'fakechroot') optdepends=('fakeroot: for makepkg usage as normal user') +provides=('pacman-contrib') +conflicts=('pacman-contrib') +replaces=('pacman-contrib') backup=(etc/pacman.conf etc/makepkg.conf) install=pacman.install options=(!libtool) 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 - 0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch pacman.conf makepkg.conf) -md5sums=('387965c7125e60e5f0b9ff3b427fe0f9' - '1a70392526c8768470da678b31905a6e' - '0c1d326d0ca48c9a9819ea8060ea3bba' - '02db451be806335ce189ffadb5cf84b9' - '2e8cbf55a94b1954b167c5dee6b62317' - '9a7d914def620cc4dd1a94ed53892175' - 'e6d44e71b847d2c98bb38087e33cd76b') +md5sums=('a0f2b3148bee4784f21cf373cf59a0bc' + '4959b8d00056398195f4e549e7bdd346' + '5c491b27bae54d93d6ba972ce0fccfa7' + '105c1e891b91cc715bb80b532514f8b1') # keep an upgrade path for older installations PKGEXT='.pkg.tar.gz' @@ -48,8 +45,11 @@ build() { patch -p1 -i $srcdir/0003-Ensure-pre_upgrade-scriptlet-gets-old-package-version.patch ./configure --prefix=/usr --sysconfdir=/etc \ - --localstatedir=/var --enable-doc + --localstatedir=/var --enable-doc \ + --with-scriptlet-shell=/usr/bin/bash \ + --with-ldconfig=/usr/bin/ldconfig make + make -C contrib } check() { @@ -59,36 +59,23 @@ check() { package() { cd $srcdir/$pkgname-$pkgver make DESTDIR=$pkgdir install + make DESTDIR=$pkgdir -C contrib install # install Arch specific stuff - mkdir -p $pkgdir/etc + install -dm755 $pkgdir/etc + install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf case "$CARCH" in - i686) - install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf - mycarch="i686" - mychost="i686-pc-linux-gnu" - myflags="-march=i686 " - ;; - x86_64) - install -m644 $srcdir/pacman.conf.x86_64 $pkgdir/etc/pacman.conf - mycarch="x86_64" - mychost="x86_64-unknown-linux-gnu" - myflags="-march=x86-64 " - ;; arm) - install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf mycarch="arm" mychost="armv5tel-unknown-linux-gnueabi" myflags="-march=armv5te " ;; armv6h) - install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf mycarch="armv6h" mychost="armv6l-unknown-linux-gnueabihf" myflags="-march=armv6 -mfloat-abi=hard -mfpu=vfp " ;; armv7h) - install -m644 $srcdir/pacman.conf $pkgdir/etc/pacman.conf mycarch="armv7h" mychost="armv7l-unknown-linux-gnueabihf" myflags="-march=armv7-a -mfloat-abi=hard -mfpu=vfpv3-d16 " @@ -102,11 +89,13 @@ package() { -e "s|@CARCHFLAGS[@]|$myflags|g" sed -i $pkgdir/etc/pacman.conf -e "s|@CARCH[@]|$mycarch|g" - # install completion files - install -Dm644 contrib/bash_completion "$pkgdir/usr/share/bash-completion/completions/pacman" + # put bash_completion in the right location + install -dm755 ${pkgdir}/usr/share/bash-completion/completions + mv ${pkgdir}/etc/bash_completion.d/pacman \ + ${pkgdir}/usr/share/bash-completion/completions + rmdir ${pkgdir}/etc/bash_completion.d + for f in makepkg pacman-key; do ln -s pacman "$pkgdir/usr/share/bash-completion/completions/$f" done - - install -Dm644 contrib/zsh_completion $pkgdir/usr/share/zsh/site-functions/_pacman } diff --git a/core/pacman/makepkg.conf b/core/pacman/makepkg.conf index c8505588b..40295d264 100644 --- a/core/pacman/makepkg.conf +++ b/core/pacman/makepkg.conf @@ -11,7 +11,7 @@ DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' 'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u' 'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u' - 'rsync::/usr/bin/rsync -z %u %o' + 'rsync::/usr/bin/rsync --no-motd -z %u %o' 'scp::/usr/bin/scp -C %u %o') # Other common tools: @@ -29,11 +29,15 @@ CHOST="@CHOST@" #-- Compiler and Linker Flags # -march (or -mcpu) builds exclusively for an architecture # -mtune optimizes for an architecture, but builds for whole processor family -CFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2" -CXXFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -D_FORTIFY_SOURCE=2" +CPPFLAGS="-D_FORTIFY_SOURCE=2" +CFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4" +CXXFLAGS="@CARCHFLAGS@-O2 -pipe -fstack-protector --param=ssp-buffer-size=4" LDFLAGS="" #-- Make Flags: change this for DistCC/SMP systems #MAKEFLAGS="-j2" +#-- Debugging flags +DEBUG_CFLAGS="-g -fvar-tracking-assignments" +DEBUG_CXXFLAGS="-g -fvar-tracking-assignments" ######################################################################### # BUILD ENVIRONMENT @@ -63,18 +67,20 @@ BUILDENV=(fakeroot !distcc color !ccache check !sign) # These are default values for the options=() settings ######################################################################### # -# Default: OPTIONS=(strip docs libtool emptydirs zipman purge !upx) +# Default: OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !debug) # A negated option will do the opposite of the comments below. # -#-- strip: Strip symbols from binaries/libraries -#-- docs: Save doc directories specified by DOC_DIRS -#-- libtool: Leave libtool (.la) files in packages -#-- emptydirs: Leave empty directories in packages -#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip -#-- purge: Remove files specified by PURGE_TARGETS -#-- upx: Compress binary executable files using UPX +#-- strip: Strip symbols from binaries/libraries +#-- docs: Save doc directories specified by DOC_DIRS +#-- libtool: Leave libtool (.la) files in packages +#-- staticlibs: Leave static library (.a) files in packages +#-- emptydirs: Leave empty directories in packages +#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip +#-- purge: Remove files specified by PURGE_TARGETS +#-- upx: Compress binary executable files using UPX +#-- debug: Add debugging flags as specified in DEBUG_* variables # -OPTIONS=(strip docs libtool emptydirs zipman purge !upx) +OPTIONS=(strip docs libtool staticlibs emptydirs zipman purge !upx !debug) #-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512 INTEGRITY_CHECK=(md5) @@ -108,6 +114,18 @@ PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod) #-- Specify a key to use for package signing #GPGKEY="" +######################################################################### +# COMPRESSION DEFAULTS +######################################################################### +# +COMPRESSGZ=(gzip -c -f -n) +COMPRESSBZ2=(bzip2 -c -f) +COMPRESSXZ=(xz -c -z -) +COMPRESSLRZ=(lrzip -q) +COMPRESSLZO=(lzop -q) +COMPRESSZ=(compress -c -f) + + ######################################################################### # EXTENSION DEFAULTS ######################################################################### diff --git a/core/pacman/pacman.conf b/core/pacman/pacman.conf index dcb2cbe04..580289460 100644 --- a/core/pacman/pacman.conf +++ b/core/pacman/pacman.conf @@ -15,11 +15,10 @@ #LogFile = /var/log/pacman.log #GPGDir = /etc/pacman.d/gnupg/ HoldPkg = pacman glibc -# If upgrades are available for these packages they will be asked for first -#SyncFirst = pacman #XferCommand = /usr/bin/curl -C - -f %u > %o #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u #CleanMethod = KeepInstalled +#UseDelta = 0.7 Architecture = @CARCH@ # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup @@ -31,7 +30,7 @@ Architecture = @CARCH@ # Misc options #UseSyslog -#UseDelta +#Color #TotalDownload CheckSpace #VerbosePkgLists @@ -41,7 +40,9 @@ CheckSpace # The compiled in default is equivalent to the following line. This requires # you to locally sign and trust packager keys using `pacman-key` for them to be # considered valid. -#SigLevel = Optional TrustedOnly +#SigLevel = Required DatabaseOptional +#LocalFileSigLevel = Optional +#RemoteFileSigLevel = Required # If you wish to check signatures but avoid local sign and trust issues, use # the following line. This will treat any key imported into pacman's keyring as # trusted. @@ -73,23 +74,18 @@ SigLevel = Never # after the header, and they will be used before the default mirrors. [core] -#SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist [extra] -#SigLevel = PackageOptional Include = /etc/pacman.d/mirrorlist [community] -#SigLevel = PackageOptional Include = /etc/pacman.d/mirrorlist [alarm] -#SigLevel = PackageOptional Include = /etc/pacman.d/mirrorlist [aur] -#SigLevel = PackageOptional Include = /etc/pacman.d/mirrorlist # An example of a custom package repository. See the pacman manpage for