Julian Foad <julian.f...@wandisco.com> writes:

> Re:
>   * "svn info ^/b" -> "Not a valid URL"; should be "path '/b' not found
> in revision REV"?
>
> On Wed, 2010-12-08, Noorul Islam K M wrote:
> [...]
>> One of the solution that you suggested was to keep what the existing
>> code is doing but saying something more helpful than "Not a valid
>> URL". I thought that the error returned by the API might have useful
>> information and could be printed using svn_err_best_message(). For
>> example, take the following two cases.
>> 
>> 1. a) With the patch
>> 
>> noo...@noorul:/tmp/wc/latestrepo$ ~/projects/subversion/builds/trunk/bin/svn 
>> info 
>> ^/non-existing                                                               
>>             
>> URL 'file:///tmp/latestrepo/non-existing' non-existent in revision 0
>> 
>> svn: A problem occurred; see other errors for details
>> 
>> 1. b) Without the patch
>> 
>> noo...@noorul:/tmp/wc/latestrepo$ ~/projects/subversion/builds/trunk/bin/svn 
>> info 
>> ^/non-existing
>> file:///tmp/latestrepo/non-existing:  (Not a valid URL)
>> 
>> svn: A problem occurred; see other errors for details
>> 
>> 2. a) With the patch 
>> 
>> noo...@noorul:/tmp/wc/latestrepo$ ~/projects/subversion/builds/trunk/bin/svn 
>> info 
>> invalid://no-domain
>> Unrecognized URL scheme for 'invalid://non-domain'
>> 
>> svn: A problem occurred; see other errors for details
>> 
>> 2. b) Without patch
>> 
>> noo...@noorul:/tmp/wc/latestrepo$ ~/projects/subversion/builds/trunk/bin/svn 
>> info 
>> invalid://no-domain                                                          
>>          
>> invalid://no-domain:  (Not a valid URL)
>> 
>> svn: A problem occurred; see other errors for details
>>  
>> In both the above cases the patch helps the user to have better
>> information (what actually went wrong). Also If a user is using the
>> client API, I think he will be having these messages than the one that
>> we hard coded as of today.
>
> Thanks for these examples and comments.  Yes, I agree the output is much
> more helpful with the patch.
>
> What about the "(Not a versioned resource)" warning?  Just above the
> code you changed, there is code to print "(Not a versioned resource)".
> When is that message used?  Should we change it in the same way?  I
> don't think it makes sense to change one of these and not the other.
>
>

With version 1.7 I am not able to find a scenario for which this
particular block gets executed. With 1.6, if I try to find information
for non-existing wc path, then that particular block gets executed.

Eg:-

With 1.6

$ svn info non-existent

non-existent:  (Not a versioned resource)

../subversion/libsvn_client/info.c:266: (apr_err=150000)
svn: 'non-existent' is not under version control

With 1.7 (trunk)

$ svn info non-existent
svn: The node '/tmp/wc/repo1.7/non-existent' was not found.


Another thing that I observed is that when there are multiple targets
specified for info command, 1.6 and 1.7 has behavioral difference.

Eg:-

With 1.6

$ svn info non-existent A

non-existent:  (Not a versioned resource)

Path: A
Name: A
URL: file:///tmp/repo1.6/A
Repository Root: file:///tmp/repo1.6
Repository UUID: 99761077-9087-4fca-ba50-95f68245589a
Revision: 1
Node Kind: file
Schedule: normal
Last Changed Author: noorul
Last Changed Rev: 1
Last Changed Date: 2010-12-23 11:40:29 +0530 (Thu, 23 Dec 2010)
Text Last Updated: 2010-12-23 11:40:15 +0530 (Thu, 23 Dec 2010)
Checksum: d41d8cd98f00b204e9800998ecf8427e

../subversion/libsvn_client/info.c:266: (apr_err=150000)
svn: 'non-existent' is not under version control


With 1.7 

$ svn info non-existent A
svn: The node '/tmp/wc/repo1.7/non-existent' was not found.

Ideally it should have displayed information for A since that particular
file exists, instead it errors out.

I fixed this by catching the exact error code SVN_ERR_WC_PATH_NOT_FOUND
in this particular scenario. I think we don't have to catch
SVN_ERR_UNVERSIONED_RESOURCE and  SVN_ERR_ENTRY_NOT_FOUND any more as
this was the case in 1.6.


>> I ran the test suite and found that one of the test cases was failing
>> and I fixed the same. There were no other failures.
>
> Thanks.
>
> [...]
>> Make "svn info" to display the actual error message returned by API when
>> illegal URL is passed.
>> 
>> * subversion/svn/info-cmd.c
>>   (svn_cl__info): Display the actual error message returned by
>>     svn_client_info3() instead of a custom one.
>> 
>> * subversion/tests/cmdline/basic_tests.py
>>   (info_nonexisting_file): Modify test case
> [...]
>
>> Index: subversion/tests/cmdline/basic_tests.py
>> ===================================================================
>> --- subversion/tests/cmdline/basic_tests.py  (revision 1042948)
>> +++ subversion/tests/cmdline/basic_tests.py  (working copy)
>> @@ -2270,7 +2270,8 @@
>>  
>>    # Check for the correct error message
>>    for line in errput:
>> -    if re.match(".*\(Not a valid URL\).*", line):
>> +    if re.match(".*" + idonotexist_url + ".*non-existent in revision 1.*",
>> +                line):
>>        return
>>  
>>    # Else never matched the expected error output, so the test failed.
>> Index: subversion/svn/info-cmd.c
>> ===================================================================
>> --- subversion/svn/info-cmd.c        (revision 1042948)
>> +++ subversion/svn/info-cmd.c        (working copy)
>> @@ -504,6 +504,7 @@
>>    svn_opt_revision_t peg_revision;
>>    svn_info_receiver_t receiver;
>>    const char *path_prefix;
>> +  char errbuf[256];
>
> Please move this variable to the inner scope.
>

Done!

>>  
>>    SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
>>                                                        opt_state->targets,
>> @@ -584,12 +585,9 @@
>>              }
>>            else if (err->apr_err == SVN_ERR_RA_ILLEGAL_URL)
>>              {
>> -              SVN_ERR(svn_cmdline_fprintf
>> -                      (stderr, subpool,
>> -                       _("%s:  (Not a valid URL)\n\n"),
>> -                       svn_path_is_url(truepath)
>> -                         ? truepath
>> -                         : svn_dirent_local_style(truepath, pool)));
>> +              SVN_ERR(svn_cmdline_fprintf(
>> +                stderr, subpool, _("%s\n\n"), 
>
> You can remove the _() wrapper because this string no longer contains
> any local-language text to be translated.
>

Done!

>> +                svn_err_best_message(err, errbuf, sizeof(errbuf))));
>>              }
>
> I think if we are going to print the error message, we should print it
> with an "svn: " prefix like we normally do.
>
> The old error message included a fixed string (the same for all possible
> errors), which was helpful for people to recognize it as an error
> message and for scripts to detect it.  The "best message" doesn't have
> any fixed part.  I think adding an "svn: " prefix would enable people
> and scripts to recognize it.

I think you are right. As of now this is not happening but I added 'svn'
prefix to the message.

Please find attached the updated patch with review comments incorporated
and enhancements. All tests pass with this patch.

Log
[[[

Make "svn info" to display the actual error message returned by API when
one of the targets is a non-existent URL or wc-entry. 

* subversion/svn/info-cmd.c
  (svn_cl__info): Display the actual error message returned by
    svn_client_info3() instead of a custom one. Catch error
    SVN_ERR_WC_PATH_NOT_FOUND instead of SVN_ERR_UNVERSIONED_RESOURCE
    and SVN_ERR_ENTRY_NOT_FOUND for non-existent wc-entry.

* subversion/tests/cmdline/basic_tests.py
  (info_nonexisting_file): Modify test case

Patch by: Noorul Islam K M <noorul{_AT_}collab.net>
]]]

Thanks and Regards
Noorul

Reply via email to