On May 21, 2014, at 09:48, Dan Ellis wrote:

> On Wed, May 21, 2014 at 3:22 AM, Ryan Schmidt wrote:
> 
>> On May 20, 2014, at 17:02, Dan Ellis wrote:
>> 
>>> I'm attempting to copy a file from a working copy to the server, but using 
>>> an incorrect case for one of the folders in the path.  The paths all exist 
>>> and everything works fine using correct case.  In the example below, "FOO" 
>>> exists on the server as "foo".
>>> 
>>> (Case 1)
>>> c:\Project_files\sandbox>svn copy bar.c 
>>> http://svr/repo/some_project/FOO/bar.c -m "text commit"
>> 
>> You're trying to create something in the non-existent directory FOO, which 
>> is an error. It never gets to the point of calling your hook script. (The 
>> message might be clearer if it said "Directory not found: …, path 
>> '/some_project/FOO'" instead of "File not found: …, path 
>> '/some_project/FOO/bar.c'".)
>> 
>>> If I use --parents to create the path (in case it doesn't exist):
>>> 
>>> (Case 3)
>>> c:\Project_files\sandbox>svn copy --parents bar.c 
>>> http://svr/repo/some_project/FOO/bar.c -m "test commit"
>>> ** ERROR-CASE: Clash: '/some_project/FOO' '/some_project/foo'
>> 
>> You've asked Subversion to create a directory FOO when a directory foo 
>> already exists, which would be fine, except your hook script prevents case 
>> collisions.
> 
> My question revolves around why the different behavior/messages when the only 
> difference is when --parents is included. One case bombs out with a cryptic 
> message (svn: E155011: File 'C:\Project_files\sandbox\bar.c' is out of date) 
> and the other triggers a pre-commit check.  Both would seem to have identical 
> implementation accept when a directory is not found (--parents would create 
> it).  Why didn't case 1 trigger the pre-commit check?  Granted, the script in 
> question may be out of scope of this list.

The pre-commit hook script is only called if Subversion's internal checks 
already passed; if the internal checks fail, there's no reason to call the 
pre-commit hook script since the commit will fail regardless of the hook 
script's outcome.

The internal check that failed in this case was that you asked Subversion to 
put a file into a nonexistent directory.

I agree the error message could be improved, as I said above. I can reproduce 
it with a simple script:

$ cd /private/tmp
$ svnadmin create repo
$ REPO=file://$(pwd)/repo
$ svn co $REPO wc
Checked out revision 0.
$ cd wc
$ touch file
$ svn add file
A         file
$ svn ci file -m ""
Adding         file
Transmitting file data .
Committed revision 1.
$ svn up
Updating '.':
At revision 1.
$ svn cp file $REPO/nonexistent/path/to/file -m ""
Adding copy of        file
svn: E155011: Commit failed (details follow):
svn: E155011: File '/private/tmp/wc/file' is out of date
svn: E160013: File not found: transaction '1-1', path 
'/nonexistent/path/to/file'

I think it would be clearer if the message said:

Adding copy of        file
svn: E155011: Commit failed (details follow):
svn: E160013: Directory not found: transaction '1-1', path '/nonexistent'


>>> As I would expect, I cannot perform an "svn info" on the incorrect-cased 
>>> path.  I was hoping I could do an "svn info" to test/determine what the 
>>> case corrected path is, but will have to try an "svn copy --parents" first 
>>> and if it fails due to a case clash, retry with the returned clash info.  
>>> Is there a better way to accomplish this?  I do understand this is more of 
>>> a corner use case, especially since Subversion is (properly IMO) designed 
>>> around case sensitivity.
>> 
>> What exactly are you trying to accomplish? If the problem is that you don't 
>> know the names (or cases) of the directories in the repository, then you can 
>> use "svn ls" to find out.
> 
> Doing an "svn ls" is burden-some when you have a lengthy path that you want 
> to discover the case sensitive version of.  If you had A/b/C/d/E for a path, 
> you'd have to "svn ls" on the repo to find "A" vs "a" then do another for "B" 
> vs "b" etc.  I'd like to know of the easiest method to discover A/b/C/d/E vs 
> doing an svn copy --parents to have the server side report back the case 
> sensitive version of it.  Plus, from a previous email, there's no stock way 
> to do "svn list" and return only the directory listing (you have to wade 
> through all the files as well).
> 
> I guess the normal and usual use case is having a working copy checkout so 
> you can locally navigate the repo structure.  In our case, we are doing an 
> archive type of operation where we really do not want a local WC due to size 
> and just operation on the repo directly.  svn copy works great in this case 
> with the exception of users getting case confused.  

I don't understand how you get into the situation of knowing the letters in the 
names of directories in the repository but don't know their case.


Reply via email to