Patchwork qemu-iotests: Fix _filter_qemu

login
register
mail settings
Submitter Kevin Wolf
Date April 16, 2013, 9:48 a.m.
Message ID <1366105701-7968-1-git-send-email-kwolf@redhat.com>
Download mbox | patch
Permalink /patch/236936/
State New
Headers show

Comments

Kevin Wolf - April 16, 2013, 9:48 a.m.
$QEMU_PROG happens to be 'qemu' in my setup, so this sed command
replaces a bit too much. Restrict it to the start of the line and to
when it's followed by a colon, i.e. the form used by error messages.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 tests/qemu-iotests/common.filter | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Eric Blake - April 16, 2013, 12:26 p.m.
On 04/16/2013 03:48 AM, Kevin Wolf wrote:
> $QEMU_PROG happens to be 'qemu' in my setup, so this sed command
> replaces a bit too much. Restrict it to the start of the line and to
> when it's followed by a colon, i.e. the form used by error messages.
> 
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
>  tests/qemu-iotests/common.filter | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
> index bc5f250..a7f889a 100644
> --- a/tests/qemu-iotests/common.filter
> +++ b/tests/qemu-iotests/common.filter
> @@ -155,7 +155,7 @@ _filter_qemu_io()
>  # replace occurrences of QEMU_PROG with "qemu"
>  _filter_qemu()
>  {
> -    sed -e "s#$(basename $QEMU_PROG)#QEMU_PROG#g"
> +    sed -e "s#^$(basename $QEMU_PROG):#QEMU_PROG:#g"

Why spawn a basename process, when you can use shell to do the same?
Also, the g modifier is worthless once you have a ^ anchor, since sed
can only replace one ^ per line.  And you don't need sed's -e option for
a single script.

The following is identical, with less typing:

_filter_qemu()
{
    sed "s#^${QEMU_PROG##*/}:#QEMU_PROG#"
}

That said, your more verbose version is still functionally correct, so
you can add:

Reviewed-by: Eric Blake <eblake@redhat.com>
Stefan Hajnoczi - April 16, 2013, 1:16 p.m.
On Tue, Apr 16, 2013 at 06:26:38AM -0600, Eric Blake wrote:
> On 04/16/2013 03:48 AM, Kevin Wolf wrote:
> > $QEMU_PROG happens to be 'qemu' in my setup, so this sed command
> > replaces a bit too much. Restrict it to the start of the line and to
> > when it's followed by a colon, i.e. the form used by error messages.
> > 
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> >  tests/qemu-iotests/common.filter | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> > 
> > diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
> > index bc5f250..a7f889a 100644
> > --- a/tests/qemu-iotests/common.filter
> > +++ b/tests/qemu-iotests/common.filter
> > @@ -155,7 +155,7 @@ _filter_qemu_io()
> >  # replace occurrences of QEMU_PROG with "qemu"
> >  _filter_qemu()
> >  {
> > -    sed -e "s#$(basename $QEMU_PROG)#QEMU_PROG#g"
> > +    sed -e "s#^$(basename $QEMU_PROG):#QEMU_PROG:#g"
> 
> Why spawn a basename process, when you can use shell to do the same?
> Also, the g modifier is worthless once you have a ^ anchor, since sed
> can only replace one ^ per line.  And you don't need sed's -e option for
> a single script.

sed -e is the convention in qemu-iotests.

Dropping the 'g' would be nice.

The problem with the POSIX shell string replacement is that the syntax
is horrible.  I can never remember what ${%}, ${%%}, ${#} and
%{##} do.  $(basename $QEMU_PROG) is clear (although it doesn't handle
spaces in the filename!).

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Markus Armbruster - April 16, 2013, 1:52 p.m.
Stefan Hajnoczi <stefanha@redhat.com> writes:

[...]
> The problem with the POSIX shell string replacement is that the syntax
> is horrible.  I can never remember what ${%}, ${%%}, ${#} and
> %{##} do.  $(basename $QEMU_PROG) is clear (although it doesn't handle
> spaces in the filename!).

Here's how I cope.  # is left of % my keyboard.  # matches "on the
left", % "on the right".  #/% are "short" and pick the shortest matching
pattern.  ##/%% are "long" and pick the longest matching pattern.
Kevin Wolf - April 16, 2013, 1:56 p.m.
Am 16.04.2013 um 15:16 hat Stefan Hajnoczi geschrieben:
> On Tue, Apr 16, 2013 at 06:26:38AM -0600, Eric Blake wrote:
> > On 04/16/2013 03:48 AM, Kevin Wolf wrote:
> > > $QEMU_PROG happens to be 'qemu' in my setup, so this sed command
> > > replaces a bit too much. Restrict it to the start of the line and to
> > > when it's followed by a colon, i.e. the form used by error messages.
> > > 
> > > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > > ---
> > >  tests/qemu-iotests/common.filter | 2 +-
> > >  1 file changed, 1 insertion(+), 1 deletion(-)
> > > 
> > > diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
> > > index bc5f250..a7f889a 100644
> > > --- a/tests/qemu-iotests/common.filter
> > > +++ b/tests/qemu-iotests/common.filter
> > > @@ -155,7 +155,7 @@ _filter_qemu_io()
> > >  # replace occurrences of QEMU_PROG with "qemu"
> > >  _filter_qemu()
> > >  {
> > > -    sed -e "s#$(basename $QEMU_PROG)#QEMU_PROG#g"
> > > +    sed -e "s#^$(basename $QEMU_PROG):#QEMU_PROG:#g"
> > 
> > Why spawn a basename process, when you can use shell to do the same?
> > Also, the g modifier is worthless once you have a ^ anchor, since sed
> > can only replace one ^ per line.  And you don't need sed's -e option for
> > a single script.
> 
> sed -e is the convention in qemu-iotests.
> 
> Dropping the 'g' would be nice.

Okay, I just updated the commit to drop the 'g'.

> The problem with the POSIX shell string replacement is that the syntax
> is horrible.  I can never remember what ${%}, ${%%}, ${#} and
> %{##} do.  $(basename $QEMU_PROG) is clear (although it doesn't handle
> spaces in the filename!).

That's exactly my problem as well.

Kevin
Eric Blake - April 16, 2013, 2:08 p.m.
On 04/16/2013 07:16 AM, Stefan Hajnoczi wrote:
>>> +    sed -e "s#^$(basename $QEMU_PROG):#QEMU_PROG:#g"
>>
>> Why spawn a basename process, when you can use shell to do the same?

> The problem with the POSIX shell string replacement is that the syntax
> is horrible.  I can never remember what ${%}, ${%%}, ${#} and
> %{##} do.  $(basename $QEMU_PROG) is clear (although it doesn't handle
> spaces in the filename!).

As written, it also doesn't handle a leading '-' in the name.  To be
robust, it should be $(basename -- "$QEMU_PROG") - and even then, it
still fails if $QEMU_PROG has a trailing newline (but no one is that
perverse in how they name their program, right?).  The shell variant
never goofs on any of those corner cases.  But I can totally understand
your aversion to line noise, and as I'm doubtful that anyone will run
the testsuite while trying to stress extreme corner-case $QEMU_PROG
naming conventions, I can certainly live with keeping $(basename
$QEMU_PROG) form for legibility.
Stefan Hajnoczi - April 16, 2013, 3:08 p.m.
On Tue, Apr 16, 2013 at 03:52:14PM +0200, Markus Armbruster wrote:
> Stefan Hajnoczi <stefanha@redhat.com> writes:
> 
> [...]
> > The problem with the POSIX shell string replacement is that the syntax
> > is horrible.  I can never remember what ${%}, ${%%}, ${#} and
> > %{##} do.  $(basename $QEMU_PROG) is clear (although it doesn't handle
> > spaces in the filename!).
> 
> Here's how I cope.  # is left of % my keyboard.  # matches "on the
> left", % "on the right".  #/% are "short" and pick the shortest matching
> pattern.  ##/%% are "long" and pick the longest matching pattern.

Nice :).

Stefan

Patch

diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.filter
index bc5f250..a7f889a 100644
--- a/tests/qemu-iotests/common.filter
+++ b/tests/qemu-iotests/common.filter
@@ -155,7 +155,7 @@  _filter_qemu_io()
 # replace occurrences of QEMU_PROG with "qemu"
 _filter_qemu()
 {
-    sed -e "s#$(basename $QEMU_PROG)#QEMU_PROG#g"
+    sed -e "s#^$(basename $QEMU_PROG):#QEMU_PROG:#g"
 }
 
 # make sure this script returns success