What do you think? IMHO horrendously over-engineered,
but that also means lots of easy "features" when/where needed.
The generalizations to multiple colon-separated glob directory patterns
%_rpmgi_glob_patterns /repo1/*/:/repo2/*/
with an argvAppend() accumulator won't be hard now that Fts(3)
is in place. There are still gonna be some issues with symlink follow
(or not)
that need deciding. I've left all the FTS_FOO cases in rpmcliWalkFirst
() explictly
for the deciding.
Similarly, on-the-fly push/pop of %name bing (from "+bing") is easy
as well
(but will handle only "+N", not "+N-V-R.A", as in RPMDBI_LABEL).
73 de Jeff
On Feb 3, 2008, at 3:12 PM, Jeff Johnson wrote:
> RPM Package Manager, CVS Repository
> http://rpm5.org/cvs/
>
> ______________________________________________________________________
> ______
>
> Server: rpm5.org Name: Jeff Johnson
> Root: /v/rpm/cvs Email: jbj@rpm5.org
> Module: rpm Date: 03-Feb-2008
> 21:12:33
> Branch: HEAD Handle: 2008020320123201
>
> Modified files:
> rpm CHANGES macros.in
> rpm/lib rpminstall.c
>
> Log:
> - jbj: add rpmcliWalkFirst() to search (possibly multiple) dirs.
>
> Summary:
> Revision Changes Path
> 1.2128 +1 -0 rpm/CHANGES
> 1.196 +71 -7 rpm/lib/rpminstall.c
> 1.231 +4 -3 rpm/macros.in
>
> ______________________________________________________________________
> ______
>
> patch -p0 <<'@@ .'
> Index: rpm/CHANGES
>
> ======================================================================
> ======
> $ cvs diff -u -r1.2127 -r1.2128 CHANGES
> --- rpm/CHANGES 3 Feb 2008 16:05:24 -0000 1.2127
> +++ rpm/CHANGES 3 Feb 2008 20:12:32 -0000 1.2128
> @@ -1,4 +1,5 @@
> 5.0.0 -> 5.1a1:
> + - jbj: add rpmcliWalkFirst() to search (possibly multiple)
> dirs.
> - rse: add _rpmgi_pattern_{glob,regex} macros for "+N" arg-
> to-path rewrite.
> - jbj: functional "+N-V-R.A" path-to-repository expansions
> with -i/-U.
> - jbj: mire.c: add STANDALONE test exerciser.
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/lib/rpminstall.c
>
> ======================================================================
> ======
> $ cvs diff -u -r1.195 -r1.196 rpminstall.c
> --- rpm/lib/rpminstall.c 3 Feb 2008 16:05:24 -0000 1.195
> +++ rpm/lib/rpminstall.c 3 Feb 2008 20:12:33 -0000 1.196
> @@ -332,14 +332,71 @@
> return 0;
> }
>
> +static const char * rpmcliWalkFirst(ARGV_t av, miRE mire)
> +{
> + /* XXX use global ftsOpts? */
> + int _ftsOpts = (FTS_COMFOLLOW | FTS_LOGICAL | FTS_NOSTAT);
> + FTS * ftsp = Fts_open((char *const *)av, _ftsOpts, NULL);
> + FTSENT * fts;
> + const char * fn = NULL;
> + int xx;
> +
> + if (ftsp != NULL)
> + while((fts = Fts_read(ftsp)) != NULL) {
> + switch (fts->fts_info) {
> + /* No-op conditions. */
> + case FTS_D: /* preorder directory */
> + case FTS_DP: /* postorder directory */
> + case FTS_DOT: /* dot or dot-dot */
> + continue;
> + /*@notreached@*/ break;
> + case FTS_F: /* regular file */
> + if (mireRegexec(mire, fts->fts_accpath))
> + continue;
> + break;
> + /* Error conditions. */
> + case FTS_NS: /* stat(2) failed */
> + case FTS_DNR: /* unreadable directory */
> + case FTS_ERR: /* error; errno is set */
> + case FTS_DC: /* directory that causes cycles */
> + case FTS_DEFAULT: /* none of the above */
> + case FTS_INIT: /* initialized only */
> + case FTS_NSOK: /* no stat(2) requested */
> + case FTS_SL: /* symbolic link */
> + case FTS_SLNONE: /* symbolic link without target */
> + case FTS_W: /* whiteout object */
> + default:
> + goto exit;
> + /*@notreached@*/ break;
> + }
> +
> + /* Stop on first file that matches. */
> + fn = xstrdup(fts->fts_accpath);
> + break;
> + }
> +
> +exit:
> + xx = Fts_close(ftsp);
> + return fn;
> +}
> +
> static const char * rpmcliInstallElementPath(rpmts ts, const
> char * arg)
> {
> +#ifdef GLOB_ONLY
> /* XXX note the added "-*.rpm" to force globbing on '-'
> boundaries. */
> const char * fn = rpmGetPath(
> "%{?_rpmgi_pattern_glob:%{_rpmgi_pattern_glob ", arg, "}}"
> "%{!?_rpmgi_pattern_glob:", arg, "-*-*.*.rpm}",
> NULL
> );
> +#else
> + /* Create a glob pattern to match repository directories. */
> + const char * fn = rpmGetPath(
> + "%{?_rpmgi_pattern_glob}"
> + "%{!?_rpmgi_pattern_glob:.}", "/",
> + NULL
> + );
> +#endif
> const char * mirePattern = rpmExpand(
> "%{?_rpmgi_pattern_regex:%{_rpmgi_pattern_regex ", arg,
> "}}"
> "%{!?_rpmgi_pattern_regex:", arg, "-[^-]+-[^-]+\\.[^.]+\
> \.rpm$}",
> @@ -349,19 +406,26 @@
> ARGV_t av = NULL;
> int ac = 0;
> int xx = mireRegcomp(mire, mirePattern);
> - int i;
>
> - /* Get list of candidate package paths. */
> + /* Get explicit list of candidate repository directories. */
> xx = rpmGlob(fn, &ac, &av);
> fn = _free(fn);
>
> /* Filter out glibc <-> glibc-common confusions. */
> - for (i = 0; i < ac; i++) {
> - if (mireRegexec(mire, av[i]))
> - continue;
> - fn = xstrdup(av[0]);
> - break;
> +#ifdef GLOB_ONLY
> + { int i;
> + for (i = 0; i < ac; i++) {
> + if (mireRegexec(mire, av[i]))
> + continue;
> + /* Stop on first file that matches. */
> + fn = xstrdup(av[0]);
> + break;
> + }
> }
> +#else
> + /* Walk (possibly multi-root'd) directories, until 1st match
> is found. */
> + fn = rpmcliWalkFirst(av, mire);
> +#endif
>
> av = argvFree(av);
> mire = mireFree(mire);
> @@ .
> patch -p0 <<'@@ .'
> Index: rpm/macros.in
>
> ======================================================================
> ======
> $ cvs diff -u -r1.230 -r1.231 macros.in
> --- rpm/macros.in 3 Feb 2008 16:05:24 -0000 1.230
> +++ rpm/macros.in 3 Feb 2008 20:12:32 -0000 1.231
> @@ -1,7 +1,7 @@
> #/*! \page config_macros Default configuration: @USRLIBRPM@/macros
> # \verbatim
> #
> -# $Id: macros.in,v 1.230 2008/02/03 16:05:24 jbj Exp $
> +# $Id: macros.in,v 1.231 2008/02/03 20:12:32 jbj Exp $
> #
> # This is a global RPM configuration file. All changes made here
> will
> # be lost when the rpm package is upgraded. Any per-system
> configuration
> @@ -981,8 +981,9 @@
>
> #
> # Pattern matching for installation via "+N-V-R.A" CLI arguments
> -%_rpmgi_pattern_glob() %{_rpmdir}/%1-*-*.*.rpm
> -%_rpmgi_pattern_regex() ^.+/%1-[^-]+-[^-]+\\.[^.]+\\.rpm$
> +#%_rpmgi_pattern_glob() %{_rpmdir}/%1-*-*.*.rpm
> +%_rpmgi_pattern_glob %{_rpmdir}/*/
> +%_rpmgi_pattern_regex() ^.+/%1-[^-]+-[^-]+\\.[^.]+\\.rpm$
>
>
> #=====================================================================
> =========
> # ---- Run-time probe dependency macros.
> @@ .
> ______________________________________________________________________
> RPM Package Manager http://rpm5.org
> CVS Sources Repository rpm-cvs@rpm5.org
Received on Sun Feb 3 21:24:59 2008