[pacman-dev] [PATCH 1/2] Add two new pactests for --dbonly
It caught me by surprise that: 1. These weren't being tested at all 2. The --dbonly combined with -U not only "works" but is also completely undocumented. It also has some weird behavior on install vs. upgrade that may need addressing. Add some tests which will hopefully provoke some discussion. Signed-off-by: Dan McGee <dan@archlinux.org> --- pactest/tests/database010.py | 17 +++++++++++++++++ pactest/tests/database011.py | 17 +++++++++++++++++ pactest/tests/database012.py | 31 +++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 0 deletions(-) create mode 100644 pactest/tests/database010.py create mode 100644 pactest/tests/database011.py create mode 100644 pactest/tests/database012.py diff --git a/pactest/tests/database010.py b/pactest/tests/database010.py new file mode 100644 index 0000000..662dc1b --- /dev/null +++ b/pactest/tests/database010.py @@ -0,0 +1,17 @@ +# TODO: these are labeled as database packages because they sure seem to me to +# be database-type operations. In their current implementation however they are +# calling -U and -R rather than -D. Obviously the tests will need to be updated +# if this changes. +self.description = "Remove a package with --dbonly, no files touched" + +p = pmpkg("dummy") +p.files = ["bin/dummy", + "usr/man/man1/dummy.1"] +self.addpkg2db("local", p) + +self.args = "-R --dbonly %s" % p.name + +self.addrule("PACMAN_RETCODE=0") +self.addrule("!PKG_EXIST=dummy") +for f in p.files: + self.addrule("FILE_EXIST=%s" % f) diff --git a/pactest/tests/database011.py b/pactest/tests/database011.py new file mode 100644 index 0000000..7d475d9 --- /dev/null +++ b/pactest/tests/database011.py @@ -0,0 +1,17 @@ +# TODO: these are labeled as database packages because they sure seem to me to +# be database-type operations. In their current implementation however they are +# calling -U and -R rather than -D. Obviously the tests will need to be updated +# if this changes. +self.description = "Install a package with --dbonly, no files touched" + +p = pmpkg("dummy") +p.files = ["bin/dummy", + "usr/man/man1/dummy.1"] +self.addpkg(p) + +self.args = "-U --dbonly %s" % p.filename() + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_EXIST=dummy") +for f in p.files: + self.addrule("!FILE_EXIST=%s" % f) diff --git a/pactest/tests/database012.py b/pactest/tests/database012.py new file mode 100644 index 0000000..a1f8698 --- /dev/null +++ b/pactest/tests/database012.py @@ -0,0 +1,31 @@ +# TODO: these are labeled as database packages because they sure seem to me to +# be database-type operations. In their current implementation however they are +# calling -U and -R rather than -D. Obviously the tests will need to be updated +# if this changes. +self.description = "Upgrade a package with --dbonly, no files touched" + +lp = pmpkg("dummy") +lp.files = ["bin/dummy", + "usr/man/man1/dummy.1"] +self.addpkg2db("local", lp) + +p = pmpkg("dummy", "2.0-1") +p.files = ["bin/dummy", + "bin/dummy2", + "usr/man/man1/dummy.1"] +self.addpkg(p) + +self.args = "-U --dbonly %s" % p.filename() + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_EXIST=dummy") +self.addrule("PKG_VERSION=dummy|2.0-1") +for f in lp.files: + self.addrule("!FILE_EXIST=%s" % f) +# TODO: I honestly think the above should NOT delete the original files, it +# should upgrade the DB entry without touching anything on the file system. +# E.g. this test should be the same as: +# pacman -R --dbonly dummy && pacman -U --dbonly dummy.pkg.tar.gz +#for f in lp.files: +# self.addrule("FILE_EXIST=%s" % f) +self.addrule("!FILE_EXIST=bin/dummy2") -- 1.7.1
We had the long option wrong in some places and its behavior wasn't documented at all with regards to -U/--upgrade. Signed-off-by: Dan McGee <dan@archlinux.org> --- doc/pacman.8.txt | 15 ++++++++++++--- src/pacman/pacman.c | 3 ++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index 249923a..3d14a42 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -90,8 +90,9 @@ to determine which packages need upgrading. This behavior operates as follows: *-U, \--upgrade*:: Upgrade or add package(s) to the system and install the required dependencies from sync repos. Either a URL or file path can be - specified. This is a ``remove-then-add'' process. See <<HCF,Handling Config - Files>> for an explanation on how pacman takes care of config files. + specified. This is a ``remove-then-add'' process. See <<UO,Upgrade + Options>> below; also see <<HCF,Handling Config Files>> for an explanation + on how pacman takes care of config files. *-V, \--version*:: Display version and exit. @@ -273,7 +274,7 @@ Remove Options[[RO]] or more target packages. This operation is recursive, and must be used with care since it can remove many potentially needed packages. -*-k, \--keep*:: +*-k, \--dbonly*:: Removes the database entry only. Leaves all files in place. *-n, \--nosave*:: @@ -375,6 +376,14 @@ linkman:pacman.conf[5]. separating them with a comma. +Upgrade Options[[UO]] +-------------------- +*-k, \--dbonly*:: + Adds the database entries for the specified packages but do not install any + of the files. On an upgrade operation, the existing package and all files + will be removed and the database entry for the new package will be added. + + Handling Config Files[[HCF]] ---------------------------- Pacman uses the same logic as rpm to determine action against files that are diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 7461b6b..09a8105 100644 --- a/src/pacman/pacman.c +++ b/src/pacman/pacman.c @@ -90,7 +90,7 @@ static void usage(int op, const char * const myname) printf("%s:\n", str_opt); printf(_(" -c, --cascade remove packages and all packages that depend on them\n")); printf(_(" -d, --nodeps skip dependency checks\n")); - printf(_(" -k, --dbonly only remove database entry, do not remove files\n")); + printf(_(" -k, --dbonly only remove database entries, do not remove files\n")); printf(_(" -n, --nosave remove configuration files as well\n")); printf(_(" -s, --recursive remove dependencies also (that won't break packages)\n" " (-ss includes explicitly installed dependencies too)\n")); @@ -105,6 +105,7 @@ static void usage(int op, const char * const myname) printf(_(" --asexplicit install packages as explicitly installed\n")); printf(_(" -d, --nodeps skip dependency checks\n")); printf(_(" -f, --force force install, overwrite conflicting files\n")); + printf(_(" -k, --dbonly add database entries, do not install or keep existing files\n")); printf(_(" --print only print the targets instead of performing the operation\n")); printf(_(" --print-format <string>\n" " specify how the targets should be printed\n")); -- 1.7.1
participants (1)
-
Dan McGee