##// END OF EJS Templates
changelog: parse copy metadata if available in extras...
Martin von Zweigbergk -
r42313:c2165551 default draft
parent child Browse files
Show More
@@ -87,6 +87,18 b' def encodecopies(copies):'
87 ]
87 ]
88 return "\n".join(items)
88 return "\n".join(items)
89
89
90 def decodecopies(data):
91 try:
92 copies = {}
93 for l in data.split('\n'):
94 k, v = l.split('\0')
95 copies[k] = v
96 return copies
97 except ValueError:
98 # Perhaps someone had chosen the same key name (e.g. "p1copies") and
99 # used different syntax for the value.
100 return None
101
90 def stripdesc(desc):
102 def stripdesc(desc):
91 """strip trailing whitespace and leading and trailing empty lines"""
103 """strip trailing whitespace and leading and trailing empty lines"""
92 return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
104 return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
@@ -286,6 +298,16 b' class changelogrevision(object):'
286 return self._text[off[2] + 1:off[3]].split('\n')
298 return self._text[off[2] + 1:off[3]].split('\n')
287
299
288 @property
300 @property
301 def p1copies(self):
302 rawcopies = self.extra.get('p1copies')
303 return rawcopies and decodecopies(rawcopies)
304
305 @property
306 def p2copies(self):
307 rawcopies = self.extra.get('p2copies')
308 return rawcopies and decodecopies(rawcopies)
309
310 @property
289 def description(self):
311 def description(self):
290 return encoding.tolocal(self._text[self._offsets[3] + 2:])
312 return encoding.tolocal(self._text[self._offsets[3] + 2:])
291
313
@@ -441,6 +441,21 b' class changectx(basectx):'
441 return self._changeset.files
441 return self._changeset.files
442 @propertycache
442 @propertycache
443 def _copies(self):
443 def _copies(self):
444 source = self._repo.ui.config('experimental', 'copies.read-from')
445 p1copies = self._changeset.p1copies
446 p2copies = self._changeset.p2copies
447 # If config says to get copy metadata only from changeset, then return
448 # that, defaulting to {} if there was no copy metadata.
449 # In compatibility mode, we return copy data from the changeset if
450 # it was recorded there, and otherwise we fall back to getting it from
451 # the filelogs (below).
452 if (source == 'changeset-only' or
453 (source == 'compatibility' and p1copies is not None)):
454 return p1copies or {}, p2copies or {}
455
456 # Otherwise (config said to read only from filelog, or we are in
457 # compatiblity mode and there is not data in the changeset), we get
458 # the copy metadata from the filelogs.
444 p1copies = {}
459 p1copies = {}
445 p2copies = {}
460 p2copies = {}
446 p1 = self.p1()
461 p1 = self.p1()
@@ -162,8 +162,8 b' def _computeforwardmissing(a, b, match=N'
162
162
163 def usechangesetcentricalgo(repo):
163 def usechangesetcentricalgo(repo):
164 """Checks if we should use changeset-centric copy algorithms"""
164 """Checks if we should use changeset-centric copy algorithms"""
165 return (repo.ui.config('experimental', 'copies.read-from') ==
165 return (repo.ui.config('experimental', 'copies.read-from') in
166 'compatibility')
166 ('changeset-only', 'compatibility'))
167
167
168 def _committedforwardcopies(a, b, match):
168 def _committedforwardcopies(a, b, match):
169 """Like _forwardcopies(), but b.rev() cannot be None (working copy)"""
169 """Like _forwardcopies(), but b.rev() cannot be None (working copy)"""
@@ -2,9 +2,11 b''
2 $ cat >> $HGRCPATH << EOF
2 $ cat >> $HGRCPATH << EOF
3 > [experimental]
3 > [experimental]
4 > copies.write-to=changeset-only
4 > copies.write-to=changeset-only
5 > copies.read-from=changeset-only
5 > [alias]
6 > [alias]
6 > changesetcopies = log -r . -T 'files: {files}
7 > changesetcopies = log -r . -T 'files: {files}
7 > {extras % "{ifcontains("copies", key, "{key}: {value}\n")}"}'
8 > {extras % "{ifcontains("copies", key, "{key}: {value}\n")}"}'
9 > showcopies = log -r . -T '{file_copies % "{source} -> {name}\n"}'
8 > EOF
10 > EOF
9
11
10 Check that copies are recorded correctly
12 Check that copies are recorded correctly
@@ -23,6 +25,15 b' Check that copies are recorded correctly'
23 p1copies: b\x00a (esc)
25 p1copies: b\x00a (esc)
24 c\x00a (esc)
26 c\x00a (esc)
25 d\x00a (esc)
27 d\x00a (esc)
28 $ hg showcopies
29 a -> b
30 a -> c
31 a -> d
32 $ hg showcopies --config experimental.copies.read-from=compatibility
33 a -> b
34 a -> c
35 a -> d
36 $ hg showcopies --config experimental.copies.read-from=filelog-only
26
37
27 Check that renames are recorded correctly
38 Check that renames are recorded correctly
28
39
@@ -31,6 +42,8 b' Check that renames are recorded correctl'
31 $ hg changesetcopies
42 $ hg changesetcopies
32 files: b b2
43 files: b b2
33 p1copies: b2\x00b (esc)
44 p1copies: b2\x00b (esc)
45 $ hg showcopies
46 b -> b2
34
47
35 Rename onto existing file. This should get recorded in the changeset files list and in the extras,
48 Rename onto existing file. This should get recorded in the changeset files list and in the extras,
36 even though there is no filelog entry.
49 even though there is no filelog entry.
@@ -46,6 +59,8 b' even though there is no filelog entry.'
46 $ hg changesetcopies
59 $ hg changesetcopies
47 files: c
60 files: c
48 p1copies: c\x00b2 (esc)
61 p1copies: c\x00b2 (esc)
62 $ hg showcopies
63 b2 -> c
49 $ hg debugindex c
64 $ hg debugindex c
50 rev linkrev nodeid p1 p2
65 rev linkrev nodeid p1 p2
51 0 1 b789fdd96dc2 000000000000 000000000000
66 0 1 b789fdd96dc2 000000000000 000000000000
@@ -74,6 +89,10 b" File 'f' exists only in p1, so 'i' shoul"
74 p1copies: g\x00a (esc)
89 p1copies: g\x00a (esc)
75 i\x00f (esc)
90 i\x00f (esc)
76 p2copies: h\x00d (esc)
91 p2copies: h\x00d (esc)
92 $ hg showcopies
93 a -> g
94 d -> h
95 f -> i
77
96
78 Test writing to both changeset and filelog
97 Test writing to both changeset and filelog
79
98
@@ -88,6 +107,12 b' Test writing to both changeset and filel'
88 copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
107 copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
89 \x01 (esc)
108 \x01 (esc)
90 a
109 a
110 $ hg showcopies
111 a -> j
112 $ hg showcopies --config experimental.copies.read-from=compatibility
113 a -> j
114 $ hg showcopies --config experimental.copies.read-from=filelog-only
115 a -> j
91
116
92 Test writing only to filelog
117 Test writing only to filelog
93
118
@@ -101,5 +126,10 b' Test writing only to filelog'
101 copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
126 copyrev: b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3
102 \x01 (esc)
127 \x01 (esc)
103 a
128 a
129 $ hg showcopies
130 $ hg showcopies --config experimental.copies.read-from=compatibility
131 a -> k
132 $ hg showcopies --config experimental.copies.read-from=filelog-only
133 a -> k
104
134
105 $ cd ..
135 $ cd ..
@@ -1,4 +1,4 b''
1 #testcases filelog compatibility
1 #testcases filelog compatibility changeset
2
2
3 $ cat >> $HGRCPATH << EOF
3 $ cat >> $HGRCPATH << EOF
4 > [extensions]
4 > [extensions]
@@ -14,6 +14,14 b''
14 > EOF
14 > EOF
15 #endif
15 #endif
16
16
17 #if changeset
18 $ cat >> $HGRCPATH << EOF
19 > [experimental]
20 > copies.read-from = changeset-only
21 > copies.write-to = changeset-only
22 > EOF
23 #endif
24
17 $ REPONUM=0
25 $ REPONUM=0
18 $ newrepo() {
26 $ newrepo() {
19 > cd $TESTTMP
27 > cd $TESTTMP
@@ -376,11 +384,13 b' Copy file that exists on both sides of t'
376 o 0 add x on branch 1
384 o 0 add x on branch 1
377 x
385 x
378 $ hg debugp1copies -r 2
386 $ hg debugp1copies -r 2
387 x -> z (changeset !)
379 $ hg debugp2copies -r 2
388 $ hg debugp2copies -r 2
380 x -> z
389 x -> z (no-changeset !)
381 $ hg debugpathcopies 1 2
390 $ hg debugpathcopies 1 2
391 x -> z (changeset !)
382 $ hg debugpathcopies 0 2
392 $ hg debugpathcopies 0 2
383 x -> z
393 x -> z (no-changeset !)
384
394
385 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies from one parent
395 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies from one parent
386 of the merge to the merge should include the copy from the other side.
396 of the merge to the merge should include the copy from the other side.
@@ -539,6 +549,9 b' test reflect that for this particular ca'
539
549
540 Grafting revision 4 on top of revision 2, showing that it respect the rename:
550 Grafting revision 4 on top of revision 2, showing that it respect the rename:
541
551
552 TODO: Make this work with copy info in changesets (probably by writing a
553 changeset-centric version of copies.mergecopies())
554 #if no-changeset
542 $ hg up 2 -q
555 $ hg up 2 -q
543 $ hg graft -r 4 --base 3 --hidden
556 $ hg graft -r 4 --base 3 --hidden
544 grafting 4:af28412ec03c "added d, modified b" (tip)
557 grafting 4:af28412ec03c "added d, modified b" (tip)
@@ -554,6 +567,8 b' Grafting revision 4 on top of revision 2'
554 b
567 b
555 +baba
568 +baba
556
569
570 #endif
571
557 Test to make sure that fullcopytracing algorithm don't fail when both the merging csets are dirty
572 Test to make sure that fullcopytracing algorithm don't fail when both the merging csets are dirty
558 (a dirty cset is one who is not the descendant of merge base)
573 (a dirty cset is one who is not the descendant of merge base)
559 -------------------------------------------------------------------------------------------------
574 -------------------------------------------------------------------------------------------------
General Comments 0
You need to be logged in to leave comments. Login now