[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Improving support for copy and move

From: Paul Burba <paulb_at_softlanding.com>
Date: 2006-05-18 21:53:35 CEST

Paul Burba <paulb@softlanding.com> wrote on 05/16/2006 04:51:59 PM:

> Hi Ivan,
>
> Your patch seems to work when moving/copying copied *files* only. Not
> sure what exactly is going on, but trying to copy a copied directory
> fails:
>
> svnadmin create /svn/repos/cm1
>
> svn co file:///svn/repos/cm1 /svn/wcs/cm1
> Checked out revision 0.
>
> touch /svn/wcs/cm1/foo
>
> svn mkdir /svn/wcs/cm1/bar
> A \SVN\WCS\cm1\bar
>
> svn add /svn/wcs/cm1/foo
> A \SVN\WCS\cm1\foo
>
> svn ci -m "log message" /svn/wcs/cm1
> Adding WCS\cm1\bar
> Adding WCS\cm1\foo
> Transmitting file data .
> Committed revision 1.
>
> svn cp /svn/wcs/cm1/foo /svn/wcs/cm1/foo1
> A \SVN\WCS\cm1\foo1
>
> svn cp /svn/wcs/cm1/foo1 /svn/wcs/cm1/foo2
> A \SVN\WCS\cm1\foo2
>
> svn cp /svn/wcs/cm1/bar /svn/wcs/cm1/bar1
> A \SVN\WCS\cm1\bar1
>
> svn cp /svn/wcs/cm1/bar1 /svn/wcs/cm1/bar2
>
> c:\svn\svn.trunk.copymove\src-trunk.collabnet.
> trunk\subversion\libsvn_wc\adm_files.c:974:
> (apr_err=155000)
> svn: URL 'file:///svn/repos/cm1/bar' doesn't match existing URL
> 'file:///svn/repos/cm1/bar1' in '/SVN/WCS/cm1/bar2/bar1'
>
> I'll look into this tomorrow, but in the meantime if you have any
thoughts
> on what is wrong please let me know.
>
> Thanks,
>
> Paul B.

Ivan,

Sorry for the delay. The problem starts in copy_dir_administratively()
where, following the example above, call svn_io_copy_dir_recursively(
src_path=="bar1", dst_basename=="bar2") is called. This results in the
following fields in /svn/wcs/cm1/bar2/.svn/entries:

  URL: file:///svn/repos/cm1/bar1
  COPIED: copied
  COPYFROM_URL: file:///svn/repos/cm1/bar
 
Later in copy_dir_administratively() your patch sets copyfrom_url to
src_entry->copyfrom_url=="file:///svn/repos/cm1/bar". Then
svn_wc_add2(copyfrom_url=="file:///svn/repos/cm1/bar") is called, which in
turn calls svn_wc_ensure_adm2(path=="bar2", url=="
file:///svn/repos/cm1/bar") which fails with an
SVN_ERR_WC_OBSTRUCTED_UPDATE error since the given URL=="
file:///svn/repos/cm1/bar" doesn't match the URL in the administrative
area=="file:///svn/repos/cm1/bar1".

A new patch is attached with a partial solution: If moving/copying a
copied dir, it sets the URL field in entries to src_entry->copyfrom_url ("
file:///svn/repos/cm1/bar" in the above example) after calling
svn_io_copy_dir_recursively(). This prevents svn_wc_ensure_adm2() from
failing. The correct URL is then set by svn_wc__do_update_cleanup(). This
is what happens during a "normal" versioned directory copy so it seems
like the right thing to do...but I'm hardly certain it's the best
approach.

Anyway, as my original purpose was to create some tests for your patch,
five new copy tests are included too:

1) copy_copied_file_and_dir - copy a file and dir, copy the copies, commit

2) move_copied_file_and_dir - copy a file and dir, move the copies, commit

3) move_moved_file_and_dir - move a file and dir, move them again, commit

4) move_file_within_moved_dir - move a dir, then move a file within that
dir twice, commit

5) move_dir_within_moved_dir - move a dir, then move a dir within that dir
twice, commit

As I said, my patch is, at best, only a partial solution...tests 4 & 5
still fail when attempting the last of the three moves. I don't want to
proceed any further until some folks with more experience in this area
weigh in. I'm just going in circles at this point :-(

Please take a look, thanks,

Paul B.

[[[
Allow copy/move files that already copied.
* subversion/libsvn_wc/copy.c:
  (copy_file_administratively, copy_dir_administratively): Use source's
  copyfrom-url and copyfrom-rev instead of url and rev when copying or
  moving already copied files or directories. When copying directories,
  set the URL entry in the destination directories "this dir" entries
  record to the source's copyfrom-url.

* subversion/tests/cmdline/copy_tests.py
  (copy_copied_file_and_dir, move_copied_file_and_dir,
  move_moved_file_and_dir, move_file_within_moved_dir,
  move_dir_within_moved_dir): New tests.
]]]

_____________________________________________________________________________
Scanned for SoftLanding Systems, Inc. and SoftLanding Europe Plc by IBM Email Security Management Services powered by MessageLabs.
_____________________________________________________________________________

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Received on Thu May 18 21:54:12 2006

This is an archived mail posted to the Subversion Dev mailing list.