[pacman-dev] [PATCH 2/3] add support for back end fnmatch'd options

Dan McGee dpmcgee at gmail.com
Sun Nov 13 14:00:54 EST 2011


On Sat, Nov 12, 2011 at 1:13 PM, Dave Reisner <d at falconindy.com> wrote:
> This is work originally provided by Sascha Kruse on FS#20360 with only
> minor adjustments to the implementation. It's been expanded to cover:
> NoUpgrade, NoExtract, IgnorePkg, IgnoreGroup.
>
> Adds tests ignore008, sync139, sync502, and sync503.
>
> Also satisfies FS#18988.
>
> Original-work-by: Sascha Kruse <knopwob at googlemail.com>
> Signed-off-by: Dave Reisner <dreisner at archlinux.org>
> ---
>  doc/pacman.conf.5.txt          |   11 +++++++----
>  lib/libalpm/add.c              |    4 ++--
>  lib/libalpm/package.c          |    4 ++--
>  lib/libalpm/remove.c           |    4 ++--
>  lib/libalpm/util.c             |    6 ++++++
>  lib/libalpm/util.h             |    1 +
>  test/pacman/tests/ignore008.py |   29 +++++++++++++++++++++++++++++
>  test/pacman/tests/sync139.py   |   23 +++++++++++++++++++++++
>  test/pacman/tests/sync502.py   |   17 +++++++++++++++++
>  test/pacman/tests/sync503.py   |   18 ++++++++++++++++++
>  10 files changed, 107 insertions(+), 10 deletions(-)
>  create mode 100644 test/pacman/tests/ignore008.py
>  create mode 100644 test/pacman/tests/sync139.py
>  create mode 100644 test/pacman/tests/sync502.py
>  create mode 100644 test/pacman/tests/sync503.py
>
> diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
> index e793e78..83b7568 100644
> --- a/doc/pacman.conf.5.txt
> +++ b/doc/pacman.conf.5.txt
> @@ -90,7 +90,7 @@ Options
>
>  *IgnorePkg =* package ...::
>        Instructs pacman to ignore any upgrades for this package when performing
> -       a '\--sysupgrade'.
> +       a '\--sysupgrade'. Shell-style glob patterns are matched.
A bit pedantic, but "allowed" instead of "matched"?

Other than that, this all looks great.

>
>  *SyncFirst =* package ...::
>        Instructs pacman to check for newer version of these packages before any
> @@ -103,7 +103,8 @@ Options
>
>  *IgnoreGroup =* group ...::
>        Instructs pacman to ignore any upgrades for all packages in this
> -       group when performing a '\--sysupgrade'.
> +       group when performing a '\--sysupgrade'. Shell-style glob patterns are
> +       matched.
>
>  *Include =* path::
>        Include another config file. This file can include repositories or
> @@ -134,7 +135,8 @@ Options
>        a package install/upgrade, and the new files will be installed with a
>        '.pacnew' extension.
>        These files refer to files in the package archive, so do not include the
> -       leading slash (the RootDir) when specifying them.
> +       leading slash (the RootDir) when specifying them. Shell-style glob patterns
> +       are matched.
>
>  *NoExtract =* file ...::
>        All files listed with a `NoExtract` directive will never be extracted from
> @@ -143,7 +145,8 @@ Options
>        'index.php', then you would not want the 'index.html' file to be extracted
>        from the 'apache' package.
>        These files refer to files in the package archive, so do not include the
> -       leading slash (the RootDir) when specifying them.
> +       leading slash (the RootDir) when specifying them. Shell-style glob patterns
> +       are matched.
>
>  *CleanMethod =* KeepInstalled &| KeepCurrent::
>        If set to `KeepInstalled` (the default), the '-Sc' operation will clean
> diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
> index d66ab93..44b852f 100644
> --- a/lib/libalpm/add.c
> +++ b/lib/libalpm/add.c
> @@ -179,7 +179,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>        }
>
>        /* if a file is in NoExtract then we never extract it */
> -       if(alpm_list_find_str(handle->noextract, entryname)) {
> +       if(alpm_list_find(handle->noextract, entryname, _alpm_fnmatch)) {
>                _alpm_log(handle, ALPM_LOG_DEBUG, "%s is in NoExtract, skipping extraction\n",
>                                entryname);
>                alpm_logaction(handle, "note: %s is in NoExtract, skipping extraction\n",
> @@ -259,7 +259,7 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
>                } else if(S_ISREG(entrymode)) {
>                        /* case 4,7: */
>                        /* if file is in NoUpgrade, don't touch it */
> -                       if(alpm_list_find_str(handle->noupgrade, entryname)) {
> +                       if(alpm_list_find(handle->noupgrade, entryname, _alpm_fnmatch)) {
>                                notouch = 1;
>                        } else {
>                                alpm_backup_t *backup;
> diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
> index e0f4ff2..2a97177 100644
> --- a/lib/libalpm/package.c
> +++ b/lib/libalpm/package.c
> @@ -690,14 +690,14 @@ int _alpm_pkg_should_ignore(alpm_handle_t *handle, alpm_pkg_t *pkg)
>        alpm_list_t *groups = NULL;
>
>        /* first see if the package is ignored */
> -       if(alpm_list_find_str(handle->ignorepkg, pkg->name)) {
> +       if(alpm_list_find(handle->ignorepkg, pkg->name, _alpm_fnmatch)) {
>                return 1;
>        }
>
>        /* next see if the package is in a group that is ignored */
>        for(groups = alpm_pkg_get_groups(pkg); groups; groups = groups->next) {
>                char *grp = groups->data;
> -               if(alpm_list_find_str(handle->ignoregroup, grp)) {
> +               if(alpm_list_find(handle->ignoregroup, grp, _alpm_fnmatch)) {
>                        return 1;
>                }
>        }
> diff --git a/lib/libalpm/remove.c b/lib/libalpm/remove.c
> index cf137ae..d7e06bc 100644
> --- a/lib/libalpm/remove.c
> +++ b/lib/libalpm/remove.c
> @@ -216,7 +216,7 @@ static int can_remove_file(alpm_handle_t *handle, const alpm_file_t *file,
>  {
>        char filepath[PATH_MAX];
>
> -       if(alpm_list_find_str(skip_remove, file->name)) {
> +       if(alpm_list_find(skip_remove, file->name, _alpm_fnmatch)) {
>                /* return success because we will never actually remove this file */
>                return 1;
>        }
> @@ -251,7 +251,7 @@ static int unlink_file(alpm_handle_t *handle, alpm_pkg_t *oldpkg,
>        /* check the remove skip list before removing the file.
>         * see the big comment block in db_find_fileconflicts() for an
>         * explanation. */
> -       if(alpm_list_find_str(skip_remove, fileobj->name)) {
> +       if(alpm_list_find(skip_remove, fileobj->name, _alpm_fnmatch)) {
>                _alpm_log(handle, ALPM_LOG_DEBUG,
>                                "%s is in skip_remove, skipping removal\n", file);
>                return 1;
> diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
> index cbc5bdf..5070cb9 100644
> --- a/lib/libalpm/util.c
> +++ b/lib/libalpm/util.c
> @@ -34,6 +34,7 @@
>  #include <limits.h>
>  #include <sys/wait.h>
>  #include <locale.h> /* setlocale */
> +#include <fnmatch.h>
>
>  /* libarchive */
>  #include <archive.h>
> @@ -1188,6 +1189,11 @@ int _alpm_access(alpm_handle_t *handle, const char *dir, const char *file, int a
>        return ret;
>  }
>
> +int _alpm_fnmatch(const void *pattern, const void *string)
> +{
> +       return fnmatch(pattern, string, 0);
> +}
> +
>  #ifndef HAVE_STRNDUP
>  /* A quick and dirty implementation derived from glibc */
>  static size_t strnlen(const char *s, size_t max)
> diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
> index 61dc8e5..df16543 100644
> --- a/lib/libalpm/util.h
> +++ b/lib/libalpm/util.h
> @@ -140,6 +140,7 @@ alpm_time_t _alpm_parsedate(const char *line);
>  int _alpm_raw_cmp(const char *first, const char *second);
>  int _alpm_raw_ncmp(const char *first, const char *second, size_t max);
>  int _alpm_access(alpm_handle_t *handle, const char *dir, const char *file, int amode);
> +int _alpm_fnmatch(const void *pattern, const void *string);
>
>  #ifndef HAVE_STRSEP
>  char *strsep(char **, const char *);
> diff --git a/test/pacman/tests/ignore008.py b/test/pacman/tests/ignore008.py
> new file mode 100644
> index 0000000..12416ad
> --- /dev/null
> +++ b/test/pacman/tests/ignore008.py
> @@ -0,0 +1,29 @@
> +self.description = "Sync with relevant ignored fnmatched packages"
> +
> +package1 = pmpkg("foopkg", "1.0-1")
> +self.addpkg2db("local", package1)
> +
> +package2 = pmpkg("barpkg", "2.0-1")
> +self.addpkg2db("local", package2)
> +
> +package3 = pmpkg("bazpkg", "3.0-1")
> +self.addpkg2db("local", package3)
> +
> +
> +package1up = pmpkg("foopkg", "2.0-1")
> +self.addpkg2db("sync", package1up)
> +
> +package2up = pmpkg("barpkg", "3.0-1")
> +self.addpkg2db("sync", package2up)
> +
> +package3up = pmpkg("bazpkg", "4.0-1")
> +self.addpkg2db("sync", package3up)
> +
> +self.option["IgnorePkg"] = ["foo*", "ba?pkg"]
> +self.args = "-Su"
> +
> +
> +self.addrule("PACMAN_RETCODE=0")
> +self.addrule("PKG_VERSION=foopkg|1.0-1")
> +self.addrule("PKG_VERSION=barpkg|2.0-1")
> +self.addrule("PKG_VERSION=bazpkg|3.0-1")
> diff --git a/test/pacman/tests/sync139.py b/test/pacman/tests/sync139.py
> new file mode 100644
> index 0000000..0b0526d
> --- /dev/null
> +++ b/test/pacman/tests/sync139.py
> @@ -0,0 +1,23 @@
> +self.description = "Sysupgrade of packages in fnmatch'd IgnoreGroup"
> +
> +sp1 = pmpkg("pkg1", "1.0-2")
> +sp1.groups = ["grp"]
> +sp2 = pmpkg("pkg2", "1.0-2")
> +sp2.groups = ["grp2"]
> +
> +for p in sp1, sp2:
> +       self.addpkg2db("sync", p)
> +
> +lp1 = pmpkg("pkg1", "1.0-1")
> +lp2 = pmpkg("pkg2", "1.0-1")
> +
> +for p in lp1, lp2:
> +       self.addpkg2db("local", p)
> +
> +self.option["IgnoreGroup"] = ["grp"]
> +
> +self.args = "-Su"
> +
> +self.addrule("PACMAN_RETCODE=0")
> +self.addrule("PKG_VERSION=pkg1|1.0-1")
> +self.addrule("PKG_VERSION=pkg2|1.0-2")
> diff --git a/test/pacman/tests/sync502.py b/test/pacman/tests/sync502.py
> new file mode 100644
> index 0000000..5cc42c9
> --- /dev/null
> +++ b/test/pacman/tests/sync502.py
> @@ -0,0 +1,17 @@
> +self.description = "Install a package from a sync db with fnmatch'ed NoExtract"
> +
> +sp = pmpkg("dummy")
> +sp.files = ["bin/dummy",
> +            "usr/share/man/man8",
> +            "usr/share/man/man1/dummy.1"]
> +self.addpkg2db("sync", sp)
> +
> +self.option["NoExtract"] = ["usr/share/man/*"]
> +
> +self.args = "-S %s" % sp.name
> +
> +self.addrule("PACMAN_RETCODE=0")
> +self.addrule("PKG_EXIST=dummy")
> +self.addrule("FILE_EXIST=bin/dummy")
> +self.addrule("!FILE_EXIST=usr/share/man/man8")
> +self.addrule("!FILE_EXIST=usr/share/man/man1/dummy.1")
> diff --git a/test/pacman/tests/sync503.py b/test/pacman/tests/sync503.py
> new file mode 100644
> index 0000000..9d24f00
> --- /dev/null
> +++ b/test/pacman/tests/sync503.py
> @@ -0,0 +1,18 @@
> +self.description = "Upgrade a package, with a fnmatch in NoUpgrade"
> +
> +sp = pmpkg("dummy", "1.0-2")
> +sp.files = ["etc/dummy.conf"]
> +self.addpkg2db("sync", sp)
> +
> +lp = pmpkg("dummy")
> +lp.files = ["etc/dummy.conf"]
> +self.addpkg2db("local", lp)
> +
> +self.option["NoUpgrade"] = ["etc/dummy.*"]
> +
> +self.args = "-S %s" % sp.name
> +
> +self.addrule("PKG_VERSION=dummy|1.0-2")
> +self.addrule("!FILE_MODIFIED=etc/dummy.conf")
> +self.addrule("FILE_PACNEW=etc/dummy.conf")
> +self.addrule("!FILE_PACSAVE=etc/dummy.conf")
> --
> 1.7.7.3


More information about the pacman-dev mailing list