Bert, do you know the issue number for this "known issue"?

I checked what the Windows, Visual studio and vscrt do. It's easy to get the 
original command line as it was typed into console using function 
GetCommandLine (1). It's easy to instruct CRT to expand * to all the files by 
linking setargv.obj (2), see 
https://msdn.microsoft.com/en-us/library/8bch7bkk(v=vs.100).aspx.

The example c++ code is here, easily convertible into c:
#include <iostream>
#include <windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    //
    _TCHAR* cmd_line = GetCommandLine();
    std::cout << _T("Whole command line=") << cmd_line << _T("\n");

    for (int i=0; i<argc; i++)
        std::cout << _T("argv[") << i << _T("]=") << argv[i] << _T("\n");

       return 0;
}

I compiled it with VS 2010 and run on windows 7.
When run a directory with the following files:

b:\svn>dir /b
args
bad-svn.txt

It was possible to get asterisk expansion and the original line:

b:\svn>args\debug\args 1 "2" "*" *
Whole command line=args\debug\args  1 "2" "*" *
argv[0]=args\debug\args
argv[1]=1
argv[2]=2
argv[3]=args
argv[4]=bad-svn.txt
argv[5]=args
argv[6]=bad-svn.txt

This processing of asterisks by CRT function _setargv  is different from the 
processing of unix shells as it removes the quotes if present. But the svn.exe 
can start with the result of GetCommandLine and evaluate arguments better, it 
can distinguish between "*" and *.

Jože

From: Bert Huijben [mailto:b...@qqmail.nl]
Sent: Thursday, June 11, 2015 3:56 PM
To: Jože Fabčič; dev@subversion.apache.org
Subject: RE: bug? svn.exe propset svn:executable "*" affects too may files on 
Windows

On Windows the '*' is evaluated even when it is enclosed in quotes... (The 
arguments are expanded by 'svn' after they are split on Windows, instead of by 
the shell as on many other platforms). So your command sets the name of the 
first file that matches to the svn:executable value on all further files that 
match.

There is not much we can do about this. A valid workaround is passing a 
different character (E.g. 'x'), as Subversion will canonicalize the value of 
this reserved property to '*' when you set it.
(Another workaround is using -F <file> where file contains '*')


Given that this is a known issue, it would have been better to ask this on the 
user list.

                Bert

From: Jože Fabčič [mailto:joze.fab...@comtrade.com]
Sent: donderdag 11 juni 2015 15:26
To: dev@subversion.apache.org<mailto:dev@subversion.apache.org>
Subject: bug? svn.exe propset svn:executable "*" affects too may files on 
Windows

Hi all,

I compiled a library (boost) and found out that few files are missing the 
svn:executable property. I wanted to set the property and the command line 
client started to apply the property to all the files in the current directory:

b:\boost\boost-1.44>svn propset svn:executable "*" bootstrap.sh
property 'svn:executable' set on 'boost-build.jam'
property 'svn:executable' set on 'boost.css'
property 'svn:executable' set on 'boost.png'
property 'svn:executable' set on 'bootstrap.bat'
property 'svn:executable' set on 'bootstrap.sh'
svn: E200009: Cannot set 'svn:executable' on a directory 
('B:\boost\boost-1.44\doc')

The working copy was created with TortoiseSVN, probably 1.8.10 that linked SVN 
1.8.11. I upgraded to the latest TortoiseSVN 1.8.11 that links SVN 1.8.13 and 
received the same result. I installed SVN 1.8.13 from 
https://www.visualsvn.com/downloads/ and received the same result.

On unix, the command works correctly. Using some other value of a property, as 
used for example in SVN book works fine:

b:\boost\boost-1.44>svn propset svn:executable on bootstrap.sh

The asterisk "*" is returned as the value of property.

b:\boost\boost-1.44>svn propget svn:executable  bootstrap.sh
*

When searching google with "svn execute permission windows", the first result 
that I receive is

http://stackoverflow.com/questions/6874085/how-to-set-execute-attribute-to-a-file-and-check-it-in-svn-from-windows

and besides the correct procedure using TortoiseSVN it also presents the wrong 
command-line invocation

svn propset svn:executable "*" someScript

It seems that the value of property is incorrectly used also for selecting the 
target:
b:\boost\boost-1.44>svn propset svexecutable "i*" bootstrap.sh
property 'svexecutable' set on 'index.html'
property 'svexecutable' set on 'INSTALL'
property 'svexecutable' set on 'bootstrap.sh'
b:\boost\boost-1.44>svn propset svexecutable b* bootstrap.sh
property 'svexecutable' set on 'boost-build.jam'
property 'svexecutable' set on 'boost.css'
property 'svexecutable' set on 'boost.png'
property 'svexecutable' set on 'bootstrap.bat'
property 'svexecutable' set on 'bootstrap.sh'
property 'svexecutable' set on 'bootstrap.sh'

Do you see the same behaviour also on your systems?

Thanks, Jože

Reply via email to