subversion-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Julian Foad <julianf...@btopenworld.com>
Subject Re: Subversion checkout issue with certain short names on Windows
Date Thu, 30 Apr 2015 07:20:44 GMT
Ping! I just noticed this thread had gone quiet. Anybody want to add
anything to the discussion, or file an issue or write a test for it?

- Julian


On 30 March 2015 at 19:32, Stefan Kueng <tortoisesvn@gmail.com> wrote:
> On 29.03.2015 17:50, Bert Huijben wrote:
>>> -----Original Message-----
>>> From: Stephen White [mailto:swhite@corefiling.com]
>>> Sent: vrijdag 27 maart 2015 14:03
>>> To: dev@subversion.apache.org
>>> Subject: Subversion checkout issue with certain short names on Windows
>>>
>>> If you pass a Windows short-name as the destination to "svn co" then it
>>> will normally work correctly, unless the short name is actually longer
>>> than the "long name" in which case the string handling seems to go awry.
>>>
>>> First a working example:
>>>
>>>   > mkdir ALongName.impl
>>>   > dir /x
>>> ...
>>> 27/03/2015  12:50    <DIR>          ALONGN~1.IMP ALongName.impl
>>> ...
>>>   >svn co --depth=files http://svn.apache.org/repos/asf/subversion/trunk
>>> ALONGN~1.IMP
>>> A    ALongName.impl\NOTICE
>>> A    ALongName.impl\get-deps.sh
>>> A    ALongName.impl\Makefile.in
>>> A    ALongName.impl\LICENSE
>>> A    ALongName.impl\build.conf
>>> A    ALongName.impl\win-tests.py
>>> A    ALongName.impl\COMMITTERS
>>> A    ALongName.impl\README
>>> A    ALongName.impl\BUGS
>>> A    ALongName.impl\configure.ac
>>> A    ALongName.impl\TODO
>>> A    ALongName.impl\.ycm_extra_conf.py
>>> A    ALongName.impl\INSTALL
>>> A    ALongName.impl\CHANGES
>>> A    ALongName.impl\autogen.sh
>>> A    ALongName.impl\gen-make.py
>>> A    ALongName.impl\aclocal.m4
>>>    U   ALongName.impl
>>>    Checked out revision 1669571.
>>>
>>>
>>> That's behaving as expected.  SVN checks out into the ALongName.impl
>>> directory, as both the long name and the short name should be
>>> synonymous.  It outputs the long name, not the short name given on the
>>> command-line, which was slightly surprising but not a problem.
>>> Presumably the result of some canonicalisation code somewhere.
>>>
>>> Now lets try the same sequence of operations with a different directory
>>> name:
>>>
>>>   > mkdir api.impl
>>>   > dir /x
>>> ...
>>>    27/03/2015  12:52    <DIR>          API~1.IMP    api.impl
>>> ...
>>>   >svn co --depth=files http://svn.apache.org/repos/asf/subversion/trunk
>>> API~1.IMP
>>>    A    api.implP\NOTICE
>>>    A    api.implP\get-deps.sh
>>>    A    api.implP\Makefile.in
>>>    A    api.implP\LICENSE
>>>    A    api.implP\build.conf
>>>    A    api.implP\win-tests.py
>>>    A    api.implP\COMMITTERS
>>>    A    api.implP\README
>>>    A    api.implP\BUGS
>>>    A    api.implP\configure.ac
>>>    A    api.implP\TODO
>>>    A    api.implP\.ycm_extra_conf.py
>>>    A    api.implP\INSTALL
>>>    A    api.implP\CHANGES
>>>    A    api.implP\autogen.sh
>>>    A    api.implP\gen-make.py
>>>    A    api.implP\aclocal.m4
>>>     U   api.implP
>>>     Checked out revision 1669571.
>>>
>>>
>>> Here the behaviour is incorrect, it's created a new folder "api.implP"
>>> and checkout out to that.  The spurious "P" character is the last
>>> character of the short name, so it looks like a buffer is being
>>> overwritten incorrectly in situations where the long name turns out to
>>> be shorter than the short name.  That happens in this case because,
>>> although "api.impl" is short, the "file extension" is more than 3
>>> characters so this isn't a valid Windows 8.3 (short) name.
>>>
>>> The use of the --depth=files option isn't signficant here, it just makes
>>> the reproduction steps quicker to run.
>>>
>>> I think this is a pretty clear example of a bug, does anyone else agree?
>>
>>
>> It looks like a bug, but not one that we can fix in Subversion. We use the
>> apr library for all our path calculations. I'm guessing that this problem
>> occurs in the APR truename implementation, as after that the code to convert
>> back from absolute paths back to shortnames would be affected
>>
>> What do you see if you just type 'svn info API~1.IMP' for that directory.
>> (I don't think this is in any way specific to checkout)
>>
>>
>> The obvious workaround is of course to just use the full name instead of
>> the short name.
>>
>>
>> Interesting followup questions would be what version of Subversion and
>> what version of apr you are using. Perhaps this issue was already fixed.
>
>
> From what I can see just by looking at the code, the problem is that the
> paths passed on the command line are used almost as-is, with only
> canonicalization done on them. Those paths are used then in some parts of
> the code, but once those paths are passed to the apr file-io functions,
> those paths are (inside apr) translated to the long form. Callbacks then use
> those long paths, but the rest of the code still uses the short paths, and
> in this case they're not identical and that leads to the described problem.
> I'm pretty sure that there are other problems because of this.
>
> I had to fix this in TSVN by making sure that all paths passed to it (either
> on the command line or by entering them anywhere in the UI) are first
> converted to the long format before I pass them on to the svn APIs.
>
> A possible fix would be to do that in the svn command line client as well,
> maybe in svn_opt__arg_canonicalize_path(). But this would require ifdef
> statements and windows specific code, which I'm aware is not something that
> the svn devs really like.
> The calculated paths in svn_opt__arg_canonicalize_path would have to be
> passed through the windows API GetLongPathName():
> https://msdn.microsoft.com/en-us/library/windows/desktop/aa364980%28v=vs.85%29.aspx
>
> Stefan

Mime
View raw message