view notes/metadata.txt @ 937:fb6f6b7fa5a5

editor: implement file batons The concept of current.file is incorrect, svn_delta.h documents open file lifetime as: * 5. When the producer calls @c open_file or @c add_file, either: * * (a) The producer must follow with any changes to the file * (@c change_file_prop and/or @c apply_textdelta, as applicable), * followed by a @c close_file call, before issuing any other file * or directory calls, or * * (b) The producer must follow with a @c change_file_prop call if * it is applicable, before issuing any other file or directory * calls; later, after all directory batons including the root * have been closed, the producer must issue @c apply_textdelta * and @c close_file calls. So, an open file can be kept open until after the root directory is closed and have deltas applied afterwards. In the meantime, other files may have been opened and patched, overwriting the current.file variable. This patch fixes it by introducing file batons bound to file paths, and using them to deduce the correct target in apply_textdelta(). In theory, open files could be put in a staging area until they are closed and moved in the RevisionData. But the current code registers files copied during a directory copy as open files and these will not receive a close_file() event. This separation will be enforced later.
author Patrick Mezard <patrick@mezard.eu>
date Sun, 23 Sep 2012 19:52:48 +0200
parents ba801f44d240
children
line wrap: on
line source

Branches
--------
In order to handle branches that are not immediate children of /branches/, the
following information must be stored in the revmap:

revision path

Where path is the actual relative path of the branch in svn. An example, with
the previous format for clarification:
New                          | Old
3 <hash> trunk               | 3 <hash>
4 <hash> branches/foo        | 4 <hash> foo

Tags
----
Note that if a tag is committed to, we can handle that case by making a branch
and then marking it as deleted. The revmap line would look something like this:
10 <hash> tags/the_tag
And the commit would be done on the hg branch 'modified-tag/the_tag'. Note that 
if this was 'tags/releases/1.0.0', then the branch would be 
'modified-tag/releases/1.0.0'.

Detecting Closing of Branches
-----------------------------
Subversion users typically remove branches when done with them. This means that
if a commit performs a delete operation on the '' path inside a branch, we can
be sure that the branch no longer exists. The branch should then be marked as
inactive.

Closing Branches
----------------
As of this writing, Mercurial marks branches as inactive by merging them so they
have no active heads. In order to mark a branch as closed, the active head on
the branch will be used as the first parent of the new changeset, and the second
changeset will be either the active head on the hg branch 'closed-branches' or
be the nullrev. The commit to mark the branch as inactive will happen on the
'closed-branches' branch in Mercurial.

Recovery
--------
hgsubversion stores several pieces of essential metadata in .hg/svn/. In order
to rebuild this data, the key 'convert_revision' should be stored in the extra
dictionary of the converted revision. The key should contain data in the format:
'svn:<uuid>/abs/path@<rev>' where <uuid> is the repo UUID, /abs/path is the
absolute path to the location the edits were made in Subversion (that is, if it
was a trunk commit on /foo/trunk, then /foo/trunk is what gets stored here, even
though the project root does not equal the repo root), and <rev> is the revision
number of the change in Subversion. This key (and its contents) have been
chosen to be compatible with the convert extension so that repos originally
converted to hg using convert can be maintained using hgsubversion if desired.

Tags (tag_info) can be reconstructed by listing the tags directory and then
running log on each tag to determine its parent changeset. 

The last revision converted (last_rev) can be converted simply by using the
highest revision number encountered while rebuilding the revision map.

The legacy tag_locations file does not need to be replaced - it will be
obsoleted as part of the long-term branch refactor.

The url will have to be provided by the user. The uuid can be re-requested from 
the repository.

branch_info can be rebuilt during the rebuild of the revision map by recording
the revisions of all active heads of server-side branches. branch_info contains
a map from branch: (parent_branch, parent_branch_rev, branch_created_rev)