Index: create.h =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/create.h,v retrieving revision 1.25 diff -u -p -r1.25 create.h --- create.h 6 Jun 2005 03:24:14 -0000 1.25 +++ create.h 30 Oct 2005 14:34:36 -0000 @@ -23,6 +23,7 @@ #ifndef _INST_CREATE_H_INCLUDE #define _INST_CREATE_H_INCLUDE +extern match_t MatchType; extern char *Prefix; extern char *Comment; extern char *Desc; Index: main.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/main.c,v retrieving revision 1.36 diff -u -p -r1.36 main.c --- main.c 6 Jun 2005 03:24:14 -0000 1.36 +++ main.c 30 Oct 2005 14:34:36 -0000 @@ -16,8 +16,9 @@ __FBSDID("$FreeBSD: src/usr.sbin/pkg_ins #include "lib.h" #include "create.h" -static char Options[] = "YNORhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:"; +static char Options[] = "EGYNORhjvxyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:"; +match_t MatchType = MATCH_GLOB; char *Prefix = NULL; char *Comment = NULL; char *Desc = NULL; @@ -57,6 +58,18 @@ main(int argc, char **argv) Verbose = TRUE; break; + case 'x': + MatchType = MATCH_REGEX; + break; + + case 'E': + MatchType = MATCH_EREGEX; + break; + + case 'G': + MatchType = MATCH_EXACT; + break; + case 'N': AutoAnswer = NO; break; @@ -216,6 +229,6 @@ usage() " [-D displayfile] [-m mtreefile] [-o origin] ", " [-s srcdir] [-S basedir] ", " -c comment -d description -f packlist pkg-filename", -" pkg_create [-YNhvyzR] -b pkg-name [pkg-filename]"); +" pkg_create [-EGYNhvxyzR] -b pkg-name [pkg-filename]"); exit(1); } Index: perform.c =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/perform.c,v retrieving revision 1.80 diff -u -p -r1.80 perform.c --- perform.c 6 Jun 2005 03:24:14 -0000 1.80 +++ perform.c 30 Oct 2005 14:34:37 -0000 @@ -81,9 +81,35 @@ pkg_perform(char **pkgs) suf = "tar"; if (InstalledPkg != NULL) { - if (!Recursive) - return (create_from_installed(InstalledPkg, pkg, suf)); - return (create_from_installed_recursive(pkg, suf)); + char *pkgsglob[] = { InstalledPkg, NULL }; + char **matched; + int i, error; + + matched = matchinstalled(MatchType, pkgsglob, &error); + if (error || matched == NULL || *matched == NULL || + (matched[1] == NULL && strcmp(*matched, InstalledPkg) == 0)) + errx(1, "no packages match pattern"); + /* + * Is there is only one installed package matching the pattern, + * we need to respect the optional pkg-filename parameter. If, + * however, the pattern matches several packages, this parameter + * makes no sense and is ignored. + */ + if (matched[1] == NULL) { + if (pkg == InstalledPkg) + pkg = *matched; + InstalledPkg = *matched; + if (!Recursive) + return (create_from_installed(InstalledPkg, pkg, suf)); + return (create_from_installed_recursive(pkg, suf)); + } + for (i = 0; matched[i] != NULL; i++) { + InstalledPkg = pkg = matched[i]; + if (!Recursive) + create_from_installed(pkg, pkg, suf); + create_from_installed_recursive(pkg, suf); + } + return TRUE; } get_dash_string(&Comment); Index: pkg_create.1 =================================================================== RCS file: /home/ncvs/src/usr.sbin/pkg_install/create/pkg_create.1,v retrieving revision 1.68 diff -u -p -r1.68 pkg_create.1 --- pkg_create.1 27 Jun 2005 17:10:21 -0000 1.68 +++ pkg_create.1 30 Oct 2005 14:34:38 -0000 @@ -52,7 +52,7 @@ .Fl f Ar packlist .Ar pkg-filename .Nm -.Op Fl YNRhvy +.Op Fl EGYNRhvxy .Fl b Ar pkg-name .Op Ar pkg-filename .Sh DESCRIPTION