[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn ls --search/pattern/glob/case-insensitive

From: Stefan Sperling <stsp_at_elego.de>
Date: Fri, 1 Sep 2017 16:42:08 +0200

On Fri, Sep 01, 2017 at 03:01:33PM +0100, Julian Foad wrote:
> (I'm unsure exactly what you meant there, stsp -- that seems to
> contradict the previous paragraph, if 'svn log --search remains
> case-insensitive.)

The most important point for me is that I don't think appending and
prepending * globs is useful in the context of a path search with 'ls'.

Consider a revision such as:

$ svn log -r 3 -v
------------------------------------------------------------------------
r3 | stsp | 2017-09-01 16:12:23 +0200 (Fri, 01 Sep 2017) | 1 line
Changed paths:
   A /trunk/dog.txt
   A /trunk/lazy_dog.txt

the quick brown fox jumps over the lazy dog
------------------------------------------------------------------------

The behaviour for log --search is that either '--search lazy' or
'--search dog' will match this revision. This is fine because we are
looking for log message output rather than path names.

$ svn log --search dog
------------------------------------------------------------------------
r3 | stsp | 2017-09-01 16:12:23 +0200 (Fri, 01 Sep 2017) | 1 line

the quick brown fox jumps over the lazy dog
------------------------------------------------------------------------
$ svn log --search lazy
------------------------------------------------------------------------
r3 | stsp | 2017-09-01 16:12:23 +0200 (Fri, 01 Sep 2017) | 1 line

the quick brown fox jumps over the lazy dog
------------------------------------------------------------------------

However, when matching paths with 'svn ls' I would not expect 'dog*' to
match lazy_dog.txt. The output is a list of paths, not a log message.
I would expect matching to behave more like a unix shell does with ls(1).

The current behaviour as implemented by --pattern looks like:

$ svn ls -r3 --pattern 'dog*' ^/
$ svn ls -r3 --pattern 'dog*' ^/trunk
dog.txt
$ svn ls -r3 --pattern '*dog*' ^/trunk
dog.txt
lazy_dog.txt

The above behaviour looks good to me.

However, as you already pointed out, matching child path components
seems to be impossible at present:

$ svn ls -r3 --pattern 'trunk/*'
$
$ svn ls -R -r3 --pattern 'trunk/*' ^/
$

These should print:

trunk/dog.txt
trunk/lazy_dog.txt

There is of course an interaction with --depth to consider.
This already works:

$ svn ls -R -r3 --pattern '*dog*' ^/
trunk/dog.txt
trunk/lazy_dog.txt
$ svn ls -R -r3 --pattern '*trunk*' ^/
trunk/
$

Which suggests that matching happens after depth filtering.
Perhaps a default depth should be chosen based on the pattern to allow
patterns such as 'trunk/*' to match?

Regarding case:

If 'list --search' is designed to be case-insensitive, then this:

$ svn ls -r3 --pattern 'Dog*' ^/trunk
$

should print:

dog.txt

If it was case-sensitive, I would use:

$ svn ls -r3 --pattern '[dD]og*' ^/trunk

I could live with either possibility.
Received on 2017-09-01 16:42:19 CEST

This is an archived mail posted to the Subversion Dev mailing list.