Thread (26 messages) flat view 26 messages, 3 authors, 2016-06-15

Re: [PATCH v4 04/14] Add new simplified git-remote-testgit

From: Stefano Lattarini <hidden>
Date: 2016-06-15 22:55:11

On 11/02/2012 04:42 PM, Felipe Contreras wrote:
On Fri, Nov 2, 2012 at 2:55 PM, Stefano Lattarini
[off-list ref] wrote:
quoted
quoted
+#!/bin/bash
I think git can't assume the existence of bash unconditionally, neither
in its scripts, nor in its tests (the exception being the tests on
bash completion, of course).  This script probably need to be re-written
to be a valid POSIX shell script.
Well, this is a _reference_ script, and that is used only for testing
purposes. The test itself can be like the bash completion tests, and
simply be skipped.

The reason I chose bash is because associative arrays, which you see
in a later patch.
quoted
It almost is, anyway, apart from the nits below ...
quoted
+# Copyright (c) 2012 Felipe Contreras
+
+alias="$1"
Just FYI: the double quoting here (and in several variable assignments
below) is redundant.  You can portably write it as:

    alias=$1

and still be safe in the face of spaces and metacharacters in $1.
I'm not sure whether the Git coding guidelines suggest the use of
quoting in this situation though; if this is the case, feel free
to disregard my observation.
What happens when you call this with:

 ./script "alias with spaces"
'$alias' will correctly expand to "alias with spaces".  Try out:

  $ sh -c 'alias=$1; echo "$alias"' dummy '1   2*3'
  1   2*3

This works consistently with every known shell (even non-POSIX
relics like Solaris /bin/sh).
quoted
quoted
+url="$2"
+
+# huh?
+url="${url#file://}"
+
+dir="$GIT_DIR/testgit/$alias"
+prefix="refs/testgit/$alias"
+refspec="refs/heads/*:${prefix}/heads/*"
+
+gitmarks="$dir/git.marks"
+testgitmarks="$dir/testgit.marks"
+
+export GIT_DIR="$url/.git"
+
I believe this should be rewritten as:

  GIT_DIR="$url/.git"; export GIT_DIR

in order to be portable to all the POSIX shells targeted by Git.
_If_ we want this as POSIX, yeah.
Why don't we?  Why add an extra requirement for a test that

 1. can be easily written in POSIX shell, and
 2. tests a feature that doesn't require bash to work (unless
    I'm sorely mistaken, that is)?

Honest question.  But of course, if the Git active contributors
deem the extra requirement (which is not an invasive one, given
how often bash is installed even on non-Linux systems) acceptable
in order to have the test case simpler and clearer, feel free to
disregard all my observations in this thread.
quoted
quoted
+mkdir -p "$dir"
+
+test -e "$gitmarks" || echo -n > "$gitmarks"
+test -e "$testgitmarks" || echo -n > "$testgitmarks"
+
The '-n' option to echo is not portable.  To create an empty
file, you can just use

   : > file

or

   true > file
All right, thanks.
quoted
quoted
+while read line; do
+    case "$line" in
Useless double quoting (my previous observation about Git coding
guidelines applies here as well, of course).
What if line has multiple spaces?
Still no problem, as in the case of the 'alias=$1' assignment before:

  $ sh -c 'case $1 in *x"  "x*) echo ok;; *) exit 1;; esac' dummy 'x  x'
  ok
To me it makes sense to quote it.
Surely it doesn't cause any problem to "over-quote" in this case;
it's better than risking to under-quote in other.  I just pointed
out that the quoting it's not really necessary, in case you weren't
aware of that.
quoted
quoted
+        echo "feature import-marks=$gitmarks"
+        echo "feature export-marks=$gitmarks"
+        git fast-export --use-done-feature --{import,export}-marks="$testgitmarks" $refs | \
Better avoid the tricky {foo,bar} bashism:

    git fast-export --use-done-feature \
                    --import-marks="$testgitmarks" \
                    --export-marks="$testgitmarks" \
                    $refs | \
If that's what we want, yeah.
Honestly, I find my longer-and-more-explicit version clearer, even
if you can assume bash for your script.  But that's a matter of
personal preference (sorry for not stating that right away), so
feel free to ignore it if you decide to keep the bash requirement
in the end.

Regards,
  Stefano
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help