On Thu, May 06, 2010 at 12:02:36PM +0200, Jörg Steffens wrote:
> IMHO it is a cleaner approach to only work on files that are part of the
> svn checkout instead of calling "svn" for all files in the directory
> (and filter for errors). But of course, both approaches are doable.
>
> I replaced "stat -c" by "find -maxdepth 0".
> If this would work also with BSD, I would appreciate if my patch gets
> included.
>
> Index: contrib/client-side/asvn
> ===================================================================
> --- contrib/client-side/asvn (Revision 941610)
> +++ contrib/client-side/asvn (Arbeitskopie)
> @@ -61,6 +61,24 @@
> rm -f $TMPFILE $TMPFILE1 $TMPFILE2
> }
>
> +function stat_details()
> +{
> + local path=${1:-.}
> + # stat -c: can not be used, because it does not work on BSD
I think the above comment can just be removed. It talks about what
happened during patch review, rather than expaining why the code does
something the reader might not expect. A comment which talks about code
that isn't there isn't really useful.
Since the function doesn't use stat anymore, maybe rename it to
something like "get_file_info"?
> + find "$path" -maxdepth 0 -printf "mode=%m user=%u(%U) group=%g(%G)\n"
On BSD, this yields: find: -printf: unknown option
Which isn't your fault. It turns out that even as currently shipped,
asvn uses a few command line switches that are specific to GNU tools.
So asvn only works with GNU userland tools anyway right now.
For instance, without your patch I already get errors like:
$ asvn ci foo -m "adding foo"
this is the pre checkin process
find: -false: unknown option
find: -false: unknown option
Adding foo
Transmitting file data .
Committed revision 3.
Rewriting asvn to be portable to non-GNU system should be left for
a different patch. I'm not saying that you have to do that, just that
all patches should be self-contained on focus on solving a single problem.
Right now the focus is on preventing asvn to consider files which aren't
under version control, not on making asvn work on non-GNU systems.
> +}
> +
> +function svn_list()
> +{
> + [ $# -eq 0 ] && local path="`pwd`"
> + # grep -v "^?": exclude all files that do not belong to subversion
What about files that are ignored by svn?
They show up as 'I' if explicitly mentioned on the command line:
$ svn ps svn:ignore foo .
$ touch foo
$ svn status
$ svn status foo
I foo
$
> + # cut -c 42-: svn status lists different information. The filename starts at column 42
Language nitpick: "different" to what? I think you meant to say
something like "various information". Maybe just assume that people
already know what svn status does, and say:
# cut -c42 because filenames start at column 42 in svn status -v output
> + # improvement: use "svn status --xml" and parse the xml output
I don't think parsing XML in a shell script will be an improvement :)
The script would need to rely on some external tool to parse the XML.
XML wasn't made to be parsed by UNIX shell scripts.
> + svn status -v --ignore-externals $path "$@" | grep -v "^?" | cut -c 42-
Note that externals still show up as 'X' even with --ignore-externals.
Why do you always ignore externals?
svn commit does not recurse into externals by default, but svn update does.
So it seems as if record{dirinfo,permissions} should be run for all externals
after an update, and for commit, record{dirinfo,permissions} should be run
for externals which are explicitly mentioned on the command line (because
svn commit will recurse into them). Is this correct and can it be
done easily?
> +}
> +
> +
> +
> function basedirname()
> {
> refname="$1"
> @@ -320,10 +338,12 @@
> # Find all the directories and files
> cp /dev/null $TMPFILE
>
> - eval "find $PCWD $SKIPSVN -o \( \( -type d ! -name .svn \) -o -type f \) $PRINTDETAILS" | while read info
> + # uses svn_list instead of version based on find,
> + # because the find version produces warnings for all files
> + # that are not part of the repository (eg. backup files)
The above 3 lines of comment can also be removed.
Thanks,
Stefan
> + svn_list $PCWD | while read device
> do
> - device=`expr "$info" : "file='\(.*\)' mode"`
> - info=`expr "$info" : "file='.*' \(mode.*\)"`
> + info=`stat_details "$device"`
>
> if [ "$PCWD" = "$device" ]
> then
Received on 2010-05-06 12:53:58 CEST