Mercurial > hgsubversion
annotate notes/metadata.txt @ 1229:46523cdfd3b0 stable 1.6.3
pushmod: prepend "link " to base text for links
http://svn.apache.org/viewvc?view=revision&revision=1223036 exposes
what is arguably a bug in hgsubversion push code. Specifically, when
we are receiving text from the server in an editor, we prepend a "link
" to the text of symlinks when opening a file and strip it when
closing a file. We don't, however, prepend "link " to the base we use
when sending text changes to the server.
This was working before because prior to that revision, the first
thing subversion did was to check whether the entirety of the before
text or the entirety of the after text was less than 64 bytes. In
that case, it just sent the entirety of the after text as a single
insert operation. I'd expect most, but not all symlinks to fit under
the 64 byte limit, including the leading "link " text on the
subversion end.
After the change, the first thing subversion does is check for a
leading match that is more than 4 bytes long, or that is the full
length of the after text. In this case, it sends a copy operation for
the leading match, and then goes into the if < 64 bytes remaining send
the whole thing behavior. It also looks for trailing matches of more
than 4 bytes even in the <64 byte case, but that's not what breaks the
tests.
Incidentally, changing the destination of long symlinks was broken
even before this subversion change. This diff includes test additions
that cover that breakage.
author | David Schleimer <dschleimer@gmail.com> |
---|---|
date | Thu, 07 Aug 2014 19:30:26 -0700 |
parents | ba801f44d240 |
children |
rev | line source |
---|---|
134
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
1 Branches |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
2 -------- |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
3 In order to handle branches that are not immediate children of /branches/, the |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
4 following information must be stored in the revmap: |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
5 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
6 revision path |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
7 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
8 Where path is the actual relative path of the branch in svn. An example, with |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
9 the previous format for clarification: |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
10 New | Old |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
11 3 <hash> trunk | 3 <hash> |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
12 4 <hash> branches/foo | 4 <hash> foo |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
13 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
14 Tags |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
15 ---- |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
16 Note that if a tag is committed to, we can handle that case by making a branch |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
17 and then marking it as deleted. The revmap line would look something like this: |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
18 10 <hash> tags/the_tag |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
19 And the commit would be done on the hg branch 'modified-tag/the_tag'. Note that |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
20 if this was 'tags/releases/1.0.0', then the branch would be |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
21 'modified-tag/releases/1.0.0'. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
22 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
23 Detecting Closing of Branches |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
24 ----------------------------- |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
25 Subversion users typically remove branches when done with them. This means that |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
26 if a commit performs a delete operation on the '' path inside a branch, we can |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
27 be sure that the branch no longer exists. The branch should then be marked as |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
28 inactive. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
29 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
30 Closing Branches |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
31 ---------------- |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
32 As of this writing, Mercurial marks branches as inactive by merging them so they |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
33 have no active heads. In order to mark a branch as closed, the active head on |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
34 the branch will be used as the first parent of the new changeset, and the second |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
35 changeset will be either the active head on the hg branch 'closed-branches' or |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
36 be the nullrev. The commit to mark the branch as inactive will happen on the |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
37 'closed-branches' branch in Mercurial. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
38 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
39 Recovery |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
40 -------- |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
41 hgsubversion stores several pieces of essential metadata in .hg/svn/. In order |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
42 to rebuild this data, the key 'convert_revision' should be stored in the extra |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
43 dictionary of the converted revision. The key should contain data in the format: |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
44 'svn:<uuid>/abs/path@<rev>' where <uuid> is the repo UUID, /abs/path is the |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
45 absolute path to the location the edits were made in Subversion (that is, if it |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
46 was a trunk commit on /foo/trunk, then /foo/trunk is what gets stored here, even |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
47 though the project root does not equal the repo root), and <rev> is the revision |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
48 number of the change in Subversion. This key (and its contents) have been |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
49 chosen to be compatible with the convert extension so that repos originally |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
50 converted to hg using convert can be maintained using hgsubversion if desired. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
51 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
52 Tags (tag_info) can be reconstructed by listing the tags directory and then |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
53 running log on each tag to determine its parent changeset. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
54 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
55 The last revision converted (last_rev) can be converted simply by using the |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
56 highest revision number encountered while rebuilding the revision map. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
57 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
58 The legacy tag_locations file does not need to be replaced - it will be |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
59 obsoleted as part of the long-term branch refactor. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
60 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
61 The url will have to be provided by the user. The uuid can be re-requested from |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
62 the repository. |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
63 |
22248b34b15a
Add notes on how metadata is stored and recovered. Note that at this point,
Augie Fackler <durin42@gmail.com>
parents:
diff
changeset
|
64 branch_info can be rebuilt during the rebuild of the revision map by recording |
155
ba801f44d240
utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents:
134
diff
changeset
|
65 the revisions of all active heads of server-side branches. branch_info contains |
ba801f44d240
utility_commands: Implement rebuildmeta so that metadata can be rebuilt.
Augie Fackler <durin42@gmail.com>
parents:
134
diff
changeset
|
66 a map from branch: (parent_branch, parent_branch_rev, branch_created_rev) |