copy-planz.txt
From: <cmpilato_at_collab.net>
Date: 2001-11-15 20:26:27 CET
Ben and I are pretty much fielding the bulk of the `svn cp' and `svn
There are all kinds of little nuances involved in this stuff, and all
Anyway, these are my plans thus far. Feedback *about the planz* (If
----
Here's the generic routine for accomplishing a copy/move given two
paths. It was comforting to find, after I had worked out this
algorithm, that Ben had done pretty much exactly this already in
svn_client_copy().
if (not exist src_path)
return ERR_BAD_SRC error
if (exist dst_path)
{
if (dst_path is directory)
copy src_path into dst_path as basename (src_path)
else
return ERR_OBSTRUCTION error
}
else
{
if (not exist parent_of_dst_path)
return ERR_BAD_DST error
else
copy src_path into parent_of_dst_path as basename (dst_path)
}
if (this is a move)
delete src_path
----
Here is how I plan to handle the four basic cases for `svn copy/move',
as determined by the type of paths supplied as the SRC and DST
arguments to the copy command.
* Case I - SRC is working copy path, DST is working copy path:
I don't care about it. Ben Collins-Sussman is handling that. :-)
* Case II - SRC is working copy path, DST is repository URL:
To accomplish this operation, we drive the commit crawler/editor in
pretty much the same way we would if performing an import, except
we are using an existing working copy to determine the items being
imported instead of disk dirents. All items in SRC tree are added,
either implicitly (as a side effect of their parents having been
added) or explicitly (at the top of the SRC tree, or because they
have a different revision from that of their parent). Also, local
modifications to items in SRC are transmitted as part of the commit
as well.
If this a `move' operation, SRC (or, the URL associate with SRC in
the repository) will be deleted as part of the commit process.
The working copy is never modified during this process is this is a
`copy'. For `move's, we *could* go ahead and remove SRC in the
working copy, but I'm planning to just take the easy route for now
and require the user to update. I'd like to keep this a WC-free
operation.
* Case III - SRC is repository URL, DST is working copy path:
There are two routes to take with this:
- Treat this as a Case IV (using DST's constructed repository URL)
plug a checkout of DST, or
- Treat this is a special checkout of SRC (at the optionally supplied
revision, even), except that once the checkout is complete, you
have DST scheduled for commit as a copy.
I personally like the former, seems cleaner to me, and it allows
`move's to happen atomically.
* Case IV - SRC is repository URL, DST is repository URL:
This is a freaky special commit drive, where we operate purely on
our ability to split paths up into components, and then "crawl"
those trees based purely on the layout of those path components.
Actually, for copies this is pretty much a four-line commit:
e->replace_root (dst)
e->add_(file/dir) (dst_basename, copyfrom=src)
e->close_dir
e->close_edit
The part that requires all the path component attention is if this
is a move, because we have make sure to anchor the edit at the
longest common ancestor of SRC and DST so we can delete SRC as part
of the same transaction as our addition of DST.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:36:48 2006
|
This is an archived mail posted to the Subversion Dev mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.