Noorul Islam K M <noo...@collab.net> writes:

> Julian Foad <julian.f...@wandisco.com> writes:
>
>> Just taking a quick look.
>>
>> * Please always include the log message with the patch.
>>
>
> I did include the log message in one of the previous mails. Since there
> was no change to the log message I did not include in the subsequent
> replies.
>
>> * Use SVN_ERR instead of svn_error_clear. There 'kind' variable is not
>> guaranteed to be set to a valid value if you the function throws an
>> error.
>>
>> * Name the variable the same way ('to_kind') in both code paths.
>>
>> * Should export_file_overwrite_with_force() test exporting from a URL as
>> well as from a local source? (If not, why not?)
>>
>
> Incorporated you review comments. Please find attached updated
> patch. Here is the log message.
>
> Log
>
> [[[ 
>
> Fix for issue #3799. Make svn export display error, when exporting file,
> tries to overwrite target.
>
> * subversion/libsvn_client/export.c
>   (copy_versioned_files, svn_client_export5): Return
>     SVN_ERR_FS_ALREADY_EXISTS if export tries to overwrite existing
>     file, child directory.
>
> * subversion/tests/cmdline/export_tests.py
>   (export_file_overwrite_fails): Extend test for URL source. Remove
>     XFail marker.
>   (export_file_overwrite_with_force): New test
>   (test_list): Add reference to new test
>
> * subversion/tests/cmdline/externals_tests.py
>   (export_wc_with_externals): Fix failing test by passing --force.
>
> Patch by: Noorul Islam K M <noorul{_AT_}collab.net>
> ]]]
>
>

The above log message is not correct. Please find below the correct
one. 

Log

[[[ 

Fix for issue #3799. Make svn export display error, when exporting file,
tries to overwrite target.

* subversion/libsvn_client/export.c
  (copy_versioned_files, svn_client_export5): Return
    SVN_ERR_ILLEGAL_TARGET if export tries to overwrite existing
    file, child directory.

* subversion/tests/cmdline/export_tests.py
  (export_file_overwrite_fails): Extend test for URL source. Remove
    XFail marker.
  (export_file_overwrite_with_force): New test
  (test_list): Add reference to new test

* subversion/tests/cmdline/externals_tests.py
  (export_wc_with_externals): Fix failing test by passing --force.

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

Thanks and Regards
Noorul

>> * Why does that externals test (number 10) need "--force"? Without it,
>> it fails like this, but I don't understand why:
>>
>> [[[
>> CMD: /home/julianfoad/src/subversion-b/bin/svn export 
>> svn-test-work/working_copies/externals_tests-10 
>> svn-test-work/working_copies/externals_tests-10.export --config-dir 
>> /home/julianfoad/build/subversion-b/subversion/tests/cmdline/svn-test-work/local_tmp/config
>>  --password rayjandom --no-auth-cache --username jrandom exited with 1
>> <TIME = 0.039988>
>> A    svn-test-work/working_copies/externals_tests-10.export/A
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/lambda
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/gamma
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/E
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/E/alpha
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/E/beta
>> A    svn-test-work/working_copies/externals_tests-10.export/A/B/F
>> /home/julianfoad/src/subversion-b/subversion/svn/export-cmd.c:123: 
>> (apr_err=200009)
>> /home/julianfoad/src/subversion-b/subversion/libsvn_client/export.c:1291: 
>> (apr_err=200009)
>> /home/julianfoad/src/subversion-b/subversion/libsvn_client/export.c:499: 
>> (apr_err=200009)
>> /home/julianfoad/src/subversion-b/subversion/libsvn_client/export.c:499: 
>> (apr_err=200009)
>> /home/julianfoad/src/subversion-b/subversion/libsvn_client/export.c:563: 
>> (apr_err=200009)
>> /home/julianfoad/src/subversion-b/subversion/libsvn_client/export.c:578: 
>> (apr_err=200009)
>> svn: E200009: Destination file 
>> '/home/julianfoad/build/subversion-b/subversion/tests/cmdline/svn-test-work/working_copies/externals_tests-10.export/A/B/gamma'
>>  exists, and will not be overwritten unless forced
>> ]]]
>>
>
> A/B/gamma is part of working copy and also part of the externals. This
> makes this path to be exported twice. During the second time it is
> failing with the above message.
>
> Thanks and Regards
> Noorul
>
> Index: subversion/tests/cmdline/externals_tests.py
> ===================================================================
> --- subversion/tests/cmdline/externals_tests.py       (revision 1126953)
> +++ subversion/tests/cmdline/externals_tests.py       (working copy)
> @@ -752,7 +752,8 @@
>                                       repo_url, wc_dir)
>    # Export the working copy.
>    svntest.actions.run_and_verify_svn(None, None, [],
> -                                     'export', wc_dir, export_target)
> +                                     'export', '--force',
> +                                     wc_dir, export_target)
>  
>    ### We should be able to check exactly the paths that 
> externals_test_setup()
>    ### set up; however, --ignore-externals fails to ignore 'A/B/gamma' so this
> Index: subversion/tests/cmdline/export_tests.py
> ===================================================================
> --- subversion/tests/cmdline/export_tests.py  (revision 1126953)
> +++ subversion/tests/cmdline/export_tests.py  (working copy)
> @@ -589,19 +589,19 @@
>                                          '.', expected_output,
>                                          expected_disk)
>  
> -@XFail()
>  @Issue(3799)
>  def export_file_overwrite_fails(sbox):
>    "exporting a file refuses to silently overwrite"
>    sbox.build(create_wc = True, read_only = True)
>  
>    iota_path = os.path.abspath(os.path.join(sbox.wc_dir, 'iota'))
> +  iota_url = sbox.repo_url + '/iota'
>    not_iota_contents = "This obstructs 'iota'.\n"
>  
>    tmpdir = sbox.get_tempname('file-overwrites')
>    os.mkdir(tmpdir)
>  
> -  # Run it
> +  # Run it for source local
>    open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
>    svntest.actions.run_and_verify_svn(None, [], '.*exist.*',
>                                       'export', iota_path, tmpdir)
> @@ -612,6 +612,17 @@
>        })
>    svntest.actions.verify_disk(tmpdir, expected_disk)
>  
> +  # Run it for source URL
> +  open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
> +  svntest.actions.run_and_verify_svn(None, [], '.*exist.*',
> +                                     'export', iota_url, tmpdir)
> +
> +  # Verify it failed
> +  expected_disk = svntest.wc.State('', {
> +      'iota': Item(contents=not_iota_contents),
> +      })
> +  svntest.actions.verify_disk(tmpdir, expected_disk)
> +
>  def export_ignoring_keyword_translation(sbox):
>    "export ignoring keyword translation"
>    sbox.build()
> @@ -867,6 +878,36 @@
>  
>    os.chdir(orig_dir)
>  
> +def export_file_overwrite_with_force(sbox):
> +  "exporting a file with force option"
> +  sbox.build(create_wc = True, read_only = True)
> +
> +  iota_path = os.path.abspath(os.path.join(sbox.wc_dir, 'iota'))
> +  iota_url = sbox.repo_url + '/iota'
> +  not_iota_contents = "This obstructs 'iota'.\n"
> +  iota_contents = "This is the file 'iota'.\n"
> +
> +  tmpdir = sbox.get_tempname('file-overwrites')
> +  os.mkdir(tmpdir)
> +
> +  expected_disk = svntest.wc.State('', {
> +      'iota': Item(contents=iota_contents),
> +      })
> +
> +  # Run it for WC export
> +  open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
> +  svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
> +                                     [], 'export', '--force',
> +                                     iota_path, tmpdir)
> +  svntest.actions.verify_disk(tmpdir, expected_disk)
> +  
> +  # Run it for URL export
> +  open(os.path.join(tmpdir, 'iota'), 'w').write(not_iota_contents)
> +  svntest.actions.run_and_verify_svn(None, svntest.verify.AnyOutput,
> +                                     [], 'export', '--force',
> +                                     iota_url, tmpdir)
> +  svntest.actions.verify_disk(tmpdir, expected_disk)
> +
>  ########################################################################
>  # Run the tests
>  
> @@ -899,6 +940,7 @@
>                export_working_copy_with_depths,
>                export_externals_with_native_eol,
>                export_to_current_dir,
> +              export_file_overwrite_with_force,
>               ]
>  
>  if __name__ == '__main__':
> Index: subversion/libsvn_client/export.c
> ===================================================================
> --- subversion/libsvn_client/export.c (revision 1126953)
> +++ subversion/libsvn_client/export.c (working copy)
> @@ -569,6 +569,25 @@
>      }
>    else if (from_kind == svn_node_file)
>      {
> +      svn_node_kind_t to_kind;
> +
> +      SVN_ERR(svn_io_check_path(to_abspath, &to_kind, pool));
> +
> +      if ((to_kind == svn_node_file || to_kind == svn_node_unknown) && ! 
> force)
> +        {
> +          return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
> +                                   _("Destination file '%s' exists, "
> +                                     "and will not be overwritten unless "
> +                                     "forced"),
> +                                   svn_dirent_local_style(to_abspath, pool));
> +        }
> +      else if (to_kind == svn_node_dir)
> +        return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
> +                                 _("Destination %s exists. Cannot overwrite "
> +                                   "directory with non-directory"),
> +                                 svn_dirent_local_style(to_abspath, pool));
> +
> +
>        SVN_ERR(copy_one_versioned_file(from_abspath, to_abspath, ctx,
>                                        revision, native_eol, ignore_keywords,
>                                        pool));
> @@ -1064,6 +1083,7 @@
>            apr_hash_t *props;
>            apr_hash_index_t *hi;
>            struct file_baton *fb = apr_pcalloc(pool, sizeof(*fb));
> +          svn_node_kind_t to_kind;
>  
>            if (svn_path_is_empty(to_path))
>              {
> @@ -1080,7 +1100,23 @@
>                eb->root_path = to_path;
>              }
>  
> +          SVN_ERR(svn_io_check_path(to_path, &to_kind, pool));
>  
> +          if ((to_kind == svn_node_file || to_kind == svn_node_unknown) &&
> +              ! overwrite)
> +            {
> +              return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
> +                                       _("Destination file '%s' exists, "
> +                                         "and will not be overwritten unless 
> "
> +                                         "forced"),
> +                                       svn_dirent_local_style(to_path, 
> pool));
> +            }
> +          else if (to_kind == svn_node_dir)
> +            return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
> +                                     _("Destination %s exists. Cannot 
> overwrite "
> +                                       "directory with non-directory"),
> +                                     svn_dirent_local_style(to_path, pool));
> +
>            /* Since you cannot actually root an editor at a file, we
>             * manually drive a few functions of our editor. */
>  

Reply via email to