threads / patch / 21728

patcht/gitweb-lib: Split HTTP response with non-GNU sed

Subject: [PATCH] t/gitweb-lib: Split HTTP response with non-GNU sed

## tl;dr

4 messages between Nov 23, 2009 and Nov 24, 2009. Diffs are folded; open one to read it.

replies: 3people: 3as markdown or json

Brian Gernhardt· Nov 23, 2009, 17:33 UTC · lore

Recognizing \r in a regex is something GNU sed will do, but other sed implementation's won't. (Found with BSD sed on OS X.) So use a literal carriage return instead.

Signed-off-by: Brian Gernhardt <brian@gernhardtsoftware.com>
---
 t/gitweb-lib.sh |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Show changes to t/gitweb-lib.sh +2 −2
diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
index 32b841d..35dda58 100644
--- a/t/gitweb-lib.sh
+++ b/t/gitweb-lib.sh
@@ -52,8 +52,8 @@ gitweb_run () {
 	rm -f gitweb.log &&
 	perl -- "$SCRIPT_NAME" \
 		>gitweb.output 2>gitweb.log &&
-	sed -e   '/^\r$/q' <gitweb.output >gitweb.headers &&
-	sed -e '1,/^\r$/d' <gitweb.output >gitweb.body    &&
+	sed -e   '/^
$/q' <gitweb.output >gitweb.headers &&
+	sed -e '1,/^
$/d' <gitweb.output >gitweb.body    &&
 	if grep '^[[]' gitweb.log >/dev/null 2>&1; then false; else true; fi
 
 	# gitweb.log is left for debugging
-- 
1.6.5.3.433.g11067
Junio C Hamano· Nov 23, 2009, 18:27 UTC · re: Brian Gernhardt · lore

Re: [PATCH] t/gitweb-lib: Split HTTP response with non-GNU sed

Brian Gernhardt <brian@gernhardtsoftware.com> writes:
> Recognizing \r in a regex is something GNU sed will do, but other sed
> implementation's won't.  (Found with BSD sed on OS X.) So use a
> literal carriage return instead.

I'd actually prefer not having to deal with this issue. How about doing something like this instead?

 t/gitweb-lib.sh |   14 ++++++++++++--
 1 files changed, 12 insertions(+), 2 deletions(-)
Show changes to t/gitweb-lib.sh +12 −2
diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
index 32b841d..3121950 100644
--- a/t/gitweb-lib.sh
+++ b/t/gitweb-lib.sh
@@ -52,8 +52,18 @@ gitweb_run () {
 	rm -f gitweb.log &&
 	perl -- "$SCRIPT_NAME" \
 		>gitweb.output 2>gitweb.log &&
-	sed -e   '/^\r$/q' <gitweb.output >gitweb.headers &&
-	sed -e '1,/^\r$/d' <gitweb.output >gitweb.body    &&
+	perl -w -e '
+		open O, ">gitweb.headers";
+		while (<>) {
+			print O;
+			last if (/^\r$/ || /^$/);
+		}
+		open O, ">gitweb.body";
+		while (<>) {
+			print O;
+		}
+		close O;
+	' gitweb.output &&
 	if grep '^[[]' gitweb.log >/dev/null 2>&1; then false; else true; fi
 
 	# gitweb.log is left for debugging
Brian Gernhardt· Nov 23, 2009, 18:50 UTC · re: Junio C Hamano · lore

Re: [PATCH] t/gitweb-lib: Split HTTP response with non-GNU sed

On Nov 23, 2009, at 1:27 PM, Junio C Hamano wrote:
Show 8 quoted lines
> Brian Gernhardt <brian@gernhardtsoftware.com> writes:
> 
>> Recognizing \r in a regex is something GNU sed will do, but other sed
>> implementation's won't.  (Found with BSD sed on OS X.) So use a
>> literal carriage return instead.
> 
> I'd actually prefer not having to deal with this issue.  How about doing
> something like this instead?
Works for me.  I just went for the obvious minimal change to make it work.  But since we're testing a perl script, we might as well just use perl to deal with it's output.
~~ Brian
Jakub Narebski· Nov 24, 2009, 16:59 UTC · re: Junio C Hamano · lore

Re: [PATCH] t/gitweb-lib: Split HTTP response with non-GNU sed

On Mon, 23 Nov 2009, Junio C Hamano wrote:
Show 5 quoted lines
> Brian Gernhardt <brian@gernhardtsoftware.com> writes:
> 
> > Recognizing \r in a regex is something GNU sed will do, but other sed
> > implementation's won't.  (Found with BSD sed on OS X.) So use a
> > literal carriage return instead.
[...]
Show 17 quoted lines
> > diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
> > index 32b841d..35dda58 100644
> > --- a/t/gitweb-lib.sh
> > +++ b/t/gitweb-lib.sh
> > @@ -52,8 +52,8 @@ gitweb_run () {
> >         rm -f gitweb.log &&
> >         perl -- "$SCRIPT_NAME" \
> >                 >gitweb.output 2>gitweb.log &&
> > -       sed -e   '/^\r$/q' <gitweb.output >gitweb.headers &&
> > -       sed -e '1,/^\r$/d' <gitweb.output >gitweb.body    &&
> > +       sed -e   '/^
> > $/q' <gitweb.output >gitweb.headers &&
> > +       sed -e '1,/^
> > $/d' <gitweb.output >gitweb.body    &&
> >         if grep '^[[]' gitweb.log >/dev/null 2>&1; then false; else
> > true; fi 
> >         # gitweb.log is left for debugging

If we were to do it this way, I would prefer to set and then use 'cr' or 'crlf' variable (in sed expression).

Show 18 quoted lines
> 
> I'd actually prefer not having to deal with this issue.  How about doing
> something like this instead?
> 
>  t/gitweb-lib.sh |   14 ++++++++++++--
>  1 files changed, 12 insertions(+), 2 deletions(-)
> 
> diff --git a/t/gitweb-lib.sh b/t/gitweb-lib.sh
> index 32b841d..3121950 100644
> --- a/t/gitweb-lib.sh
> +++ b/t/gitweb-lib.sh
> @@ -52,8 +52,18 @@ gitweb_run () {
>  	rm -f gitweb.log &&
>  	perl -- "$SCRIPT_NAME" \
>  		>gitweb.output 2>gitweb.log &&
> -	sed -e   '/^\r$/q' <gitweb.output >gitweb.headers &&
> -	sed -e '1,/^\r$/d' <gitweb.output >gitweb.body    &&
> +	perl -w -e '
"perl", or "$PERL", or "$PERL_PATH"?
> +		open O, ">gitweb.headers";
Well, modern Perl would use here
+		open my $fh, ">", "gitweb.headers";
But it is not that important here.
Show 14 quoted lines
> +		while (<>) {
> +			print O;
> +			last if (/^\r$/ || /^$/);
> +		}
> +		open O, ">gitweb.body";
> +		while (<>) {
> +			print O;
> +		}
> +		close O;
> +	' gitweb.output &&
>  	if grep '^[[]' gitweb.log >/dev/null 2>&1; then false; else true; fi
>  
>  	# gitweb.log is left for debugging
> 

This is a good solution. We test Perl script anyway (so Perl is required for running this test), and this way we can do this portably and in one pass (one fork).

-- 
Jakub Narebski
Poland

← back to recent threads