From d6f31dc78852939f7f83648529887caca2ac9294 Mon Sep 17 00:00:00 2001 From: Ram Bhamidipaty Date: Tue, 26 Jun 2012 22:02:18 -0700 Subject: Add man page for pactree Add a man page for the pactree utility. Feedback-from: Allan McRae Feedback-from: Andrew Gregory Signed-off-by: Ram Bhamidipaty Signed-off-by: Dan McGee --- doc/.gitignore | 1 + doc/Makefile.am | 4 ++++ doc/pactree.8.txt | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 doc/pactree.8.txt diff --git a/doc/.gitignore b/doc/.gitignore index 5625735a..a96ddb30 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -5,6 +5,7 @@ makepkg.conf.5 pacman.8 pacman-key.8 pacman.conf.5 +pactree.8 pkgdelta.8 repo-add.8 repo-remove.8 diff --git a/doc/Makefile.am b/doc/Makefile.am index 4c1700b9..dd37124f 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -10,6 +10,7 @@ ASCIIDOC_MANS = \ vercmp.8 \ pkgdelta.8 \ pacman-key.8 \ + pactree.8 \ PKGBUILD.5 \ makepkg.conf.5 \ pacman.conf.5 \ @@ -24,6 +25,7 @@ HTML_MANPAGES = \ vercmp.8.html \ pkgdelta.8.html \ pacman-key.8.html \ + pactree.8.html \ PKGBUILD.5.html \ makepkg.conf.5.html \ pacman.conf.5.html \ @@ -48,6 +50,7 @@ EXTRA_DIST = \ vercmp.8.txt \ pkgdelta.8.txt \ pacman-key.8.txt \ + pactree.8.txt \ PKGBUILD.5.txt \ PKGBUILD-example.txt \ makepkg.conf.5.txt \ @@ -144,6 +147,7 @@ repo-add.8 repo-add.8.html: repo-add.8.txt vercmp.8 vercmp.8.html: vercmp.8.txt pkgdelta.8 pkgdelta.8.html: pkgdelta.8.txt pacman-key.8 pacman-key.8.html: pacman-key.8.txt +pactree.8 pactree.8.html: pactree.8.txt PKGBUILD.5 PKGBUILD.5.html: PKGBUILD.5.txt PKGBUILD-example.txt makepkg.conf.5 makepkg.conf.5.html: makepkg.conf.5.txt pacman.conf.5 pacman.conf.5.html: pacman.conf.5.txt diff --git a/doc/pactree.8.txt b/doc/pactree.8.txt new file mode 100644 index 00000000..669a14bb --- /dev/null +++ b/doc/pactree.8.txt @@ -0,0 +1,62 @@ +///// +vim:set ts=4 sw=4 syntax=asciidoc noet spell spelllang=en_us: +///// +pactree(8) +========= + +Name +---- +pactree - package dependency tree viewer + + +Synopsis +-------- +'pactree' [options] package + +Description +----------- +Pactree produces a dependency tree for a package. + +By default a tree like output is generated, but with the -g option a graphviz +description is generated. + +Options +------- +*-b, \--dbpath*:: + Specify an alternative database location. + +*-c, \--color*:: + Colorize output. + +*-d, \--depth *:: + Limits the number of levels of dependency to show. A zero means + show the named package only, one shows the packages that are directly + required. + +*-g, \--graph*:: + Generate graphviz description. If this option is given, the -c and -l + options are ignored. + +*-h, \--help*:: + Output syntax and command line options. + +*-l, \--linear*:: + Prints package names at the start of each line, one per line. + +*-r, \--reverse*:: + Show packages that depend on the named package. + +*-s, \--sync*:: + Read package data from sync databases instead of local database. + +*-u, \--unique*:: + List dependent packages once. Implies --linear. + +*\--config *:: + Specify an alternate pacman configuration file. + +See Also +-------- +linkman:pacman[8], linkman:pacman.conf[5], linkman:makepkg[8] + +include::footer.txt[] -- cgit v1.2.3 From 717fdb8ee0fd23cf72fc7d2832317f513caefa2c Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sun, 8 Jul 2012 21:36:36 +1000 Subject: 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 32f6f303..efa1a87c 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 00000000..904af4a3 --- /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 00000000..0a3ce835 --- /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/") -- cgit v1.2.3 From 44e9fdd0e848382337edb97d41e7317638a67bac Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sun, 8 Jul 2012 23:58:37 +1000 Subject: 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 efa1a87c..d6e5d8c6 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 00000000..421b739a --- /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/") -- cgit v1.2.3 From d7c3164fd5824f1e300d2c7ee92f5c2446461c03 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Wed, 28 Mar 2012 20:22:18 -0400 Subject: makepkg.conf: enable curl's cookie engine for http Implements FS#28098. Signed-off-by: Dave Reisner Signed-off-by: Dan McGee --- etc/makepkg.conf.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in index e9152c8b..dfdad646 100644 --- a/etc/makepkg.conf.in +++ b/etc/makepkg.conf.in @@ -9,8 +9,8 @@ #-- The download utilities that makepkg should use to acquire sources # Format: 'protocol::agent' 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' + 'http::/usr/bin/curl -b "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -b "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'rsync::/usr/bin/rsync --no-motd -z %u %o' 'scp::/usr/bin/scp -C %u %o') -- cgit v1.2.3 From 5c1ba2d5fd5263525a0355cdce900b58dc41c916 Mon Sep 17 00:00:00 2001 From: Dave Reisner Date: Mon, 2 Jul 2012 10:57:01 -0400 Subject: makepkg.conf: add -q option for curl Avoid involving the user's ~/.curlrc file as this may alter the expected behavior of downloads. ref: https://bbs.archlinux.org/viewtopic.php?pid=1124441 Signed-off-by: Dave Reisner Signed-off-by: Dan McGee --- etc/makepkg.conf.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/etc/makepkg.conf.in b/etc/makepkg.conf.in index dfdad646..a31a2135 100644 --- a/etc/makepkg.conf.in +++ b/etc/makepkg.conf.in @@ -8,9 +8,9 @@ # #-- The download utilities that makepkg should use to acquire sources # Format: 'protocol::agent' -DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' - 'http::/usr/bin/curl -b "" -fLC - --retry 3 --retry-delay 3 -o %o %u' - 'https::/usr/bin/curl -b "" -fLC - --retry 3 --retry-delay 3 -o %o %u' +DLAGENTS=('ftp::/usr/bin/curl -qfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u' + 'http::/usr/bin/curl -qb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' + 'https::/usr/bin/curl -qb "" -fLC - --retry 3 --retry-delay 3 -o %o %u' 'rsync::/usr/bin/rsync --no-motd -z %u %o' 'scp::/usr/bin/scp -C %u %o') -- cgit v1.2.3