##// END OF EJS Templates
evolution: stop wrongly flagging unrelated part of a split as divergent...
marmoute -
r53029:e68fe567 stable
parent child Browse files
Show More
@@ -1,1155 +1,1157 b''
1 # obsolete.py - obsolete markers handling
1 # obsolete.py - obsolete markers handling
2 #
2 #
3 # Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
3 # Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
4 # Logilab SA <contact@logilab.fr>
4 # Logilab SA <contact@logilab.fr>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 """Obsolete marker handling
9 """Obsolete marker handling
10
10
11 An obsolete marker maps an old changeset to a list of new
11 An obsolete marker maps an old changeset to a list of new
12 changesets. If the list of new changesets is empty, the old changeset
12 changesets. If the list of new changesets is empty, the old changeset
13 is said to be "killed". Otherwise, the old changeset is being
13 is said to be "killed". Otherwise, the old changeset is being
14 "replaced" by the new changesets.
14 "replaced" by the new changesets.
15
15
16 Obsolete markers can be used to record and distribute changeset graph
16 Obsolete markers can be used to record and distribute changeset graph
17 transformations performed by history rewrite operations, and help
17 transformations performed by history rewrite operations, and help
18 building new tools to reconcile conflicting rewrite actions. To
18 building new tools to reconcile conflicting rewrite actions. To
19 facilitate conflict resolution, markers include various annotations
19 facilitate conflict resolution, markers include various annotations
20 besides old and news changeset identifiers, such as creation date or
20 besides old and news changeset identifiers, such as creation date or
21 author name.
21 author name.
22
22
23 The old obsoleted changeset is called a "predecessor" and possible
23 The old obsoleted changeset is called a "predecessor" and possible
24 replacements are called "successors". Markers that used changeset X as
24 replacements are called "successors". Markers that used changeset X as
25 a predecessor are called "successor markers of X" because they hold
25 a predecessor are called "successor markers of X" because they hold
26 information about the successors of X. Markers that use changeset Y as
26 information about the successors of X. Markers that use changeset Y as
27 a successors are call "predecessor markers of Y" because they hold
27 a successors are call "predecessor markers of Y" because they hold
28 information about the predecessors of Y.
28 information about the predecessors of Y.
29
29
30 Examples:
30 Examples:
31
31
32 - When changeset A is replaced by changeset A', one marker is stored:
32 - When changeset A is replaced by changeset A', one marker is stored:
33
33
34 (A, (A',))
34 (A, (A',))
35
35
36 - When changesets A and B are folded into a new changeset C, two markers are
36 - When changesets A and B are folded into a new changeset C, two markers are
37 stored:
37 stored:
38
38
39 (A, (C,)) and (B, (C,))
39 (A, (C,)) and (B, (C,))
40
40
41 - When changeset A is simply "pruned" from the graph, a marker is created:
41 - When changeset A is simply "pruned" from the graph, a marker is created:
42
42
43 (A, ())
43 (A, ())
44
44
45 - When changeset A is split into B and C, a single marker is used:
45 - When changeset A is split into B and C, a single marker is used:
46
46
47 (A, (B, C))
47 (A, (B, C))
48
48
49 We use a single marker to distinguish the "split" case from the "divergence"
49 We use a single marker to distinguish the "split" case from the "divergence"
50 case. If two independent operations rewrite the same changeset A in to A' and
50 case. If two independent operations rewrite the same changeset A in to A' and
51 A'', we have an error case: divergent rewriting. We can detect it because
51 A'', we have an error case: divergent rewriting. We can detect it because
52 two markers will be created independently:
52 two markers will be created independently:
53
53
54 (A, (B,)) and (A, (C,))
54 (A, (B,)) and (A, (C,))
55
55
56 Format
56 Format
57 ------
57 ------
58
58
59 Markers are stored in an append-only file stored in
59 Markers are stored in an append-only file stored in
60 '.hg/store/obsstore'.
60 '.hg/store/obsstore'.
61
61
62 The file starts with a version header:
62 The file starts with a version header:
63
63
64 - 1 unsigned byte: version number, starting at zero.
64 - 1 unsigned byte: version number, starting at zero.
65
65
66 The header is followed by the markers. Marker format depend of the version. See
66 The header is followed by the markers. Marker format depend of the version. See
67 comment associated with each format for details.
67 comment associated with each format for details.
68
68
69 """
69 """
70
70
71 import binascii
71 import binascii
72 import struct
72 import struct
73 import weakref
73 import weakref
74
74
75 from .i18n import _
75 from .i18n import _
76 from .node import (
76 from .node import (
77 bin,
77 bin,
78 hex,
78 hex,
79 )
79 )
80 from . import (
80 from . import (
81 encoding,
81 encoding,
82 error,
82 error,
83 obsutil,
83 obsutil,
84 phases,
84 phases,
85 policy,
85 policy,
86 pycompat,
86 pycompat,
87 util,
87 util,
88 )
88 )
89 from .utils import (
89 from .utils import (
90 dateutil,
90 dateutil,
91 hashutil,
91 hashutil,
92 )
92 )
93
93
94 parsers = policy.importmod('parsers')
94 parsers = policy.importmod('parsers')
95
95
96 _pack = struct.pack
96 _pack = struct.pack
97 _unpack = struct.unpack
97 _unpack = struct.unpack
98 _calcsize = struct.calcsize
98 _calcsize = struct.calcsize
99 propertycache = util.propertycache
99 propertycache = util.propertycache
100
100
101 # Options for obsolescence
101 # Options for obsolescence
102 createmarkersopt = b'createmarkers'
102 createmarkersopt = b'createmarkers'
103 allowunstableopt = b'allowunstable'
103 allowunstableopt = b'allowunstable'
104 allowdivergenceopt = b'allowdivergence'
104 allowdivergenceopt = b'allowdivergence'
105 exchangeopt = b'exchange'
105 exchangeopt = b'exchange'
106
106
107
107
108 def _getoptionvalue(repo, option):
108 def _getoptionvalue(repo, option):
109 """Returns True if the given repository has the given obsolete option
109 """Returns True if the given repository has the given obsolete option
110 enabled.
110 enabled.
111 """
111 """
112 configkey = b'evolution.%s' % option
112 configkey = b'evolution.%s' % option
113 newconfig = repo.ui.configbool(b'experimental', configkey)
113 newconfig = repo.ui.configbool(b'experimental', configkey)
114
114
115 # Return the value only if defined
115 # Return the value only if defined
116 if newconfig is not None:
116 if newconfig is not None:
117 return newconfig
117 return newconfig
118
118
119 # Fallback on generic option
119 # Fallback on generic option
120 try:
120 try:
121 return repo.ui.configbool(b'experimental', b'evolution')
121 return repo.ui.configbool(b'experimental', b'evolution')
122 except (error.ConfigError, AttributeError):
122 except (error.ConfigError, AttributeError):
123 # Fallback on old-fashion config
123 # Fallback on old-fashion config
124 # inconsistent config: experimental.evolution
124 # inconsistent config: experimental.evolution
125 result = set(repo.ui.configlist(b'experimental', b'evolution'))
125 result = set(repo.ui.configlist(b'experimental', b'evolution'))
126
126
127 if b'all' in result:
127 if b'all' in result:
128 return True
128 return True
129
129
130 # Temporary hack for next check
130 # Temporary hack for next check
131 newconfig = repo.ui.config(b'experimental', b'evolution.createmarkers')
131 newconfig = repo.ui.config(b'experimental', b'evolution.createmarkers')
132 if newconfig:
132 if newconfig:
133 result.add(b'createmarkers')
133 result.add(b'createmarkers')
134
134
135 return option in result
135 return option in result
136
136
137
137
138 def getoptions(repo):
138 def getoptions(repo):
139 """Returns dicts showing state of obsolescence features."""
139 """Returns dicts showing state of obsolescence features."""
140
140
141 createmarkersvalue = _getoptionvalue(repo, createmarkersopt)
141 createmarkersvalue = _getoptionvalue(repo, createmarkersopt)
142 if createmarkersvalue:
142 if createmarkersvalue:
143 unstablevalue = _getoptionvalue(repo, allowunstableopt)
143 unstablevalue = _getoptionvalue(repo, allowunstableopt)
144 divergencevalue = _getoptionvalue(repo, allowdivergenceopt)
144 divergencevalue = _getoptionvalue(repo, allowdivergenceopt)
145 exchangevalue = _getoptionvalue(repo, exchangeopt)
145 exchangevalue = _getoptionvalue(repo, exchangeopt)
146 else:
146 else:
147 # if we cannot create obsolescence markers, we shouldn't exchange them
147 # if we cannot create obsolescence markers, we shouldn't exchange them
148 # or perform operations that lead to instability or divergence
148 # or perform operations that lead to instability or divergence
149 unstablevalue = False
149 unstablevalue = False
150 divergencevalue = False
150 divergencevalue = False
151 exchangevalue = False
151 exchangevalue = False
152
152
153 return {
153 return {
154 createmarkersopt: createmarkersvalue,
154 createmarkersopt: createmarkersvalue,
155 allowunstableopt: unstablevalue,
155 allowunstableopt: unstablevalue,
156 allowdivergenceopt: divergencevalue,
156 allowdivergenceopt: divergencevalue,
157 exchangeopt: exchangevalue,
157 exchangeopt: exchangevalue,
158 }
158 }
159
159
160
160
161 def isenabled(repo, option):
161 def isenabled(repo, option):
162 """Returns True if the given repository has the given obsolete option
162 """Returns True if the given repository has the given obsolete option
163 enabled.
163 enabled.
164 """
164 """
165 return getoptions(repo)[option]
165 return getoptions(repo)[option]
166
166
167
167
168 # Creating aliases for marker flags because evolve extension looks for
168 # Creating aliases for marker flags because evolve extension looks for
169 # bumpedfix in obsolete.py
169 # bumpedfix in obsolete.py
170 bumpedfix = obsutil.bumpedfix
170 bumpedfix = obsutil.bumpedfix
171 usingsha256 = obsutil.usingsha256
171 usingsha256 = obsutil.usingsha256
172
172
173 ## Parsing and writing of version "0"
173 ## Parsing and writing of version "0"
174 #
174 #
175 # The header is followed by the markers. Each marker is made of:
175 # The header is followed by the markers. Each marker is made of:
176 #
176 #
177 # - 1 uint8 : number of new changesets "N", can be zero.
177 # - 1 uint8 : number of new changesets "N", can be zero.
178 #
178 #
179 # - 1 uint32: metadata size "M" in bytes.
179 # - 1 uint32: metadata size "M" in bytes.
180 #
180 #
181 # - 1 byte: a bit field. It is reserved for flags used in common
181 # - 1 byte: a bit field. It is reserved for flags used in common
182 # obsolete marker operations, to avoid repeated decoding of metadata
182 # obsolete marker operations, to avoid repeated decoding of metadata
183 # entries.
183 # entries.
184 #
184 #
185 # - 20 bytes: obsoleted changeset identifier.
185 # - 20 bytes: obsoleted changeset identifier.
186 #
186 #
187 # - N*20 bytes: new changesets identifiers.
187 # - N*20 bytes: new changesets identifiers.
188 #
188 #
189 # - M bytes: metadata as a sequence of nul-terminated strings. Each
189 # - M bytes: metadata as a sequence of nul-terminated strings. Each
190 # string contains a key and a value, separated by a colon ':', without
190 # string contains a key and a value, separated by a colon ':', without
191 # additional encoding. Keys cannot contain '\0' or ':' and values
191 # additional encoding. Keys cannot contain '\0' or ':' and values
192 # cannot contain '\0'.
192 # cannot contain '\0'.
193 _fm0version = 0
193 _fm0version = 0
194 _fm0fixed = b'>BIB20s'
194 _fm0fixed = b'>BIB20s'
195 _fm0node = b'20s'
195 _fm0node = b'20s'
196 _fm0fsize = _calcsize(_fm0fixed)
196 _fm0fsize = _calcsize(_fm0fixed)
197 _fm0fnodesize = _calcsize(_fm0node)
197 _fm0fnodesize = _calcsize(_fm0node)
198
198
199
199
200 def _fm0readmarkers(data, off, stop):
200 def _fm0readmarkers(data, off, stop):
201 # Loop on markers
201 # Loop on markers
202 while off < stop:
202 while off < stop:
203 # read fixed part
203 # read fixed part
204 cur = data[off : off + _fm0fsize]
204 cur = data[off : off + _fm0fsize]
205 off += _fm0fsize
205 off += _fm0fsize
206 numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur)
206 numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur)
207 # read replacement
207 # read replacement
208 sucs = ()
208 sucs = ()
209 if numsuc:
209 if numsuc:
210 s = _fm0fnodesize * numsuc
210 s = _fm0fnodesize * numsuc
211 cur = data[off : off + s]
211 cur = data[off : off + s]
212 sucs = _unpack(_fm0node * numsuc, cur)
212 sucs = _unpack(_fm0node * numsuc, cur)
213 off += s
213 off += s
214 # read metadata
214 # read metadata
215 # (metadata will be decoded on demand)
215 # (metadata will be decoded on demand)
216 metadata = data[off : off + mdsize]
216 metadata = data[off : off + mdsize]
217 if len(metadata) != mdsize:
217 if len(metadata) != mdsize:
218 raise error.Abort(
218 raise error.Abort(
219 _(
219 _(
220 b'parsing obsolete marker: metadata is too '
220 b'parsing obsolete marker: metadata is too '
221 b'short, %d bytes expected, got %d'
221 b'short, %d bytes expected, got %d'
222 )
222 )
223 % (mdsize, len(metadata))
223 % (mdsize, len(metadata))
224 )
224 )
225 off += mdsize
225 off += mdsize
226 metadata = _fm0decodemeta(metadata)
226 metadata = _fm0decodemeta(metadata)
227 try:
227 try:
228 when, offset = metadata.pop(b'date', b'0 0').split(b' ')
228 when, offset = metadata.pop(b'date', b'0 0').split(b' ')
229 date = float(when), int(offset)
229 date = float(when), int(offset)
230 except ValueError:
230 except ValueError:
231 date = (0.0, 0)
231 date = (0.0, 0)
232 parents = None
232 parents = None
233 if b'p2' in metadata:
233 if b'p2' in metadata:
234 parents = (metadata.pop(b'p1', None), metadata.pop(b'p2', None))
234 parents = (metadata.pop(b'p1', None), metadata.pop(b'p2', None))
235 elif b'p1' in metadata:
235 elif b'p1' in metadata:
236 parents = (metadata.pop(b'p1', None),)
236 parents = (metadata.pop(b'p1', None),)
237 elif b'p0' in metadata:
237 elif b'p0' in metadata:
238 parents = ()
238 parents = ()
239 if parents is not None:
239 if parents is not None:
240 try:
240 try:
241 parents = tuple(bin(p) for p in parents)
241 parents = tuple(bin(p) for p in parents)
242 # if parent content is not a nodeid, drop the data
242 # if parent content is not a nodeid, drop the data
243 for p in parents:
243 for p in parents:
244 if len(p) != 20:
244 if len(p) != 20:
245 parents = None
245 parents = None
246 break
246 break
247 except binascii.Error:
247 except binascii.Error:
248 # if content cannot be translated to nodeid drop the data.
248 # if content cannot be translated to nodeid drop the data.
249 parents = None
249 parents = None
250
250
251 metadata = tuple(sorted(metadata.items()))
251 metadata = tuple(sorted(metadata.items()))
252
252
253 yield (pre, sucs, flags, metadata, date, parents)
253 yield (pre, sucs, flags, metadata, date, parents)
254
254
255
255
256 def _fm0encodeonemarker(marker):
256 def _fm0encodeonemarker(marker):
257 pre, sucs, flags, metadata, date, parents = marker
257 pre, sucs, flags, metadata, date, parents = marker
258 if flags & usingsha256:
258 if flags & usingsha256:
259 raise error.Abort(_(b'cannot handle sha256 with old obsstore format'))
259 raise error.Abort(_(b'cannot handle sha256 with old obsstore format'))
260 metadata = dict(metadata)
260 metadata = dict(metadata)
261 time, tz = date
261 time, tz = date
262 metadata[b'date'] = b'%r %i' % (time, tz)
262 metadata[b'date'] = b'%r %i' % (time, tz)
263 if parents is not None:
263 if parents is not None:
264 if not parents:
264 if not parents:
265 # mark that we explicitly recorded no parents
265 # mark that we explicitly recorded no parents
266 metadata[b'p0'] = b''
266 metadata[b'p0'] = b''
267 for i, p in enumerate(parents, 1):
267 for i, p in enumerate(parents, 1):
268 metadata[b'p%i' % i] = hex(p)
268 metadata[b'p%i' % i] = hex(p)
269 metadata = _fm0encodemeta(metadata)
269 metadata = _fm0encodemeta(metadata)
270 numsuc = len(sucs)
270 numsuc = len(sucs)
271 format = _fm0fixed + (_fm0node * numsuc)
271 format = _fm0fixed + (_fm0node * numsuc)
272 data = [numsuc, len(metadata), flags, pre]
272 data = [numsuc, len(metadata), flags, pre]
273 data.extend(sucs)
273 data.extend(sucs)
274 return _pack(format, *data) + metadata
274 return _pack(format, *data) + metadata
275
275
276
276
277 def _fm0encodemeta(meta):
277 def _fm0encodemeta(meta):
278 """Return encoded metadata string to string mapping.
278 """Return encoded metadata string to string mapping.
279
279
280 Assume no ':' in key and no '\0' in both key and value."""
280 Assume no ':' in key and no '\0' in both key and value."""
281 for key, value in meta.items():
281 for key, value in meta.items():
282 if b':' in key or b'\0' in key:
282 if b':' in key or b'\0' in key:
283 raise ValueError(b"':' and '\0' are forbidden in metadata key'")
283 raise ValueError(b"':' and '\0' are forbidden in metadata key'")
284 if b'\0' in value:
284 if b'\0' in value:
285 raise ValueError(b"':' is forbidden in metadata value'")
285 raise ValueError(b"':' is forbidden in metadata value'")
286 return b'\0'.join([b'%s:%s' % (k, meta[k]) for k in sorted(meta)])
286 return b'\0'.join([b'%s:%s' % (k, meta[k]) for k in sorted(meta)])
287
287
288
288
289 def _fm0decodemeta(data):
289 def _fm0decodemeta(data):
290 """Return string to string dictionary from encoded version."""
290 """Return string to string dictionary from encoded version."""
291 d = {}
291 d = {}
292 for l in data.split(b'\0'):
292 for l in data.split(b'\0'):
293 if l:
293 if l:
294 key, value = l.split(b':', 1)
294 key, value = l.split(b':', 1)
295 d[key] = value
295 d[key] = value
296 return d
296 return d
297
297
298
298
299 ## Parsing and writing of version "1"
299 ## Parsing and writing of version "1"
300 #
300 #
301 # The header is followed by the markers. Each marker is made of:
301 # The header is followed by the markers. Each marker is made of:
302 #
302 #
303 # - uint32: total size of the marker (including this field)
303 # - uint32: total size of the marker (including this field)
304 #
304 #
305 # - float64: date in seconds since epoch
305 # - float64: date in seconds since epoch
306 #
306 #
307 # - int16: timezone offset in minutes
307 # - int16: timezone offset in minutes
308 #
308 #
309 # - uint16: a bit field. It is reserved for flags used in common
309 # - uint16: a bit field. It is reserved for flags used in common
310 # obsolete marker operations, to avoid repeated decoding of metadata
310 # obsolete marker operations, to avoid repeated decoding of metadata
311 # entries.
311 # entries.
312 #
312 #
313 # - uint8: number of successors "N", can be zero.
313 # - uint8: number of successors "N", can be zero.
314 #
314 #
315 # - uint8: number of parents "P", can be zero.
315 # - uint8: number of parents "P", can be zero.
316 #
316 #
317 # 0: parents data stored but no parent,
317 # 0: parents data stored but no parent,
318 # 1: one parent stored,
318 # 1: one parent stored,
319 # 2: two parents stored,
319 # 2: two parents stored,
320 # 3: no parent data stored
320 # 3: no parent data stored
321 #
321 #
322 # - uint8: number of metadata entries M
322 # - uint8: number of metadata entries M
323 #
323 #
324 # - 20 or 32 bytes: predecessor changeset identifier.
324 # - 20 or 32 bytes: predecessor changeset identifier.
325 #
325 #
326 # - N*(20 or 32) bytes: successors changesets identifiers.
326 # - N*(20 or 32) bytes: successors changesets identifiers.
327 #
327 #
328 # - P*(20 or 32) bytes: parents of the predecessors changesets.
328 # - P*(20 or 32) bytes: parents of the predecessors changesets.
329 #
329 #
330 # - M*(uint8, uint8): size of all metadata entries (key and value)
330 # - M*(uint8, uint8): size of all metadata entries (key and value)
331 #
331 #
332 # - remaining bytes: the metadata, each (key, value) pair after the other.
332 # - remaining bytes: the metadata, each (key, value) pair after the other.
333 _fm1version = 1
333 _fm1version = 1
334 _fm1fixed = b'>IdhHBBB'
334 _fm1fixed = b'>IdhHBBB'
335 _fm1nodesha1 = b'20s'
335 _fm1nodesha1 = b'20s'
336 _fm1nodesha256 = b'32s'
336 _fm1nodesha256 = b'32s'
337 _fm1nodesha1size = _calcsize(_fm1nodesha1)
337 _fm1nodesha1size = _calcsize(_fm1nodesha1)
338 _fm1nodesha256size = _calcsize(_fm1nodesha256)
338 _fm1nodesha256size = _calcsize(_fm1nodesha256)
339 _fm1fsize = _calcsize(_fm1fixed)
339 _fm1fsize = _calcsize(_fm1fixed)
340 _fm1parentnone = 3
340 _fm1parentnone = 3
341 _fm1metapair = b'BB'
341 _fm1metapair = b'BB'
342 _fm1metapairsize = _calcsize(_fm1metapair)
342 _fm1metapairsize = _calcsize(_fm1metapair)
343
343
344
344
345 def _fm1purereadmarkers(data, off, stop):
345 def _fm1purereadmarkers(data, off, stop):
346 # make some global constants local for performance
346 # make some global constants local for performance
347 noneflag = _fm1parentnone
347 noneflag = _fm1parentnone
348 sha2flag = usingsha256
348 sha2flag = usingsha256
349 sha1size = _fm1nodesha1size
349 sha1size = _fm1nodesha1size
350 sha2size = _fm1nodesha256size
350 sha2size = _fm1nodesha256size
351 sha1fmt = _fm1nodesha1
351 sha1fmt = _fm1nodesha1
352 sha2fmt = _fm1nodesha256
352 sha2fmt = _fm1nodesha256
353 metasize = _fm1metapairsize
353 metasize = _fm1metapairsize
354 metafmt = _fm1metapair
354 metafmt = _fm1metapair
355 fsize = _fm1fsize
355 fsize = _fm1fsize
356 unpack = _unpack
356 unpack = _unpack
357
357
358 # Loop on markers
358 # Loop on markers
359 ufixed = struct.Struct(_fm1fixed).unpack
359 ufixed = struct.Struct(_fm1fixed).unpack
360
360
361 while off < stop:
361 while off < stop:
362 # read fixed part
362 # read fixed part
363 o1 = off + fsize
363 o1 = off + fsize
364 t, secs, tz, flags, numsuc, numpar, nummeta = ufixed(data[off:o1])
364 t, secs, tz, flags, numsuc, numpar, nummeta = ufixed(data[off:o1])
365
365
366 if flags & sha2flag:
366 if flags & sha2flag:
367 nodefmt = sha2fmt
367 nodefmt = sha2fmt
368 nodesize = sha2size
368 nodesize = sha2size
369 else:
369 else:
370 nodefmt = sha1fmt
370 nodefmt = sha1fmt
371 nodesize = sha1size
371 nodesize = sha1size
372
372
373 (prec,) = unpack(nodefmt, data[o1 : o1 + nodesize])
373 (prec,) = unpack(nodefmt, data[o1 : o1 + nodesize])
374 o1 += nodesize
374 o1 += nodesize
375
375
376 # read 0 or more successors
376 # read 0 or more successors
377 if numsuc == 1:
377 if numsuc == 1:
378 o2 = o1 + nodesize
378 o2 = o1 + nodesize
379 sucs = (data[o1:o2],)
379 sucs = (data[o1:o2],)
380 else:
380 else:
381 o2 = o1 + nodesize * numsuc
381 o2 = o1 + nodesize * numsuc
382 sucs = unpack(nodefmt * numsuc, data[o1:o2])
382 sucs = unpack(nodefmt * numsuc, data[o1:o2])
383
383
384 # read parents
384 # read parents
385 if numpar == noneflag:
385 if numpar == noneflag:
386 o3 = o2
386 o3 = o2
387 parents = None
387 parents = None
388 elif numpar == 1:
388 elif numpar == 1:
389 o3 = o2 + nodesize
389 o3 = o2 + nodesize
390 parents = (data[o2:o3],)
390 parents = (data[o2:o3],)
391 else:
391 else:
392 o3 = o2 + nodesize * numpar
392 o3 = o2 + nodesize * numpar
393 parents = unpack(nodefmt * numpar, data[o2:o3])
393 parents = unpack(nodefmt * numpar, data[o2:o3])
394
394
395 # read metadata
395 # read metadata
396 off = o3 + metasize * nummeta
396 off = o3 + metasize * nummeta
397 metapairsize = unpack(b'>' + (metafmt * nummeta), data[o3:off])
397 metapairsize = unpack(b'>' + (metafmt * nummeta), data[o3:off])
398 metadata = []
398 metadata = []
399 for idx in range(0, len(metapairsize), 2):
399 for idx in range(0, len(metapairsize), 2):
400 o1 = off + metapairsize[idx]
400 o1 = off + metapairsize[idx]
401 o2 = o1 + metapairsize[idx + 1]
401 o2 = o1 + metapairsize[idx + 1]
402 metadata.append((data[off:o1], data[o1:o2]))
402 metadata.append((data[off:o1], data[o1:o2]))
403 off = o2
403 off = o2
404
404
405 yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents)
405 yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents)
406
406
407
407
408 def _fm1encodeonemarker(marker):
408 def _fm1encodeonemarker(marker):
409 pre, sucs, flags, metadata, date, parents = marker
409 pre, sucs, flags, metadata, date, parents = marker
410 # determine node size
410 # determine node size
411 _fm1node = _fm1nodesha1
411 _fm1node = _fm1nodesha1
412 if flags & usingsha256:
412 if flags & usingsha256:
413 _fm1node = _fm1nodesha256
413 _fm1node = _fm1nodesha256
414 numsuc = len(sucs)
414 numsuc = len(sucs)
415 numextranodes = 1 + numsuc
415 numextranodes = 1 + numsuc
416 if parents is None:
416 if parents is None:
417 numpar = _fm1parentnone
417 numpar = _fm1parentnone
418 else:
418 else:
419 numpar = len(parents)
419 numpar = len(parents)
420 numextranodes += numpar
420 numextranodes += numpar
421 formatnodes = _fm1node * numextranodes
421 formatnodes = _fm1node * numextranodes
422 formatmeta = _fm1metapair * len(metadata)
422 formatmeta = _fm1metapair * len(metadata)
423 format = _fm1fixed + formatnodes + formatmeta
423 format = _fm1fixed + formatnodes + formatmeta
424 # tz is stored in minutes so we divide by 60
424 # tz is stored in minutes so we divide by 60
425 tz = date[1] // 60
425 tz = date[1] // 60
426 data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre]
426 data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre]
427 data.extend(sucs)
427 data.extend(sucs)
428 if parents is not None:
428 if parents is not None:
429 data.extend(parents)
429 data.extend(parents)
430 totalsize = _calcsize(format)
430 totalsize = _calcsize(format)
431 for key, value in metadata:
431 for key, value in metadata:
432 lk = len(key)
432 lk = len(key)
433 lv = len(value)
433 lv = len(value)
434 if lk > 255:
434 if lk > 255:
435 msg = (
435 msg = (
436 b'obsstore metadata key cannot be longer than 255 bytes'
436 b'obsstore metadata key cannot be longer than 255 bytes'
437 b' (key "%s" is %u bytes)'
437 b' (key "%s" is %u bytes)'
438 ) % (key, lk)
438 ) % (key, lk)
439 raise error.ProgrammingError(msg)
439 raise error.ProgrammingError(msg)
440 if lv > 255:
440 if lv > 255:
441 msg = (
441 msg = (
442 b'obsstore metadata value cannot be longer than 255 bytes'
442 b'obsstore metadata value cannot be longer than 255 bytes'
443 b' (value "%s" for key "%s" is %u bytes)'
443 b' (value "%s" for key "%s" is %u bytes)'
444 ) % (value, key, lv)
444 ) % (value, key, lv)
445 raise error.ProgrammingError(msg)
445 raise error.ProgrammingError(msg)
446 data.append(lk)
446 data.append(lk)
447 data.append(lv)
447 data.append(lv)
448 totalsize += lk + lv
448 totalsize += lk + lv
449 data[0] = totalsize
449 data[0] = totalsize
450 data = [_pack(format, *data)]
450 data = [_pack(format, *data)]
451 for key, value in metadata:
451 for key, value in metadata:
452 data.append(key)
452 data.append(key)
453 data.append(value)
453 data.append(value)
454 return b''.join(data)
454 return b''.join(data)
455
455
456
456
457 def _fm1readmarkers(data, off, stop):
457 def _fm1readmarkers(data, off, stop):
458 native = getattr(parsers, 'fm1readmarkers', None)
458 native = getattr(parsers, 'fm1readmarkers', None)
459 if not native:
459 if not native:
460 return _fm1purereadmarkers(data, off, stop)
460 return _fm1purereadmarkers(data, off, stop)
461 return native(data, off, stop)
461 return native(data, off, stop)
462
462
463
463
464 # mapping to read/write various marker formats
464 # mapping to read/write various marker formats
465 # <version> -> (decoder, encoder)
465 # <version> -> (decoder, encoder)
466 formats = {
466 formats = {
467 _fm0version: (_fm0readmarkers, _fm0encodeonemarker),
467 _fm0version: (_fm0readmarkers, _fm0encodeonemarker),
468 _fm1version: (_fm1readmarkers, _fm1encodeonemarker),
468 _fm1version: (_fm1readmarkers, _fm1encodeonemarker),
469 }
469 }
470
470
471
471
472 def _readmarkerversion(data):
472 def _readmarkerversion(data):
473 return _unpack(b'>B', data[0:1])[0]
473 return _unpack(b'>B', data[0:1])[0]
474
474
475
475
476 @util.nogc
476 @util.nogc
477 def _readmarkers(data, off=None, stop=None):
477 def _readmarkers(data, off=None, stop=None):
478 """Read and enumerate markers from raw data"""
478 """Read and enumerate markers from raw data"""
479 diskversion = _readmarkerversion(data)
479 diskversion = _readmarkerversion(data)
480 if not off:
480 if not off:
481 off = 1 # skip 1 byte version number
481 off = 1 # skip 1 byte version number
482 if stop is None:
482 if stop is None:
483 stop = len(data)
483 stop = len(data)
484 if diskversion not in formats:
484 if diskversion not in formats:
485 msg = _(b'parsing obsolete marker: unknown version %r') % diskversion
485 msg = _(b'parsing obsolete marker: unknown version %r') % diskversion
486 raise error.UnknownVersion(msg, version=diskversion)
486 raise error.UnknownVersion(msg, version=diskversion)
487 return diskversion, formats[diskversion][0](data, off, stop)
487 return diskversion, formats[diskversion][0](data, off, stop)
488
488
489
489
490 def encodeheader(version=_fm0version):
490 def encodeheader(version=_fm0version):
491 return _pack(b'>B', version)
491 return _pack(b'>B', version)
492
492
493
493
494 def encodemarkers(markers, addheader=False, version=_fm0version):
494 def encodemarkers(markers, addheader=False, version=_fm0version):
495 # Kept separate from flushmarkers(), it will be reused for
495 # Kept separate from flushmarkers(), it will be reused for
496 # markers exchange.
496 # markers exchange.
497 encodeone = formats[version][1]
497 encodeone = formats[version][1]
498 if addheader:
498 if addheader:
499 yield encodeheader(version)
499 yield encodeheader(version)
500 for marker in markers:
500 for marker in markers:
501 yield encodeone(marker)
501 yield encodeone(marker)
502
502
503
503
504 @util.nogc
504 @util.nogc
505 def _addsuccessors(successors, markers):
505 def _addsuccessors(successors, markers):
506 for mark in markers:
506 for mark in markers:
507 successors.setdefault(mark[0], set()).add(mark)
507 successors.setdefault(mark[0], set()).add(mark)
508
508
509
509
510 @util.nogc
510 @util.nogc
511 def _addpredecessors(predecessors, markers):
511 def _addpredecessors(predecessors, markers):
512 for mark in markers:
512 for mark in markers:
513 for suc in mark[1]:
513 for suc in mark[1]:
514 predecessors.setdefault(suc, set()).add(mark)
514 predecessors.setdefault(suc, set()).add(mark)
515
515
516
516
517 @util.nogc
517 @util.nogc
518 def _addchildren(children, markers):
518 def _addchildren(children, markers):
519 for mark in markers:
519 for mark in markers:
520 parents = mark[5]
520 parents = mark[5]
521 if parents is not None:
521 if parents is not None:
522 for p in parents:
522 for p in parents:
523 children.setdefault(p, set()).add(mark)
523 children.setdefault(p, set()).add(mark)
524
524
525
525
526 def _checkinvalidmarkers(repo, markers):
526 def _checkinvalidmarkers(repo, markers):
527 """search for marker with invalid data and raise error if needed
527 """search for marker with invalid data and raise error if needed
528
528
529 Exist as a separated function to allow the evolve extension for a more
529 Exist as a separated function to allow the evolve extension for a more
530 subtle handling.
530 subtle handling.
531 """
531 """
532 for mark in markers:
532 for mark in markers:
533 if repo.nullid in mark[1]:
533 if repo.nullid in mark[1]:
534 raise error.Abort(
534 raise error.Abort(
535 _(
535 _(
536 b'bad obsolescence marker detected: '
536 b'bad obsolescence marker detected: '
537 b'invalid successors nullid'
537 b'invalid successors nullid'
538 )
538 )
539 )
539 )
540
540
541
541
542 class obsstore:
542 class obsstore:
543 """Store obsolete markers
543 """Store obsolete markers
544
544
545 Markers can be accessed with two mappings:
545 Markers can be accessed with two mappings:
546 - predecessors[x] -> set(markers on predecessors edges of x)
546 - predecessors[x] -> set(markers on predecessors edges of x)
547 - successors[x] -> set(markers on successors edges of x)
547 - successors[x] -> set(markers on successors edges of x)
548 - children[x] -> set(markers on predecessors edges of children(x)
548 - children[x] -> set(markers on predecessors edges of children(x)
549 """
549 """
550
550
551 fields = (b'prec', b'succs', b'flag', b'meta', b'date', b'parents')
551 fields = (b'prec', b'succs', b'flag', b'meta', b'date', b'parents')
552 # prec: nodeid, predecessors changesets
552 # prec: nodeid, predecessors changesets
553 # succs: tuple of nodeid, successor changesets (0-N length)
553 # succs: tuple of nodeid, successor changesets (0-N length)
554 # flag: integer, flag field carrying modifier for the markers (see doc)
554 # flag: integer, flag field carrying modifier for the markers (see doc)
555 # meta: binary blob in UTF-8, encoded metadata dictionary
555 # meta: binary blob in UTF-8, encoded metadata dictionary
556 # date: (float, int) tuple, date of marker creation
556 # date: (float, int) tuple, date of marker creation
557 # parents: (tuple of nodeid) or None, parents of predecessors
557 # parents: (tuple of nodeid) or None, parents of predecessors
558 # None is used when no data has been recorded
558 # None is used when no data has been recorded
559
559
560 def __init__(self, repo, svfs, defaultformat=_fm1version, readonly=False):
560 def __init__(self, repo, svfs, defaultformat=_fm1version, readonly=False):
561 # caches for various obsolescence related cache
561 # caches for various obsolescence related cache
562 self.caches = {}
562 self.caches = {}
563 self.svfs = svfs
563 self.svfs = svfs
564 self._repo = weakref.ref(repo)
564 self._repo = weakref.ref(repo)
565 self._defaultformat = defaultformat
565 self._defaultformat = defaultformat
566 self._readonly = readonly
566 self._readonly = readonly
567
567
568 @property
568 @property
569 def repo(self):
569 def repo(self):
570 r = self._repo()
570 r = self._repo()
571 if r is None:
571 if r is None:
572 msg = "using the obsstore of a deallocated repo"
572 msg = "using the obsstore of a deallocated repo"
573 raise error.ProgrammingError(msg)
573 raise error.ProgrammingError(msg)
574 return r
574 return r
575
575
576 def __iter__(self):
576 def __iter__(self):
577 return iter(self._all)
577 return iter(self._all)
578
578
579 def __len__(self):
579 def __len__(self):
580 return len(self._all)
580 return len(self._all)
581
581
582 def __nonzero__(self):
582 def __nonzero__(self):
583 from . import statichttprepo
583 from . import statichttprepo
584
584
585 if isinstance(self.repo, statichttprepo.statichttprepository):
585 if isinstance(self.repo, statichttprepo.statichttprepository):
586 # If repo is accessed via static HTTP, then we can't use os.stat()
586 # If repo is accessed via static HTTP, then we can't use os.stat()
587 # to just peek at the file size.
587 # to just peek at the file size.
588 return len(self._data) > 1
588 return len(self._data) > 1
589 if not self._cached('_all'):
589 if not self._cached('_all'):
590 try:
590 try:
591 return self.svfs.stat(b'obsstore').st_size > 1
591 return self.svfs.stat(b'obsstore').st_size > 1
592 except FileNotFoundError:
592 except FileNotFoundError:
593 # just build an empty _all list if no obsstore exists, which
593 # just build an empty _all list if no obsstore exists, which
594 # avoids further stat() syscalls
594 # avoids further stat() syscalls
595 pass
595 pass
596 return bool(self._all)
596 return bool(self._all)
597
597
598 __bool__ = __nonzero__
598 __bool__ = __nonzero__
599
599
600 @property
600 @property
601 def readonly(self):
601 def readonly(self):
602 """True if marker creation is disabled
602 """True if marker creation is disabled
603
603
604 Remove me in the future when obsolete marker is always on."""
604 Remove me in the future when obsolete marker is always on."""
605 return self._readonly
605 return self._readonly
606
606
607 def create(
607 def create(
608 self,
608 self,
609 transaction,
609 transaction,
610 prec,
610 prec,
611 succs=(),
611 succs=(),
612 flag=0,
612 flag=0,
613 parents=None,
613 parents=None,
614 date=None,
614 date=None,
615 metadata=None,
615 metadata=None,
616 ui=None,
616 ui=None,
617 ):
617 ):
618 """obsolete: add a new obsolete marker
618 """obsolete: add a new obsolete marker
619
619
620 * ensuring it is hashable
620 * ensuring it is hashable
621 * check mandatory metadata
621 * check mandatory metadata
622 * encode metadata
622 * encode metadata
623
623
624 If you are a human writing code creating marker you want to use the
624 If you are a human writing code creating marker you want to use the
625 `createmarkers` function in this module instead.
625 `createmarkers` function in this module instead.
626
626
627 return True if a new marker have been added, False if the markers
627 return True if a new marker have been added, False if the markers
628 already existed (no op).
628 already existed (no op).
629 """
629 """
630 flag = int(flag)
630 flag = int(flag)
631 if metadata is None:
631 if metadata is None:
632 metadata = {}
632 metadata = {}
633 if date is None:
633 if date is None:
634 if b'date' in metadata:
634 if b'date' in metadata:
635 # as a courtesy for out-of-tree extensions
635 # as a courtesy for out-of-tree extensions
636 date = dateutil.parsedate(metadata.pop(b'date'))
636 date = dateutil.parsedate(metadata.pop(b'date'))
637 elif ui is not None:
637 elif ui is not None:
638 date = ui.configdate(b'devel', b'default-date')
638 date = ui.configdate(b'devel', b'default-date')
639 if date is None:
639 if date is None:
640 date = dateutil.makedate()
640 date = dateutil.makedate()
641 else:
641 else:
642 date = dateutil.makedate()
642 date = dateutil.makedate()
643 if flag & usingsha256:
643 if flag & usingsha256:
644 if len(prec) != 32:
644 if len(prec) != 32:
645 raise ValueError(prec)
645 raise ValueError(prec)
646 for succ in succs:
646 for succ in succs:
647 if len(succ) != 32:
647 if len(succ) != 32:
648 raise ValueError(succ)
648 raise ValueError(succ)
649 else:
649 else:
650 if len(prec) != 20:
650 if len(prec) != 20:
651 raise ValueError(prec)
651 raise ValueError(prec)
652 for succ in succs:
652 for succ in succs:
653 if len(succ) != 20:
653 if len(succ) != 20:
654 raise ValueError(succ)
654 raise ValueError(succ)
655 if prec in succs:
655 if prec in succs:
656 raise ValueError('in-marker cycle with %s' % prec.hex())
656 raise ValueError('in-marker cycle with %s' % prec.hex())
657
657
658 metadata = tuple(sorted(metadata.items()))
658 metadata = tuple(sorted(metadata.items()))
659 for k, v in metadata:
659 for k, v in metadata:
660 try:
660 try:
661 # might be better to reject non-ASCII keys
661 # might be better to reject non-ASCII keys
662 k.decode('utf-8')
662 k.decode('utf-8')
663 v.decode('utf-8')
663 v.decode('utf-8')
664 except UnicodeDecodeError:
664 except UnicodeDecodeError:
665 raise error.ProgrammingError(
665 raise error.ProgrammingError(
666 b'obsstore metadata must be valid UTF-8 sequence '
666 b'obsstore metadata must be valid UTF-8 sequence '
667 b'(key = %r, value = %r)'
667 b'(key = %r, value = %r)'
668 % (pycompat.bytestr(k), pycompat.bytestr(v))
668 % (pycompat.bytestr(k), pycompat.bytestr(v))
669 )
669 )
670
670
671 marker = (bytes(prec), tuple(succs), flag, metadata, date, parents)
671 marker = (bytes(prec), tuple(succs), flag, metadata, date, parents)
672 return bool(self.add(transaction, [marker]))
672 return bool(self.add(transaction, [marker]))
673
673
674 def add(self, transaction, markers):
674 def add(self, transaction, markers):
675 """Add new markers to the store
675 """Add new markers to the store
676
676
677 Take care of filtering duplicate.
677 Take care of filtering duplicate.
678 Return the number of new marker."""
678 Return the number of new marker."""
679 if self._readonly:
679 if self._readonly:
680 raise error.Abort(
680 raise error.Abort(
681 _(b'creating obsolete markers is not enabled on this repo')
681 _(b'creating obsolete markers is not enabled on this repo')
682 )
682 )
683 known = set()
683 known = set()
684 getsuccessors = self.successors.get
684 getsuccessors = self.successors.get
685 new = []
685 new = []
686 for m in markers:
686 for m in markers:
687 if m not in getsuccessors(m[0], ()) and m not in known:
687 if m not in getsuccessors(m[0], ()) and m not in known:
688 known.add(m)
688 known.add(m)
689 new.append(m)
689 new.append(m)
690 if new:
690 if new:
691 f = self.svfs(b'obsstore', b'ab')
691 f = self.svfs(b'obsstore', b'ab')
692 try:
692 try:
693 offset = f.tell()
693 offset = f.tell()
694 transaction.add(b'obsstore', offset)
694 transaction.add(b'obsstore', offset)
695 # offset == 0: new file - add the version header
695 # offset == 0: new file - add the version header
696 data = b''.join(encodemarkers(new, offset == 0, self._version))
696 data = b''.join(encodemarkers(new, offset == 0, self._version))
697 f.write(data)
697 f.write(data)
698 finally:
698 finally:
699 # XXX: f.close() == filecache invalidation == obsstore rebuilt.
699 # XXX: f.close() == filecache invalidation == obsstore rebuilt.
700 # call 'filecacheentry.refresh()' here
700 # call 'filecacheentry.refresh()' here
701 f.close()
701 f.close()
702 addedmarkers = transaction.changes.get(b'obsmarkers')
702 addedmarkers = transaction.changes.get(b'obsmarkers')
703 if addedmarkers is not None:
703 if addedmarkers is not None:
704 addedmarkers.update(new)
704 addedmarkers.update(new)
705 self._addmarkers(new, data)
705 self._addmarkers(new, data)
706 # new marker *may* have changed several set. invalidate the cache.
706 # new marker *may* have changed several set. invalidate the cache.
707 self.caches.clear()
707 self.caches.clear()
708 # records the number of new markers for the transaction hooks
708 # records the number of new markers for the transaction hooks
709 previous = int(transaction.hookargs.get(b'new_obsmarkers', b'0'))
709 previous = int(transaction.hookargs.get(b'new_obsmarkers', b'0'))
710 transaction.hookargs[b'new_obsmarkers'] = b'%d' % (previous + len(new))
710 transaction.hookargs[b'new_obsmarkers'] = b'%d' % (previous + len(new))
711 return len(new)
711 return len(new)
712
712
713 def mergemarkers(self, transaction, data):
713 def mergemarkers(self, transaction, data):
714 """merge a binary stream of markers inside the obsstore
714 """merge a binary stream of markers inside the obsstore
715
715
716 Returns the number of new markers added."""
716 Returns the number of new markers added."""
717 version, markers = _readmarkers(data)
717 version, markers = _readmarkers(data)
718 return self.add(transaction, markers)
718 return self.add(transaction, markers)
719
719
720 @propertycache
720 @propertycache
721 def _data(self):
721 def _data(self):
722 return self.svfs.tryread(b'obsstore')
722 return self.svfs.tryread(b'obsstore')
723
723
724 @propertycache
724 @propertycache
725 def _version(self):
725 def _version(self):
726 if len(self._data) >= 1:
726 if len(self._data) >= 1:
727 return _readmarkerversion(self._data)
727 return _readmarkerversion(self._data)
728 else:
728 else:
729 return self._defaultformat
729 return self._defaultformat
730
730
731 @propertycache
731 @propertycache
732 def _all(self):
732 def _all(self):
733 data = self._data
733 data = self._data
734 if not data:
734 if not data:
735 return []
735 return []
736 self._version, markers = _readmarkers(data)
736 self._version, markers = _readmarkers(data)
737 markers = list(markers)
737 markers = list(markers)
738 _checkinvalidmarkers(self.repo, markers)
738 _checkinvalidmarkers(self.repo, markers)
739 return markers
739 return markers
740
740
741 @propertycache
741 @propertycache
742 def successors(self):
742 def successors(self):
743 successors = {}
743 successors = {}
744 _addsuccessors(successors, self._all)
744 _addsuccessors(successors, self._all)
745 return successors
745 return successors
746
746
747 @propertycache
747 @propertycache
748 def predecessors(self):
748 def predecessors(self):
749 predecessors = {}
749 predecessors = {}
750 _addpredecessors(predecessors, self._all)
750 _addpredecessors(predecessors, self._all)
751 return predecessors
751 return predecessors
752
752
753 @propertycache
753 @propertycache
754 def children(self):
754 def children(self):
755 children = {}
755 children = {}
756 _addchildren(children, self._all)
756 _addchildren(children, self._all)
757 return children
757 return children
758
758
759 def _cached(self, attr):
759 def _cached(self, attr):
760 return attr in self.__dict__
760 return attr in self.__dict__
761
761
762 def _addmarkers(self, markers, rawdata):
762 def _addmarkers(self, markers, rawdata):
763 markers = list(markers) # to allow repeated iteration
763 markers = list(markers) # to allow repeated iteration
764 self._data = self._data + rawdata
764 self._data = self._data + rawdata
765 self._all.extend(markers)
765 self._all.extend(markers)
766 if self._cached('successors'):
766 if self._cached('successors'):
767 _addsuccessors(self.successors, markers)
767 _addsuccessors(self.successors, markers)
768 if self._cached('predecessors'):
768 if self._cached('predecessors'):
769 _addpredecessors(self.predecessors, markers)
769 _addpredecessors(self.predecessors, markers)
770 if self._cached('children'):
770 if self._cached('children'):
771 _addchildren(self.children, markers)
771 _addchildren(self.children, markers)
772 _checkinvalidmarkers(self.repo, markers)
772 _checkinvalidmarkers(self.repo, markers)
773
773
774 def relevantmarkers(self, nodes):
774 def relevantmarkers(self, nodes):
775 """return a set of all obsolescence markers relevant to a set of nodes.
775 """return a set of all obsolescence markers relevant to a set of nodes.
776
776
777 "relevant" to a set of nodes mean:
777 "relevant" to a set of nodes mean:
778
778
779 - marker that use this changeset as successor
779 - marker that use this changeset as successor
780 - prune marker of direct children on this changeset
780 - prune marker of direct children on this changeset
781 - recursive application of the two rules on predecessors of these
781 - recursive application of the two rules on predecessors of these
782 markers
782 markers
783
783
784 It is a set so you cannot rely on order."""
784 It is a set so you cannot rely on order."""
785
785
786 pendingnodes = set(nodes)
786 pendingnodes = set(nodes)
787 seenmarkers = set()
787 seenmarkers = set()
788 seennodes = set(pendingnodes)
788 seennodes = set(pendingnodes)
789 precursorsmarkers = self.predecessors
789 precursorsmarkers = self.predecessors
790 succsmarkers = self.successors
790 succsmarkers = self.successors
791 children = self.children
791 children = self.children
792 while pendingnodes:
792 while pendingnodes:
793 direct = set()
793 direct = set()
794 for current in pendingnodes:
794 for current in pendingnodes:
795 direct.update(precursorsmarkers.get(current, ()))
795 direct.update(precursorsmarkers.get(current, ()))
796 pruned = [m for m in children.get(current, ()) if not m[1]]
796 pruned = [m for m in children.get(current, ()) if not m[1]]
797 direct.update(pruned)
797 direct.update(pruned)
798 pruned = [m for m in succsmarkers.get(current, ()) if not m[1]]
798 pruned = [m for m in succsmarkers.get(current, ()) if not m[1]]
799 direct.update(pruned)
799 direct.update(pruned)
800 direct -= seenmarkers
800 direct -= seenmarkers
801 pendingnodes = {m[0] for m in direct}
801 pendingnodes = {m[0] for m in direct}
802 seenmarkers |= direct
802 seenmarkers |= direct
803 pendingnodes -= seennodes
803 pendingnodes -= seennodes
804 seennodes |= pendingnodes
804 seennodes |= pendingnodes
805 return seenmarkers
805 return seenmarkers
806
806
807
807
808 def makestore(ui, repo):
808 def makestore(ui, repo):
809 """Create an obsstore instance from a repo."""
809 """Create an obsstore instance from a repo."""
810 # read default format for new obsstore.
810 # read default format for new obsstore.
811 # developer config: format.obsstore-version
811 # developer config: format.obsstore-version
812 defaultformat = ui.configint(b'format', b'obsstore-version')
812 defaultformat = ui.configint(b'format', b'obsstore-version')
813 # rely on obsstore class default when possible.
813 # rely on obsstore class default when possible.
814 kwargs = {}
814 kwargs = {}
815 if defaultformat is not None:
815 if defaultformat is not None:
816 kwargs['defaultformat'] = defaultformat
816 kwargs['defaultformat'] = defaultformat
817 readonly = not isenabled(repo, createmarkersopt)
817 readonly = not isenabled(repo, createmarkersopt)
818 store = obsstore(repo, repo.svfs, readonly=readonly, **kwargs)
818 store = obsstore(repo, repo.svfs, readonly=readonly, **kwargs)
819 if store and readonly:
819 if store and readonly:
820 ui.warn(
820 ui.warn(
821 _(b'"obsolete" feature not enabled but %i markers found!\n')
821 _(b'"obsolete" feature not enabled but %i markers found!\n')
822 % len(list(store))
822 % len(list(store))
823 )
823 )
824 return store
824 return store
825
825
826
826
827 def commonversion(versions):
827 def commonversion(versions):
828 """Return the newest version listed in both versions and our local formats.
828 """Return the newest version listed in both versions and our local formats.
829
829
830 Returns None if no common version exists.
830 Returns None if no common version exists.
831 """
831 """
832 versions.sort(reverse=True)
832 versions.sort(reverse=True)
833 # search for highest version known on both side
833 # search for highest version known on both side
834 for v in versions:
834 for v in versions:
835 if v in formats:
835 if v in formats:
836 return v
836 return v
837 return None
837 return None
838
838
839
839
840 # arbitrary picked to fit into 8K limit from HTTP server
840 # arbitrary picked to fit into 8K limit from HTTP server
841 # you have to take in account:
841 # you have to take in account:
842 # - the version header
842 # - the version header
843 # - the base85 encoding
843 # - the base85 encoding
844 _maxpayload = 5300
844 _maxpayload = 5300
845
845
846
846
847 def _pushkeyescape(markers):
847 def _pushkeyescape(markers):
848 """encode markers into a dict suitable for pushkey exchange
848 """encode markers into a dict suitable for pushkey exchange
849
849
850 - binary data is base85 encoded
850 - binary data is base85 encoded
851 - split in chunks smaller than 5300 bytes"""
851 - split in chunks smaller than 5300 bytes"""
852 keys = {}
852 keys = {}
853 parts = []
853 parts = []
854 currentlen = _maxpayload * 2 # ensure we create a new part
854 currentlen = _maxpayload * 2 # ensure we create a new part
855 for marker in markers:
855 for marker in markers:
856 nextdata = _fm0encodeonemarker(marker)
856 nextdata = _fm0encodeonemarker(marker)
857 if len(nextdata) + currentlen > _maxpayload:
857 if len(nextdata) + currentlen > _maxpayload:
858 currentpart = []
858 currentpart = []
859 currentlen = 0
859 currentlen = 0
860 parts.append(currentpart)
860 parts.append(currentpart)
861 currentpart.append(nextdata)
861 currentpart.append(nextdata)
862 currentlen += len(nextdata)
862 currentlen += len(nextdata)
863 for idx, part in enumerate(reversed(parts)):
863 for idx, part in enumerate(reversed(parts)):
864 data = b''.join([_pack(b'>B', _fm0version)] + part)
864 data = b''.join([_pack(b'>B', _fm0version)] + part)
865 keys[b'dump%i' % idx] = util.b85encode(data)
865 keys[b'dump%i' % idx] = util.b85encode(data)
866 return keys
866 return keys
867
867
868
868
869 def listmarkers(repo):
869 def listmarkers(repo):
870 """List markers over pushkey"""
870 """List markers over pushkey"""
871 if not repo.obsstore:
871 if not repo.obsstore:
872 return {}
872 return {}
873 return _pushkeyescape(sorted(repo.obsstore))
873 return _pushkeyescape(sorted(repo.obsstore))
874
874
875
875
876 def pushmarker(repo, key, old, new):
876 def pushmarker(repo, key, old, new):
877 """Push markers over pushkey"""
877 """Push markers over pushkey"""
878 if not key.startswith(b'dump'):
878 if not key.startswith(b'dump'):
879 repo.ui.warn(_(b'unknown key: %r') % key)
879 repo.ui.warn(_(b'unknown key: %r') % key)
880 return False
880 return False
881 if old:
881 if old:
882 repo.ui.warn(_(b'unexpected old value for %r') % key)
882 repo.ui.warn(_(b'unexpected old value for %r') % key)
883 return False
883 return False
884 data = util.b85decode(new)
884 data = util.b85decode(new)
885 with repo.lock(), repo.transaction(b'pushkey: obsolete markers') as tr:
885 with repo.lock(), repo.transaction(b'pushkey: obsolete markers') as tr:
886 repo.obsstore.mergemarkers(tr, data)
886 repo.obsstore.mergemarkers(tr, data)
887 repo.invalidatevolatilesets()
887 repo.invalidatevolatilesets()
888 return True
888 return True
889
889
890
890
891 # mapping of 'set-name' -> <function to compute this set>
891 # mapping of 'set-name' -> <function to compute this set>
892 cachefuncs = {}
892 cachefuncs = {}
893
893
894
894
895 def cachefor(name):
895 def cachefor(name):
896 """Decorator to register a function as computing the cache for a set"""
896 """Decorator to register a function as computing the cache for a set"""
897
897
898 def decorator(func):
898 def decorator(func):
899 if name in cachefuncs:
899 if name in cachefuncs:
900 msg = b"duplicated registration for volatileset '%s' (existing: %r)"
900 msg = b"duplicated registration for volatileset '%s' (existing: %r)"
901 raise error.ProgrammingError(msg % (name, cachefuncs[name]))
901 raise error.ProgrammingError(msg % (name, cachefuncs[name]))
902 cachefuncs[name] = func
902 cachefuncs[name] = func
903 return func
903 return func
904
904
905 return decorator
905 return decorator
906
906
907
907
908 def getrevs(repo, name):
908 def getrevs(repo, name):
909 """Return the set of revision that belong to the <name> set
909 """Return the set of revision that belong to the <name> set
910
910
911 Such access may compute the set and cache it for future use"""
911 Such access may compute the set and cache it for future use"""
912 repo = repo.unfiltered()
912 repo = repo.unfiltered()
913 with util.timedcm('getrevs %s', name):
913 with util.timedcm('getrevs %s', name):
914 if not repo.obsstore:
914 if not repo.obsstore:
915 return frozenset()
915 return frozenset()
916 if name not in repo.obsstore.caches:
916 if name not in repo.obsstore.caches:
917 repo.obsstore.caches[name] = cachefuncs[name](repo)
917 repo.obsstore.caches[name] = cachefuncs[name](repo)
918 return repo.obsstore.caches[name]
918 return repo.obsstore.caches[name]
919
919
920
920
921 # To be simple we need to invalidate obsolescence cache when:
921 # To be simple we need to invalidate obsolescence cache when:
922 #
922 #
923 # - new changeset is added:
923 # - new changeset is added:
924 # - public phase is changed
924 # - public phase is changed
925 # - obsolescence marker are added
925 # - obsolescence marker are added
926 # - strip is used a repo
926 # - strip is used a repo
927 def clearobscaches(repo):
927 def clearobscaches(repo):
928 """Remove all obsolescence related cache from a repo
928 """Remove all obsolescence related cache from a repo
929
929
930 This remove all cache in obsstore is the obsstore already exist on the
930 This remove all cache in obsstore is the obsstore already exist on the
931 repo.
931 repo.
932
932
933 (We could be smarter here given the exact event that trigger the cache
933 (We could be smarter here given the exact event that trigger the cache
934 clearing)"""
934 clearing)"""
935 # only clear cache is there is obsstore data in this repo
935 # only clear cache is there is obsstore data in this repo
936 if b'obsstore' in repo._filecache:
936 if b'obsstore' in repo._filecache:
937 repo.obsstore.caches.clear()
937 repo.obsstore.caches.clear()
938
938
939
939
940 def _mutablerevs(repo):
940 def _mutablerevs(repo):
941 """the set of mutable revision in the repository"""
941 """the set of mutable revision in the repository"""
942 return repo._phasecache.getrevset(repo, phases.relevant_mutable_phases)
942 return repo._phasecache.getrevset(repo, phases.relevant_mutable_phases)
943
943
944
944
945 @cachefor(b'obsolete')
945 @cachefor(b'obsolete')
946 def _computeobsoleteset(repo):
946 def _computeobsoleteset(repo):
947 """the set of obsolete revisions"""
947 """the set of obsolete revisions"""
948 getnode = repo.changelog.node
948 getnode = repo.changelog.node
949 notpublic = _mutablerevs(repo)
949 notpublic = _mutablerevs(repo)
950 isobs = repo.obsstore.successors.__contains__
950 isobs = repo.obsstore.successors.__contains__
951 return frozenset(r for r in notpublic if isobs(getnode(r)))
951 return frozenset(r for r in notpublic if isobs(getnode(r)))
952
952
953
953
954 @cachefor(b'orphan')
954 @cachefor(b'orphan')
955 def _computeorphanset(repo):
955 def _computeorphanset(repo):
956 """the set of non obsolete revisions with obsolete parents"""
956 """the set of non obsolete revisions with obsolete parents"""
957 pfunc = repo.changelog.parentrevs
957 pfunc = repo.changelog.parentrevs
958 mutable = _mutablerevs(repo)
958 mutable = _mutablerevs(repo)
959 obsolete = getrevs(repo, b'obsolete')
959 obsolete = getrevs(repo, b'obsolete')
960 others = mutable - obsolete
960 others = mutable - obsolete
961 unstable = set()
961 unstable = set()
962 for r in sorted(others):
962 for r in sorted(others):
963 # A rev is unstable if one of its parent is obsolete or unstable
963 # A rev is unstable if one of its parent is obsolete or unstable
964 # this works since we traverse following growing rev order
964 # this works since we traverse following growing rev order
965 for p in pfunc(r):
965 for p in pfunc(r):
966 if p in obsolete or p in unstable:
966 if p in obsolete or p in unstable:
967 unstable.add(r)
967 unstable.add(r)
968 break
968 break
969 return frozenset(unstable)
969 return frozenset(unstable)
970
970
971
971
972 @cachefor(b'suspended')
972 @cachefor(b'suspended')
973 def _computesuspendedset(repo):
973 def _computesuspendedset(repo):
974 """the set of obsolete parents with non obsolete descendants"""
974 """the set of obsolete parents with non obsolete descendants"""
975 suspended = repo.changelog.ancestors(getrevs(repo, b'orphan'))
975 suspended = repo.changelog.ancestors(getrevs(repo, b'orphan'))
976 return frozenset(r for r in getrevs(repo, b'obsolete') if r in suspended)
976 return frozenset(r for r in getrevs(repo, b'obsolete') if r in suspended)
977
977
978
978
979 @cachefor(b'extinct')
979 @cachefor(b'extinct')
980 def _computeextinctset(repo):
980 def _computeextinctset(repo):
981 """the set of obsolete parents without non obsolete descendants"""
981 """the set of obsolete parents without non obsolete descendants"""
982 return getrevs(repo, b'obsolete') - getrevs(repo, b'suspended')
982 return getrevs(repo, b'obsolete') - getrevs(repo, b'suspended')
983
983
984
984
985 @cachefor(b'phasedivergent')
985 @cachefor(b'phasedivergent')
986 def _computephasedivergentset(repo):
986 def _computephasedivergentset(repo):
987 """the set of revs trying to obsolete public revisions"""
987 """the set of revs trying to obsolete public revisions"""
988 bumped = set()
988 bumped = set()
989 # util function (avoid attribute lookup in the loop)
989 # util function (avoid attribute lookup in the loop)
990 phase = repo._phasecache.phase # would be faster to grab the full list
990 phase = repo._phasecache.phase # would be faster to grab the full list
991 public = phases.public
991 public = phases.public
992 cl = repo.changelog
992 cl = repo.changelog
993 torev = cl.index.get_rev
993 torev = cl.index.get_rev
994 tonode = cl.node
994 tonode = cl.node
995 obsstore = repo.obsstore
995 obsstore = repo.obsstore
996 candidates = sorted(_mutablerevs(repo) - getrevs(repo, b"obsolete"))
996 candidates = sorted(_mutablerevs(repo) - getrevs(repo, b"obsolete"))
997 for rev in candidates:
997 for rev in candidates:
998 # We only evaluate mutable, non-obsolete revision
998 # We only evaluate mutable, non-obsolete revision
999 node = tonode(rev)
999 node = tonode(rev)
1000 # (future) A cache of predecessors may worth if split is very common
1000 # (future) A cache of predecessors may worth if split is very common
1001 for pnode in obsutil.allpredecessors(
1001 for pnode in obsutil.allpredecessors(
1002 obsstore, [node], ignoreflags=bumpedfix
1002 obsstore, [node], ignoreflags=bumpedfix
1003 ):
1003 ):
1004 prev = torev(pnode) # unfiltered! but so is phasecache
1004 prev = torev(pnode) # unfiltered! but so is phasecache
1005 if (prev is not None) and (phase(repo, prev) <= public):
1005 if (prev is not None) and (phase(repo, prev) <= public):
1006 # we have a public predecessor
1006 # we have a public predecessor
1007 bumped.add(rev)
1007 bumped.add(rev)
1008 break # Next draft!
1008 break # Next draft!
1009 return frozenset(bumped)
1009 return frozenset(bumped)
1010
1010
1011
1011
1012 @cachefor(b'contentdivergent')
1012 @cachefor(b'contentdivergent')
1013 def _computecontentdivergentset(repo):
1013 def _computecontentdivergentset(repo):
1014 """the set of rev that compete to be the final successors of some revision."""
1014 """the set of rev that compete to be the final successors of some revision."""
1015 divergent = set()
1015 divergent = set()
1016 obsstore = repo.obsstore
1016 obsstore = repo.obsstore
1017 newermap = {}
1017 newermap = {}
1018 tonode = repo.changelog.node
1018 tonode = repo.changelog.node
1019 candidates = sorted(_mutablerevs(repo) - getrevs(repo, b"obsolete"))
1019 candidates = sorted(_mutablerevs(repo) - getrevs(repo, b"obsolete"))
1020 for rev in candidates:
1020 for rev in candidates:
1021 node = tonode(rev)
1021 node = tonode(rev)
1022 mark = obsstore.predecessors.get(node, ())
1022 mark = obsstore.predecessors.get(node, ())
1023 toprocess = set(mark)
1023 toprocess = set(mark)
1024 seen = set()
1024 seen = set()
1025 while toprocess:
1025 while toprocess:
1026 prec = toprocess.pop()[0]
1026 prec = toprocess.pop()[0]
1027 if prec in seen:
1027 if prec in seen:
1028 continue # emergency cycle hanging prevention
1028 continue # emergency cycle hanging prevention
1029 seen.add(prec)
1029 seen.add(prec)
1030 if prec not in newermap:
1030 if prec not in newermap:
1031 obsutil.successorssets(repo, prec, cache=newermap)
1031 obsutil.successorssets(repo, prec, cache=newermap)
1032 newer = [n for n in newermap[prec] if n]
1032 newer = [n for n in newermap[prec] if n]
1033 if len(newer) > 1:
1033 # Strickly speaking, the len(newer) is not needed, but it speeds
1034 # things up.
1035 if len(newer) > 1 and any(n for n in newer if node not in n):
1034 divergent.add(rev)
1036 divergent.add(rev)
1035 break
1037 break
1036 toprocess.update(obsstore.predecessors.get(prec, ()))
1038 toprocess.update(obsstore.predecessors.get(prec, ()))
1037 return frozenset(divergent)
1039 return frozenset(divergent)
1038
1040
1039
1041
1040 def makefoldid(relation, user):
1042 def makefoldid(relation, user):
1041
1043
1042 folddigest = hashutil.sha1(user)
1044 folddigest = hashutil.sha1(user)
1043 for p in relation[0] + relation[1]:
1045 for p in relation[0] + relation[1]:
1044 folddigest.update(b'%d' % p.rev())
1046 folddigest.update(b'%d' % p.rev())
1045 folddigest.update(p.node())
1047 folddigest.update(p.node())
1046 # Since fold only has to compete against fold for the same successors, it
1048 # Since fold only has to compete against fold for the same successors, it
1047 # seems fine to use a small ID. Smaller ID save space.
1049 # seems fine to use a small ID. Smaller ID save space.
1048 return hex(folddigest.digest())[:8]
1050 return hex(folddigest.digest())[:8]
1049
1051
1050
1052
1051 def createmarkers(
1053 def createmarkers(
1052 repo, relations, flag=0, date=None, metadata=None, operation=None
1054 repo, relations, flag=0, date=None, metadata=None, operation=None
1053 ):
1055 ):
1054 """Add obsolete markers between changesets in a repo
1056 """Add obsolete markers between changesets in a repo
1055
1057
1056 <relations> must be an iterable of ((<old>,...), (<new>, ...)[,{metadata}])
1058 <relations> must be an iterable of ((<old>,...), (<new>, ...)[,{metadata}])
1057 tuple. `old` and `news` are changectx. metadata is an optional dictionary
1059 tuple. `old` and `news` are changectx. metadata is an optional dictionary
1058 containing metadata for this marker only. It is merged with the global
1060 containing metadata for this marker only. It is merged with the global
1059 metadata specified through the `metadata` argument of this function.
1061 metadata specified through the `metadata` argument of this function.
1060 Any string values in metadata must be UTF-8 bytes.
1062 Any string values in metadata must be UTF-8 bytes.
1061
1063
1062 Trying to obsolete a public changeset will raise an exception.
1064 Trying to obsolete a public changeset will raise an exception.
1063
1065
1064 Current user and date are used except if specified otherwise in the
1066 Current user and date are used except if specified otherwise in the
1065 metadata attribute.
1067 metadata attribute.
1066
1068
1067 This function operates within a transaction of its own, but does
1069 This function operates within a transaction of its own, but does
1068 not take any lock on the repo.
1070 not take any lock on the repo.
1069 """
1071 """
1070 # prepare metadata
1072 # prepare metadata
1071 if metadata is None:
1073 if metadata is None:
1072 metadata = {}
1074 metadata = {}
1073 if b'user' not in metadata:
1075 if b'user' not in metadata:
1074 luser = (
1076 luser = (
1075 repo.ui.config(b'devel', b'user.obsmarker') or repo.ui.username()
1077 repo.ui.config(b'devel', b'user.obsmarker') or repo.ui.username()
1076 )
1078 )
1077 metadata[b'user'] = encoding.fromlocal(luser)
1079 metadata[b'user'] = encoding.fromlocal(luser)
1078
1080
1079 # Operation metadata handling
1081 # Operation metadata handling
1080 useoperation = repo.ui.configbool(
1082 useoperation = repo.ui.configbool(
1081 b'experimental', b'evolution.track-operation'
1083 b'experimental', b'evolution.track-operation'
1082 )
1084 )
1083 if useoperation and operation:
1085 if useoperation and operation:
1084 metadata[b'operation'] = operation
1086 metadata[b'operation'] = operation
1085
1087
1086 # Effect flag metadata handling
1088 # Effect flag metadata handling
1087 saveeffectflag = repo.ui.configbool(
1089 saveeffectflag = repo.ui.configbool(
1088 b'experimental', b'evolution.effect-flags'
1090 b'experimental', b'evolution.effect-flags'
1089 )
1091 )
1090
1092
1091 with repo.transaction(b'add-obsolescence-marker') as tr:
1093 with repo.transaction(b'add-obsolescence-marker') as tr:
1092 markerargs = []
1094 markerargs = []
1093 for rel in relations:
1095 for rel in relations:
1094 predecessors = rel[0]
1096 predecessors = rel[0]
1095 if not isinstance(predecessors, tuple):
1097 if not isinstance(predecessors, tuple):
1096 # preserve compat with old API until all caller are migrated
1098 # preserve compat with old API until all caller are migrated
1097 predecessors = (predecessors,)
1099 predecessors = (predecessors,)
1098 if len(predecessors) > 1 and len(rel[1]) != 1:
1100 if len(predecessors) > 1 and len(rel[1]) != 1:
1099 msg = b'Fold markers can only have 1 successors, not %d'
1101 msg = b'Fold markers can only have 1 successors, not %d'
1100 raise error.ProgrammingError(msg % len(rel[1]))
1102 raise error.ProgrammingError(msg % len(rel[1]))
1101 foldid = None
1103 foldid = None
1102 foldsize = len(predecessors)
1104 foldsize = len(predecessors)
1103 if 1 < foldsize:
1105 if 1 < foldsize:
1104 foldid = makefoldid(rel, metadata[b'user'])
1106 foldid = makefoldid(rel, metadata[b'user'])
1105 for foldidx, prec in enumerate(predecessors, 1):
1107 for foldidx, prec in enumerate(predecessors, 1):
1106 sucs = rel[1]
1108 sucs = rel[1]
1107 localmetadata = metadata.copy()
1109 localmetadata = metadata.copy()
1108 if len(rel) > 2:
1110 if len(rel) > 2:
1109 localmetadata.update(rel[2])
1111 localmetadata.update(rel[2])
1110 if foldid is not None:
1112 if foldid is not None:
1111 localmetadata[b'fold-id'] = foldid
1113 localmetadata[b'fold-id'] = foldid
1112 localmetadata[b'fold-idx'] = b'%d' % foldidx
1114 localmetadata[b'fold-idx'] = b'%d' % foldidx
1113 localmetadata[b'fold-size'] = b'%d' % foldsize
1115 localmetadata[b'fold-size'] = b'%d' % foldsize
1114
1116
1115 if not prec.mutable():
1117 if not prec.mutable():
1116 raise error.Abort(
1118 raise error.Abort(
1117 _(b"cannot obsolete public changeset: %s") % prec,
1119 _(b"cannot obsolete public changeset: %s") % prec,
1118 hint=b"see 'hg help phases' for details",
1120 hint=b"see 'hg help phases' for details",
1119 )
1121 )
1120 nprec = prec.node()
1122 nprec = prec.node()
1121 nsucs = tuple(s.node() for s in sucs)
1123 nsucs = tuple(s.node() for s in sucs)
1122 npare = None
1124 npare = None
1123 if not nsucs:
1125 if not nsucs:
1124 npare = tuple(p.node() for p in prec.parents())
1126 npare = tuple(p.node() for p in prec.parents())
1125 if nprec in nsucs:
1127 if nprec in nsucs:
1126 raise error.Abort(
1128 raise error.Abort(
1127 _(b"changeset %s cannot obsolete itself") % prec
1129 _(b"changeset %s cannot obsolete itself") % prec
1128 )
1130 )
1129
1131
1130 # Effect flag can be different by relation
1132 # Effect flag can be different by relation
1131 if saveeffectflag:
1133 if saveeffectflag:
1132 # The effect flag is saved in a versioned field name for
1134 # The effect flag is saved in a versioned field name for
1133 # future evolution
1135 # future evolution
1134 effectflag = obsutil.geteffectflag(prec, sucs)
1136 effectflag = obsutil.geteffectflag(prec, sucs)
1135 localmetadata[obsutil.EFFECTFLAGFIELD] = b"%d" % effectflag
1137 localmetadata[obsutil.EFFECTFLAGFIELD] = b"%d" % effectflag
1136
1138
1137 # Creating the marker causes the hidden cache to become
1139 # Creating the marker causes the hidden cache to become
1138 # invalid, which causes recomputation when we ask for
1140 # invalid, which causes recomputation when we ask for
1139 # prec.parents() above. Resulting in n^2 behavior. So let's
1141 # prec.parents() above. Resulting in n^2 behavior. So let's
1140 # prepare all of the args first, then create the markers.
1142 # prepare all of the args first, then create the markers.
1141 markerargs.append((nprec, nsucs, npare, localmetadata))
1143 markerargs.append((nprec, nsucs, npare, localmetadata))
1142
1144
1143 for args in markerargs:
1145 for args in markerargs:
1144 nprec, nsucs, npare, localmetadata = args
1146 nprec, nsucs, npare, localmetadata = args
1145 repo.obsstore.create(
1147 repo.obsstore.create(
1146 tr,
1148 tr,
1147 nprec,
1149 nprec,
1148 nsucs,
1150 nsucs,
1149 flag,
1151 flag,
1150 parents=npare,
1152 parents=npare,
1151 date=date,
1153 date=date,
1152 metadata=localmetadata,
1154 metadata=localmetadata,
1153 ui=repo.ui,
1155 ui=repo.ui,
1154 )
1156 )
1155 repo.filteredrevcache.clear()
1157 repo.filteredrevcache.clear()
@@ -1,3193 +1,3190 b''
1 This test file test the various templates related to obsmarkers.
1 This test file test the various templates related to obsmarkers.
2
2
3 Global setup
3 Global setup
4 ============
4 ============
5
5
6 $ . $TESTDIR/testlib/obsmarker-common.sh
6 $ . $TESTDIR/testlib/obsmarker-common.sh
7 $ cat >> $HGRCPATH <<EOF
7 $ cat >> $HGRCPATH <<EOF
8 > [ui]
8 > [ui]
9 > interactive = true
9 > interactive = true
10 > [phases]
10 > [phases]
11 > publish=False
11 > publish=False
12 > [experimental]
12 > [experimental]
13 > evolution=true
13 > evolution=true
14 > evolution.allowdivergence=true
14 > evolution.allowdivergence=true
15 > [templates]
15 > [templates]
16 > obsfatesuccessors = "{if(successors, " as ")}{join(successors, ", ")}"
16 > obsfatesuccessors = "{if(successors, " as ")}{join(successors, ", ")}"
17 > obsfateverb = "{obsfateverb(successors, markers)}"
17 > obsfateverb = "{obsfateverb(successors, markers)}"
18 > obsfateoperations = "{if(obsfateoperations(markers), " using {join(obsfateoperations(markers), ", ")}")}"
18 > obsfateoperations = "{if(obsfateoperations(markers), " using {join(obsfateoperations(markers), ", ")}")}"
19 > obsfateusers = "{if(obsfateusers(markers), " by {join(obsfateusers(markers), ", ")}")}"
19 > obsfateusers = "{if(obsfateusers(markers), " by {join(obsfateusers(markers), ", ")}")}"
20 > obsfatedate = "{if(obsfatedate(markers), "{ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), " (at {min(obsfatedate(markers))|isodate})", " (between {min(obsfatedate(markers))|isodate} and {max(obsfatedate(markers))|isodate})")}")}"
20 > obsfatedate = "{if(obsfatedate(markers), "{ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), " (at {min(obsfatedate(markers))|isodate})", " (between {min(obsfatedate(markers))|isodate} and {max(obsfatedate(markers))|isodate})")}")}"
21 > obsfatetempl = "{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}; "
21 > obsfatetempl = "{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}; "
22 > [alias]
22 > [alias]
23 > tlog = log -G -T '{node|short}\
23 > tlog = log -G -T '{node|short}\
24 > \n Predecessors: {predecessors}\
24 > \n Predecessors: {predecessors}\
25 > \n semi-colon: {join(predecessors, "; ")}\
25 > \n semi-colon: {join(predecessors, "; ")}\
26 > \n json: {predecessors|json}\
26 > \n json: {predecessors|json}\
27 > \n map: {join(predecessors % "{rev}:{node}", " ")}\
27 > \n map: {join(predecessors % "{rev}:{node}", " ")}\
28 > \n Successors: {successorssets}\
28 > \n Successors: {successorssets}\
29 > \n multi-line: {join(successorssets, "\n multi-line: ")}\
29 > \n multi-line: {join(successorssets, "\n multi-line: ")}\
30 > \n json: {successorssets|json}\n'
30 > \n json: {successorssets|json}\n'
31 > fatelog = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers % "{obsfatetempl}"} \n" )}'
31 > fatelog = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers % "{obsfatetempl}"} \n" )}'
32 > fatelogjson = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers|json}\n")}'
32 > fatelogjson = log -G -T '{node|short}\n{if(succsandmarkers, " Obsfate: {succsandmarkers|json}\n")}'
33 > fatelogkw = log -G -T '{node|short}\n{if(obsfate, "{obsfate % " Obsfate: {fate}\n"}")}'
33 > fatelogkw = log -G -T '{node|short}\n{if(obsfate, "{obsfate % " Obsfate: {fate}\n"}")}'
34 > EOF
34 > EOF
35
35
36 Test templates on amended commit
36 Test templates on amended commit
37 ================================
37 ================================
38
38
39 Test setup
39 Test setup
40 ----------
40 ----------
41
41
42 $ hg init $TESTTMP/templates-local-amend
42 $ hg init $TESTTMP/templates-local-amend
43 $ cd $TESTTMP/templates-local-amend
43 $ cd $TESTTMP/templates-local-amend
44 $ mkcommit ROOT
44 $ mkcommit ROOT
45 $ mkcommit A0
45 $ mkcommit A0
46 $ echo 42 >> A0
46 $ echo 42 >> A0
47 $ hg commit --amend -m "A1" --config devel.default-date="1234567890 0"
47 $ hg commit --amend -m "A1" --config devel.default-date="1234567890 0"
48 $ hg commit --amend -m "A2" --config devel.default-date="987654321 0" --config devel.user.obsmarker=test2
48 $ hg commit --amend -m "A2" --config devel.default-date="987654321 0" --config devel.user.obsmarker=test2
49
49
50 $ hg log --hidden -G
50 $ hg log --hidden -G
51 @ changeset: 3:d004c8f274b9
51 @ changeset: 3:d004c8f274b9
52 | tag: tip
52 | tag: tip
53 | parent: 0:ea207398892e
53 | parent: 0:ea207398892e
54 | user: test
54 | user: test
55 | date: Thu Jan 01 00:00:00 1970 +0000
55 | date: Thu Jan 01 00:00:00 1970 +0000
56 | summary: A2
56 | summary: A2
57 |
57 |
58 | x changeset: 2:a468dc9b3633
58 | x changeset: 2:a468dc9b3633
59 |/ parent: 0:ea207398892e
59 |/ parent: 0:ea207398892e
60 | user: test
60 | user: test
61 | date: Thu Jan 01 00:00:00 1970 +0000
61 | date: Thu Jan 01 00:00:00 1970 +0000
62 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2
62 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2
63 | summary: A1
63 | summary: A1
64 |
64 |
65 | x changeset: 1:471f378eab4c
65 | x changeset: 1:471f378eab4c
66 |/ user: test
66 |/ user: test
67 | date: Thu Jan 01 00:00:00 1970 +0000
67 | date: Thu Jan 01 00:00:00 1970 +0000
68 | obsolete: rewritten using amend as 2:a468dc9b3633
68 | obsolete: rewritten using amend as 2:a468dc9b3633
69 | summary: A0
69 | summary: A0
70 |
70 |
71 o changeset: 0:ea207398892e
71 o changeset: 0:ea207398892e
72 user: test
72 user: test
73 date: Thu Jan 01 00:00:00 1970 +0000
73 date: Thu Jan 01 00:00:00 1970 +0000
74 summary: ROOT
74 summary: ROOT
75
75
76 Check templates
76 Check templates
77 ---------------
77 ---------------
78 $ hg up 'desc(A0)' --hidden
78 $ hg up 'desc(A0)' --hidden
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
79 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
80 updated to hidden changeset 471f378eab4c
80 updated to hidden changeset 471f378eab4c
81 (hidden revision '471f378eab4c' was rewritten as: d004c8f274b9)
81 (hidden revision '471f378eab4c' was rewritten as: d004c8f274b9)
82
82
83 Predecessors template should show current revision as it is the working copy
83 Predecessors template should show current revision as it is the working copy
84 $ hg tlog
84 $ hg tlog
85 o d004c8f274b9
85 o d004c8f274b9
86 | Predecessors: 1:471f378eab4c
86 | Predecessors: 1:471f378eab4c
87 | semi-colon: 1:471f378eab4c
87 | semi-colon: 1:471f378eab4c
88 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
88 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
89 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
89 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
90 | Successors:
90 | Successors:
91 | multi-line:
91 | multi-line:
92 | json: []
92 | json: []
93 | @ 471f378eab4c
93 | @ 471f378eab4c
94 |/ Predecessors:
94 |/ Predecessors:
95 | semi-colon:
95 | semi-colon:
96 | json: []
96 | json: []
97 | map:
97 | map:
98 | Successors: 3:d004c8f274b9
98 | Successors: 3:d004c8f274b9
99 | multi-line: 3:d004c8f274b9
99 | multi-line: 3:d004c8f274b9
100 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
100 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
101 o ea207398892e
101 o ea207398892e
102 Predecessors:
102 Predecessors:
103 semi-colon:
103 semi-colon:
104 json: []
104 json: []
105 map:
105 map:
106 Successors:
106 Successors:
107 multi-line:
107 multi-line:
108 json: []
108 json: []
109
109
110 $ hg fatelog
110 $ hg fatelog
111 o d004c8f274b9
111 o d004c8f274b9
112 |
112 |
113 | @ 471f378eab4c
113 | @ 471f378eab4c
114 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test, test2 (between 2001-04-19 04:25 +0000 and 2009-02-13 23:31 +0000);
114 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test, test2 (between 2001-04-19 04:25 +0000 and 2009-02-13 23:31 +0000);
115 o ea207398892e
115 o ea207398892e
116
116
117
117
118 $ hg fatelogkw
118 $ hg fatelogkw
119 o d004c8f274b9
119 o d004c8f274b9
120 |
120 |
121 | @ 471f378eab4c
121 | @ 471f378eab4c
122 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test, test2
122 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test, test2
123 o ea207398892e
123 o ea207398892e
124
124
125
125
126 $ hg log -G --config command-templates.log=
126 $ hg log -G --config command-templates.log=
127 o changeset: 3:d004c8f274b9
127 o changeset: 3:d004c8f274b9
128 | tag: tip
128 | tag: tip
129 | parent: 0:ea207398892e
129 | parent: 0:ea207398892e
130 | user: test
130 | user: test
131 | date: Thu Jan 01 00:00:00 1970 +0000
131 | date: Thu Jan 01 00:00:00 1970 +0000
132 | summary: A2
132 | summary: A2
133 |
133 |
134 | @ changeset: 1:471f378eab4c
134 | @ changeset: 1:471f378eab4c
135 |/ user: test
135 |/ user: test
136 | date: Thu Jan 01 00:00:00 1970 +0000
136 | date: Thu Jan 01 00:00:00 1970 +0000
137 | obsolete: rewritten using amend as 3:d004c8f274b9 by test, test2
137 | obsolete: rewritten using amend as 3:d004c8f274b9 by test, test2
138 | summary: A0
138 | summary: A0
139 |
139 |
140 o changeset: 0:ea207398892e
140 o changeset: 0:ea207398892e
141 user: test
141 user: test
142 date: Thu Jan 01 00:00:00 1970 +0000
142 date: Thu Jan 01 00:00:00 1970 +0000
143 summary: ROOT
143 summary: ROOT
144
144
145
145
146 $ hg log -G -T "default"
146 $ hg log -G -T "default"
147 o changeset: 3:d004c8f274b9
147 o changeset: 3:d004c8f274b9
148 | tag: tip
148 | tag: tip
149 | parent: 0:ea207398892e
149 | parent: 0:ea207398892e
150 | user: test
150 | user: test
151 | date: Thu Jan 01 00:00:00 1970 +0000
151 | date: Thu Jan 01 00:00:00 1970 +0000
152 | summary: A2
152 | summary: A2
153 |
153 |
154 | @ changeset: 1:471f378eab4c
154 | @ changeset: 1:471f378eab4c
155 |/ user: test
155 |/ user: test
156 | date: Thu Jan 01 00:00:00 1970 +0000
156 | date: Thu Jan 01 00:00:00 1970 +0000
157 | obsolete: rewritten using amend as 3:d004c8f274b9 by test, test2
157 | obsolete: rewritten using amend as 3:d004c8f274b9 by test, test2
158 | summary: A0
158 | summary: A0
159 |
159 |
160 o changeset: 0:ea207398892e
160 o changeset: 0:ea207398892e
161 user: test
161 user: test
162 date: Thu Jan 01 00:00:00 1970 +0000
162 date: Thu Jan 01 00:00:00 1970 +0000
163 summary: ROOT
163 summary: ROOT
164
164
165 $ hg up 'desc(A1)' --hidden
165 $ hg up 'desc(A1)' --hidden
166 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
166 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 updated to hidden changeset a468dc9b3633
167 updated to hidden changeset a468dc9b3633
168 (hidden revision 'a468dc9b3633' was rewritten as: d004c8f274b9)
168 (hidden revision 'a468dc9b3633' was rewritten as: d004c8f274b9)
169
169
170 Predecessors template should show current revision as it is the working copy
170 Predecessors template should show current revision as it is the working copy
171 $ hg tlog
171 $ hg tlog
172 o d004c8f274b9
172 o d004c8f274b9
173 | Predecessors: 2:a468dc9b3633
173 | Predecessors: 2:a468dc9b3633
174 | semi-colon: 2:a468dc9b3633
174 | semi-colon: 2:a468dc9b3633
175 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
175 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
176 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
176 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
177 | Successors:
177 | Successors:
178 | multi-line:
178 | multi-line:
179 | json: []
179 | json: []
180 | @ a468dc9b3633
180 | @ a468dc9b3633
181 |/ Predecessors:
181 |/ Predecessors:
182 | semi-colon:
182 | semi-colon:
183 | json: []
183 | json: []
184 | map:
184 | map:
185 | Successors: 3:d004c8f274b9
185 | Successors: 3:d004c8f274b9
186 | multi-line: 3:d004c8f274b9
186 | multi-line: 3:d004c8f274b9
187 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
187 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
188 o ea207398892e
188 o ea207398892e
189 Predecessors:
189 Predecessors:
190 semi-colon:
190 semi-colon:
191 json: []
191 json: []
192 map:
192 map:
193 Successors:
193 Successors:
194 multi-line:
194 multi-line:
195 json: []
195 json: []
196
196
197 $ hg fatelog
197 $ hg fatelog
198 o d004c8f274b9
198 o d004c8f274b9
199 |
199 |
200 | @ a468dc9b3633
200 | @ a468dc9b3633
201 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
201 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
202 o ea207398892e
202 o ea207398892e
203
203
204 Predecessors template should show all the predecessors as we force their display
204 Predecessors template should show all the predecessors as we force their display
205 with --hidden
205 with --hidden
206 $ hg tlog --hidden
206 $ hg tlog --hidden
207 o d004c8f274b9
207 o d004c8f274b9
208 | Predecessors: 2:a468dc9b3633
208 | Predecessors: 2:a468dc9b3633
209 | semi-colon: 2:a468dc9b3633
209 | semi-colon: 2:a468dc9b3633
210 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
210 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
211 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
211 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
212 | Successors:
212 | Successors:
213 | multi-line:
213 | multi-line:
214 | json: []
214 | json: []
215 | @ a468dc9b3633
215 | @ a468dc9b3633
216 |/ Predecessors: 1:471f378eab4c
216 |/ Predecessors: 1:471f378eab4c
217 | semi-colon: 1:471f378eab4c
217 | semi-colon: 1:471f378eab4c
218 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
218 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
219 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
219 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
220 | Successors: 3:d004c8f274b9
220 | Successors: 3:d004c8f274b9
221 | multi-line: 3:d004c8f274b9
221 | multi-line: 3:d004c8f274b9
222 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
222 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
223 | x 471f378eab4c
223 | x 471f378eab4c
224 |/ Predecessors:
224 |/ Predecessors:
225 | semi-colon:
225 | semi-colon:
226 | json: []
226 | json: []
227 | map:
227 | map:
228 | Successors: 2:a468dc9b3633
228 | Successors: 2:a468dc9b3633
229 | multi-line: 2:a468dc9b3633
229 | multi-line: 2:a468dc9b3633
230 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
230 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
231 o ea207398892e
231 o ea207398892e
232 Predecessors:
232 Predecessors:
233 semi-colon:
233 semi-colon:
234 json: []
234 json: []
235 map:
235 map:
236 Successors:
236 Successors:
237 multi-line:
237 multi-line:
238 json: []
238 json: []
239
239
240 $ hg fatelog --hidden
240 $ hg fatelog --hidden
241 o d004c8f274b9
241 o d004c8f274b9
242 |
242 |
243 | @ a468dc9b3633
243 | @ a468dc9b3633
244 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
244 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
245 | x 471f378eab4c
245 | x 471f378eab4c
246 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000);
246 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000);
247 o ea207398892e
247 o ea207398892e
248
248
249
249
250 Predecessors template shouldn't show anything as all obsolete commit are not
250 Predecessors template shouldn't show anything as all obsolete commit are not
251 visible.
251 visible.
252 $ hg up 'desc(A2)'
252 $ hg up 'desc(A2)'
253 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
253 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
254 $ hg tlog
254 $ hg tlog
255 @ d004c8f274b9
255 @ d004c8f274b9
256 | Predecessors:
256 | Predecessors:
257 | semi-colon:
257 | semi-colon:
258 | json: []
258 | json: []
259 | map:
259 | map:
260 | Successors:
260 | Successors:
261 | multi-line:
261 | multi-line:
262 | json: []
262 | json: []
263 o ea207398892e
263 o ea207398892e
264 Predecessors:
264 Predecessors:
265 semi-colon:
265 semi-colon:
266 json: []
266 json: []
267 map:
267 map:
268 Successors:
268 Successors:
269 multi-line:
269 multi-line:
270 json: []
270 json: []
271
271
272 $ hg tlog --hidden
272 $ hg tlog --hidden
273 @ d004c8f274b9
273 @ d004c8f274b9
274 | Predecessors: 2:a468dc9b3633
274 | Predecessors: 2:a468dc9b3633
275 | semi-colon: 2:a468dc9b3633
275 | semi-colon: 2:a468dc9b3633
276 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
276 | json: ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]
277 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
277 | map: 2:a468dc9b36338b14fdb7825f55ce3df4e71517ad
278 | Successors:
278 | Successors:
279 | multi-line:
279 | multi-line:
280 | json: []
280 | json: []
281 | x a468dc9b3633
281 | x a468dc9b3633
282 |/ Predecessors: 1:471f378eab4c
282 |/ Predecessors: 1:471f378eab4c
283 | semi-colon: 1:471f378eab4c
283 | semi-colon: 1:471f378eab4c
284 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
284 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
285 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
285 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
286 | Successors: 3:d004c8f274b9
286 | Successors: 3:d004c8f274b9
287 | multi-line: 3:d004c8f274b9
287 | multi-line: 3:d004c8f274b9
288 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
288 | json: [["d004c8f274b9ec480a47a93c10dac5eee63adb78"]]
289 | x 471f378eab4c
289 | x 471f378eab4c
290 |/ Predecessors:
290 |/ Predecessors:
291 | semi-colon:
291 | semi-colon:
292 | json: []
292 | json: []
293 | map:
293 | map:
294 | Successors: 2:a468dc9b3633
294 | Successors: 2:a468dc9b3633
295 | multi-line: 2:a468dc9b3633
295 | multi-line: 2:a468dc9b3633
296 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
296 | json: [["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]]
297 o ea207398892e
297 o ea207398892e
298 Predecessors:
298 Predecessors:
299 semi-colon:
299 semi-colon:
300 json: []
300 json: []
301 map:
301 map:
302 Successors:
302 Successors:
303 multi-line:
303 multi-line:
304 json: []
304 json: []
305
305
306 $ hg fatelog
306 $ hg fatelog
307 @ d004c8f274b9
307 @ d004c8f274b9
308 |
308 |
309 o ea207398892e
309 o ea207398892e
310
310
311
311
312 $ hg fatelog --hidden
312 $ hg fatelog --hidden
313 @ d004c8f274b9
313 @ d004c8f274b9
314 |
314 |
315 | x a468dc9b3633
315 | x a468dc9b3633
316 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
316 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000);
317 | x 471f378eab4c
317 | x 471f378eab4c
318 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000);
318 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000);
319 o ea207398892e
319 o ea207398892e
320
320
321 $ hg fatelogjson --hidden
321 $ hg fatelogjson --hidden
322 @ d004c8f274b9
322 @ d004c8f274b9
323 |
323 |
324 | x a468dc9b3633
324 | x a468dc9b3633
325 |/ Obsfate: [{"markers": [["a468dc9b36338b14fdb7825f55ce3df4e71517ad", ["d004c8f274b9ec480a47a93c10dac5eee63adb78"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test2"]], [987654321.0, 0], null]], "successors": ["d004c8f274b9ec480a47a93c10dac5eee63adb78"]}]
325 |/ Obsfate: [{"markers": [["a468dc9b36338b14fdb7825f55ce3df4e71517ad", ["d004c8f274b9ec480a47a93c10dac5eee63adb78"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test2"]], [987654321.0, 0], null]], "successors": ["d004c8f274b9ec480a47a93c10dac5eee63adb78"]}]
326 | x 471f378eab4c
326 | x 471f378eab4c
327 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"], 0, [["ef1", "9"], ["operation", "amend"], ["user", "test"]], [1234567890.0, 0], null]], "successors": ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]}]
327 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"], 0, [["ef1", "9"], ["operation", "amend"], ["user", "test"]], [1234567890.0, 0], null]], "successors": ["a468dc9b36338b14fdb7825f55ce3df4e71517ad"]}]
328 o ea207398892e
328 o ea207398892e
329
329
330
330
331 Check other fatelog implementations
331 Check other fatelog implementations
332 -----------------------------------
332 -----------------------------------
333
333
334 $ hg fatelogkw --hidden -q
334 $ hg fatelogkw --hidden -q
335 @ d004c8f274b9
335 @ d004c8f274b9
336 |
336 |
337 | x a468dc9b3633
337 | x a468dc9b3633
338 |/ Obsfate: rewritten using amend as 3:d004c8f274b9
338 |/ Obsfate: rewritten using amend as 3:d004c8f274b9
339 | x 471f378eab4c
339 | x 471f378eab4c
340 |/ Obsfate: rewritten using amend as 2:a468dc9b3633
340 |/ Obsfate: rewritten using amend as 2:a468dc9b3633
341 o ea207398892e
341 o ea207398892e
342
342
343 $ hg fatelogkw --hidden
343 $ hg fatelogkw --hidden
344 @ d004c8f274b9
344 @ d004c8f274b9
345 |
345 |
346 | x a468dc9b3633
346 | x a468dc9b3633
347 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2
347 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2
348 | x 471f378eab4c
348 | x 471f378eab4c
349 |/ Obsfate: rewritten using amend as 2:a468dc9b3633
349 |/ Obsfate: rewritten using amend as 2:a468dc9b3633
350 o ea207398892e
350 o ea207398892e
351
351
352 $ hg fatelogkw --hidden -v
352 $ hg fatelogkw --hidden -v
353 @ d004c8f274b9
353 @ d004c8f274b9
354 |
354 |
355 | x a468dc9b3633
355 | x a468dc9b3633
356 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000)
356 |/ Obsfate: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000)
357 | x 471f378eab4c
357 | x 471f378eab4c
358 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000)
358 |/ Obsfate: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000)
359 o ea207398892e
359 o ea207398892e
360
360
361
361
362 $ hg log -G -T "default" --hidden
362 $ hg log -G -T "default" --hidden
363 @ changeset: 3:d004c8f274b9
363 @ changeset: 3:d004c8f274b9
364 | tag: tip
364 | tag: tip
365 | parent: 0:ea207398892e
365 | parent: 0:ea207398892e
366 | user: test
366 | user: test
367 | date: Thu Jan 01 00:00:00 1970 +0000
367 | date: Thu Jan 01 00:00:00 1970 +0000
368 | summary: A2
368 | summary: A2
369 |
369 |
370 | x changeset: 2:a468dc9b3633
370 | x changeset: 2:a468dc9b3633
371 |/ parent: 0:ea207398892e
371 |/ parent: 0:ea207398892e
372 | user: test
372 | user: test
373 | date: Thu Jan 01 00:00:00 1970 +0000
373 | date: Thu Jan 01 00:00:00 1970 +0000
374 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2
374 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2
375 | summary: A1
375 | summary: A1
376 |
376 |
377 | x changeset: 1:471f378eab4c
377 | x changeset: 1:471f378eab4c
378 |/ user: test
378 |/ user: test
379 | date: Thu Jan 01 00:00:00 1970 +0000
379 | date: Thu Jan 01 00:00:00 1970 +0000
380 | obsolete: rewritten using amend as 2:a468dc9b3633
380 | obsolete: rewritten using amend as 2:a468dc9b3633
381 | summary: A0
381 | summary: A0
382 |
382 |
383 o changeset: 0:ea207398892e
383 o changeset: 0:ea207398892e
384 user: test
384 user: test
385 date: Thu Jan 01 00:00:00 1970 +0000
385 date: Thu Jan 01 00:00:00 1970 +0000
386 summary: ROOT
386 summary: ROOT
387
387
388 $ hg log -G -T "default" --hidden -v
388 $ hg log -G -T "default" --hidden -v
389 @ changeset: 3:d004c8f274b9
389 @ changeset: 3:d004c8f274b9
390 | tag: tip
390 | tag: tip
391 | parent: 0:ea207398892e
391 | parent: 0:ea207398892e
392 | user: test
392 | user: test
393 | date: Thu Jan 01 00:00:00 1970 +0000
393 | date: Thu Jan 01 00:00:00 1970 +0000
394 | files: A0
394 | files: A0
395 | description:
395 | description:
396 | A2
396 | A2
397 |
397 |
398 |
398 |
399 | x changeset: 2:a468dc9b3633
399 | x changeset: 2:a468dc9b3633
400 |/ parent: 0:ea207398892e
400 |/ parent: 0:ea207398892e
401 | user: test
401 | user: test
402 | date: Thu Jan 01 00:00:00 1970 +0000
402 | date: Thu Jan 01 00:00:00 1970 +0000
403 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000)
403 | obsolete: rewritten using amend as 3:d004c8f274b9 by test2 (at 2001-04-19 04:25 +0000)
404 | files: A0
404 | files: A0
405 | description:
405 | description:
406 | A1
406 | A1
407 |
407 |
408 |
408 |
409 | x changeset: 1:471f378eab4c
409 | x changeset: 1:471f378eab4c
410 |/ user: test
410 |/ user: test
411 | date: Thu Jan 01 00:00:00 1970 +0000
411 | date: Thu Jan 01 00:00:00 1970 +0000
412 | obsolete: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000)
412 | obsolete: rewritten using amend as 2:a468dc9b3633 by test (at 2009-02-13 23:31 +0000)
413 | files: A0
413 | files: A0
414 | description:
414 | description:
415 | A0
415 | A0
416 |
416 |
417 |
417 |
418 o changeset: 0:ea207398892e
418 o changeset: 0:ea207398892e
419 user: test
419 user: test
420 date: Thu Jan 01 00:00:00 1970 +0000
420 date: Thu Jan 01 00:00:00 1970 +0000
421 files: ROOT
421 files: ROOT
422 description:
422 description:
423 ROOT
423 ROOT
424
424
425
425
426 Test templates with splitted commit
426 Test templates with splitted commit
427 ===================================
427 ===================================
428
428
429 $ hg init $TESTTMP/templates-local-split
429 $ hg init $TESTTMP/templates-local-split
430 $ cd $TESTTMP/templates-local-split
430 $ cd $TESTTMP/templates-local-split
431 $ mkcommit ROOT
431 $ mkcommit ROOT
432 $ echo 42 >> a
432 $ echo 42 >> a
433 $ echo 43 >> b
433 $ echo 43 >> b
434 $ hg commit -A -m "A0"
434 $ hg commit -A -m "A0"
435 adding a
435 adding a
436 adding b
436 adding b
437 $ hg log --hidden -G
437 $ hg log --hidden -G
438 @ changeset: 1:471597cad322
438 @ changeset: 1:471597cad322
439 | tag: tip
439 | tag: tip
440 | user: test
440 | user: test
441 | date: Thu Jan 01 00:00:00 1970 +0000
441 | date: Thu Jan 01 00:00:00 1970 +0000
442 | summary: A0
442 | summary: A0
443 |
443 |
444 o changeset: 0:ea207398892e
444 o changeset: 0:ea207398892e
445 user: test
445 user: test
446 date: Thu Jan 01 00:00:00 1970 +0000
446 date: Thu Jan 01 00:00:00 1970 +0000
447 summary: ROOT
447 summary: ROOT
448
448
449 # Simulate split
449 # Simulate split
450 $ hg up -r "desc(ROOT)"
450 $ hg up -r "desc(ROOT)"
451 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
451 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
452 $ echo 42 >> a
452 $ echo 42 >> a
453 $ hg commit -A -m "A0"
453 $ hg commit -A -m "A0"
454 adding a
454 adding a
455 created new head
455 created new head
456 $ echo 43 >> b
456 $ echo 43 >> b
457 $ hg commit -A -m "A0"
457 $ hg commit -A -m "A0"
458 adding b
458 adding b
459 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
459 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
460 1 new obsolescence markers
460 1 new obsolescence markers
461 obsoleted 1 changesets
461 obsoleted 1 changesets
462
462
463 $ hg log --hidden -G
463 $ hg log --hidden -G
464 @ changeset: 3:f257fde29c7a
464 @ changeset: 3:f257fde29c7a
465 | tag: tip
465 | tag: tip
466 | user: test
466 | user: test
467 | date: Thu Jan 01 00:00:00 1970 +0000
467 | date: Thu Jan 01 00:00:00 1970 +0000
468 | summary: A0
468 | summary: A0
469 |
469 |
470 o changeset: 2:337fec4d2edc
470 o changeset: 2:337fec4d2edc
471 | parent: 0:ea207398892e
471 | parent: 0:ea207398892e
472 | user: test
472 | user: test
473 | date: Thu Jan 01 00:00:00 1970 +0000
473 | date: Thu Jan 01 00:00:00 1970 +0000
474 | summary: A0
474 | summary: A0
475 |
475 |
476 | x changeset: 1:471597cad322
476 | x changeset: 1:471597cad322
477 |/ user: test
477 |/ user: test
478 | date: Thu Jan 01 00:00:00 1970 +0000
478 | date: Thu Jan 01 00:00:00 1970 +0000
479 | obsolete: split as 2:337fec4d2edc, 3:f257fde29c7a
479 | obsolete: split as 2:337fec4d2edc, 3:f257fde29c7a
480 | summary: A0
480 | summary: A0
481 |
481 |
482 o changeset: 0:ea207398892e
482 o changeset: 0:ea207398892e
483 user: test
483 user: test
484 date: Thu Jan 01 00:00:00 1970 +0000
484 date: Thu Jan 01 00:00:00 1970 +0000
485 summary: ROOT
485 summary: ROOT
486
486
487 Check templates
487 Check templates
488 ---------------
488 ---------------
489
489
490 $ hg up 'obsolete()' --hidden
490 $ hg up 'obsolete()' --hidden
491 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
491 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
492 updated to hidden changeset 471597cad322
492 updated to hidden changeset 471597cad322
493 (hidden revision '471597cad322' was split as: 337fec4d2edc, f257fde29c7a)
493 (hidden revision '471597cad322' was split as: 337fec4d2edc, f257fde29c7a)
494
494
495 Predecessors template should show current revision as it is the working copy
495 Predecessors template should show current revision as it is the working copy
496 $ hg tlog
496 $ hg tlog
497 o f257fde29c7a
497 o f257fde29c7a
498 | Predecessors: 1:471597cad322
498 | Predecessors: 1:471597cad322
499 | semi-colon: 1:471597cad322
499 | semi-colon: 1:471597cad322
500 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
500 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
501 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
501 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
502 | Successors:
502 | Successors:
503 | multi-line:
503 | multi-line:
504 | json: []
504 | json: []
505 o 337fec4d2edc
505 o 337fec4d2edc
506 | Predecessors: 1:471597cad322
506 | Predecessors: 1:471597cad322
507 | semi-colon: 1:471597cad322
507 | semi-colon: 1:471597cad322
508 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
508 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
509 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
509 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
510 | Successors:
510 | Successors:
511 | multi-line:
511 | multi-line:
512 | json: []
512 | json: []
513 | @ 471597cad322
513 | @ 471597cad322
514 |/ Predecessors:
514 |/ Predecessors:
515 | semi-colon:
515 | semi-colon:
516 | json: []
516 | json: []
517 | map:
517 | map:
518 | Successors: 2:337fec4d2edc 3:f257fde29c7a
518 | Successors: 2:337fec4d2edc 3:f257fde29c7a
519 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
519 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
520 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
520 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
521 o ea207398892e
521 o ea207398892e
522 Predecessors:
522 Predecessors:
523 semi-colon:
523 semi-colon:
524 json: []
524 json: []
525 map:
525 map:
526 Successors:
526 Successors:
527 multi-line:
527 multi-line:
528 json: []
528 json: []
529
529
530 $ hg fatelog
530 $ hg fatelog
531 o f257fde29c7a
531 o f257fde29c7a
532 |
532 |
533 o 337fec4d2edc
533 o 337fec4d2edc
534 |
534 |
535 | @ 471597cad322
535 | @ 471597cad322
536 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
536 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
537 o ea207398892e
537 o ea207398892e
538
538
539 $ hg up f257fde29c7a
539 $ hg up f257fde29c7a
540 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
540 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
541
541
542 Predecessors template should not show a predecessor as it's not displayed in
542 Predecessors template should not show a predecessor as it's not displayed in
543 the log
543 the log
544 $ hg tlog
544 $ hg tlog
545 @ f257fde29c7a
545 @ f257fde29c7a
546 | Predecessors:
546 | Predecessors:
547 | semi-colon:
547 | semi-colon:
548 | json: []
548 | json: []
549 | map:
549 | map:
550 | Successors:
550 | Successors:
551 | multi-line:
551 | multi-line:
552 | json: []
552 | json: []
553 o 337fec4d2edc
553 o 337fec4d2edc
554 | Predecessors:
554 | Predecessors:
555 | semi-colon:
555 | semi-colon:
556 | json: []
556 | json: []
557 | map:
557 | map:
558 | Successors:
558 | Successors:
559 | multi-line:
559 | multi-line:
560 | json: []
560 | json: []
561 o ea207398892e
561 o ea207398892e
562 Predecessors:
562 Predecessors:
563 semi-colon:
563 semi-colon:
564 json: []
564 json: []
565 map:
565 map:
566 Successors:
566 Successors:
567 multi-line:
567 multi-line:
568 json: []
568 json: []
569
569
570 Predecessors template should show both predecessors as we force their display
570 Predecessors template should show both predecessors as we force their display
571 with --hidden
571 with --hidden
572 $ hg tlog --hidden
572 $ hg tlog --hidden
573 @ f257fde29c7a
573 @ f257fde29c7a
574 | Predecessors: 1:471597cad322
574 | Predecessors: 1:471597cad322
575 | semi-colon: 1:471597cad322
575 | semi-colon: 1:471597cad322
576 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
576 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
577 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
577 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
578 | Successors:
578 | Successors:
579 | multi-line:
579 | multi-line:
580 | json: []
580 | json: []
581 o 337fec4d2edc
581 o 337fec4d2edc
582 | Predecessors: 1:471597cad322
582 | Predecessors: 1:471597cad322
583 | semi-colon: 1:471597cad322
583 | semi-colon: 1:471597cad322
584 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
584 | json: ["471597cad322d1f659bb169751be9133dad92ef3"]
585 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
585 | map: 1:471597cad322d1f659bb169751be9133dad92ef3
586 | Successors:
586 | Successors:
587 | multi-line:
587 | multi-line:
588 | json: []
588 | json: []
589 | x 471597cad322
589 | x 471597cad322
590 |/ Predecessors:
590 |/ Predecessors:
591 | semi-colon:
591 | semi-colon:
592 | json: []
592 | json: []
593 | map:
593 | map:
594 | Successors: 2:337fec4d2edc 3:f257fde29c7a
594 | Successors: 2:337fec4d2edc 3:f257fde29c7a
595 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
595 | multi-line: 2:337fec4d2edc 3:f257fde29c7a
596 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
596 | json: [["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]]
597 o ea207398892e
597 o ea207398892e
598 Predecessors:
598 Predecessors:
599 semi-colon:
599 semi-colon:
600 json: []
600 json: []
601 map:
601 map:
602 Successors:
602 Successors:
603 multi-line:
603 multi-line:
604 json: []
604 json: []
605
605
606 $ hg fatelog --hidden
606 $ hg fatelog --hidden
607 @ f257fde29c7a
607 @ f257fde29c7a
608 |
608 |
609 o 337fec4d2edc
609 o 337fec4d2edc
610 |
610 |
611 | x 471597cad322
611 | x 471597cad322
612 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
612 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000);
613 o ea207398892e
613 o ea207398892e
614
614
615 $ hg fatelogjson --hidden
615 $ hg fatelogjson --hidden
616 @ f257fde29c7a
616 @ f257fde29c7a
617 |
617 |
618 o 337fec4d2edc
618 o 337fec4d2edc
619 |
619 |
620 | x 471597cad322
620 | x 471597cad322
621 |/ Obsfate: [{"markers": [["471597cad322d1f659bb169751be9133dad92ef3", ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]}]
621 |/ Obsfate: [{"markers": [["471597cad322d1f659bb169751be9133dad92ef3", ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["337fec4d2edcf0e7a467e35f818234bc620068b5", "f257fde29c7a847c9b607f6e958656d0df0fb15c"]}]
622 o ea207398892e
622 o ea207398892e
623
623
624 Check other fatelog implementations
624 Check other fatelog implementations
625 -----------------------------------
625 -----------------------------------
626
626
627 $ hg fatelogkw --hidden -q
627 $ hg fatelogkw --hidden -q
628 @ f257fde29c7a
628 @ f257fde29c7a
629 |
629 |
630 o 337fec4d2edc
630 o 337fec4d2edc
631 |
631 |
632 | x 471597cad322
632 | x 471597cad322
633 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a
633 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a
634 o ea207398892e
634 o ea207398892e
635
635
636 $ hg fatelogkw --hidden
636 $ hg fatelogkw --hidden
637 @ f257fde29c7a
637 @ f257fde29c7a
638 |
638 |
639 o 337fec4d2edc
639 o 337fec4d2edc
640 |
640 |
641 | x 471597cad322
641 | x 471597cad322
642 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a
642 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a
643 o ea207398892e
643 o ea207398892e
644
644
645 $ hg fatelogkw --hidden -v
645 $ hg fatelogkw --hidden -v
646 @ f257fde29c7a
646 @ f257fde29c7a
647 |
647 |
648 o 337fec4d2edc
648 o 337fec4d2edc
649 |
649 |
650 | x 471597cad322
650 | x 471597cad322
651 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000)
651 |/ Obsfate: split as 2:337fec4d2edc, 3:f257fde29c7a by test (at 1970-01-01 00:00 +0000)
652 o ea207398892e
652 o ea207398892e
653
653
654
654
655 $ hg log -G -T "default" --hidden
655 $ hg log -G -T "default" --hidden
656 @ changeset: 3:f257fde29c7a
656 @ changeset: 3:f257fde29c7a
657 | tag: tip
657 | tag: tip
658 | user: test
658 | user: test
659 | date: Thu Jan 01 00:00:00 1970 +0000
659 | date: Thu Jan 01 00:00:00 1970 +0000
660 | summary: A0
660 | summary: A0
661 |
661 |
662 o changeset: 2:337fec4d2edc
662 o changeset: 2:337fec4d2edc
663 | parent: 0:ea207398892e
663 | parent: 0:ea207398892e
664 | user: test
664 | user: test
665 | date: Thu Jan 01 00:00:00 1970 +0000
665 | date: Thu Jan 01 00:00:00 1970 +0000
666 | summary: A0
666 | summary: A0
667 |
667 |
668 | x changeset: 1:471597cad322
668 | x changeset: 1:471597cad322
669 |/ user: test
669 |/ user: test
670 | date: Thu Jan 01 00:00:00 1970 +0000
670 | date: Thu Jan 01 00:00:00 1970 +0000
671 | obsolete: split as 2:337fec4d2edc, 3:f257fde29c7a
671 | obsolete: split as 2:337fec4d2edc, 3:f257fde29c7a
672 | summary: A0
672 | summary: A0
673 |
673 |
674 o changeset: 0:ea207398892e
674 o changeset: 0:ea207398892e
675 user: test
675 user: test
676 date: Thu Jan 01 00:00:00 1970 +0000
676 date: Thu Jan 01 00:00:00 1970 +0000
677 summary: ROOT
677 summary: ROOT
678
678
679
679
680 Test templates with folded commit
680 Test templates with folded commit
681 =================================
681 =================================
682
682
683 Test setup
683 Test setup
684 ----------
684 ----------
685
685
686 $ hg init $TESTTMP/templates-local-fold
686 $ hg init $TESTTMP/templates-local-fold
687 $ cd $TESTTMP/templates-local-fold
687 $ cd $TESTTMP/templates-local-fold
688 $ mkcommit ROOT
688 $ mkcommit ROOT
689 $ mkcommit A0
689 $ mkcommit A0
690 $ mkcommit B0
690 $ mkcommit B0
691 $ hg log --hidden -G
691 $ hg log --hidden -G
692 @ changeset: 2:0dec01379d3b
692 @ changeset: 2:0dec01379d3b
693 | tag: tip
693 | tag: tip
694 | user: test
694 | user: test
695 | date: Thu Jan 01 00:00:00 1970 +0000
695 | date: Thu Jan 01 00:00:00 1970 +0000
696 | summary: B0
696 | summary: B0
697 |
697 |
698 o changeset: 1:471f378eab4c
698 o changeset: 1:471f378eab4c
699 | user: test
699 | user: test
700 | date: Thu Jan 01 00:00:00 1970 +0000
700 | date: Thu Jan 01 00:00:00 1970 +0000
701 | summary: A0
701 | summary: A0
702 |
702 |
703 o changeset: 0:ea207398892e
703 o changeset: 0:ea207398892e
704 user: test
704 user: test
705 date: Thu Jan 01 00:00:00 1970 +0000
705 date: Thu Jan 01 00:00:00 1970 +0000
706 summary: ROOT
706 summary: ROOT
707
707
708 Simulate a fold
708 Simulate a fold
709 $ hg up -r "desc(ROOT)"
709 $ hg up -r "desc(ROOT)"
710 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
710 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
711 $ echo "A0" > A0
711 $ echo "A0" > A0
712 $ echo "B0" > B0
712 $ echo "B0" > B0
713 $ hg commit -A -m "C0"
713 $ hg commit -A -m "C0"
714 adding A0
714 adding A0
715 adding B0
715 adding B0
716 created new head
716 created new head
717 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
717 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
718 1 new obsolescence markers
718 1 new obsolescence markers
719 obsoleted 1 changesets
719 obsoleted 1 changesets
720 1 new orphan changesets
720 1 new orphan changesets
721 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
721 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
722 1 new obsolescence markers
722 1 new obsolescence markers
723 obsoleted 1 changesets
723 obsoleted 1 changesets
724
724
725 $ hg log --hidden -G
725 $ hg log --hidden -G
726 @ changeset: 3:eb5a0daa2192
726 @ changeset: 3:eb5a0daa2192
727 | tag: tip
727 | tag: tip
728 | parent: 0:ea207398892e
728 | parent: 0:ea207398892e
729 | user: test
729 | user: test
730 | date: Thu Jan 01 00:00:00 1970 +0000
730 | date: Thu Jan 01 00:00:00 1970 +0000
731 | summary: C0
731 | summary: C0
732 |
732 |
733 | x changeset: 2:0dec01379d3b
733 | x changeset: 2:0dec01379d3b
734 | | user: test
734 | | user: test
735 | | date: Thu Jan 01 00:00:00 1970 +0000
735 | | date: Thu Jan 01 00:00:00 1970 +0000
736 | | obsolete: rewritten as 3:eb5a0daa2192
736 | | obsolete: rewritten as 3:eb5a0daa2192
737 | | summary: B0
737 | | summary: B0
738 | |
738 | |
739 | x changeset: 1:471f378eab4c
739 | x changeset: 1:471f378eab4c
740 |/ user: test
740 |/ user: test
741 | date: Thu Jan 01 00:00:00 1970 +0000
741 | date: Thu Jan 01 00:00:00 1970 +0000
742 | obsolete: rewritten as 3:eb5a0daa2192
742 | obsolete: rewritten as 3:eb5a0daa2192
743 | summary: A0
743 | summary: A0
744 |
744 |
745 o changeset: 0:ea207398892e
745 o changeset: 0:ea207398892e
746 user: test
746 user: test
747 date: Thu Jan 01 00:00:00 1970 +0000
747 date: Thu Jan 01 00:00:00 1970 +0000
748 summary: ROOT
748 summary: ROOT
749
749
750 Check templates
750 Check templates
751 ---------------
751 ---------------
752
752
753 $ hg up 'desc(A0)' --hidden
753 $ hg up 'desc(A0)' --hidden
754 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
754 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
755 updated to hidden changeset 471f378eab4c
755 updated to hidden changeset 471f378eab4c
756 (hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192)
756 (hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192)
757
757
758 Predecessors template should show current revision as it is the working copy
758 Predecessors template should show current revision as it is the working copy
759 $ hg tlog
759 $ hg tlog
760 o eb5a0daa2192
760 o eb5a0daa2192
761 | Predecessors: 1:471f378eab4c
761 | Predecessors: 1:471f378eab4c
762 | semi-colon: 1:471f378eab4c
762 | semi-colon: 1:471f378eab4c
763 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
763 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
764 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
764 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
765 | Successors:
765 | Successors:
766 | multi-line:
766 | multi-line:
767 | json: []
767 | json: []
768 | @ 471f378eab4c
768 | @ 471f378eab4c
769 |/ Predecessors:
769 |/ Predecessors:
770 | semi-colon:
770 | semi-colon:
771 | json: []
771 | json: []
772 | map:
772 | map:
773 | Successors: 3:eb5a0daa2192
773 | Successors: 3:eb5a0daa2192
774 | multi-line: 3:eb5a0daa2192
774 | multi-line: 3:eb5a0daa2192
775 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
775 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
776 o ea207398892e
776 o ea207398892e
777 Predecessors:
777 Predecessors:
778 semi-colon:
778 semi-colon:
779 json: []
779 json: []
780 map:
780 map:
781 Successors:
781 Successors:
782 multi-line:
782 multi-line:
783 json: []
783 json: []
784
784
785 $ hg fatelog
785 $ hg fatelog
786 o eb5a0daa2192
786 o eb5a0daa2192
787 |
787 |
788 | @ 471f378eab4c
788 | @ 471f378eab4c
789 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
789 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
790 o ea207398892e
790 o ea207398892e
791
791
792 $ hg up 'desc(B0)' --hidden
792 $ hg up 'desc(B0)' --hidden
793 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
793 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
794 updated to hidden changeset 0dec01379d3b
794 updated to hidden changeset 0dec01379d3b
795 (hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192)
795 (hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192)
796
796
797 Predecessors template should show both predecessors as they should be both
797 Predecessors template should show both predecessors as they should be both
798 displayed
798 displayed
799 $ hg tlog
799 $ hg tlog
800 o eb5a0daa2192
800 o eb5a0daa2192
801 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
801 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
802 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
802 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
803 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
803 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
804 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
804 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
805 | Successors:
805 | Successors:
806 | multi-line:
806 | multi-line:
807 | json: []
807 | json: []
808 | @ 0dec01379d3b
808 | @ 0dec01379d3b
809 | | Predecessors:
809 | | Predecessors:
810 | | semi-colon:
810 | | semi-colon:
811 | | json: []
811 | | json: []
812 | | map:
812 | | map:
813 | | Successors: 3:eb5a0daa2192
813 | | Successors: 3:eb5a0daa2192
814 | | multi-line: 3:eb5a0daa2192
814 | | multi-line: 3:eb5a0daa2192
815 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
815 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
816 | x 471f378eab4c
816 | x 471f378eab4c
817 |/ Predecessors:
817 |/ Predecessors:
818 | semi-colon:
818 | semi-colon:
819 | json: []
819 | json: []
820 | map:
820 | map:
821 | Successors: 3:eb5a0daa2192
821 | Successors: 3:eb5a0daa2192
822 | multi-line: 3:eb5a0daa2192
822 | multi-line: 3:eb5a0daa2192
823 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
823 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
824 o ea207398892e
824 o ea207398892e
825 Predecessors:
825 Predecessors:
826 semi-colon:
826 semi-colon:
827 json: []
827 json: []
828 map:
828 map:
829 Successors:
829 Successors:
830 multi-line:
830 multi-line:
831 json: []
831 json: []
832
832
833 $ hg fatelog
833 $ hg fatelog
834 o eb5a0daa2192
834 o eb5a0daa2192
835 |
835 |
836 | @ 0dec01379d3b
836 | @ 0dec01379d3b
837 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
837 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
838 | x 471f378eab4c
838 | x 471f378eab4c
839 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
839 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
840 o ea207398892e
840 o ea207398892e
841
841
842 $ hg up 'desc(C0)'
842 $ hg up 'desc(C0)'
843 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
843 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
844
844
845 Predecessors template should not show predecessors as they are not displayed in
845 Predecessors template should not show predecessors as they are not displayed in
846 the log
846 the log
847 $ hg tlog
847 $ hg tlog
848 @ eb5a0daa2192
848 @ eb5a0daa2192
849 | Predecessors:
849 | Predecessors:
850 | semi-colon:
850 | semi-colon:
851 | json: []
851 | json: []
852 | map:
852 | map:
853 | Successors:
853 | Successors:
854 | multi-line:
854 | multi-line:
855 | json: []
855 | json: []
856 o ea207398892e
856 o ea207398892e
857 Predecessors:
857 Predecessors:
858 semi-colon:
858 semi-colon:
859 json: []
859 json: []
860 map:
860 map:
861 Successors:
861 Successors:
862 multi-line:
862 multi-line:
863 json: []
863 json: []
864 Predecessors template should show both predecessors as we force their display
864 Predecessors template should show both predecessors as we force their display
865 with --hidden
865 with --hidden
866 $ hg tlog --hidden
866 $ hg tlog --hidden
867 @ eb5a0daa2192
867 @ eb5a0daa2192
868 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
868 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
869 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
869 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
870 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
870 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
871 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
871 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
872 | Successors:
872 | Successors:
873 | multi-line:
873 | multi-line:
874 | json: []
874 | json: []
875 | x 0dec01379d3b
875 | x 0dec01379d3b
876 | | Predecessors:
876 | | Predecessors:
877 | | semi-colon:
877 | | semi-colon:
878 | | json: []
878 | | json: []
879 | | map:
879 | | map:
880 | | Successors: 3:eb5a0daa2192
880 | | Successors: 3:eb5a0daa2192
881 | | multi-line: 3:eb5a0daa2192
881 | | multi-line: 3:eb5a0daa2192
882 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
882 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
883 | x 471f378eab4c
883 | x 471f378eab4c
884 |/ Predecessors:
884 |/ Predecessors:
885 | semi-colon:
885 | semi-colon:
886 | json: []
886 | json: []
887 | map:
887 | map:
888 | Successors: 3:eb5a0daa2192
888 | Successors: 3:eb5a0daa2192
889 | multi-line: 3:eb5a0daa2192
889 | multi-line: 3:eb5a0daa2192
890 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
890 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
891 o ea207398892e
891 o ea207398892e
892 Predecessors:
892 Predecessors:
893 semi-colon:
893 semi-colon:
894 json: []
894 json: []
895 map:
895 map:
896 Successors:
896 Successors:
897 multi-line:
897 multi-line:
898 json: []
898 json: []
899
899
900 $ hg fatelog --hidden
900 $ hg fatelog --hidden
901 @ eb5a0daa2192
901 @ eb5a0daa2192
902 |
902 |
903 | x 0dec01379d3b
903 | x 0dec01379d3b
904 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
904 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
905 | x 471f378eab4c
905 | x 471f378eab4c
906 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
906 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
907 o ea207398892e
907 o ea207398892e
908
908
909
909
910 $ hg fatelogjson --hidden
910 $ hg fatelogjson --hidden
911 @ eb5a0daa2192
911 @ eb5a0daa2192
912 |
912 |
913 | x 0dec01379d3b
913 | x 0dec01379d3b
914 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
914 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
915 | x 471f378eab4c
915 | x 471f378eab4c
916 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
916 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
917 o ea207398892e
917 o ea207398892e
918
918
919 Check other fatelog implementations
919 Check other fatelog implementations
920 -----------------------------------
920 -----------------------------------
921
921
922 $ hg fatelogkw --hidden -q
922 $ hg fatelogkw --hidden -q
923 @ eb5a0daa2192
923 @ eb5a0daa2192
924 |
924 |
925 | x 0dec01379d3b
925 | x 0dec01379d3b
926 | | Obsfate: rewritten as 3:eb5a0daa2192
926 | | Obsfate: rewritten as 3:eb5a0daa2192
927 | x 471f378eab4c
927 | x 471f378eab4c
928 |/ Obsfate: rewritten as 3:eb5a0daa2192
928 |/ Obsfate: rewritten as 3:eb5a0daa2192
929 o ea207398892e
929 o ea207398892e
930
930
931 $ hg fatelogkw --hidden
931 $ hg fatelogkw --hidden
932 @ eb5a0daa2192
932 @ eb5a0daa2192
933 |
933 |
934 | x 0dec01379d3b
934 | x 0dec01379d3b
935 | | Obsfate: rewritten as 3:eb5a0daa2192
935 | | Obsfate: rewritten as 3:eb5a0daa2192
936 | x 471f378eab4c
936 | x 471f378eab4c
937 |/ Obsfate: rewritten as 3:eb5a0daa2192
937 |/ Obsfate: rewritten as 3:eb5a0daa2192
938 o ea207398892e
938 o ea207398892e
939
939
940 $ hg fatelogkw --hidden -v
940 $ hg fatelogkw --hidden -v
941 @ eb5a0daa2192
941 @ eb5a0daa2192
942 |
942 |
943 | x 0dec01379d3b
943 | x 0dec01379d3b
944 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
944 | | Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
945 | x 471f378eab4c
945 | x 471f378eab4c
946 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
946 |/ Obsfate: rewritten as 3:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
947 o ea207398892e
947 o ea207398892e
948
948
949 $ hg log -G -T "default" --hidden
949 $ hg log -G -T "default" --hidden
950 @ changeset: 3:eb5a0daa2192
950 @ changeset: 3:eb5a0daa2192
951 | tag: tip
951 | tag: tip
952 | parent: 0:ea207398892e
952 | parent: 0:ea207398892e
953 | user: test
953 | user: test
954 | date: Thu Jan 01 00:00:00 1970 +0000
954 | date: Thu Jan 01 00:00:00 1970 +0000
955 | summary: C0
955 | summary: C0
956 |
956 |
957 | x changeset: 2:0dec01379d3b
957 | x changeset: 2:0dec01379d3b
958 | | user: test
958 | | user: test
959 | | date: Thu Jan 01 00:00:00 1970 +0000
959 | | date: Thu Jan 01 00:00:00 1970 +0000
960 | | obsolete: rewritten as 3:eb5a0daa2192
960 | | obsolete: rewritten as 3:eb5a0daa2192
961 | | summary: B0
961 | | summary: B0
962 | |
962 | |
963 | x changeset: 1:471f378eab4c
963 | x changeset: 1:471f378eab4c
964 |/ user: test
964 |/ user: test
965 | date: Thu Jan 01 00:00:00 1970 +0000
965 | date: Thu Jan 01 00:00:00 1970 +0000
966 | obsolete: rewritten as 3:eb5a0daa2192
966 | obsolete: rewritten as 3:eb5a0daa2192
967 | summary: A0
967 | summary: A0
968 |
968 |
969 o changeset: 0:ea207398892e
969 o changeset: 0:ea207398892e
970 user: test
970 user: test
971 date: Thu Jan 01 00:00:00 1970 +0000
971 date: Thu Jan 01 00:00:00 1970 +0000
972 summary: ROOT
972 summary: ROOT
973
973
974
974
975 Test templates with divergence
975 Test templates with divergence
976 ==============================
976 ==============================
977
977
978 Test setup
978 Test setup
979 ----------
979 ----------
980
980
981 $ hg init $TESTTMP/templates-local-divergence
981 $ hg init $TESTTMP/templates-local-divergence
982 $ cd $TESTTMP/templates-local-divergence
982 $ cd $TESTTMP/templates-local-divergence
983 $ mkcommit ROOT
983 $ mkcommit ROOT
984 $ mkcommit A0
984 $ mkcommit A0
985 $ hg commit --amend -m "A1"
985 $ hg commit --amend -m "A1"
986 $ hg log --hidden -G
986 $ hg log --hidden -G
987 @ changeset: 2:fdf9bde5129a
987 @ changeset: 2:fdf9bde5129a
988 | tag: tip
988 | tag: tip
989 | parent: 0:ea207398892e
989 | parent: 0:ea207398892e
990 | user: test
990 | user: test
991 | date: Thu Jan 01 00:00:00 1970 +0000
991 | date: Thu Jan 01 00:00:00 1970 +0000
992 | summary: A1
992 | summary: A1
993 |
993 |
994 | x changeset: 1:471f378eab4c
994 | x changeset: 1:471f378eab4c
995 |/ user: test
995 |/ user: test
996 | date: Thu Jan 01 00:00:00 1970 +0000
996 | date: Thu Jan 01 00:00:00 1970 +0000
997 | obsolete: rewritten using amend as 2:fdf9bde5129a
997 | obsolete: rewritten using amend as 2:fdf9bde5129a
998 | summary: A0
998 | summary: A0
999 |
999 |
1000 o changeset: 0:ea207398892e
1000 o changeset: 0:ea207398892e
1001 user: test
1001 user: test
1002 date: Thu Jan 01 00:00:00 1970 +0000
1002 date: Thu Jan 01 00:00:00 1970 +0000
1003 summary: ROOT
1003 summary: ROOT
1004
1004
1005 $ hg update --hidden 'desc(A0)'
1005 $ hg update --hidden 'desc(A0)'
1006 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1006 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1007 updated to hidden changeset 471f378eab4c
1007 updated to hidden changeset 471f378eab4c
1008 (hidden revision '471f378eab4c' was rewritten as: fdf9bde5129a)
1008 (hidden revision '471f378eab4c' was rewritten as: fdf9bde5129a)
1009 $ hg commit --amend -m "A2"
1009 $ hg commit --amend -m "A2"
1010 2 new content-divergent changesets
1010 2 new content-divergent changesets
1011 $ hg log --hidden -G
1011 $ hg log --hidden -G
1012 @ changeset: 3:65b757b745b9
1012 @ changeset: 3:65b757b745b9
1013 | tag: tip
1013 | tag: tip
1014 | parent: 0:ea207398892e
1014 | parent: 0:ea207398892e
1015 | user: test
1015 | user: test
1016 | date: Thu Jan 01 00:00:00 1970 +0000
1016 | date: Thu Jan 01 00:00:00 1970 +0000
1017 | instability: content-divergent
1017 | instability: content-divergent
1018 | summary: A2
1018 | summary: A2
1019 |
1019 |
1020 | * changeset: 2:fdf9bde5129a
1020 | * changeset: 2:fdf9bde5129a
1021 |/ parent: 0:ea207398892e
1021 |/ parent: 0:ea207398892e
1022 | user: test
1022 | user: test
1023 | date: Thu Jan 01 00:00:00 1970 +0000
1023 | date: Thu Jan 01 00:00:00 1970 +0000
1024 | instability: content-divergent
1024 | instability: content-divergent
1025 | summary: A1
1025 | summary: A1
1026 |
1026 |
1027 | x changeset: 1:471f378eab4c
1027 | x changeset: 1:471f378eab4c
1028 |/ user: test
1028 |/ user: test
1029 | date: Thu Jan 01 00:00:00 1970 +0000
1029 | date: Thu Jan 01 00:00:00 1970 +0000
1030 | obsolete: rewritten using amend as 2:fdf9bde5129a
1030 | obsolete: rewritten using amend as 2:fdf9bde5129a
1031 | obsolete: rewritten using amend as 3:65b757b745b9
1031 | obsolete: rewritten using amend as 3:65b757b745b9
1032 | summary: A0
1032 | summary: A0
1033 |
1033 |
1034 o changeset: 0:ea207398892e
1034 o changeset: 0:ea207398892e
1035 user: test
1035 user: test
1036 date: Thu Jan 01 00:00:00 1970 +0000
1036 date: Thu Jan 01 00:00:00 1970 +0000
1037 summary: ROOT
1037 summary: ROOT
1038
1038
1039 $ hg commit --amend -m 'A3'
1039 $ hg commit --amend -m 'A3'
1040 $ hg log --hidden -G
1040 $ hg log --hidden -G
1041 @ changeset: 4:019fadeab383
1041 @ changeset: 4:019fadeab383
1042 | tag: tip
1042 | tag: tip
1043 | parent: 0:ea207398892e
1043 | parent: 0:ea207398892e
1044 | user: test
1044 | user: test
1045 | date: Thu Jan 01 00:00:00 1970 +0000
1045 | date: Thu Jan 01 00:00:00 1970 +0000
1046 | instability: content-divergent
1046 | instability: content-divergent
1047 | summary: A3
1047 | summary: A3
1048 |
1048 |
1049 | x changeset: 3:65b757b745b9
1049 | x changeset: 3:65b757b745b9
1050 |/ parent: 0:ea207398892e
1050 |/ parent: 0:ea207398892e
1051 | user: test
1051 | user: test
1052 | date: Thu Jan 01 00:00:00 1970 +0000
1052 | date: Thu Jan 01 00:00:00 1970 +0000
1053 | obsolete: rewritten using amend as 4:019fadeab383
1053 | obsolete: rewritten using amend as 4:019fadeab383
1054 | summary: A2
1054 | summary: A2
1055 |
1055 |
1056 | * changeset: 2:fdf9bde5129a
1056 | * changeset: 2:fdf9bde5129a
1057 |/ parent: 0:ea207398892e
1057 |/ parent: 0:ea207398892e
1058 | user: test
1058 | user: test
1059 | date: Thu Jan 01 00:00:00 1970 +0000
1059 | date: Thu Jan 01 00:00:00 1970 +0000
1060 | instability: content-divergent
1060 | instability: content-divergent
1061 | summary: A1
1061 | summary: A1
1062 |
1062 |
1063 | x changeset: 1:471f378eab4c
1063 | x changeset: 1:471f378eab4c
1064 |/ user: test
1064 |/ user: test
1065 | date: Thu Jan 01 00:00:00 1970 +0000
1065 | date: Thu Jan 01 00:00:00 1970 +0000
1066 | obsolete: rewritten using amend as 2:fdf9bde5129a
1066 | obsolete: rewritten using amend as 2:fdf9bde5129a
1067 | obsolete: rewritten using amend as 3:65b757b745b9
1067 | obsolete: rewritten using amend as 3:65b757b745b9
1068 | summary: A0
1068 | summary: A0
1069 |
1069 |
1070 o changeset: 0:ea207398892e
1070 o changeset: 0:ea207398892e
1071 user: test
1071 user: test
1072 date: Thu Jan 01 00:00:00 1970 +0000
1072 date: Thu Jan 01 00:00:00 1970 +0000
1073 summary: ROOT
1073 summary: ROOT
1074
1074
1075
1075
1076 Check templates
1076 Check templates
1077 ---------------
1077 ---------------
1078
1078
1079 $ hg up 'desc(A0)' --hidden
1079 $ hg up 'desc(A0)' --hidden
1080 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1080 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1081 updated to hidden changeset 471f378eab4c
1081 updated to hidden changeset 471f378eab4c
1082 (hidden revision '471f378eab4c' has diverged)
1082 (hidden revision '471f378eab4c' has diverged)
1083
1083
1084 Predecessors template should show current revision as it is the working copy
1084 Predecessors template should show current revision as it is the working copy
1085 $ hg tlog
1085 $ hg tlog
1086 * 019fadeab383
1086 * 019fadeab383
1087 | Predecessors: 1:471f378eab4c
1087 | Predecessors: 1:471f378eab4c
1088 | semi-colon: 1:471f378eab4c
1088 | semi-colon: 1:471f378eab4c
1089 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1089 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1090 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1090 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1091 | Successors:
1091 | Successors:
1092 | multi-line:
1092 | multi-line:
1093 | json: []
1093 | json: []
1094 | * fdf9bde5129a
1094 | * fdf9bde5129a
1095 |/ Predecessors: 1:471f378eab4c
1095 |/ Predecessors: 1:471f378eab4c
1096 | semi-colon: 1:471f378eab4c
1096 | semi-colon: 1:471f378eab4c
1097 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1097 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1098 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1098 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1099 | Successors:
1099 | Successors:
1100 | multi-line:
1100 | multi-line:
1101 | json: []
1101 | json: []
1102 | @ 471f378eab4c
1102 | @ 471f378eab4c
1103 |/ Predecessors:
1103 |/ Predecessors:
1104 | semi-colon:
1104 | semi-colon:
1105 | json: []
1105 | json: []
1106 | map:
1106 | map:
1107 | Successors: 2:fdf9bde5129a; 4:019fadeab383
1107 | Successors: 2:fdf9bde5129a; 4:019fadeab383
1108 | multi-line: 2:fdf9bde5129a
1108 | multi-line: 2:fdf9bde5129a
1109 | multi-line: 4:019fadeab383
1109 | multi-line: 4:019fadeab383
1110 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
1110 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
1111 o ea207398892e
1111 o ea207398892e
1112 Predecessors:
1112 Predecessors:
1113 semi-colon:
1113 semi-colon:
1114 json: []
1114 json: []
1115 map:
1115 map:
1116 Successors:
1116 Successors:
1117 multi-line:
1117 multi-line:
1118 json: []
1118 json: []
1119 $ hg fatelog
1119 $ hg fatelog
1120 * 019fadeab383
1120 * 019fadeab383
1121 |
1121 |
1122 | * fdf9bde5129a
1122 | * fdf9bde5129a
1123 |/
1123 |/
1124 | @ 471f378eab4c
1124 | @ 471f378eab4c
1125 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
1125 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
1126 o ea207398892e
1126 o ea207398892e
1127
1127
1128 $ hg up 'desc(A1)'
1128 $ hg up 'desc(A1)'
1129 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1129 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1130
1130
1131 Predecessors template should not show predecessors as they are not displayed in
1131 Predecessors template should not show predecessors as they are not displayed in
1132 the log
1132 the log
1133 $ hg tlog
1133 $ hg tlog
1134 * 019fadeab383
1134 * 019fadeab383
1135 | Predecessors:
1135 | Predecessors:
1136 | semi-colon:
1136 | semi-colon:
1137 | json: []
1137 | json: []
1138 | map:
1138 | map:
1139 | Successors:
1139 | Successors:
1140 | multi-line:
1140 | multi-line:
1141 | json: []
1141 | json: []
1142 | @ fdf9bde5129a
1142 | @ fdf9bde5129a
1143 |/ Predecessors:
1143 |/ Predecessors:
1144 | semi-colon:
1144 | semi-colon:
1145 | json: []
1145 | json: []
1146 | map:
1146 | map:
1147 | Successors:
1147 | Successors:
1148 | multi-line:
1148 | multi-line:
1149 | json: []
1149 | json: []
1150 o ea207398892e
1150 o ea207398892e
1151 Predecessors:
1151 Predecessors:
1152 semi-colon:
1152 semi-colon:
1153 json: []
1153 json: []
1154 map:
1154 map:
1155 Successors:
1155 Successors:
1156 multi-line:
1156 multi-line:
1157 json: []
1157 json: []
1158
1158
1159 $ hg fatelog
1159 $ hg fatelog
1160 * 019fadeab383
1160 * 019fadeab383
1161 |
1161 |
1162 | @ fdf9bde5129a
1162 | @ fdf9bde5129a
1163 |/
1163 |/
1164 o ea207398892e
1164 o ea207398892e
1165
1165
1166 Predecessors template should the predecessors as we force their display with
1166 Predecessors template should the predecessors as we force their display with
1167 --hidden
1167 --hidden
1168 $ hg tlog --hidden
1168 $ hg tlog --hidden
1169 * 019fadeab383
1169 * 019fadeab383
1170 | Predecessors: 3:65b757b745b9
1170 | Predecessors: 3:65b757b745b9
1171 | semi-colon: 3:65b757b745b9
1171 | semi-colon: 3:65b757b745b9
1172 | json: ["65b757b745b935093c87a2bccd877521cccffcbd"]
1172 | json: ["65b757b745b935093c87a2bccd877521cccffcbd"]
1173 | map: 3:65b757b745b935093c87a2bccd877521cccffcbd
1173 | map: 3:65b757b745b935093c87a2bccd877521cccffcbd
1174 | Successors:
1174 | Successors:
1175 | multi-line:
1175 | multi-line:
1176 | json: []
1176 | json: []
1177 | x 65b757b745b9
1177 | x 65b757b745b9
1178 |/ Predecessors: 1:471f378eab4c
1178 |/ Predecessors: 1:471f378eab4c
1179 | semi-colon: 1:471f378eab4c
1179 | semi-colon: 1:471f378eab4c
1180 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1180 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1181 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1181 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1182 | Successors: 4:019fadeab383
1182 | Successors: 4:019fadeab383
1183 | multi-line: 4:019fadeab383
1183 | multi-line: 4:019fadeab383
1184 | json: [["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
1184 | json: [["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]]
1185 | @ fdf9bde5129a
1185 | @ fdf9bde5129a
1186 |/ Predecessors: 1:471f378eab4c
1186 |/ Predecessors: 1:471f378eab4c
1187 | semi-colon: 1:471f378eab4c
1187 | semi-colon: 1:471f378eab4c
1188 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1188 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1189 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1189 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1190 | Successors:
1190 | Successors:
1191 | multi-line:
1191 | multi-line:
1192 | json: []
1192 | json: []
1193 | x 471f378eab4c
1193 | x 471f378eab4c
1194 |/ Predecessors:
1194 |/ Predecessors:
1195 | semi-colon:
1195 | semi-colon:
1196 | json: []
1196 | json: []
1197 | map:
1197 | map:
1198 | Successors: 2:fdf9bde5129a; 3:65b757b745b9
1198 | Successors: 2:fdf9bde5129a; 3:65b757b745b9
1199 | multi-line: 2:fdf9bde5129a
1199 | multi-line: 2:fdf9bde5129a
1200 | multi-line: 3:65b757b745b9
1200 | multi-line: 3:65b757b745b9
1201 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["65b757b745b935093c87a2bccd877521cccffcbd"]]
1201 | json: [["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], ["65b757b745b935093c87a2bccd877521cccffcbd"]]
1202 o ea207398892e
1202 o ea207398892e
1203 Predecessors:
1203 Predecessors:
1204 semi-colon:
1204 semi-colon:
1205 json: []
1205 json: []
1206 map:
1206 map:
1207 Successors:
1207 Successors:
1208 multi-line:
1208 multi-line:
1209 json: []
1209 json: []
1210
1210
1211 $ hg fatelog --hidden
1211 $ hg fatelog --hidden
1212 * 019fadeab383
1212 * 019fadeab383
1213 |
1213 |
1214 | x 65b757b745b9
1214 | x 65b757b745b9
1215 |/ Obsfate: rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
1215 |/ Obsfate: rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000);
1216 | @ fdf9bde5129a
1216 | @ fdf9bde5129a
1217 |/
1217 |/
1218 | x 471f378eab4c
1218 | x 471f378eab4c
1219 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
1219 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
1220 o ea207398892e
1220 o ea207398892e
1221
1221
1222
1222
1223 $ hg fatelogjson --hidden
1223 $ hg fatelogjson --hidden
1224 * 019fadeab383
1224 * 019fadeab383
1225 |
1225 |
1226 | x 65b757b745b9
1226 | x 65b757b745b9
1227 |/ Obsfate: [{"markers": [["65b757b745b935093c87a2bccd877521cccffcbd", ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]}]
1227 |/ Obsfate: [{"markers": [["65b757b745b935093c87a2bccd877521cccffcbd", ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["019fadeab383f6699fa83ad7bdb4d82ed2c0e5ab"]}]
1228 | @ fdf9bde5129a
1228 | @ fdf9bde5129a
1229 |/
1229 |/
1230 | x 471f378eab4c
1230 | x 471f378eab4c
1231 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"]}, {"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["65b757b745b935093c87a2bccd877521cccffcbd"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["65b757b745b935093c87a2bccd877521cccffcbd"]}]
1231 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e"]}, {"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["65b757b745b935093c87a2bccd877521cccffcbd"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["65b757b745b935093c87a2bccd877521cccffcbd"]}]
1232 o ea207398892e
1232 o ea207398892e
1233
1233
1234
1234
1235 Check other fatelog implementations
1235 Check other fatelog implementations
1236 -----------------------------------
1236 -----------------------------------
1237
1237
1238 $ hg fatelogkw --hidden -q
1238 $ hg fatelogkw --hidden -q
1239 * 019fadeab383
1239 * 019fadeab383
1240 |
1240 |
1241 | x 65b757b745b9
1241 | x 65b757b745b9
1242 |/ Obsfate: rewritten using amend as 4:019fadeab383
1242 |/ Obsfate: rewritten using amend as 4:019fadeab383
1243 | @ fdf9bde5129a
1243 | @ fdf9bde5129a
1244 |/
1244 |/
1245 | x 471f378eab4c
1245 | x 471f378eab4c
1246 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
1246 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
1247 | Obsfate: rewritten using amend as 3:65b757b745b9
1247 | Obsfate: rewritten using amend as 3:65b757b745b9
1248 o ea207398892e
1248 o ea207398892e
1249
1249
1250 $ hg fatelogkw --hidden
1250 $ hg fatelogkw --hidden
1251 * 019fadeab383
1251 * 019fadeab383
1252 |
1252 |
1253 | x 65b757b745b9
1253 | x 65b757b745b9
1254 |/ Obsfate: rewritten using amend as 4:019fadeab383
1254 |/ Obsfate: rewritten using amend as 4:019fadeab383
1255 | @ fdf9bde5129a
1255 | @ fdf9bde5129a
1256 |/
1256 |/
1257 | x 471f378eab4c
1257 | x 471f378eab4c
1258 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
1258 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
1259 | Obsfate: rewritten using amend as 3:65b757b745b9
1259 | Obsfate: rewritten using amend as 3:65b757b745b9
1260 o ea207398892e
1260 o ea207398892e
1261
1261
1262 $ hg fatelogkw --hidden -v
1262 $ hg fatelogkw --hidden -v
1263 * 019fadeab383
1263 * 019fadeab383
1264 |
1264 |
1265 | x 65b757b745b9
1265 | x 65b757b745b9
1266 |/ Obsfate: rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000)
1266 |/ Obsfate: rewritten using amend as 4:019fadeab383 by test (at 1970-01-01 00:00 +0000)
1267 | @ fdf9bde5129a
1267 | @ fdf9bde5129a
1268 |/
1268 |/
1269 | x 471f378eab4c
1269 | x 471f378eab4c
1270 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000)
1270 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000)
1271 | Obsfate: rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000)
1271 | Obsfate: rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000)
1272 o ea207398892e
1272 o ea207398892e
1273
1273
1274 $ hg log -G -T "default" --hidden
1274 $ hg log -G -T "default" --hidden
1275 * changeset: 4:019fadeab383
1275 * changeset: 4:019fadeab383
1276 | tag: tip
1276 | tag: tip
1277 | parent: 0:ea207398892e
1277 | parent: 0:ea207398892e
1278 | user: test
1278 | user: test
1279 | date: Thu Jan 01 00:00:00 1970 +0000
1279 | date: Thu Jan 01 00:00:00 1970 +0000
1280 | instability: content-divergent
1280 | instability: content-divergent
1281 | summary: A3
1281 | summary: A3
1282 |
1282 |
1283 | x changeset: 3:65b757b745b9
1283 | x changeset: 3:65b757b745b9
1284 |/ parent: 0:ea207398892e
1284 |/ parent: 0:ea207398892e
1285 | user: test
1285 | user: test
1286 | date: Thu Jan 01 00:00:00 1970 +0000
1286 | date: Thu Jan 01 00:00:00 1970 +0000
1287 | obsolete: rewritten using amend as 4:019fadeab383
1287 | obsolete: rewritten using amend as 4:019fadeab383
1288 | summary: A2
1288 | summary: A2
1289 |
1289 |
1290 | @ changeset: 2:fdf9bde5129a
1290 | @ changeset: 2:fdf9bde5129a
1291 |/ parent: 0:ea207398892e
1291 |/ parent: 0:ea207398892e
1292 | user: test
1292 | user: test
1293 | date: Thu Jan 01 00:00:00 1970 +0000
1293 | date: Thu Jan 01 00:00:00 1970 +0000
1294 | instability: content-divergent
1294 | instability: content-divergent
1295 | summary: A1
1295 | summary: A1
1296 |
1296 |
1297 | x changeset: 1:471f378eab4c
1297 | x changeset: 1:471f378eab4c
1298 |/ user: test
1298 |/ user: test
1299 | date: Thu Jan 01 00:00:00 1970 +0000
1299 | date: Thu Jan 01 00:00:00 1970 +0000
1300 | obsolete: rewritten using amend as 2:fdf9bde5129a
1300 | obsolete: rewritten using amend as 2:fdf9bde5129a
1301 | obsolete: rewritten using amend as 3:65b757b745b9
1301 | obsolete: rewritten using amend as 3:65b757b745b9
1302 | summary: A0
1302 | summary: A0
1303 |
1303 |
1304 o changeset: 0:ea207398892e
1304 o changeset: 0:ea207398892e
1305 user: test
1305 user: test
1306 date: Thu Jan 01 00:00:00 1970 +0000
1306 date: Thu Jan 01 00:00:00 1970 +0000
1307 summary: ROOT
1307 summary: ROOT
1308
1308
1309
1309
1310 Test templates with amended + folded commit
1310 Test templates with amended + folded commit
1311 ===========================================
1311 ===========================================
1312
1312
1313 Test setup
1313 Test setup
1314 ----------
1314 ----------
1315
1315
1316 $ hg init $TESTTMP/templates-local-amend-fold
1316 $ hg init $TESTTMP/templates-local-amend-fold
1317 $ cd $TESTTMP/templates-local-amend-fold
1317 $ cd $TESTTMP/templates-local-amend-fold
1318 $ mkcommit ROOT
1318 $ mkcommit ROOT
1319 $ mkcommit A0
1319 $ mkcommit A0
1320 $ mkcommit B0
1320 $ mkcommit B0
1321 $ hg commit --amend -m "B1"
1321 $ hg commit --amend -m "B1"
1322 $ hg log --hidden -G
1322 $ hg log --hidden -G
1323 @ changeset: 3:b7ea6d14e664
1323 @ changeset: 3:b7ea6d14e664
1324 | tag: tip
1324 | tag: tip
1325 | parent: 1:471f378eab4c
1325 | parent: 1:471f378eab4c
1326 | user: test
1326 | user: test
1327 | date: Thu Jan 01 00:00:00 1970 +0000
1327 | date: Thu Jan 01 00:00:00 1970 +0000
1328 | summary: B1
1328 | summary: B1
1329 |
1329 |
1330 | x changeset: 2:0dec01379d3b
1330 | x changeset: 2:0dec01379d3b
1331 |/ user: test
1331 |/ user: test
1332 | date: Thu Jan 01 00:00:00 1970 +0000
1332 | date: Thu Jan 01 00:00:00 1970 +0000
1333 | obsolete: rewritten using amend as 3:b7ea6d14e664
1333 | obsolete: rewritten using amend as 3:b7ea6d14e664
1334 | summary: B0
1334 | summary: B0
1335 |
1335 |
1336 o changeset: 1:471f378eab4c
1336 o changeset: 1:471f378eab4c
1337 | user: test
1337 | user: test
1338 | date: Thu Jan 01 00:00:00 1970 +0000
1338 | date: Thu Jan 01 00:00:00 1970 +0000
1339 | summary: A0
1339 | summary: A0
1340 |
1340 |
1341 o changeset: 0:ea207398892e
1341 o changeset: 0:ea207398892e
1342 user: test
1342 user: test
1343 date: Thu Jan 01 00:00:00 1970 +0000
1343 date: Thu Jan 01 00:00:00 1970 +0000
1344 summary: ROOT
1344 summary: ROOT
1345
1345
1346 # Simulate a fold
1346 # Simulate a fold
1347 $ hg up -r "desc(ROOT)"
1347 $ hg up -r "desc(ROOT)"
1348 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1348 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1349 $ echo "A0" > A0
1349 $ echo "A0" > A0
1350 $ echo "B0" > B0
1350 $ echo "B0" > B0
1351 $ hg commit -A -m "C0"
1351 $ hg commit -A -m "C0"
1352 adding A0
1352 adding A0
1353 adding B0
1353 adding B0
1354 created new head
1354 created new head
1355 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
1355 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(C0)"`
1356 1 new obsolescence markers
1356 1 new obsolescence markers
1357 obsoleted 1 changesets
1357 obsoleted 1 changesets
1358 1 new orphan changesets
1358 1 new orphan changesets
1359 $ hg debugobsolete `getid "desc(B1)"` `getid "desc(C0)"`
1359 $ hg debugobsolete `getid "desc(B1)"` `getid "desc(C0)"`
1360 1 new obsolescence markers
1360 1 new obsolescence markers
1361 obsoleted 1 changesets
1361 obsoleted 1 changesets
1362
1362
1363 $ hg log --hidden -G
1363 $ hg log --hidden -G
1364 @ changeset: 4:eb5a0daa2192
1364 @ changeset: 4:eb5a0daa2192
1365 | tag: tip
1365 | tag: tip
1366 | parent: 0:ea207398892e
1366 | parent: 0:ea207398892e
1367 | user: test
1367 | user: test
1368 | date: Thu Jan 01 00:00:00 1970 +0000
1368 | date: Thu Jan 01 00:00:00 1970 +0000
1369 | summary: C0
1369 | summary: C0
1370 |
1370 |
1371 | x changeset: 3:b7ea6d14e664
1371 | x changeset: 3:b7ea6d14e664
1372 | | parent: 1:471f378eab4c
1372 | | parent: 1:471f378eab4c
1373 | | user: test
1373 | | user: test
1374 | | date: Thu Jan 01 00:00:00 1970 +0000
1374 | | date: Thu Jan 01 00:00:00 1970 +0000
1375 | | obsolete: rewritten as 4:eb5a0daa2192
1375 | | obsolete: rewritten as 4:eb5a0daa2192
1376 | | summary: B1
1376 | | summary: B1
1377 | |
1377 | |
1378 | | x changeset: 2:0dec01379d3b
1378 | | x changeset: 2:0dec01379d3b
1379 | |/ user: test
1379 | |/ user: test
1380 | | date: Thu Jan 01 00:00:00 1970 +0000
1380 | | date: Thu Jan 01 00:00:00 1970 +0000
1381 | | obsolete: rewritten using amend as 3:b7ea6d14e664
1381 | | obsolete: rewritten using amend as 3:b7ea6d14e664
1382 | | summary: B0
1382 | | summary: B0
1383 | |
1383 | |
1384 | x changeset: 1:471f378eab4c
1384 | x changeset: 1:471f378eab4c
1385 |/ user: test
1385 |/ user: test
1386 | date: Thu Jan 01 00:00:00 1970 +0000
1386 | date: Thu Jan 01 00:00:00 1970 +0000
1387 | obsolete: rewritten as 4:eb5a0daa2192
1387 | obsolete: rewritten as 4:eb5a0daa2192
1388 | summary: A0
1388 | summary: A0
1389 |
1389 |
1390 o changeset: 0:ea207398892e
1390 o changeset: 0:ea207398892e
1391 user: test
1391 user: test
1392 date: Thu Jan 01 00:00:00 1970 +0000
1392 date: Thu Jan 01 00:00:00 1970 +0000
1393 summary: ROOT
1393 summary: ROOT
1394
1394
1395 Check templates
1395 Check templates
1396 ---------------
1396 ---------------
1397
1397
1398 $ hg up 'desc(A0)' --hidden
1398 $ hg up 'desc(A0)' --hidden
1399 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1399 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1400 updated to hidden changeset 471f378eab4c
1400 updated to hidden changeset 471f378eab4c
1401 (hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192)
1401 (hidden revision '471f378eab4c' was rewritten as: eb5a0daa2192)
1402
1402
1403 Predecessors template should show current revision as it is the working copy
1403 Predecessors template should show current revision as it is the working copy
1404 $ hg tlog
1404 $ hg tlog
1405 o eb5a0daa2192
1405 o eb5a0daa2192
1406 | Predecessors: 1:471f378eab4c
1406 | Predecessors: 1:471f378eab4c
1407 | semi-colon: 1:471f378eab4c
1407 | semi-colon: 1:471f378eab4c
1408 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1408 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1409 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1409 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1410 | Successors:
1410 | Successors:
1411 | multi-line:
1411 | multi-line:
1412 | json: []
1412 | json: []
1413 | @ 471f378eab4c
1413 | @ 471f378eab4c
1414 |/ Predecessors:
1414 |/ Predecessors:
1415 | semi-colon:
1415 | semi-colon:
1416 | json: []
1416 | json: []
1417 | map:
1417 | map:
1418 | Successors: 4:eb5a0daa2192
1418 | Successors: 4:eb5a0daa2192
1419 | multi-line: 4:eb5a0daa2192
1419 | multi-line: 4:eb5a0daa2192
1420 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1420 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1421 o ea207398892e
1421 o ea207398892e
1422 Predecessors:
1422 Predecessors:
1423 semi-colon:
1423 semi-colon:
1424 json: []
1424 json: []
1425 map:
1425 map:
1426 Successors:
1426 Successors:
1427 multi-line:
1427 multi-line:
1428 json: []
1428 json: []
1429
1429
1430 $ hg fatelog
1430 $ hg fatelog
1431 o eb5a0daa2192
1431 o eb5a0daa2192
1432 |
1432 |
1433 | @ 471f378eab4c
1433 | @ 471f378eab4c
1434 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1434 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1435 o ea207398892e
1435 o ea207398892e
1436
1436
1437 $ hg up 'desc(B0)' --hidden
1437 $ hg up 'desc(B0)' --hidden
1438 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1438 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1439 updated to hidden changeset 0dec01379d3b
1439 updated to hidden changeset 0dec01379d3b
1440 (hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192)
1440 (hidden revision '0dec01379d3b' was rewritten as: eb5a0daa2192)
1441
1441
1442 Predecessors template should both predecessors as they are visible
1442 Predecessors template should both predecessors as they are visible
1443 $ hg tlog
1443 $ hg tlog
1444 o eb5a0daa2192
1444 o eb5a0daa2192
1445 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
1445 | Predecessors: 2:0dec01379d3b 1:471f378eab4c
1446 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
1446 | semi-colon: 2:0dec01379d3b; 1:471f378eab4c
1447 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
1447 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", "471f378eab4c5e25f6c77f785b27c936efb22874"]
1448 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
1448 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5 1:471f378eab4c5e25f6c77f785b27c936efb22874
1449 | Successors:
1449 | Successors:
1450 | multi-line:
1450 | multi-line:
1451 | json: []
1451 | json: []
1452 | @ 0dec01379d3b
1452 | @ 0dec01379d3b
1453 | | Predecessors:
1453 | | Predecessors:
1454 | | semi-colon:
1454 | | semi-colon:
1455 | | json: []
1455 | | json: []
1456 | | map:
1456 | | map:
1457 | | Successors: 4:eb5a0daa2192
1457 | | Successors: 4:eb5a0daa2192
1458 | | multi-line: 4:eb5a0daa2192
1458 | | multi-line: 4:eb5a0daa2192
1459 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1459 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1460 | x 471f378eab4c
1460 | x 471f378eab4c
1461 |/ Predecessors:
1461 |/ Predecessors:
1462 | semi-colon:
1462 | semi-colon:
1463 | json: []
1463 | json: []
1464 | map:
1464 | map:
1465 | Successors: 4:eb5a0daa2192
1465 | Successors: 4:eb5a0daa2192
1466 | multi-line: 4:eb5a0daa2192
1466 | multi-line: 4:eb5a0daa2192
1467 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1467 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1468 o ea207398892e
1468 o ea207398892e
1469 Predecessors:
1469 Predecessors:
1470 semi-colon:
1470 semi-colon:
1471 json: []
1471 json: []
1472 map:
1472 map:
1473 Successors:
1473 Successors:
1474 multi-line:
1474 multi-line:
1475 json: []
1475 json: []
1476
1476
1477 $ hg fatelog
1477 $ hg fatelog
1478 o eb5a0daa2192
1478 o eb5a0daa2192
1479 |
1479 |
1480 | @ 0dec01379d3b
1480 | @ 0dec01379d3b
1481 | | Obsfate: rewritten using amend as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1481 | | Obsfate: rewritten using amend as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1482 | x 471f378eab4c
1482 | x 471f378eab4c
1483 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1483 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1484 o ea207398892e
1484 o ea207398892e
1485
1485
1486 $ hg up 'desc(B1)' --hidden
1486 $ hg up 'desc(B1)' --hidden
1487 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1487 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1488 updated to hidden changeset b7ea6d14e664
1488 updated to hidden changeset b7ea6d14e664
1489 (hidden revision 'b7ea6d14e664' was rewritten as: eb5a0daa2192)
1489 (hidden revision 'b7ea6d14e664' was rewritten as: eb5a0daa2192)
1490
1490
1491 Predecessors template should both predecessors as they are visible
1491 Predecessors template should both predecessors as they are visible
1492 $ hg tlog
1492 $ hg tlog
1493 o eb5a0daa2192
1493 o eb5a0daa2192
1494 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
1494 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
1495 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
1495 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
1496 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
1496 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
1497 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
1497 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
1498 | Successors:
1498 | Successors:
1499 | multi-line:
1499 | multi-line:
1500 | json: []
1500 | json: []
1501 | @ b7ea6d14e664
1501 | @ b7ea6d14e664
1502 | | Predecessors:
1502 | | Predecessors:
1503 | | semi-colon:
1503 | | semi-colon:
1504 | | json: []
1504 | | json: []
1505 | | map:
1505 | | map:
1506 | | Successors: 4:eb5a0daa2192
1506 | | Successors: 4:eb5a0daa2192
1507 | | multi-line: 4:eb5a0daa2192
1507 | | multi-line: 4:eb5a0daa2192
1508 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1508 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1509 | x 471f378eab4c
1509 | x 471f378eab4c
1510 |/ Predecessors:
1510 |/ Predecessors:
1511 | semi-colon:
1511 | semi-colon:
1512 | json: []
1512 | json: []
1513 | map:
1513 | map:
1514 | Successors: 4:eb5a0daa2192
1514 | Successors: 4:eb5a0daa2192
1515 | multi-line: 4:eb5a0daa2192
1515 | multi-line: 4:eb5a0daa2192
1516 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1516 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1517 o ea207398892e
1517 o ea207398892e
1518 Predecessors:
1518 Predecessors:
1519 semi-colon:
1519 semi-colon:
1520 json: []
1520 json: []
1521 map:
1521 map:
1522 Successors:
1522 Successors:
1523 multi-line:
1523 multi-line:
1524 json: []
1524 json: []
1525
1525
1526 $ hg fatelog
1526 $ hg fatelog
1527 o eb5a0daa2192
1527 o eb5a0daa2192
1528 |
1528 |
1529 | @ b7ea6d14e664
1529 | @ b7ea6d14e664
1530 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1530 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1531 | x 471f378eab4c
1531 | x 471f378eab4c
1532 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1532 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1533 o ea207398892e
1533 o ea207398892e
1534
1534
1535 $ hg up 'desc(C0)'
1535 $ hg up 'desc(C0)'
1536 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1536 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1537
1537
1538 Predecessors template should show no predecessors as they are both non visible
1538 Predecessors template should show no predecessors as they are both non visible
1539 $ hg tlog
1539 $ hg tlog
1540 @ eb5a0daa2192
1540 @ eb5a0daa2192
1541 | Predecessors:
1541 | Predecessors:
1542 | semi-colon:
1542 | semi-colon:
1543 | json: []
1543 | json: []
1544 | map:
1544 | map:
1545 | Successors:
1545 | Successors:
1546 | multi-line:
1546 | multi-line:
1547 | json: []
1547 | json: []
1548 o ea207398892e
1548 o ea207398892e
1549 Predecessors:
1549 Predecessors:
1550 semi-colon:
1550 semi-colon:
1551 json: []
1551 json: []
1552 map:
1552 map:
1553 Successors:
1553 Successors:
1554 multi-line:
1554 multi-line:
1555 json: []
1555 json: []
1556
1556
1557 $ hg fatelog
1557 $ hg fatelog
1558 @ eb5a0daa2192
1558 @ eb5a0daa2192
1559 |
1559 |
1560 o ea207398892e
1560 o ea207398892e
1561
1561
1562 Predecessors template should show all predecessors as we force their display
1562 Predecessors template should show all predecessors as we force their display
1563 with --hidden
1563 with --hidden
1564 $ hg tlog --hidden
1564 $ hg tlog --hidden
1565 @ eb5a0daa2192
1565 @ eb5a0daa2192
1566 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
1566 | Predecessors: 1:471f378eab4c 3:b7ea6d14e664
1567 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
1567 | semi-colon: 1:471f378eab4c; 3:b7ea6d14e664
1568 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
1568 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874", "b7ea6d14e664bdc8922221f7992631b50da3fb07"]
1569 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
1569 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874 3:b7ea6d14e664bdc8922221f7992631b50da3fb07
1570 | Successors:
1570 | Successors:
1571 | multi-line:
1571 | multi-line:
1572 | json: []
1572 | json: []
1573 | x b7ea6d14e664
1573 | x b7ea6d14e664
1574 | | Predecessors: 2:0dec01379d3b
1574 | | Predecessors: 2:0dec01379d3b
1575 | | semi-colon: 2:0dec01379d3b
1575 | | semi-colon: 2:0dec01379d3b
1576 | | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1576 | | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1577 | | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1577 | | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1578 | | Successors: 4:eb5a0daa2192
1578 | | Successors: 4:eb5a0daa2192
1579 | | multi-line: 4:eb5a0daa2192
1579 | | multi-line: 4:eb5a0daa2192
1580 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1580 | | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1581 | | x 0dec01379d3b
1581 | | x 0dec01379d3b
1582 | |/ Predecessors:
1582 | |/ Predecessors:
1583 | | semi-colon:
1583 | | semi-colon:
1584 | | json: []
1584 | | json: []
1585 | | map:
1585 | | map:
1586 | | Successors: 3:b7ea6d14e664
1586 | | Successors: 3:b7ea6d14e664
1587 | | multi-line: 3:b7ea6d14e664
1587 | | multi-line: 3:b7ea6d14e664
1588 | | json: [["b7ea6d14e664bdc8922221f7992631b50da3fb07"]]
1588 | | json: [["b7ea6d14e664bdc8922221f7992631b50da3fb07"]]
1589 | x 471f378eab4c
1589 | x 471f378eab4c
1590 |/ Predecessors:
1590 |/ Predecessors:
1591 | semi-colon:
1591 | semi-colon:
1592 | json: []
1592 | json: []
1593 | map:
1593 | map:
1594 | Successors: 4:eb5a0daa2192
1594 | Successors: 4:eb5a0daa2192
1595 | multi-line: 4:eb5a0daa2192
1595 | multi-line: 4:eb5a0daa2192
1596 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1596 | json: [["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]]
1597 o ea207398892e
1597 o ea207398892e
1598 Predecessors:
1598 Predecessors:
1599 semi-colon:
1599 semi-colon:
1600 json: []
1600 json: []
1601 map:
1601 map:
1602 Successors:
1602 Successors:
1603 multi-line:
1603 multi-line:
1604 json: []
1604 json: []
1605
1605
1606 $ hg fatelog --hidden
1606 $ hg fatelog --hidden
1607 @ eb5a0daa2192
1607 @ eb5a0daa2192
1608 |
1608 |
1609 | x b7ea6d14e664
1609 | x b7ea6d14e664
1610 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1610 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1611 | | x 0dec01379d3b
1611 | | x 0dec01379d3b
1612 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664 by test (at 1970-01-01 00:00 +0000);
1612 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664 by test (at 1970-01-01 00:00 +0000);
1613 | x 471f378eab4c
1613 | x 471f378eab4c
1614 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1614 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000);
1615 o ea207398892e
1615 o ea207398892e
1616
1616
1617
1617
1618 $ hg fatelogjson --hidden
1618 $ hg fatelogjson --hidden
1619 @ eb5a0daa2192
1619 @ eb5a0daa2192
1620 |
1620 |
1621 | x b7ea6d14e664
1621 | x b7ea6d14e664
1622 | | Obsfate: [{"markers": [["b7ea6d14e664bdc8922221f7992631b50da3fb07", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
1622 | | Obsfate: [{"markers": [["b7ea6d14e664bdc8922221f7992631b50da3fb07", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
1623 | | x 0dec01379d3b
1623 | | x 0dec01379d3b
1624 | |/ Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["b7ea6d14e664bdc8922221f7992631b50da3fb07"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b7ea6d14e664bdc8922221f7992631b50da3fb07"]}]
1624 | |/ Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["b7ea6d14e664bdc8922221f7992631b50da3fb07"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b7ea6d14e664bdc8922221f7992631b50da3fb07"]}]
1625 | x 471f378eab4c
1625 | x 471f378eab4c
1626 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
1626 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["eb5a0daa21923bbf8caeb2c42085b9e463861fd0"]}]
1627 o ea207398892e
1627 o ea207398892e
1628
1628
1629
1629
1630 Check other fatelog implementations
1630 Check other fatelog implementations
1631 -----------------------------------
1631 -----------------------------------
1632
1632
1633 $ hg fatelogkw --hidden -q
1633 $ hg fatelogkw --hidden -q
1634 @ eb5a0daa2192
1634 @ eb5a0daa2192
1635 |
1635 |
1636 | x b7ea6d14e664
1636 | x b7ea6d14e664
1637 | | Obsfate: rewritten as 4:eb5a0daa2192
1637 | | Obsfate: rewritten as 4:eb5a0daa2192
1638 | | x 0dec01379d3b
1638 | | x 0dec01379d3b
1639 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664
1639 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664
1640 | x 471f378eab4c
1640 | x 471f378eab4c
1641 |/ Obsfate: rewritten as 4:eb5a0daa2192
1641 |/ Obsfate: rewritten as 4:eb5a0daa2192
1642 o ea207398892e
1642 o ea207398892e
1643
1643
1644 $ hg fatelogkw --hidden
1644 $ hg fatelogkw --hidden
1645 @ eb5a0daa2192
1645 @ eb5a0daa2192
1646 |
1646 |
1647 | x b7ea6d14e664
1647 | x b7ea6d14e664
1648 | | Obsfate: rewritten as 4:eb5a0daa2192
1648 | | Obsfate: rewritten as 4:eb5a0daa2192
1649 | | x 0dec01379d3b
1649 | | x 0dec01379d3b
1650 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664
1650 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664
1651 | x 471f378eab4c
1651 | x 471f378eab4c
1652 |/ Obsfate: rewritten as 4:eb5a0daa2192
1652 |/ Obsfate: rewritten as 4:eb5a0daa2192
1653 o ea207398892e
1653 o ea207398892e
1654
1654
1655 $ hg fatelogkw --hidden -v
1655 $ hg fatelogkw --hidden -v
1656 @ eb5a0daa2192
1656 @ eb5a0daa2192
1657 |
1657 |
1658 | x b7ea6d14e664
1658 | x b7ea6d14e664
1659 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
1659 | | Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
1660 | | x 0dec01379d3b
1660 | | x 0dec01379d3b
1661 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664 by test (at 1970-01-01 00:00 +0000)
1661 | |/ Obsfate: rewritten using amend as 3:b7ea6d14e664 by test (at 1970-01-01 00:00 +0000)
1662 | x 471f378eab4c
1662 | x 471f378eab4c
1663 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
1663 |/ Obsfate: rewritten as 4:eb5a0daa2192 by test (at 1970-01-01 00:00 +0000)
1664 o ea207398892e
1664 o ea207398892e
1665
1665
1666 $ hg log -G -T "default" --hidden
1666 $ hg log -G -T "default" --hidden
1667 @ changeset: 4:eb5a0daa2192
1667 @ changeset: 4:eb5a0daa2192
1668 | tag: tip
1668 | tag: tip
1669 | parent: 0:ea207398892e
1669 | parent: 0:ea207398892e
1670 | user: test
1670 | user: test
1671 | date: Thu Jan 01 00:00:00 1970 +0000
1671 | date: Thu Jan 01 00:00:00 1970 +0000
1672 | summary: C0
1672 | summary: C0
1673 |
1673 |
1674 | x changeset: 3:b7ea6d14e664
1674 | x changeset: 3:b7ea6d14e664
1675 | | parent: 1:471f378eab4c
1675 | | parent: 1:471f378eab4c
1676 | | user: test
1676 | | user: test
1677 | | date: Thu Jan 01 00:00:00 1970 +0000
1677 | | date: Thu Jan 01 00:00:00 1970 +0000
1678 | | obsolete: rewritten as 4:eb5a0daa2192
1678 | | obsolete: rewritten as 4:eb5a0daa2192
1679 | | summary: B1
1679 | | summary: B1
1680 | |
1680 | |
1681 | | x changeset: 2:0dec01379d3b
1681 | | x changeset: 2:0dec01379d3b
1682 | |/ user: test
1682 | |/ user: test
1683 | | date: Thu Jan 01 00:00:00 1970 +0000
1683 | | date: Thu Jan 01 00:00:00 1970 +0000
1684 | | obsolete: rewritten using amend as 3:b7ea6d14e664
1684 | | obsolete: rewritten using amend as 3:b7ea6d14e664
1685 | | summary: B0
1685 | | summary: B0
1686 | |
1686 | |
1687 | x changeset: 1:471f378eab4c
1687 | x changeset: 1:471f378eab4c
1688 |/ user: test
1688 |/ user: test
1689 | date: Thu Jan 01 00:00:00 1970 +0000
1689 | date: Thu Jan 01 00:00:00 1970 +0000
1690 | obsolete: rewritten as 4:eb5a0daa2192
1690 | obsolete: rewritten as 4:eb5a0daa2192
1691 | summary: A0
1691 | summary: A0
1692 |
1692 |
1693 o changeset: 0:ea207398892e
1693 o changeset: 0:ea207398892e
1694 user: test
1694 user: test
1695 date: Thu Jan 01 00:00:00 1970 +0000
1695 date: Thu Jan 01 00:00:00 1970 +0000
1696 summary: ROOT
1696 summary: ROOT
1697
1697
1698
1698
1699 Test template with pushed and pulled obs markers
1699 Test template with pushed and pulled obs markers
1700 ================================================
1700 ================================================
1701
1701
1702 Test setup
1702 Test setup
1703 ----------
1703 ----------
1704
1704
1705 $ hg init $TESTTMP/templates-local-remote-markers-1
1705 $ hg init $TESTTMP/templates-local-remote-markers-1
1706 $ cd $TESTTMP/templates-local-remote-markers-1
1706 $ cd $TESTTMP/templates-local-remote-markers-1
1707 $ mkcommit ROOT
1707 $ mkcommit ROOT
1708 $ mkcommit A0
1708 $ mkcommit A0
1709 $ hg clone $TESTTMP/templates-local-remote-markers-1 $TESTTMP/templates-local-remote-markers-2
1709 $ hg clone $TESTTMP/templates-local-remote-markers-1 $TESTTMP/templates-local-remote-markers-2
1710 updating to branch default
1710 updating to branch default
1711 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1711 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1712 $ cd $TESTTMP/templates-local-remote-markers-2
1712 $ cd $TESTTMP/templates-local-remote-markers-2
1713 $ hg log --hidden -G
1713 $ hg log --hidden -G
1714 @ changeset: 1:471f378eab4c
1714 @ changeset: 1:471f378eab4c
1715 | tag: tip
1715 | tag: tip
1716 | user: test
1716 | user: test
1717 | date: Thu Jan 01 00:00:00 1970 +0000
1717 | date: Thu Jan 01 00:00:00 1970 +0000
1718 | summary: A0
1718 | summary: A0
1719 |
1719 |
1720 o changeset: 0:ea207398892e
1720 o changeset: 0:ea207398892e
1721 user: test
1721 user: test
1722 date: Thu Jan 01 00:00:00 1970 +0000
1722 date: Thu Jan 01 00:00:00 1970 +0000
1723 summary: ROOT
1723 summary: ROOT
1724
1724
1725 $ cd $TESTTMP/templates-local-remote-markers-1
1725 $ cd $TESTTMP/templates-local-remote-markers-1
1726 $ hg commit --amend -m "A1"
1726 $ hg commit --amend -m "A1"
1727 $ hg commit --amend -m "A2"
1727 $ hg commit --amend -m "A2"
1728 $ hg log --hidden -G
1728 $ hg log --hidden -G
1729 @ changeset: 3:7a230b46bf61
1729 @ changeset: 3:7a230b46bf61
1730 | tag: tip
1730 | tag: tip
1731 | parent: 0:ea207398892e
1731 | parent: 0:ea207398892e
1732 | user: test
1732 | user: test
1733 | date: Thu Jan 01 00:00:00 1970 +0000
1733 | date: Thu Jan 01 00:00:00 1970 +0000
1734 | summary: A2
1734 | summary: A2
1735 |
1735 |
1736 | x changeset: 2:fdf9bde5129a
1736 | x changeset: 2:fdf9bde5129a
1737 |/ parent: 0:ea207398892e
1737 |/ parent: 0:ea207398892e
1738 | user: test
1738 | user: test
1739 | date: Thu Jan 01 00:00:00 1970 +0000
1739 | date: Thu Jan 01 00:00:00 1970 +0000
1740 | obsolete: rewritten using amend as 3:7a230b46bf61
1740 | obsolete: rewritten using amend as 3:7a230b46bf61
1741 | summary: A1
1741 | summary: A1
1742 |
1742 |
1743 | x changeset: 1:471f378eab4c
1743 | x changeset: 1:471f378eab4c
1744 |/ user: test
1744 |/ user: test
1745 | date: Thu Jan 01 00:00:00 1970 +0000
1745 | date: Thu Jan 01 00:00:00 1970 +0000
1746 | obsolete: rewritten using amend as 2:fdf9bde5129a
1746 | obsolete: rewritten using amend as 2:fdf9bde5129a
1747 | summary: A0
1747 | summary: A0
1748 |
1748 |
1749 o changeset: 0:ea207398892e
1749 o changeset: 0:ea207398892e
1750 user: test
1750 user: test
1751 date: Thu Jan 01 00:00:00 1970 +0000
1751 date: Thu Jan 01 00:00:00 1970 +0000
1752 summary: ROOT
1752 summary: ROOT
1753
1753
1754 $ cd $TESTTMP/templates-local-remote-markers-2
1754 $ cd $TESTTMP/templates-local-remote-markers-2
1755 $ hg pull
1755 $ hg pull
1756 pulling from $TESTTMP/templates-local-remote-markers-1
1756 pulling from $TESTTMP/templates-local-remote-markers-1
1757 searching for changes
1757 searching for changes
1758 adding changesets
1758 adding changesets
1759 adding manifests
1759 adding manifests
1760 adding file changes
1760 adding file changes
1761 added 1 changesets with 0 changes to 1 files (+1 heads)
1761 added 1 changesets with 0 changes to 1 files (+1 heads)
1762 2 new obsolescence markers
1762 2 new obsolescence markers
1763 obsoleted 1 changesets
1763 obsoleted 1 changesets
1764 new changesets 7a230b46bf61 (1 drafts)
1764 new changesets 7a230b46bf61 (1 drafts)
1765 (run 'hg heads' to see heads)
1765 (run 'hg heads' to see heads)
1766 $ hg log --hidden -G
1766 $ hg log --hidden -G
1767 o changeset: 2:7a230b46bf61
1767 o changeset: 2:7a230b46bf61
1768 | tag: tip
1768 | tag: tip
1769 | parent: 0:ea207398892e
1769 | parent: 0:ea207398892e
1770 | user: test
1770 | user: test
1771 | date: Thu Jan 01 00:00:00 1970 +0000
1771 | date: Thu Jan 01 00:00:00 1970 +0000
1772 | summary: A2
1772 | summary: A2
1773 |
1773 |
1774 | @ changeset: 1:471f378eab4c
1774 | @ changeset: 1:471f378eab4c
1775 |/ user: test
1775 |/ user: test
1776 | date: Thu Jan 01 00:00:00 1970 +0000
1776 | date: Thu Jan 01 00:00:00 1970 +0000
1777 | obsolete: rewritten using amend as 2:7a230b46bf61
1777 | obsolete: rewritten using amend as 2:7a230b46bf61
1778 | summary: A0
1778 | summary: A0
1779 |
1779 |
1780 o changeset: 0:ea207398892e
1780 o changeset: 0:ea207398892e
1781 user: test
1781 user: test
1782 date: Thu Jan 01 00:00:00 1970 +0000
1782 date: Thu Jan 01 00:00:00 1970 +0000
1783 summary: ROOT
1783 summary: ROOT
1784
1784
1785
1785
1786 $ hg debugobsolete
1786 $ hg debugobsolete
1787 471f378eab4c5e25f6c77f785b27c936efb22874 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1787 471f378eab4c5e25f6c77f785b27c936efb22874 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1788 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 7a230b46bf61e50b30308c6cfd7bd1269ef54702 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1788 fdf9bde5129a28d4548fadd3f62b265cdd3b7a2e 7a230b46bf61e50b30308c6cfd7bd1269ef54702 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1789
1789
1790 Check templates
1790 Check templates
1791 ---------------
1791 ---------------
1792
1792
1793 Predecessors template should show current revision as it is the working copy
1793 Predecessors template should show current revision as it is the working copy
1794 $ hg tlog
1794 $ hg tlog
1795 o 7a230b46bf61
1795 o 7a230b46bf61
1796 | Predecessors: 1:471f378eab4c
1796 | Predecessors: 1:471f378eab4c
1797 | semi-colon: 1:471f378eab4c
1797 | semi-colon: 1:471f378eab4c
1798 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1798 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1799 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1799 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1800 | Successors:
1800 | Successors:
1801 | multi-line:
1801 | multi-line:
1802 | json: []
1802 | json: []
1803 | @ 471f378eab4c
1803 | @ 471f378eab4c
1804 |/ Predecessors:
1804 |/ Predecessors:
1805 | semi-colon:
1805 | semi-colon:
1806 | json: []
1806 | json: []
1807 | map:
1807 | map:
1808 | Successors: 2:7a230b46bf61
1808 | Successors: 2:7a230b46bf61
1809 | multi-line: 2:7a230b46bf61
1809 | multi-line: 2:7a230b46bf61
1810 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1810 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1811 o ea207398892e
1811 o ea207398892e
1812 Predecessors:
1812 Predecessors:
1813 semi-colon:
1813 semi-colon:
1814 json: []
1814 json: []
1815 map:
1815 map:
1816 Successors:
1816 Successors:
1817 multi-line:
1817 multi-line:
1818 json: []
1818 json: []
1819
1819
1820 $ hg fatelog
1820 $ hg fatelog
1821 o 7a230b46bf61
1821 o 7a230b46bf61
1822 |
1822 |
1823 | @ 471f378eab4c
1823 | @ 471f378eab4c
1824 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1824 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1825 o ea207398892e
1825 o ea207398892e
1826
1826
1827 $ hg up 'desc(A2)'
1827 $ hg up 'desc(A2)'
1828 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1828 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1829
1829
1830 Predecessors template should show no predecessors as they are non visible
1830 Predecessors template should show no predecessors as they are non visible
1831 $ hg tlog
1831 $ hg tlog
1832 @ 7a230b46bf61
1832 @ 7a230b46bf61
1833 | Predecessors:
1833 | Predecessors:
1834 | semi-colon:
1834 | semi-colon:
1835 | json: []
1835 | json: []
1836 | map:
1836 | map:
1837 | Successors:
1837 | Successors:
1838 | multi-line:
1838 | multi-line:
1839 | json: []
1839 | json: []
1840 o ea207398892e
1840 o ea207398892e
1841 Predecessors:
1841 Predecessors:
1842 semi-colon:
1842 semi-colon:
1843 json: []
1843 json: []
1844 map:
1844 map:
1845 Successors:
1845 Successors:
1846 multi-line:
1846 multi-line:
1847 json: []
1847 json: []
1848
1848
1849 $ hg fatelog
1849 $ hg fatelog
1850 @ 7a230b46bf61
1850 @ 7a230b46bf61
1851 |
1851 |
1852 o ea207398892e
1852 o ea207398892e
1853
1853
1854 Predecessors template should show all predecessors as we force their display
1854 Predecessors template should show all predecessors as we force their display
1855 with --hidden
1855 with --hidden
1856 $ hg tlog --hidden
1856 $ hg tlog --hidden
1857 @ 7a230b46bf61
1857 @ 7a230b46bf61
1858 | Predecessors: 1:471f378eab4c
1858 | Predecessors: 1:471f378eab4c
1859 | semi-colon: 1:471f378eab4c
1859 | semi-colon: 1:471f378eab4c
1860 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1860 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
1861 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1861 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
1862 | Successors:
1862 | Successors:
1863 | multi-line:
1863 | multi-line:
1864 | json: []
1864 | json: []
1865 | x 471f378eab4c
1865 | x 471f378eab4c
1866 |/ Predecessors:
1866 |/ Predecessors:
1867 | semi-colon:
1867 | semi-colon:
1868 | json: []
1868 | json: []
1869 | map:
1869 | map:
1870 | Successors: 2:7a230b46bf61
1870 | Successors: 2:7a230b46bf61
1871 | multi-line: 2:7a230b46bf61
1871 | multi-line: 2:7a230b46bf61
1872 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1872 | json: [["7a230b46bf61e50b30308c6cfd7bd1269ef54702"]]
1873 o ea207398892e
1873 o ea207398892e
1874 Predecessors:
1874 Predecessors:
1875 semi-colon:
1875 semi-colon:
1876 json: []
1876 json: []
1877 map:
1877 map:
1878 Successors:
1878 Successors:
1879 multi-line:
1879 multi-line:
1880 json: []
1880 json: []
1881
1881
1882 $ hg fatelog --hidden
1882 $ hg fatelog --hidden
1883 @ 7a230b46bf61
1883 @ 7a230b46bf61
1884 |
1884 |
1885 | x 471f378eab4c
1885 | x 471f378eab4c
1886 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1886 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000);
1887 o ea207398892e
1887 o ea207398892e
1888
1888
1889
1889
1890 Check other fatelog implementations
1890 Check other fatelog implementations
1891 -----------------------------------
1891 -----------------------------------
1892
1892
1893 $ hg fatelogkw --hidden -q
1893 $ hg fatelogkw --hidden -q
1894 @ 7a230b46bf61
1894 @ 7a230b46bf61
1895 |
1895 |
1896 | x 471f378eab4c
1896 | x 471f378eab4c
1897 |/ Obsfate: rewritten using amend as 2:7a230b46bf61
1897 |/ Obsfate: rewritten using amend as 2:7a230b46bf61
1898 o ea207398892e
1898 o ea207398892e
1899
1899
1900 $ hg fatelogkw --hidden
1900 $ hg fatelogkw --hidden
1901 @ 7a230b46bf61
1901 @ 7a230b46bf61
1902 |
1902 |
1903 | x 471f378eab4c
1903 | x 471f378eab4c
1904 |/ Obsfate: rewritten using amend as 2:7a230b46bf61
1904 |/ Obsfate: rewritten using amend as 2:7a230b46bf61
1905 o ea207398892e
1905 o ea207398892e
1906
1906
1907 $ hg fatelogkw --hidden -v
1907 $ hg fatelogkw --hidden -v
1908 @ 7a230b46bf61
1908 @ 7a230b46bf61
1909 |
1909 |
1910 | x 471f378eab4c
1910 | x 471f378eab4c
1911 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000)
1911 |/ Obsfate: rewritten using amend as 2:7a230b46bf61 by test (at 1970-01-01 00:00 +0000)
1912 o ea207398892e
1912 o ea207398892e
1913
1913
1914 $ hg log -G -T "default" --hidden
1914 $ hg log -G -T "default" --hidden
1915 @ changeset: 2:7a230b46bf61
1915 @ changeset: 2:7a230b46bf61
1916 | tag: tip
1916 | tag: tip
1917 | parent: 0:ea207398892e
1917 | parent: 0:ea207398892e
1918 | user: test
1918 | user: test
1919 | date: Thu Jan 01 00:00:00 1970 +0000
1919 | date: Thu Jan 01 00:00:00 1970 +0000
1920 | summary: A2
1920 | summary: A2
1921 |
1921 |
1922 | x changeset: 1:471f378eab4c
1922 | x changeset: 1:471f378eab4c
1923 |/ user: test
1923 |/ user: test
1924 | date: Thu Jan 01 00:00:00 1970 +0000
1924 | date: Thu Jan 01 00:00:00 1970 +0000
1925 | obsolete: rewritten using amend as 2:7a230b46bf61
1925 | obsolete: rewritten using amend as 2:7a230b46bf61
1926 | summary: A0
1926 | summary: A0
1927 |
1927 |
1928 o changeset: 0:ea207398892e
1928 o changeset: 0:ea207398892e
1929 user: test
1929 user: test
1930 date: Thu Jan 01 00:00:00 1970 +0000
1930 date: Thu Jan 01 00:00:00 1970 +0000
1931 summary: ROOT
1931 summary: ROOT
1932
1932
1933
1933
1934 Test template with obsmarkers cycle
1934 Test template with obsmarkers cycle
1935 ===================================
1935 ===================================
1936
1936
1937 Test setup
1937 Test setup
1938 ----------
1938 ----------
1939
1939
1940 $ hg init $TESTTMP/templates-local-cycle
1940 $ hg init $TESTTMP/templates-local-cycle
1941 $ cd $TESTTMP/templates-local-cycle
1941 $ cd $TESTTMP/templates-local-cycle
1942 $ mkcommit ROOT
1942 $ mkcommit ROOT
1943 $ mkcommit A0
1943 $ mkcommit A0
1944 $ mkcommit B0
1944 $ mkcommit B0
1945 $ hg up -r 0
1945 $ hg up -r 0
1946 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1946 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1947 $ mkcommit C0
1947 $ mkcommit C0
1948 created new head
1948 created new head
1949
1949
1950 Create the cycle
1950 Create the cycle
1951
1951
1952 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(B0)"`
1952 $ hg debugobsolete `getid "desc(A0)"` `getid "desc(B0)"`
1953 1 new obsolescence markers
1953 1 new obsolescence markers
1954 obsoleted 1 changesets
1954 obsoleted 1 changesets
1955 1 new orphan changesets
1955 1 new orphan changesets
1956 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
1956 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(C0)"`
1957 1 new obsolescence markers
1957 1 new obsolescence markers
1958 obsoleted 1 changesets
1958 obsoleted 1 changesets
1959 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(A0)"`
1959 $ hg debugobsolete `getid "desc(B0)"` `getid "desc(A0)"`
1960 1 new obsolescence markers
1960 1 new obsolescence markers
1961
1961
1962 Check templates
1962 Check templates
1963 ---------------
1963 ---------------
1964
1964
1965 $ hg tlog
1965 $ hg tlog
1966 @ f897c6137566
1966 @ f897c6137566
1967 | Predecessors:
1967 | Predecessors:
1968 | semi-colon:
1968 | semi-colon:
1969 | json: []
1969 | json: []
1970 | map:
1970 | map:
1971 | Successors:
1971 | Successors:
1972 | multi-line:
1972 | multi-line:
1973 | json: []
1973 | json: []
1974 o ea207398892e
1974 o ea207398892e
1975 Predecessors:
1975 Predecessors:
1976 semi-colon:
1976 semi-colon:
1977 json: []
1977 json: []
1978 map:
1978 map:
1979 Successors:
1979 Successors:
1980 multi-line:
1980 multi-line:
1981 json: []
1981 json: []
1982
1982
1983 $ hg fatelog
1983 $ hg fatelog
1984 @ f897c6137566
1984 @ f897c6137566
1985 |
1985 |
1986 o ea207398892e
1986 o ea207398892e
1987
1987
1988
1988
1989 $ hg up -r "desc(B0)" --hidden
1989 $ hg up -r "desc(B0)" --hidden
1990 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1990 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1991 updated to hidden changeset 0dec01379d3b
1991 updated to hidden changeset 0dec01379d3b
1992 (hidden revision '0dec01379d3b' is pruned)
1992 (hidden revision '0dec01379d3b' is pruned)
1993 $ hg tlog
1993 $ hg tlog
1994 o f897c6137566
1994 o f897c6137566
1995 | Predecessors: 2:0dec01379d3b
1995 | Predecessors: 2:0dec01379d3b
1996 | semi-colon: 2:0dec01379d3b
1996 | semi-colon: 2:0dec01379d3b
1997 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1997 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
1998 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1998 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
1999 | Successors:
1999 | Successors:
2000 | multi-line:
2000 | multi-line:
2001 | json: []
2001 | json: []
2002 | @ 0dec01379d3b
2002 | @ 0dec01379d3b
2003 | | Predecessors: 1:471f378eab4c
2003 | | Predecessors: 1:471f378eab4c
2004 | | semi-colon: 1:471f378eab4c
2004 | | semi-colon: 1:471f378eab4c
2005 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2005 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2006 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2006 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2007 | | Successors: 3:f897c6137566; 1:471f378eab4c
2007 | | Successors: 3:f897c6137566; 1:471f378eab4c
2008 | | multi-line: 3:f897c6137566
2008 | | multi-line: 3:f897c6137566
2009 | | multi-line: 1:471f378eab4c
2009 | | multi-line: 1:471f378eab4c
2010 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2010 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2011 | x 471f378eab4c
2011 | x 471f378eab4c
2012 |/ Predecessors: 2:0dec01379d3b
2012 |/ Predecessors: 2:0dec01379d3b
2013 | semi-colon: 2:0dec01379d3b
2013 | semi-colon: 2:0dec01379d3b
2014 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2014 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2015 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2015 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2016 | Successors: 2:0dec01379d3b
2016 | Successors: 2:0dec01379d3b
2017 | multi-line: 2:0dec01379d3b
2017 | multi-line: 2:0dec01379d3b
2018 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2018 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2019 o ea207398892e
2019 o ea207398892e
2020 Predecessors:
2020 Predecessors:
2021 semi-colon:
2021 semi-colon:
2022 json: []
2022 json: []
2023 map:
2023 map:
2024 Successors:
2024 Successors:
2025 multi-line:
2025 multi-line:
2026 json: []
2026 json: []
2027
2027
2028 $ hg fatelog
2028 $ hg fatelog
2029 o f897c6137566
2029 o f897c6137566
2030 |
2030 |
2031 | @ 0dec01379d3b
2031 | @ 0dec01379d3b
2032 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
2032 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
2033 | x 471f378eab4c
2033 | x 471f378eab4c
2034 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
2034 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
2035 o ea207398892e
2035 o ea207398892e
2036
2036
2037
2037
2038 $ hg up -r "desc(A0)" --hidden
2038 $ hg up -r "desc(A0)" --hidden
2039 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2039 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2040 $ hg tlog
2040 $ hg tlog
2041 o f897c6137566
2041 o f897c6137566
2042 | Predecessors: 1:471f378eab4c
2042 | Predecessors: 1:471f378eab4c
2043 | semi-colon: 1:471f378eab4c
2043 | semi-colon: 1:471f378eab4c
2044 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2044 | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2045 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2045 | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2046 | Successors:
2046 | Successors:
2047 | multi-line:
2047 | multi-line:
2048 | json: []
2048 | json: []
2049 | @ 471f378eab4c
2049 | @ 471f378eab4c
2050 |/ Predecessors:
2050 |/ Predecessors:
2051 | semi-colon:
2051 | semi-colon:
2052 | json: []
2052 | json: []
2053 | map:
2053 | map:
2054 | Successors:
2054 | Successors:
2055 | multi-line:
2055 | multi-line:
2056 | json: []
2056 | json: []
2057 o ea207398892e
2057 o ea207398892e
2058 Predecessors:
2058 Predecessors:
2059 semi-colon:
2059 semi-colon:
2060 json: []
2060 json: []
2061 map:
2061 map:
2062 Successors:
2062 Successors:
2063 multi-line:
2063 multi-line:
2064 json: []
2064 json: []
2065
2065
2066 $ hg fatelog
2066 $ hg fatelog
2067 o f897c6137566
2067 o f897c6137566
2068 |
2068 |
2069 | @ 471f378eab4c
2069 | @ 471f378eab4c
2070 |/ Obsfate: pruned;
2070 |/ Obsfate: pruned;
2071 o ea207398892e
2071 o ea207398892e
2072
2072
2073
2073
2074 $ hg up -r "desc(ROOT)" --hidden
2074 $ hg up -r "desc(ROOT)" --hidden
2075 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2075 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2076 $ hg tlog
2076 $ hg tlog
2077 o f897c6137566
2077 o f897c6137566
2078 | Predecessors:
2078 | Predecessors:
2079 | semi-colon:
2079 | semi-colon:
2080 | json: []
2080 | json: []
2081 | map:
2081 | map:
2082 | Successors:
2082 | Successors:
2083 | multi-line:
2083 | multi-line:
2084 | json: []
2084 | json: []
2085 @ ea207398892e
2085 @ ea207398892e
2086 Predecessors:
2086 Predecessors:
2087 semi-colon:
2087 semi-colon:
2088 json: []
2088 json: []
2089 map:
2089 map:
2090 Successors:
2090 Successors:
2091 multi-line:
2091 multi-line:
2092 json: []
2092 json: []
2093
2093
2094 $ hg fatelog
2094 $ hg fatelog
2095 o f897c6137566
2095 o f897c6137566
2096 |
2096 |
2097 @ ea207398892e
2097 @ ea207398892e
2098
2098
2099
2099
2100 $ hg tlog --hidden
2100 $ hg tlog --hidden
2101 o f897c6137566
2101 o f897c6137566
2102 | Predecessors: 2:0dec01379d3b
2102 | Predecessors: 2:0dec01379d3b
2103 | semi-colon: 2:0dec01379d3b
2103 | semi-colon: 2:0dec01379d3b
2104 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2104 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2105 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2105 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2106 | Successors:
2106 | Successors:
2107 | multi-line:
2107 | multi-line:
2108 | json: []
2108 | json: []
2109 | x 0dec01379d3b
2109 | x 0dec01379d3b
2110 | | Predecessors: 1:471f378eab4c
2110 | | Predecessors: 1:471f378eab4c
2111 | | semi-colon: 1:471f378eab4c
2111 | | semi-colon: 1:471f378eab4c
2112 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2112 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2113 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2113 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2114 | | Successors: 3:f897c6137566; 1:471f378eab4c
2114 | | Successors: 3:f897c6137566; 1:471f378eab4c
2115 | | multi-line: 3:f897c6137566
2115 | | multi-line: 3:f897c6137566
2116 | | multi-line: 1:471f378eab4c
2116 | | multi-line: 1:471f378eab4c
2117 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2117 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2118 | x 471f378eab4c
2118 | x 471f378eab4c
2119 |/ Predecessors: 2:0dec01379d3b
2119 |/ Predecessors: 2:0dec01379d3b
2120 | semi-colon: 2:0dec01379d3b
2120 | semi-colon: 2:0dec01379d3b
2121 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2121 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2122 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2122 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2123 | Successors: 2:0dec01379d3b
2123 | Successors: 2:0dec01379d3b
2124 | multi-line: 2:0dec01379d3b
2124 | multi-line: 2:0dec01379d3b
2125 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2125 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2126 @ ea207398892e
2126 @ ea207398892e
2127 Predecessors:
2127 Predecessors:
2128 semi-colon:
2128 semi-colon:
2129 json: []
2129 json: []
2130 map:
2130 map:
2131 Successors:
2131 Successors:
2132 multi-line:
2132 multi-line:
2133 json: []
2133 json: []
2134
2134
2135 Check other fatelog implementations
2135 Check other fatelog implementations
2136 -----------------------------------
2136 -----------------------------------
2137
2137
2138 $ hg fatelogkw --hidden -q
2138 $ hg fatelogkw --hidden -q
2139 o f897c6137566
2139 o f897c6137566
2140 |
2140 |
2141 | x 0dec01379d3b
2141 | x 0dec01379d3b
2142 | | Obsfate: rewritten as 3:f897c6137566
2142 | | Obsfate: rewritten as 3:f897c6137566
2143 | | Obsfate: rewritten as 1:471f378eab4c
2143 | | Obsfate: rewritten as 1:471f378eab4c
2144 | x 471f378eab4c
2144 | x 471f378eab4c
2145 |/ Obsfate: rewritten as 2:0dec01379d3b
2145 |/ Obsfate: rewritten as 2:0dec01379d3b
2146 @ ea207398892e
2146 @ ea207398892e
2147
2147
2148 $ hg fatelogkw --hidden
2148 $ hg fatelogkw --hidden
2149 o f897c6137566
2149 o f897c6137566
2150 |
2150 |
2151 | x 0dec01379d3b
2151 | x 0dec01379d3b
2152 | | Obsfate: rewritten as 3:f897c6137566
2152 | | Obsfate: rewritten as 3:f897c6137566
2153 | | Obsfate: rewritten as 1:471f378eab4c
2153 | | Obsfate: rewritten as 1:471f378eab4c
2154 | x 471f378eab4c
2154 | x 471f378eab4c
2155 |/ Obsfate: rewritten as 2:0dec01379d3b
2155 |/ Obsfate: rewritten as 2:0dec01379d3b
2156 @ ea207398892e
2156 @ ea207398892e
2157
2157
2158 $ hg fatelogkw --hidden -v
2158 $ hg fatelogkw --hidden -v
2159 o f897c6137566
2159 o f897c6137566
2160 |
2160 |
2161 | x 0dec01379d3b
2161 | x 0dec01379d3b
2162 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000)
2162 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000)
2163 | | Obsfate: rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000)
2163 | | Obsfate: rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000)
2164 | x 471f378eab4c
2164 | x 471f378eab4c
2165 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000)
2165 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000)
2166 @ ea207398892e
2166 @ ea207398892e
2167
2167
2168 $ hg log -G -T "default" --hidden
2168 $ hg log -G -T "default" --hidden
2169 o changeset: 3:f897c6137566
2169 o changeset: 3:f897c6137566
2170 | tag: tip
2170 | tag: tip
2171 | parent: 0:ea207398892e
2171 | parent: 0:ea207398892e
2172 | user: test
2172 | user: test
2173 | date: Thu Jan 01 00:00:00 1970 +0000
2173 | date: Thu Jan 01 00:00:00 1970 +0000
2174 | summary: C0
2174 | summary: C0
2175 |
2175 |
2176 | x changeset: 2:0dec01379d3b
2176 | x changeset: 2:0dec01379d3b
2177 | | user: test
2177 | | user: test
2178 | | date: Thu Jan 01 00:00:00 1970 +0000
2178 | | date: Thu Jan 01 00:00:00 1970 +0000
2179 | | obsolete: rewritten as 3:f897c6137566
2179 | | obsolete: rewritten as 3:f897c6137566
2180 | | obsolete: rewritten as 1:471f378eab4c
2180 | | obsolete: rewritten as 1:471f378eab4c
2181 | | summary: B0
2181 | | summary: B0
2182 | |
2182 | |
2183 | x changeset: 1:471f378eab4c
2183 | x changeset: 1:471f378eab4c
2184 |/ user: test
2184 |/ user: test
2185 | date: Thu Jan 01 00:00:00 1970 +0000
2185 | date: Thu Jan 01 00:00:00 1970 +0000
2186 | obsolete: rewritten as 2:0dec01379d3b
2186 | obsolete: rewritten as 2:0dec01379d3b
2187 | summary: A0
2187 | summary: A0
2188 |
2188 |
2189 @ changeset: 0:ea207398892e
2189 @ changeset: 0:ea207398892e
2190 user: test
2190 user: test
2191 date: Thu Jan 01 00:00:00 1970 +0000
2191 date: Thu Jan 01 00:00:00 1970 +0000
2192 summary: ROOT
2192 summary: ROOT
2193
2193
2194
2194
2195 Test template with split + divergence with cycles
2195 Test template with split + divergence with cycles
2196 =================================================
2196 =================================================
2197
2197
2198 $ hg log -G
2198 $ hg log -G
2199 o changeset: 3:f897c6137566
2199 o changeset: 3:f897c6137566
2200 | tag: tip
2200 | tag: tip
2201 | parent: 0:ea207398892e
2201 | parent: 0:ea207398892e
2202 | user: test
2202 | user: test
2203 | date: Thu Jan 01 00:00:00 1970 +0000
2203 | date: Thu Jan 01 00:00:00 1970 +0000
2204 | summary: C0
2204 | summary: C0
2205 |
2205 |
2206 @ changeset: 0:ea207398892e
2206 @ changeset: 0:ea207398892e
2207 user: test
2207 user: test
2208 date: Thu Jan 01 00:00:00 1970 +0000
2208 date: Thu Jan 01 00:00:00 1970 +0000
2209 summary: ROOT
2209 summary: ROOT
2210
2210
2211 $ hg up
2211 $ hg up
2212 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2212 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2213
2213
2214 Create a commit with three files
2214 Create a commit with three files
2215 $ touch A B C
2215 $ touch A B C
2216 $ hg commit -A -m "Add A,B,C" A B C
2216 $ hg commit -A -m "Add A,B,C" A B C
2217
2217
2218 Split it
2218 Split it
2219 $ hg up 3
2219 $ hg up 3
2220 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
2220 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
2221 $ touch A
2221 $ touch A
2222 $ hg commit -A -m "Add A,B,C" A
2222 $ hg commit -A -m "Add A,B,C" A
2223 created new head
2223 created new head
2224
2224
2225 $ touch B
2225 $ touch B
2226 $ hg commit -A -m "Add A,B,C" B
2226 $ hg commit -A -m "Add A,B,C" B
2227
2227
2228 $ touch C
2228 $ touch C
2229 $ hg commit -A -m "Add A,B,C" C
2229 $ hg commit -A -m "Add A,B,C" C
2230
2230
2231 $ hg log -G
2231 $ hg log -G
2232 @ changeset: 7:ba2ed02b0c9a
2232 @ changeset: 7:ba2ed02b0c9a
2233 | tag: tip
2233 | tag: tip
2234 | user: test
2234 | user: test
2235 | date: Thu Jan 01 00:00:00 1970 +0000
2235 | date: Thu Jan 01 00:00:00 1970 +0000
2236 | summary: Add A,B,C
2236 | summary: Add A,B,C
2237 |
2237 |
2238 o changeset: 6:4a004186e638
2238 o changeset: 6:4a004186e638
2239 | user: test
2239 | user: test
2240 | date: Thu Jan 01 00:00:00 1970 +0000
2240 | date: Thu Jan 01 00:00:00 1970 +0000
2241 | summary: Add A,B,C
2241 | summary: Add A,B,C
2242 |
2242 |
2243 o changeset: 5:dd800401bd8c
2243 o changeset: 5:dd800401bd8c
2244 | parent: 3:f897c6137566
2244 | parent: 3:f897c6137566
2245 | user: test
2245 | user: test
2246 | date: Thu Jan 01 00:00:00 1970 +0000
2246 | date: Thu Jan 01 00:00:00 1970 +0000
2247 | summary: Add A,B,C
2247 | summary: Add A,B,C
2248 |
2248 |
2249 | o changeset: 4:9bd10a0775e4
2249 | o changeset: 4:9bd10a0775e4
2250 |/ user: test
2250 |/ user: test
2251 | date: Thu Jan 01 00:00:00 1970 +0000
2251 | date: Thu Jan 01 00:00:00 1970 +0000
2252 | summary: Add A,B,C
2252 | summary: Add A,B,C
2253 |
2253 |
2254 o changeset: 3:f897c6137566
2254 o changeset: 3:f897c6137566
2255 | parent: 0:ea207398892e
2255 | parent: 0:ea207398892e
2256 | user: test
2256 | user: test
2257 | date: Thu Jan 01 00:00:00 1970 +0000
2257 | date: Thu Jan 01 00:00:00 1970 +0000
2258 | summary: C0
2258 | summary: C0
2259 |
2259 |
2260 o changeset: 0:ea207398892e
2260 o changeset: 0:ea207398892e
2261 user: test
2261 user: test
2262 date: Thu Jan 01 00:00:00 1970 +0000
2262 date: Thu Jan 01 00:00:00 1970 +0000
2263 summary: ROOT
2263 summary: ROOT
2264
2264
2265 $ hg debugobsolete `getid "4"` `getid "5"` `getid "6"` `getid "7"`
2265 $ hg debugobsolete `getid "4"` `getid "5"` `getid "6"` `getid "7"`
2266 1 new obsolescence markers
2266 1 new obsolescence markers
2267 obsoleted 1 changesets
2267 obsoleted 1 changesets
2268 $ hg log -G
2268 $ hg log -G
2269 @ changeset: 7:ba2ed02b0c9a
2269 @ changeset: 7:ba2ed02b0c9a
2270 | tag: tip
2270 | tag: tip
2271 | user: test
2271 | user: test
2272 | date: Thu Jan 01 00:00:00 1970 +0000
2272 | date: Thu Jan 01 00:00:00 1970 +0000
2273 | summary: Add A,B,C
2273 | summary: Add A,B,C
2274 |
2274 |
2275 o changeset: 6:4a004186e638
2275 o changeset: 6:4a004186e638
2276 | user: test
2276 | user: test
2277 | date: Thu Jan 01 00:00:00 1970 +0000
2277 | date: Thu Jan 01 00:00:00 1970 +0000
2278 | summary: Add A,B,C
2278 | summary: Add A,B,C
2279 |
2279 |
2280 o changeset: 5:dd800401bd8c
2280 o changeset: 5:dd800401bd8c
2281 | parent: 3:f897c6137566
2281 | parent: 3:f897c6137566
2282 | user: test
2282 | user: test
2283 | date: Thu Jan 01 00:00:00 1970 +0000
2283 | date: Thu Jan 01 00:00:00 1970 +0000
2284 | summary: Add A,B,C
2284 | summary: Add A,B,C
2285 |
2285 |
2286 o changeset: 3:f897c6137566
2286 o changeset: 3:f897c6137566
2287 | parent: 0:ea207398892e
2287 | parent: 0:ea207398892e
2288 | user: test
2288 | user: test
2289 | date: Thu Jan 01 00:00:00 1970 +0000
2289 | date: Thu Jan 01 00:00:00 1970 +0000
2290 | summary: C0
2290 | summary: C0
2291 |
2291 |
2292 o changeset: 0:ea207398892e
2292 o changeset: 0:ea207398892e
2293 user: test
2293 user: test
2294 date: Thu Jan 01 00:00:00 1970 +0000
2294 date: Thu Jan 01 00:00:00 1970 +0000
2295 summary: ROOT
2295 summary: ROOT
2296
2296
2297 Diverge one of the splitted commit
2297 Diverge one of the splitted commit
2298
2298
2299 $ hg up 6
2299 $ hg up 6
2300 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2300 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2301 $ hg commit --amend -m "Add only B"
2301 $ hg commit --amend -m "Add only B"
2302 1 new orphan changesets
2302 1 new orphan changesets
2303
2303
2304 $ hg up 6 --hidden
2304 $ hg up 6 --hidden
2305 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2305 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2306 $ hg commit --amend -m "Add B only"
2306 $ hg commit --amend -m "Add B only"
2307 4 new content-divergent changesets
2307 2 new content-divergent changesets
2308
2308
2309 $ hg log -G
2309 $ hg log -G
2310 @ changeset: 9:0b997eb7ceee
2310 @ changeset: 9:0b997eb7ceee
2311 | tag: tip
2311 | tag: tip
2312 | parent: 5:dd800401bd8c
2312 | parent: 5:dd800401bd8c
2313 | user: test
2313 | user: test
2314 | date: Thu Jan 01 00:00:00 1970 +0000
2314 | date: Thu Jan 01 00:00:00 1970 +0000
2315 | instability: content-divergent
2315 | instability: content-divergent
2316 | summary: Add B only
2316 | summary: Add B only
2317 |
2317 |
2318 | * changeset: 8:b18bc8331526
2318 | * changeset: 8:b18bc8331526
2319 |/ parent: 5:dd800401bd8c
2319 |/ parent: 5:dd800401bd8c
2320 | user: test
2320 | user: test
2321 | date: Thu Jan 01 00:00:00 1970 +0000
2321 | date: Thu Jan 01 00:00:00 1970 +0000
2322 | instability: content-divergent
2322 | instability: content-divergent
2323 | summary: Add only B
2323 | summary: Add only B
2324 |
2324 |
2325 | * changeset: 7:ba2ed02b0c9a
2325 | * changeset: 7:ba2ed02b0c9a
2326 | | user: test
2326 | | user: test
2327 | | date: Thu Jan 01 00:00:00 1970 +0000
2327 | | date: Thu Jan 01 00:00:00 1970 +0000
2328 | | instability: orphan, content-divergent
2328 | | instability: orphan
2329 | | summary: Add A,B,C
2329 | | summary: Add A,B,C
2330 | |
2330 | |
2331 | x changeset: 6:4a004186e638
2331 | x changeset: 6:4a004186e638
2332 |/ user: test
2332 |/ user: test
2333 | date: Thu Jan 01 00:00:00 1970 +0000
2333 | date: Thu Jan 01 00:00:00 1970 +0000
2334 | obsolete: rewritten using amend as 8:b18bc8331526
2334 | obsolete: rewritten using amend as 8:b18bc8331526
2335 | obsolete: rewritten using amend as 9:0b997eb7ceee
2335 | obsolete: rewritten using amend as 9:0b997eb7ceee
2336 | summary: Add A,B,C
2336 | summary: Add A,B,C
2337 |
2337 |
2338 * changeset: 5:dd800401bd8c
2338 o changeset: 5:dd800401bd8c
2339 | parent: 3:f897c6137566
2339 | parent: 3:f897c6137566
2340 | user: test
2340 | user: test
2341 | date: Thu Jan 01 00:00:00 1970 +0000
2341 | date: Thu Jan 01 00:00:00 1970 +0000
2342 | instability: content-divergent
2343 | summary: Add A,B,C
2342 | summary: Add A,B,C
2344 |
2343 |
2345 o changeset: 3:f897c6137566
2344 o changeset: 3:f897c6137566
2346 | parent: 0:ea207398892e
2345 | parent: 0:ea207398892e
2347 | user: test
2346 | user: test
2348 | date: Thu Jan 01 00:00:00 1970 +0000
2347 | date: Thu Jan 01 00:00:00 1970 +0000
2349 | summary: C0
2348 | summary: C0
2350 |
2349 |
2351 o changeset: 0:ea207398892e
2350 o changeset: 0:ea207398892e
2352 user: test
2351 user: test
2353 date: Thu Jan 01 00:00:00 1970 +0000
2352 date: Thu Jan 01 00:00:00 1970 +0000
2354 summary: ROOT
2353 summary: ROOT
2355
2354
2356
2355
2357 Check templates
2356 Check templates
2358 ---------------
2357 ---------------
2359
2358
2360 $ hg tlog
2359 $ hg tlog
2361 @ 0b997eb7ceee
2360 @ 0b997eb7ceee
2362 | Predecessors: 6:4a004186e638
2361 | Predecessors: 6:4a004186e638
2363 | semi-colon: 6:4a004186e638
2362 | semi-colon: 6:4a004186e638
2364 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2363 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2365 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2364 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2366 | Successors:
2365 | Successors:
2367 | multi-line:
2366 | multi-line:
2368 | json: []
2367 | json: []
2369 | * b18bc8331526
2368 | * b18bc8331526
2370 |/ Predecessors: 6:4a004186e638
2369 |/ Predecessors: 6:4a004186e638
2371 | semi-colon: 6:4a004186e638
2370 | semi-colon: 6:4a004186e638
2372 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2371 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2373 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2372 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2374 | Successors:
2373 | Successors:
2375 | multi-line:
2374 | multi-line:
2376 | json: []
2375 | json: []
2377 | * ba2ed02b0c9a
2376 | * ba2ed02b0c9a
2378 | | Predecessors:
2377 | | Predecessors:
2379 | | semi-colon:
2378 | | semi-colon:
2380 | | json: []
2379 | | json: []
2381 | | map:
2380 | | map:
2382 | | Successors:
2381 | | Successors:
2383 | | multi-line:
2382 | | multi-line:
2384 | | json: []
2383 | | json: []
2385 | x 4a004186e638
2384 | x 4a004186e638
2386 |/ Predecessors:
2385 |/ Predecessors:
2387 | semi-colon:
2386 | semi-colon:
2388 | json: []
2387 | json: []
2389 | map:
2388 | map:
2390 | Successors: 8:b18bc8331526; 9:0b997eb7ceee
2389 | Successors: 8:b18bc8331526; 9:0b997eb7ceee
2391 | multi-line: 8:b18bc8331526
2390 | multi-line: 8:b18bc8331526
2392 | multi-line: 9:0b997eb7ceee
2391 | multi-line: 9:0b997eb7ceee
2393 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
2392 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
2394 * dd800401bd8c
2393 o dd800401bd8c
2395 | Predecessors:
2394 | Predecessors:
2396 | semi-colon:
2395 | semi-colon:
2397 | json: []
2396 | json: []
2398 | map:
2397 | map:
2399 | Successors:
2398 | Successors:
2400 | multi-line:
2399 | multi-line:
2401 | json: []
2400 | json: []
2402 o f897c6137566
2401 o f897c6137566
2403 | Predecessors:
2402 | Predecessors:
2404 | semi-colon:
2403 | semi-colon:
2405 | json: []
2404 | json: []
2406 | map:
2405 | map:
2407 | Successors:
2406 | Successors:
2408 | multi-line:
2407 | multi-line:
2409 | json: []
2408 | json: []
2410 o ea207398892e
2409 o ea207398892e
2411 Predecessors:
2410 Predecessors:
2412 semi-colon:
2411 semi-colon:
2413 json: []
2412 json: []
2414 map:
2413 map:
2415 Successors:
2414 Successors:
2416 multi-line:
2415 multi-line:
2417 json: []
2416 json: []
2418 $ hg fatelog
2417 $ hg fatelog
2419 @ 0b997eb7ceee
2418 @ 0b997eb7ceee
2420 |
2419 |
2421 | * b18bc8331526
2420 | * b18bc8331526
2422 |/
2421 |/
2423 | * ba2ed02b0c9a
2422 | * ba2ed02b0c9a
2424 | |
2423 | |
2425 | x 4a004186e638
2424 | x 4a004186e638
2426 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
2425 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
2427 * dd800401bd8c
2426 o dd800401bd8c
2428 |
2427 |
2429 o f897c6137566
2428 o f897c6137566
2430 |
2429 |
2431 o ea207398892e
2430 o ea207398892e
2432
2431
2433 $ hg tlog --hidden
2432 $ hg tlog --hidden
2434 @ 0b997eb7ceee
2433 @ 0b997eb7ceee
2435 | Predecessors: 6:4a004186e638
2434 | Predecessors: 6:4a004186e638
2436 | semi-colon: 6:4a004186e638
2435 | semi-colon: 6:4a004186e638
2437 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2436 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2438 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2437 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2439 | Successors:
2438 | Successors:
2440 | multi-line:
2439 | multi-line:
2441 | json: []
2440 | json: []
2442 | * b18bc8331526
2441 | * b18bc8331526
2443 |/ Predecessors: 6:4a004186e638
2442 |/ Predecessors: 6:4a004186e638
2444 | semi-colon: 6:4a004186e638
2443 | semi-colon: 6:4a004186e638
2445 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2444 | json: ["4a004186e63889f20cb16434fcbd72220bd1eace"]
2446 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2445 | map: 6:4a004186e63889f20cb16434fcbd72220bd1eace
2447 | Successors:
2446 | Successors:
2448 | multi-line:
2447 | multi-line:
2449 | json: []
2448 | json: []
2450 | * ba2ed02b0c9a
2449 | * ba2ed02b0c9a
2451 | | Predecessors: 4:9bd10a0775e4
2450 | | Predecessors: 4:9bd10a0775e4
2452 | | semi-colon: 4:9bd10a0775e4
2451 | | semi-colon: 4:9bd10a0775e4
2453 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2452 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2454 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2453 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2455 | | Successors:
2454 | | Successors:
2456 | | multi-line:
2455 | | multi-line:
2457 | | json: []
2456 | | json: []
2458 | x 4a004186e638
2457 | x 4a004186e638
2459 |/ Predecessors: 4:9bd10a0775e4
2458 |/ Predecessors: 4:9bd10a0775e4
2460 | semi-colon: 4:9bd10a0775e4
2459 | semi-colon: 4:9bd10a0775e4
2461 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2460 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2462 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2461 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2463 | Successors: 8:b18bc8331526; 9:0b997eb7ceee
2462 | Successors: 8:b18bc8331526; 9:0b997eb7ceee
2464 | multi-line: 8:b18bc8331526
2463 | multi-line: 8:b18bc8331526
2465 | multi-line: 9:0b997eb7ceee
2464 | multi-line: 9:0b997eb7ceee
2466 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
2465 | json: [["b18bc8331526a22cbb1801022bd1555bf291c48b"], ["0b997eb7ceeee06200a02f8aab185979092d514e"]]
2467 * dd800401bd8c
2466 o dd800401bd8c
2468 | Predecessors: 4:9bd10a0775e4
2467 | Predecessors: 4:9bd10a0775e4
2469 | semi-colon: 4:9bd10a0775e4
2468 | semi-colon: 4:9bd10a0775e4
2470 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2469 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2471 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2470 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2472 | Successors:
2471 | Successors:
2473 | multi-line:
2472 | multi-line:
2474 | json: []
2473 | json: []
2475 | x 9bd10a0775e4
2474 | x 9bd10a0775e4
2476 |/ Predecessors:
2475 |/ Predecessors:
2477 | semi-colon:
2476 | semi-colon:
2478 | json: []
2477 | json: []
2479 | map:
2478 | map:
2480 | Successors: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
2479 | Successors: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
2481 | multi-line: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
2480 | multi-line: 5:dd800401bd8c 6:4a004186e638 7:ba2ed02b0c9a
2482 | json: [["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]]
2481 | json: [["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]]
2483 o f897c6137566
2482 o f897c6137566
2484 | Predecessors: 2:0dec01379d3b
2483 | Predecessors: 2:0dec01379d3b
2485 | semi-colon: 2:0dec01379d3b
2484 | semi-colon: 2:0dec01379d3b
2486 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2485 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2487 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2486 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2488 | Successors:
2487 | Successors:
2489 | multi-line:
2488 | multi-line:
2490 | json: []
2489 | json: []
2491 | x 0dec01379d3b
2490 | x 0dec01379d3b
2492 | | Predecessors: 1:471f378eab4c
2491 | | Predecessors: 1:471f378eab4c
2493 | | semi-colon: 1:471f378eab4c
2492 | | semi-colon: 1:471f378eab4c
2494 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2493 | | json: ["471f378eab4c5e25f6c77f785b27c936efb22874"]
2495 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2494 | | map: 1:471f378eab4c5e25f6c77f785b27c936efb22874
2496 | | Successors: 3:f897c6137566; 1:471f378eab4c
2495 | | Successors: 3:f897c6137566; 1:471f378eab4c
2497 | | multi-line: 3:f897c6137566
2496 | | multi-line: 3:f897c6137566
2498 | | multi-line: 1:471f378eab4c
2497 | | multi-line: 1:471f378eab4c
2499 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2498 | | json: [["f897c6137566320b081514b4c7227ecc3d384b39"], ["471f378eab4c5e25f6c77f785b27c936efb22874"]]
2500 | x 471f378eab4c
2499 | x 471f378eab4c
2501 |/ Predecessors: 2:0dec01379d3b
2500 |/ Predecessors: 2:0dec01379d3b
2502 | semi-colon: 2:0dec01379d3b
2501 | semi-colon: 2:0dec01379d3b
2503 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2502 | json: ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]
2504 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2503 | map: 2:0dec01379d3be6318c470ead31b1fe7ae7cb53d5
2505 | Successors: 2:0dec01379d3b
2504 | Successors: 2:0dec01379d3b
2506 | multi-line: 2:0dec01379d3b
2505 | multi-line: 2:0dec01379d3b
2507 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2506 | json: [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]]
2508 o ea207398892e
2507 o ea207398892e
2509 Predecessors:
2508 Predecessors:
2510 semi-colon:
2509 semi-colon:
2511 json: []
2510 json: []
2512 map:
2511 map:
2513 Successors:
2512 Successors:
2514 multi-line:
2513 multi-line:
2515 json: []
2514 json: []
2516 $ hg fatelog --hidden
2515 $ hg fatelog --hidden
2517 @ 0b997eb7ceee
2516 @ 0b997eb7ceee
2518 |
2517 |
2519 | * b18bc8331526
2518 | * b18bc8331526
2520 |/
2519 |/
2521 | * ba2ed02b0c9a
2520 | * ba2ed02b0c9a
2522 | |
2521 | |
2523 | x 4a004186e638
2522 | x 4a004186e638
2524 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
2523 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000); rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000);
2525 * dd800401bd8c
2524 o dd800401bd8c
2526 |
2525 |
2527 | x 9bd10a0775e4
2526 | x 9bd10a0775e4
2528 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a by test (at 1970-01-01 00:00 +0000);
2527 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a by test (at 1970-01-01 00:00 +0000);
2529 o f897c6137566
2528 o f897c6137566
2530 |
2529 |
2531 | x 0dec01379d3b
2530 | x 0dec01379d3b
2532 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
2531 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000); rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000);
2533 | x 471f378eab4c
2532 | x 471f378eab4c
2534 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
2533 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000);
2535 o ea207398892e
2534 o ea207398892e
2536
2535
2537 $ hg fatelogjson --hidden
2536 $ hg fatelogjson --hidden
2538 @ 0b997eb7ceee
2537 @ 0b997eb7ceee
2539 |
2538 |
2540 | * b18bc8331526
2539 | * b18bc8331526
2541 |/
2540 |/
2542 | * ba2ed02b0c9a
2541 | * ba2ed02b0c9a
2543 | |
2542 | |
2544 | x 4a004186e638
2543 | x 4a004186e638
2545 |/ Obsfate: [{"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["b18bc8331526a22cbb1801022bd1555bf291c48b"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b18bc8331526a22cbb1801022bd1555bf291c48b"]}, {"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["0b997eb7ceeee06200a02f8aab185979092d514e"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["0b997eb7ceeee06200a02f8aab185979092d514e"]}]
2544 |/ Obsfate: [{"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["b18bc8331526a22cbb1801022bd1555bf291c48b"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["b18bc8331526a22cbb1801022bd1555bf291c48b"]}, {"markers": [["4a004186e63889f20cb16434fcbd72220bd1eace", ["0b997eb7ceeee06200a02f8aab185979092d514e"], 0, [["ef1", "1"], ["operation", "amend"], ["user", "test"]], [0.0, 0], null]], "successors": ["0b997eb7ceeee06200a02f8aab185979092d514e"]}]
2546 * dd800401bd8c
2545 o dd800401bd8c
2547 |
2546 |
2548 | x 9bd10a0775e4
2547 | x 9bd10a0775e4
2549 |/ Obsfate: [{"markers": [["9bd10a0775e478708cada5f176ec6de654359ce7", ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]}]
2548 |/ Obsfate: [{"markers": [["9bd10a0775e478708cada5f176ec6de654359ce7", ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["dd800401bd8c79d815329277739e433e883f784e", "4a004186e63889f20cb16434fcbd72220bd1eace", "ba2ed02b0c9a56b9fdbc4e79c7e57866984d8a1f"]}]
2550 o f897c6137566
2549 o f897c6137566
2551 |
2550 |
2552 | x 0dec01379d3b
2551 | x 0dec01379d3b
2553 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["f897c6137566320b081514b4c7227ecc3d384b39"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["f897c6137566320b081514b4c7227ecc3d384b39"]}, {"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["471f378eab4c5e25f6c77f785b27c936efb22874"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["471f378eab4c5e25f6c77f785b27c936efb22874"]}]
2552 | | Obsfate: [{"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["f897c6137566320b081514b4c7227ecc3d384b39"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["f897c6137566320b081514b4c7227ecc3d384b39"]}, {"markers": [["0dec01379d3be6318c470ead31b1fe7ae7cb53d5", ["471f378eab4c5e25f6c77f785b27c936efb22874"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["471f378eab4c5e25f6c77f785b27c936efb22874"]}]
2554 | x 471f378eab4c
2553 | x 471f378eab4c
2555 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]}]
2554 |/ Obsfate: [{"markers": [["471f378eab4c5e25f6c77f785b27c936efb22874", ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"], 0, [["user", "test"]], [0.0, 0], null]], "successors": ["0dec01379d3be6318c470ead31b1fe7ae7cb53d5"]}]
2556 o ea207398892e
2555 o ea207398892e
2557
2556
2558 $ hg up --hidden 4
2557 $ hg up --hidden 4
2559 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2558 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2560 updated to hidden changeset 9bd10a0775e4
2559 updated to hidden changeset 9bd10a0775e4
2561 (hidden revision '9bd10a0775e4' has diverged)
2560 (hidden revision '9bd10a0775e4' has diverged)
2562 $ hg rebase -r 7 -d 8 --config extensions.rebase=
2561 $ hg rebase -r 7 -d 8 --config extensions.rebase=
2563 rebasing 7:ba2ed02b0c9a "Add A,B,C"
2562 rebasing 7:ba2ed02b0c9a "Add A,B,C"
2564 $ hg tlog
2563 $ hg tlog
2565 * eceed8f98ffc
2564 o eceed8f98ffc
2566 | Predecessors: 4:9bd10a0775e4
2565 | Predecessors: 4:9bd10a0775e4
2567 | semi-colon: 4:9bd10a0775e4
2566 | semi-colon: 4:9bd10a0775e4
2568 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2567 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2569 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2568 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2570 | Successors:
2569 | Successors:
2571 | multi-line:
2570 | multi-line:
2572 | json: []
2571 | json: []
2573 | * 0b997eb7ceee
2572 | * 0b997eb7ceee
2574 | | Predecessors: 4:9bd10a0775e4
2573 | | Predecessors: 4:9bd10a0775e4
2575 | | semi-colon: 4:9bd10a0775e4
2574 | | semi-colon: 4:9bd10a0775e4
2576 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2575 | | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2577 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2576 | | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2578 | | Successors:
2577 | | Successors:
2579 | | multi-line:
2578 | | multi-line:
2580 | | json: []
2579 | | json: []
2581 * | b18bc8331526
2580 * | b18bc8331526
2582 |/ Predecessors: 4:9bd10a0775e4
2581 |/ Predecessors: 4:9bd10a0775e4
2583 | semi-colon: 4:9bd10a0775e4
2582 | semi-colon: 4:9bd10a0775e4
2584 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2583 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2585 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2584 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2586 | Successors:
2585 | Successors:
2587 | multi-line:
2586 | multi-line:
2588 | json: []
2587 | json: []
2589 * dd800401bd8c
2588 o dd800401bd8c
2590 | Predecessors: 4:9bd10a0775e4
2589 | Predecessors: 4:9bd10a0775e4
2591 | semi-colon: 4:9bd10a0775e4
2590 | semi-colon: 4:9bd10a0775e4
2592 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2591 | json: ["9bd10a0775e478708cada5f176ec6de654359ce7"]
2593 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2592 | map: 4:9bd10a0775e478708cada5f176ec6de654359ce7
2594 | Successors:
2593 | Successors:
2595 | multi-line:
2594 | multi-line:
2596 | json: []
2595 | json: []
2597 | @ 9bd10a0775e4
2596 | @ 9bd10a0775e4
2598 |/ Predecessors:
2597 |/ Predecessors:
2599 | semi-colon:
2598 | semi-colon:
2600 | json: []
2599 | json: []
2601 | map:
2600 | map:
2602 | Successors: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc; 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
2601 | Successors: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc; 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
2603 | multi-line: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc
2602 | multi-line: 5:dd800401bd8c 9:0b997eb7ceee 10:eceed8f98ffc
2604 | multi-line: 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
2603 | multi-line: 5:dd800401bd8c 8:b18bc8331526 10:eceed8f98ffc
2605 | json: [["dd800401bd8c79d815329277739e433e883f784e", "0b997eb7ceeee06200a02f8aab185979092d514e", "eceed8f98ffc4186032e29a6542ab98888ebf68d"], ["dd800401bd8c79d815329277739e433e883f784e", "b18bc8331526a22cbb1801022bd1555bf291c48b", "eceed8f98ffc4186032e29a6542ab98888ebf68d"]]
2604 | json: [["dd800401bd8c79d815329277739e433e883f784e", "0b997eb7ceeee06200a02f8aab185979092d514e", "eceed8f98ffc4186032e29a6542ab98888ebf68d"], ["dd800401bd8c79d815329277739e433e883f784e", "b18bc8331526a22cbb1801022bd1555bf291c48b", "eceed8f98ffc4186032e29a6542ab98888ebf68d"]]
2606 o f897c6137566
2605 o f897c6137566
2607 | Predecessors:
2606 | Predecessors:
2608 | semi-colon:
2607 | semi-colon:
2609 | json: []
2608 | json: []
2610 | map:
2609 | map:
2611 | Successors:
2610 | Successors:
2612 | multi-line:
2611 | multi-line:
2613 | json: []
2612 | json: []
2614 o ea207398892e
2613 o ea207398892e
2615 Predecessors:
2614 Predecessors:
2616 semi-colon:
2615 semi-colon:
2617 json: []
2616 json: []
2618 map:
2617 map:
2619 Successors:
2618 Successors:
2620 multi-line:
2619 multi-line:
2621 json: []
2620 json: []
2622
2621
2623 $ hg fatelog
2622 $ hg fatelog
2624 * eceed8f98ffc
2623 o eceed8f98ffc
2625 |
2624 |
2626 | * 0b997eb7ceee
2625 | * 0b997eb7ceee
2627 | |
2626 | |
2628 * | b18bc8331526
2627 * | b18bc8331526
2629 |/
2628 |/
2630 * dd800401bd8c
2629 o dd800401bd8c
2631 |
2630 |
2632 | @ 9bd10a0775e4
2631 | @ 9bd10a0775e4
2633 |/ Obsfate: split using amend, rebase as 5:dd800401bd8c, 9:0b997eb7ceee, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000); split using amend, rebase as 5:dd800401bd8c, 8:b18bc8331526, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000);
2632 |/ Obsfate: split using amend, rebase as 5:dd800401bd8c, 9:0b997eb7ceee, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000); split using amend, rebase as 5:dd800401bd8c, 8:b18bc8331526, 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000);
2634 o f897c6137566
2633 o f897c6137566
2635 |
2634 |
2636 o ea207398892e
2635 o ea207398892e
2637
2636
2638 Check other fatelog implementations
2637 Check other fatelog implementations
2639 -----------------------------------
2638 -----------------------------------
2640
2639
2641 $ hg fatelogkw --hidden -q
2640 $ hg fatelogkw --hidden -q
2642 * eceed8f98ffc
2641 o eceed8f98ffc
2643 |
2642 |
2644 | * 0b997eb7ceee
2643 | * 0b997eb7ceee
2645 | |
2644 | |
2646 * | b18bc8331526
2645 * | b18bc8331526
2647 |/
2646 |/
2648 | x ba2ed02b0c9a
2647 | x ba2ed02b0c9a
2649 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc
2648 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc
2650 | x 4a004186e638
2649 | x 4a004186e638
2651 |/ Obsfate: rewritten using amend as 8:b18bc8331526
2650 |/ Obsfate: rewritten using amend as 8:b18bc8331526
2652 | Obsfate: rewritten using amend as 9:0b997eb7ceee
2651 | Obsfate: rewritten using amend as 9:0b997eb7ceee
2653 * dd800401bd8c
2652 o dd800401bd8c
2654 |
2653 |
2655 | @ 9bd10a0775e4
2654 | @ 9bd10a0775e4
2656 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2655 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2657 o f897c6137566
2656 o f897c6137566
2658 |
2657 |
2659 | x 0dec01379d3b
2658 | x 0dec01379d3b
2660 | | Obsfate: rewritten as 3:f897c6137566
2659 | | Obsfate: rewritten as 3:f897c6137566
2661 | | Obsfate: rewritten as 1:471f378eab4c
2660 | | Obsfate: rewritten as 1:471f378eab4c
2662 | x 471f378eab4c
2661 | x 471f378eab4c
2663 |/ Obsfate: rewritten as 2:0dec01379d3b
2662 |/ Obsfate: rewritten as 2:0dec01379d3b
2664 o ea207398892e
2663 o ea207398892e
2665
2664
2666 $ hg fatelogkw --hidden
2665 $ hg fatelogkw --hidden
2667 * eceed8f98ffc
2666 o eceed8f98ffc
2668 |
2667 |
2669 | * 0b997eb7ceee
2668 | * 0b997eb7ceee
2670 | |
2669 | |
2671 * | b18bc8331526
2670 * | b18bc8331526
2672 |/
2671 |/
2673 | x ba2ed02b0c9a
2672 | x ba2ed02b0c9a
2674 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc
2673 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc
2675 | x 4a004186e638
2674 | x 4a004186e638
2676 |/ Obsfate: rewritten using amend as 8:b18bc8331526
2675 |/ Obsfate: rewritten using amend as 8:b18bc8331526
2677 | Obsfate: rewritten using amend as 9:0b997eb7ceee
2676 | Obsfate: rewritten using amend as 9:0b997eb7ceee
2678 * dd800401bd8c
2677 o dd800401bd8c
2679 |
2678 |
2680 | @ 9bd10a0775e4
2679 | @ 9bd10a0775e4
2681 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2680 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2682 o f897c6137566
2681 o f897c6137566
2683 |
2682 |
2684 | x 0dec01379d3b
2683 | x 0dec01379d3b
2685 | | Obsfate: rewritten as 3:f897c6137566
2684 | | Obsfate: rewritten as 3:f897c6137566
2686 | | Obsfate: rewritten as 1:471f378eab4c
2685 | | Obsfate: rewritten as 1:471f378eab4c
2687 | x 471f378eab4c
2686 | x 471f378eab4c
2688 |/ Obsfate: rewritten as 2:0dec01379d3b
2687 |/ Obsfate: rewritten as 2:0dec01379d3b
2689 o ea207398892e
2688 o ea207398892e
2690
2689
2691 $ hg fatelogkw --hidden -v
2690 $ hg fatelogkw --hidden -v
2692 * eceed8f98ffc
2691 o eceed8f98ffc
2693 |
2692 |
2694 | * 0b997eb7ceee
2693 | * 0b997eb7ceee
2695 | |
2694 | |
2696 * | b18bc8331526
2695 * | b18bc8331526
2697 |/
2696 |/
2698 | x ba2ed02b0c9a
2697 | x ba2ed02b0c9a
2699 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000)
2698 | | Obsfate: rewritten using rebase as 10:eceed8f98ffc by test (at 1970-01-01 00:00 +0000)
2700 | x 4a004186e638
2699 | x 4a004186e638
2701 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000)
2700 |/ Obsfate: rewritten using amend as 8:b18bc8331526 by test (at 1970-01-01 00:00 +0000)
2702 | Obsfate: rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000)
2701 | Obsfate: rewritten using amend as 9:0b997eb7ceee by test (at 1970-01-01 00:00 +0000)
2703 * dd800401bd8c
2702 o dd800401bd8c
2704 |
2703 |
2705 | @ 9bd10a0775e4
2704 | @ 9bd10a0775e4
2706 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a by test (at 1970-01-01 00:00 +0000)
2705 |/ Obsfate: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a by test (at 1970-01-01 00:00 +0000)
2707 o f897c6137566
2706 o f897c6137566
2708 |
2707 |
2709 | x 0dec01379d3b
2708 | x 0dec01379d3b
2710 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000)
2709 | | Obsfate: rewritten as 3:f897c6137566 by test (at 1970-01-01 00:00 +0000)
2711 | | Obsfate: rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000)
2710 | | Obsfate: rewritten as 1:471f378eab4c by test (at 1970-01-01 00:00 +0000)
2712 | x 471f378eab4c
2711 | x 471f378eab4c
2713 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000)
2712 |/ Obsfate: rewritten as 2:0dec01379d3b by test (at 1970-01-01 00:00 +0000)
2714 o ea207398892e
2713 o ea207398892e
2715
2714
2716 $ hg log -G -T "default" --hidden
2715 $ hg log -G -T "default" --hidden
2717 * changeset: 10:eceed8f98ffc
2716 o changeset: 10:eceed8f98ffc
2718 | tag: tip
2717 | tag: tip
2719 | parent: 8:b18bc8331526
2718 | parent: 8:b18bc8331526
2720 | user: test
2719 | user: test
2721 | date: Thu Jan 01 00:00:00 1970 +0000
2720 | date: Thu Jan 01 00:00:00 1970 +0000
2722 | instability: content-divergent
2723 | summary: Add A,B,C
2721 | summary: Add A,B,C
2724 |
2722 |
2725 | * changeset: 9:0b997eb7ceee
2723 | * changeset: 9:0b997eb7ceee
2726 | | parent: 5:dd800401bd8c
2724 | | parent: 5:dd800401bd8c
2727 | | user: test
2725 | | user: test
2728 | | date: Thu Jan 01 00:00:00 1970 +0000
2726 | | date: Thu Jan 01 00:00:00 1970 +0000
2729 | | instability: content-divergent
2727 | | instability: content-divergent
2730 | | summary: Add B only
2728 | | summary: Add B only
2731 | |
2729 | |
2732 * | changeset: 8:b18bc8331526
2730 * | changeset: 8:b18bc8331526
2733 |/ parent: 5:dd800401bd8c
2731 |/ parent: 5:dd800401bd8c
2734 | user: test
2732 | user: test
2735 | date: Thu Jan 01 00:00:00 1970 +0000
2733 | date: Thu Jan 01 00:00:00 1970 +0000
2736 | instability: content-divergent
2734 | instability: content-divergent
2737 | summary: Add only B
2735 | summary: Add only B
2738 |
2736 |
2739 | x changeset: 7:ba2ed02b0c9a
2737 | x changeset: 7:ba2ed02b0c9a
2740 | | user: test
2738 | | user: test
2741 | | date: Thu Jan 01 00:00:00 1970 +0000
2739 | | date: Thu Jan 01 00:00:00 1970 +0000
2742 | | obsolete: rewritten using rebase as 10:eceed8f98ffc
2740 | | obsolete: rewritten using rebase as 10:eceed8f98ffc
2743 | | summary: Add A,B,C
2741 | | summary: Add A,B,C
2744 | |
2742 | |
2745 | x changeset: 6:4a004186e638
2743 | x changeset: 6:4a004186e638
2746 |/ user: test
2744 |/ user: test
2747 | date: Thu Jan 01 00:00:00 1970 +0000
2745 | date: Thu Jan 01 00:00:00 1970 +0000
2748 | obsolete: rewritten using amend as 8:b18bc8331526
2746 | obsolete: rewritten using amend as 8:b18bc8331526
2749 | obsolete: rewritten using amend as 9:0b997eb7ceee
2747 | obsolete: rewritten using amend as 9:0b997eb7ceee
2750 | summary: Add A,B,C
2748 | summary: Add A,B,C
2751 |
2749 |
2752 * changeset: 5:dd800401bd8c
2750 o changeset: 5:dd800401bd8c
2753 | parent: 3:f897c6137566
2751 | parent: 3:f897c6137566
2754 | user: test
2752 | user: test
2755 | date: Thu Jan 01 00:00:00 1970 +0000
2753 | date: Thu Jan 01 00:00:00 1970 +0000
2756 | instability: content-divergent
2757 | summary: Add A,B,C
2754 | summary: Add A,B,C
2758 |
2755 |
2759 | @ changeset: 4:9bd10a0775e4
2756 | @ changeset: 4:9bd10a0775e4
2760 |/ user: test
2757 |/ user: test
2761 | date: Thu Jan 01 00:00:00 1970 +0000
2758 | date: Thu Jan 01 00:00:00 1970 +0000
2762 | obsolete: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2759 | obsolete: split as 5:dd800401bd8c, 6:4a004186e638, 7:ba2ed02b0c9a
2763 | summary: Add A,B,C
2760 | summary: Add A,B,C
2764 |
2761 |
2765 o changeset: 3:f897c6137566
2762 o changeset: 3:f897c6137566
2766 | parent: 0:ea207398892e
2763 | parent: 0:ea207398892e
2767 | user: test
2764 | user: test
2768 | date: Thu Jan 01 00:00:00 1970 +0000
2765 | date: Thu Jan 01 00:00:00 1970 +0000
2769 | summary: C0
2766 | summary: C0
2770 |
2767 |
2771 | x changeset: 2:0dec01379d3b
2768 | x changeset: 2:0dec01379d3b
2772 | | user: test
2769 | | user: test
2773 | | date: Thu Jan 01 00:00:00 1970 +0000
2770 | | date: Thu Jan 01 00:00:00 1970 +0000
2774 | | obsolete: rewritten as 3:f897c6137566
2771 | | obsolete: rewritten as 3:f897c6137566
2775 | | obsolete: rewritten as 1:471f378eab4c
2772 | | obsolete: rewritten as 1:471f378eab4c
2776 | | summary: B0
2773 | | summary: B0
2777 | |
2774 | |
2778 | x changeset: 1:471f378eab4c
2775 | x changeset: 1:471f378eab4c
2779 |/ user: test
2776 |/ user: test
2780 | date: Thu Jan 01 00:00:00 1970 +0000
2777 | date: Thu Jan 01 00:00:00 1970 +0000
2781 | obsolete: rewritten as 2:0dec01379d3b
2778 | obsolete: rewritten as 2:0dec01379d3b
2782 | summary: A0
2779 | summary: A0
2783 |
2780 |
2784 o changeset: 0:ea207398892e
2781 o changeset: 0:ea207398892e
2785 user: test
2782 user: test
2786 date: Thu Jan 01 00:00:00 1970 +0000
2783 date: Thu Jan 01 00:00:00 1970 +0000
2787 summary: ROOT
2784 summary: ROOT
2788
2785
2789
2786
2790 Test templates with pruned commits
2787 Test templates with pruned commits
2791 ==================================
2788 ==================================
2792
2789
2793 Test setup
2790 Test setup
2794 ----------
2791 ----------
2795
2792
2796 $ hg init $TESTTMP/templates-local-prune
2793 $ hg init $TESTTMP/templates-local-prune
2797 $ cd $TESTTMP/templates-local-prune
2794 $ cd $TESTTMP/templates-local-prune
2798 $ mkcommit ROOT
2795 $ mkcommit ROOT
2799 $ mkcommit A0
2796 $ mkcommit A0
2800 $ hg debugobsolete --record-parent `getid "."`
2797 $ hg debugobsolete --record-parent `getid "."`
2801 1 new obsolescence markers
2798 1 new obsolescence markers
2802 obsoleted 1 changesets
2799 obsoleted 1 changesets
2803
2800
2804 Check output
2801 Check output
2805 ------------
2802 ------------
2806
2803
2807 $ hg up "desc(A0)" --hidden
2804 $ hg up "desc(A0)" --hidden
2808 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2805 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2809 $ hg tlog
2806 $ hg tlog
2810 @ 471f378eab4c
2807 @ 471f378eab4c
2811 | Predecessors:
2808 | Predecessors:
2812 | semi-colon:
2809 | semi-colon:
2813 | json: []
2810 | json: []
2814 | map:
2811 | map:
2815 | Successors:
2812 | Successors:
2816 | multi-line:
2813 | multi-line:
2817 | json: []
2814 | json: []
2818 o ea207398892e
2815 o ea207398892e
2819 Predecessors:
2816 Predecessors:
2820 semi-colon:
2817 semi-colon:
2821 json: []
2818 json: []
2822 map:
2819 map:
2823 Successors:
2820 Successors:
2824 multi-line:
2821 multi-line:
2825 json: []
2822 json: []
2826 $ hg fatelog
2823 $ hg fatelog
2827 @ 471f378eab4c
2824 @ 471f378eab4c
2828 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2825 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2829 o ea207398892e
2826 o ea207398892e
2830
2827
2831 Test templates with multiple pruned commits
2828 Test templates with multiple pruned commits
2832 ===========================================
2829 ===========================================
2833
2830
2834 Test setup
2831 Test setup
2835 ----------
2832 ----------
2836
2833
2837 $ hg init $TESTTMP/multiple-local-prune
2834 $ hg init $TESTTMP/multiple-local-prune
2838 $ cd $TESTTMP/multiple-local-prune
2835 $ cd $TESTTMP/multiple-local-prune
2839 $ mkcommit ROOT
2836 $ mkcommit ROOT
2840 $ mkcommit A0
2837 $ mkcommit A0
2841 $ hg commit --amend -m "A1"
2838 $ hg commit --amend -m "A1"
2842 $ hg debugobsolete --record-parent `getid "."`
2839 $ hg debugobsolete --record-parent `getid "."`
2843 1 new obsolescence markers
2840 1 new obsolescence markers
2844 obsoleted 1 changesets
2841 obsoleted 1 changesets
2845
2842
2846 $ hg up -r "desc(A0)" --hidden
2843 $ hg up -r "desc(A0)" --hidden
2847 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2844 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2848 updated to hidden changeset 471f378eab4c
2845 updated to hidden changeset 471f378eab4c
2849 (hidden revision '471f378eab4c' is pruned)
2846 (hidden revision '471f378eab4c' is pruned)
2850 $ hg commit --amend -m "A2"
2847 $ hg commit --amend -m "A2"
2851 $ hg debugobsolete --record-parent `getid "."`
2848 $ hg debugobsolete --record-parent `getid "."`
2852 1 new obsolescence markers
2849 1 new obsolescence markers
2853 obsoleted 1 changesets
2850 obsoleted 1 changesets
2854
2851
2855 Check output
2852 Check output
2856 ------------
2853 ------------
2857
2854
2858 $ hg up "desc(A0)" --hidden
2855 $ hg up "desc(A0)" --hidden
2859 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2856 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
2860 updated to hidden changeset 471f378eab4c
2857 updated to hidden changeset 471f378eab4c
2861 (hidden revision '471f378eab4c' is pruned)
2858 (hidden revision '471f378eab4c' is pruned)
2862 $ hg tlog
2859 $ hg tlog
2863 @ 471f378eab4c
2860 @ 471f378eab4c
2864 | Predecessors:
2861 | Predecessors:
2865 | semi-colon:
2862 | semi-colon:
2866 | json: []
2863 | json: []
2867 | map:
2864 | map:
2868 | Successors:
2865 | Successors:
2869 | multi-line:
2866 | multi-line:
2870 | json: []
2867 | json: []
2871 o ea207398892e
2868 o ea207398892e
2872 Predecessors:
2869 Predecessors:
2873 semi-colon:
2870 semi-colon:
2874 json: []
2871 json: []
2875 map:
2872 map:
2876 Successors:
2873 Successors:
2877 multi-line:
2874 multi-line:
2878 json: []
2875 json: []
2879
2876
2880 # todo: the obsfate output is not ideal
2877 # todo: the obsfate output is not ideal
2881 $ hg fatelog
2878 $ hg fatelog
2882 @ 471f378eab4c
2879 @ 471f378eab4c
2883 | Obsfate: pruned;
2880 | Obsfate: pruned;
2884 o ea207398892e
2881 o ea207398892e
2885
2882
2886 $ hg fatelog --hidden
2883 $ hg fatelog --hidden
2887 x 65b757b745b9
2884 x 65b757b745b9
2888 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2885 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2889 | x fdf9bde5129a
2886 | x fdf9bde5129a
2890 |/ Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2887 |/ Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
2891 | @ 471f378eab4c
2888 | @ 471f378eab4c
2892 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
2889 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000); rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000);
2893 o ea207398892e
2890 o ea207398892e
2894
2891
2895 Check other fatelog implementations
2892 Check other fatelog implementations
2896 -----------------------------------
2893 -----------------------------------
2897
2894
2898 $ hg fatelogkw --hidden -q
2895 $ hg fatelogkw --hidden -q
2899 x 65b757b745b9
2896 x 65b757b745b9
2900 | Obsfate: pruned
2897 | Obsfate: pruned
2901 | x fdf9bde5129a
2898 | x fdf9bde5129a
2902 |/ Obsfate: pruned
2899 |/ Obsfate: pruned
2903 | @ 471f378eab4c
2900 | @ 471f378eab4c
2904 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
2901 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
2905 | Obsfate: rewritten using amend as 3:65b757b745b9
2902 | Obsfate: rewritten using amend as 3:65b757b745b9
2906 o ea207398892e
2903 o ea207398892e
2907
2904
2908 $ hg fatelogkw --hidden
2905 $ hg fatelogkw --hidden
2909 x 65b757b745b9
2906 x 65b757b745b9
2910 | Obsfate: pruned
2907 | Obsfate: pruned
2911 | x fdf9bde5129a
2908 | x fdf9bde5129a
2912 |/ Obsfate: pruned
2909 |/ Obsfate: pruned
2913 | @ 471f378eab4c
2910 | @ 471f378eab4c
2914 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
2911 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a
2915 | Obsfate: rewritten using amend as 3:65b757b745b9
2912 | Obsfate: rewritten using amend as 3:65b757b745b9
2916 o ea207398892e
2913 o ea207398892e
2917
2914
2918 $ hg fatelogkw --hidden -v
2915 $ hg fatelogkw --hidden -v
2919 x 65b757b745b9
2916 x 65b757b745b9
2920 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
2917 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
2921 | x fdf9bde5129a
2918 | x fdf9bde5129a
2922 |/ Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
2919 |/ Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
2923 | @ 471f378eab4c
2920 | @ 471f378eab4c
2924 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000)
2921 |/ Obsfate: rewritten using amend as 2:fdf9bde5129a by test (at 1970-01-01 00:00 +0000)
2925 | Obsfate: rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000)
2922 | Obsfate: rewritten using amend as 3:65b757b745b9 by test (at 1970-01-01 00:00 +0000)
2926 o ea207398892e
2923 o ea207398892e
2927
2924
2928
2925
2929 $ hg log -G -T "default" --hidden
2926 $ hg log -G -T "default" --hidden
2930 x changeset: 3:65b757b745b9
2927 x changeset: 3:65b757b745b9
2931 | tag: tip
2928 | tag: tip
2932 | parent: 0:ea207398892e
2929 | parent: 0:ea207398892e
2933 | user: test
2930 | user: test
2934 | date: Thu Jan 01 00:00:00 1970 +0000
2931 | date: Thu Jan 01 00:00:00 1970 +0000
2935 | obsolete: pruned
2932 | obsolete: pruned
2936 | summary: A2
2933 | summary: A2
2937 |
2934 |
2938 | x changeset: 2:fdf9bde5129a
2935 | x changeset: 2:fdf9bde5129a
2939 |/ parent: 0:ea207398892e
2936 |/ parent: 0:ea207398892e
2940 | user: test
2937 | user: test
2941 | date: Thu Jan 01 00:00:00 1970 +0000
2938 | date: Thu Jan 01 00:00:00 1970 +0000
2942 | obsolete: pruned
2939 | obsolete: pruned
2943 | summary: A1
2940 | summary: A1
2944 |
2941 |
2945 | @ changeset: 1:471f378eab4c
2942 | @ changeset: 1:471f378eab4c
2946 |/ user: test
2943 |/ user: test
2947 | date: Thu Jan 01 00:00:00 1970 +0000
2944 | date: Thu Jan 01 00:00:00 1970 +0000
2948 | obsolete: rewritten using amend as 2:fdf9bde5129a
2945 | obsolete: rewritten using amend as 2:fdf9bde5129a
2949 | obsolete: rewritten using amend as 3:65b757b745b9
2946 | obsolete: rewritten using amend as 3:65b757b745b9
2950 | summary: A0
2947 | summary: A0
2951 |
2948 |
2952 o changeset: 0:ea207398892e
2949 o changeset: 0:ea207398892e
2953 user: test
2950 user: test
2954 date: Thu Jan 01 00:00:00 1970 +0000
2951 date: Thu Jan 01 00:00:00 1970 +0000
2955 summary: ROOT
2952 summary: ROOT
2956
2953
2957 Check that {negrev} shows usable negative revisions despite hidden commits
2954 Check that {negrev} shows usable negative revisions despite hidden commits
2958
2955
2959 $ hg log -G -T "{negrev}\n"
2956 $ hg log -G -T "{negrev}\n"
2960 @ -3
2957 @ -3
2961 |
2958 |
2962 o -4
2959 o -4
2963
2960
2964
2961
2965 $ hg log -G -T "{negrev}\n" --hidden
2962 $ hg log -G -T "{negrev}\n" --hidden
2966 x -1
2963 x -1
2967 |
2964 |
2968 | x -2
2965 | x -2
2969 |/
2966 |/
2970 | @ -3
2967 | @ -3
2971 |/
2968 |/
2972 o -4
2969 o -4
2973
2970
2974
2971
2975 Test templates with splitted and pruned commit
2972 Test templates with splitted and pruned commit
2976 ==============================================
2973 ==============================================
2977
2974
2978 $ hg init $TESTTMP/templates-local-split-prune
2975 $ hg init $TESTTMP/templates-local-split-prune
2979 $ cd $TESTTMP/templates-local-split-prune
2976 $ cd $TESTTMP/templates-local-split-prune
2980 $ mkcommit ROOT
2977 $ mkcommit ROOT
2981 $ echo 42 >> a
2978 $ echo 42 >> a
2982 $ echo 43 >> b
2979 $ echo 43 >> b
2983 $ hg commit -A -m "A0"
2980 $ hg commit -A -m "A0"
2984 adding a
2981 adding a
2985 adding b
2982 adding b
2986 $ hg log --hidden -G
2983 $ hg log --hidden -G
2987 @ changeset: 1:471597cad322
2984 @ changeset: 1:471597cad322
2988 | tag: tip
2985 | tag: tip
2989 | user: test
2986 | user: test
2990 | date: Thu Jan 01 00:00:00 1970 +0000
2987 | date: Thu Jan 01 00:00:00 1970 +0000
2991 | summary: A0
2988 | summary: A0
2992 |
2989 |
2993 o changeset: 0:ea207398892e
2990 o changeset: 0:ea207398892e
2994 user: test
2991 user: test
2995 date: Thu Jan 01 00:00:00 1970 +0000
2992 date: Thu Jan 01 00:00:00 1970 +0000
2996 summary: ROOT
2993 summary: ROOT
2997
2994
2998 # Simulate split
2995 # Simulate split
2999 $ hg up -r "desc(ROOT)"
2996 $ hg up -r "desc(ROOT)"
3000 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
2997 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
3001 $ echo 42 >> a
2998 $ echo 42 >> a
3002 $ hg commit -A -m "A1"
2999 $ hg commit -A -m "A1"
3003 adding a
3000 adding a
3004 created new head
3001 created new head
3005 $ echo 43 >> b
3002 $ echo 43 >> b
3006 $ hg commit -A -m "A2"
3003 $ hg commit -A -m "A2"
3007 adding b
3004 adding b
3008 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
3005 $ hg debugobsolete `getid "1"` `getid "2"` `getid "3"`
3009 1 new obsolescence markers
3006 1 new obsolescence markers
3010 obsoleted 1 changesets
3007 obsoleted 1 changesets
3011
3008
3012 # Simulate prune
3009 # Simulate prune
3013 $ hg debugobsolete --record-parent `getid "."`
3010 $ hg debugobsolete --record-parent `getid "."`
3014 1 new obsolescence markers
3011 1 new obsolescence markers
3015 obsoleted 1 changesets
3012 obsoleted 1 changesets
3016
3013
3017 $ hg log --hidden -G
3014 $ hg log --hidden -G
3018 @ changeset: 3:0d0ef4bdf70e
3015 @ changeset: 3:0d0ef4bdf70e
3019 | tag: tip
3016 | tag: tip
3020 | user: test
3017 | user: test
3021 | date: Thu Jan 01 00:00:00 1970 +0000
3018 | date: Thu Jan 01 00:00:00 1970 +0000
3022 | obsolete: pruned
3019 | obsolete: pruned
3023 | summary: A2
3020 | summary: A2
3024 |
3021 |
3025 o changeset: 2:617adc3a144c
3022 o changeset: 2:617adc3a144c
3026 | parent: 0:ea207398892e
3023 | parent: 0:ea207398892e
3027 | user: test
3024 | user: test
3028 | date: Thu Jan 01 00:00:00 1970 +0000
3025 | date: Thu Jan 01 00:00:00 1970 +0000
3029 | summary: A1
3026 | summary: A1
3030 |
3027 |
3031 | x changeset: 1:471597cad322
3028 | x changeset: 1:471597cad322
3032 |/ user: test
3029 |/ user: test
3033 | date: Thu Jan 01 00:00:00 1970 +0000
3030 | date: Thu Jan 01 00:00:00 1970 +0000
3034 | obsolete: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3031 | obsolete: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3035 | summary: A0
3032 | summary: A0
3036 |
3033 |
3037 o changeset: 0:ea207398892e
3034 o changeset: 0:ea207398892e
3038 user: test
3035 user: test
3039 date: Thu Jan 01 00:00:00 1970 +0000
3036 date: Thu Jan 01 00:00:00 1970 +0000
3040 summary: ROOT
3037 summary: ROOT
3041
3038
3042 Check templates
3039 Check templates
3043 ---------------
3040 ---------------
3044
3041
3045 $ hg up 'desc("A0")' --hidden
3042 $ hg up 'desc("A0")' --hidden
3046 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
3043 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
3047 updated to hidden changeset 471597cad322
3044 updated to hidden changeset 471597cad322
3048 (hidden revision '471597cad322' was rewritten as: 617adc3a144c)
3045 (hidden revision '471597cad322' was rewritten as: 617adc3a144c)
3049
3046
3050 # todo: the obsfate output is not ideal
3047 # todo: the obsfate output is not ideal
3051 $ hg fatelog
3048 $ hg fatelog
3052 o 617adc3a144c
3049 o 617adc3a144c
3053 |
3050 |
3054 | @ 471597cad322
3051 | @ 471597cad322
3055 |/ Obsfate: rewritten as 2:617adc3a144c by test (at 1970-01-01 00:00 +0000);
3052 |/ Obsfate: rewritten as 2:617adc3a144c by test (at 1970-01-01 00:00 +0000);
3056 o ea207398892e
3053 o ea207398892e
3057
3054
3058 $ hg up -r 'desc("A2")' --hidden
3055 $ hg up -r 'desc("A2")' --hidden
3059 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
3056 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
3060 updated to hidden changeset 0d0ef4bdf70e
3057 updated to hidden changeset 0d0ef4bdf70e
3061 (hidden revision '0d0ef4bdf70e' is pruned)
3058 (hidden revision '0d0ef4bdf70e' is pruned)
3062
3059
3063 $ hg fatelog --hidden
3060 $ hg fatelog --hidden
3064 @ 0d0ef4bdf70e
3061 @ 0d0ef4bdf70e
3065 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
3062 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000);
3066 o 617adc3a144c
3063 o 617adc3a144c
3067 |
3064 |
3068 | x 471597cad322
3065 | x 471597cad322
3069 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e by test (at 1970-01-01 00:00 +0000);
3066 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e by test (at 1970-01-01 00:00 +0000);
3070 o ea207398892e
3067 o ea207398892e
3071
3068
3072
3069
3073 Check other fatelog implementations
3070 Check other fatelog implementations
3074 -----------------------------------
3071 -----------------------------------
3075
3072
3076 $ hg fatelogkw --hidden -q
3073 $ hg fatelogkw --hidden -q
3077 @ 0d0ef4bdf70e
3074 @ 0d0ef4bdf70e
3078 | Obsfate: pruned
3075 | Obsfate: pruned
3079 o 617adc3a144c
3076 o 617adc3a144c
3080 |
3077 |
3081 | x 471597cad322
3078 | x 471597cad322
3082 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3079 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3083 o ea207398892e
3080 o ea207398892e
3084
3081
3085 $ hg fatelogkw --hidden
3082 $ hg fatelogkw --hidden
3086 @ 0d0ef4bdf70e
3083 @ 0d0ef4bdf70e
3087 | Obsfate: pruned
3084 | Obsfate: pruned
3088 o 617adc3a144c
3085 o 617adc3a144c
3089 |
3086 |
3090 | x 471597cad322
3087 | x 471597cad322
3091 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3088 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3092 o ea207398892e
3089 o ea207398892e
3093
3090
3094 $ hg fatelogkw --hidden -v
3091 $ hg fatelogkw --hidden -v
3095 @ 0d0ef4bdf70e
3092 @ 0d0ef4bdf70e
3096 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
3093 | Obsfate: pruned by test (at 1970-01-01 00:00 +0000)
3097 o 617adc3a144c
3094 o 617adc3a144c
3098 |
3095 |
3099 | x 471597cad322
3096 | x 471597cad322
3100 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e by test (at 1970-01-01 00:00 +0000)
3097 |/ Obsfate: split as 2:617adc3a144c, 3:0d0ef4bdf70e by test (at 1970-01-01 00:00 +0000)
3101 o ea207398892e
3098 o ea207398892e
3102
3099
3103 $ hg log -G -T "default" --hidden
3100 $ hg log -G -T "default" --hidden
3104 @ changeset: 3:0d0ef4bdf70e
3101 @ changeset: 3:0d0ef4bdf70e
3105 | tag: tip
3102 | tag: tip
3106 | user: test
3103 | user: test
3107 | date: Thu Jan 01 00:00:00 1970 +0000
3104 | date: Thu Jan 01 00:00:00 1970 +0000
3108 | obsolete: pruned
3105 | obsolete: pruned
3109 | summary: A2
3106 | summary: A2
3110 |
3107 |
3111 o changeset: 2:617adc3a144c
3108 o changeset: 2:617adc3a144c
3112 | parent: 0:ea207398892e
3109 | parent: 0:ea207398892e
3113 | user: test
3110 | user: test
3114 | date: Thu Jan 01 00:00:00 1970 +0000
3111 | date: Thu Jan 01 00:00:00 1970 +0000
3115 | summary: A1
3112 | summary: A1
3116 |
3113 |
3117 | x changeset: 1:471597cad322
3114 | x changeset: 1:471597cad322
3118 |/ user: test
3115 |/ user: test
3119 | date: Thu Jan 01 00:00:00 1970 +0000
3116 | date: Thu Jan 01 00:00:00 1970 +0000
3120 | obsolete: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3117 | obsolete: split as 2:617adc3a144c, 3:0d0ef4bdf70e
3121 | summary: A0
3118 | summary: A0
3122 |
3119 |
3123 o changeset: 0:ea207398892e
3120 o changeset: 0:ea207398892e
3124 user: test
3121 user: test
3125 date: Thu Jan 01 00:00:00 1970 +0000
3122 date: Thu Jan 01 00:00:00 1970 +0000
3126 summary: ROOT
3123 summary: ROOT
3127
3124
3128
3125
3129 Test metadata encoding (issue5754)
3126 Test metadata encoding (issue5754)
3130 ==================================
3127 ==================================
3131
3128
3132 $ hg init $TESTTMP/metadata-encoding
3129 $ hg init $TESTTMP/metadata-encoding
3133 $ cd $TESTTMP/metadata-encoding
3130 $ cd $TESTTMP/metadata-encoding
3134 $ cat <<'EOF' >> .hg/hgrc
3131 $ cat <<'EOF' >> .hg/hgrc
3135 > [extensions]
3132 > [extensions]
3136 > amend =
3133 > amend =
3137 > EOF
3134 > EOF
3138 $ "$PYTHON" <<'EOF'
3135 $ "$PYTHON" <<'EOF'
3139 > with open('test1', 'wb') as f:
3136 > with open('test1', 'wb') as f:
3140 > f.write(b't\xe8st1') and None
3137 > f.write(b't\xe8st1') and None
3141 > with open('test2', 'wb') as f:
3138 > with open('test2', 'wb') as f:
3142 > f.write(b't\xe8st2') and None
3139 > f.write(b't\xe8st2') and None
3143 > EOF
3140 > EOF
3144 $ mkcommit ROOT
3141 $ mkcommit ROOT
3145 $ ( HGENCODING=latin-1 HGUSER="`cat test1`" mkcommit A0 )
3142 $ ( HGENCODING=latin-1 HGUSER="`cat test1`" mkcommit A0 )
3146 $ echo 42 >> A0
3143 $ echo 42 >> A0
3147 $ HGENCODING=latin-1 hg amend -m "A1" --note "`cat test2`"
3144 $ HGENCODING=latin-1 hg amend -m "A1" --note "`cat test2`"
3148 $ HGENCODING=latin-1 hg amend -m "A2" \
3145 $ HGENCODING=latin-1 hg amend -m "A2" \
3149 > --config devel.user.obsmarker="`cat test2`"
3146 > --config devel.user.obsmarker="`cat test2`"
3150 $ mkcommit B0
3147 $ mkcommit B0
3151 $ HGENCODING=latin-1 hg debugobsolete -u "`cat test2`" "`getid 'desc(B0)'`"
3148 $ HGENCODING=latin-1 hg debugobsolete -u "`cat test2`" "`getid 'desc(B0)'`"
3152 1 new obsolescence markers
3149 1 new obsolescence markers
3153 obsoleted 1 changesets
3150 obsoleted 1 changesets
3154
3151
3155 metadata should be stored in UTF-8, and debugobsolete doesn't decode it to
3152 metadata should be stored in UTF-8, and debugobsolete doesn't decode it to
3156 local encoding since the command is supposed to show unmodified content:
3153 local encoding since the command is supposed to show unmodified content:
3157
3154
3158 $ HGENCODING=latin-1 hg debugobsolete
3155 $ HGENCODING=latin-1 hg debugobsolete
3159 5f66a482f0bb2fcaccfc215554ad5eb9f40b50f5 718c0d00cee1429bdb73064e0d88908c601507a8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'note': 't\xc3\xa8st2', 'operation': 'amend', 'user': 'test'}
3156 5f66a482f0bb2fcaccfc215554ad5eb9f40b50f5 718c0d00cee1429bdb73064e0d88908c601507a8 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'note': 't\xc3\xa8st2', 'operation': 'amend', 'user': 'test'}
3160 718c0d00cee1429bdb73064e0d88908c601507a8 1132562159b35bb27e1d6b80c80ee94a1659a4da 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 't\xc3\xa8st2'}
3157 718c0d00cee1429bdb73064e0d88908c601507a8 1132562159b35bb27e1d6b80c80ee94a1659a4da 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 't\xc3\xa8st2'}
3161 8f82db6f991db367fdbb3b6dba5e187ecc3ebd96 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 't\xc3\xa8st2'}
3158 8f82db6f991db367fdbb3b6dba5e187ecc3ebd96 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 't\xc3\xa8st2'}
3162
3159
3163 metadata should be converted back to local encoding when displaying:
3160 metadata should be converted back to local encoding when displaying:
3164
3161
3165 $ HGENCODING=latin-1 hg fatelog --hidden
3162 $ HGENCODING=latin-1 hg fatelog --hidden
3166 @ 8f82db6f991d
3163 @ 8f82db6f991d
3167 | Obsfate: pruned by t\xe8st2 (at 1970-01-01 00:00 +0000); (esc)
3164 | Obsfate: pruned by t\xe8st2 (at 1970-01-01 00:00 +0000); (esc)
3168 o 1132562159b3
3165 o 1132562159b3
3169 |
3166 |
3170 | x 718c0d00cee1
3167 | x 718c0d00cee1
3171 |/ Obsfate: rewritten using amend as 3:1132562159b3 by t\xe8st2 (at 1970-01-01 00:00 +0000); (esc)
3168 |/ Obsfate: rewritten using amend as 3:1132562159b3 by t\xe8st2 (at 1970-01-01 00:00 +0000); (esc)
3172 | x 5f66a482f0bb
3169 | x 5f66a482f0bb
3173 |/ Obsfate: rewritten using amend as 2:718c0d00cee1 by test (at 1970-01-01 00:00 +0000);
3170 |/ Obsfate: rewritten using amend as 2:718c0d00cee1 by test (at 1970-01-01 00:00 +0000);
3174 o ea207398892e
3171 o ea207398892e
3175
3172
3176 $ HGENCODING=utf-8 hg fatelog --hidden
3173 $ HGENCODING=utf-8 hg fatelog --hidden
3177 @ 8f82db6f991d
3174 @ 8f82db6f991d
3178 | Obsfate: pruned by t\xc3\xa8st2 (at 1970-01-01 00:00 +0000); (esc)
3175 | Obsfate: pruned by t\xc3\xa8st2 (at 1970-01-01 00:00 +0000); (esc)
3179 o 1132562159b3
3176 o 1132562159b3
3180 |
3177 |
3181 | x 718c0d00cee1
3178 | x 718c0d00cee1
3182 |/ Obsfate: rewritten using amend as 3:1132562159b3 by t\xc3\xa8st2 (at 1970-01-01 00:00 +0000); (esc)
3179 |/ Obsfate: rewritten using amend as 3:1132562159b3 by t\xc3\xa8st2 (at 1970-01-01 00:00 +0000); (esc)
3183 | x 5f66a482f0bb
3180 | x 5f66a482f0bb
3184 |/ Obsfate: rewritten using amend as 2:718c0d00cee1 by test (at 1970-01-01 00:00 +0000);
3181 |/ Obsfate: rewritten using amend as 2:718c0d00cee1 by test (at 1970-01-01 00:00 +0000);
3185 o ea207398892e
3182 o ea207398892e
3186
3183
3187 $ hg log -G -T "{negrev}\n"
3184 $ hg log -G -T "{negrev}\n"
3188 @ -1
3185 @ -1
3189 |
3186 |
3190 o -2
3187 o -2
3191 |
3188 |
3192 o -5
3189 o -5
3193
3190
@@ -1,798 +1,848 b''
1 Test file dedicated to testing the divergent troubles from obsolete changeset.
1 Test file dedicated to testing the divergent troubles from obsolete changeset.
2
2
3 This is the most complex troubles from far so we isolate it in a dedicated
3 This is the most complex troubles from far so we isolate it in a dedicated
4 file.
4 file.
5
5
6 Enable obsolete
6 Enable obsolete
7
7
8 $ cat >> $HGRCPATH << EOF
8 $ cat >> $HGRCPATH << EOF
9 > [ui]
9 > [ui]
10 > logtemplate = {rev}:{node|short} {desc}{if(obsfate, " [{join(obsfate, "; ")}]")}\n
10 > logtemplate = {rev}:{node|short} {desc}{if(obsfate, " [{join(obsfate, "; ")}]")}\n
11 > [experimental]
11 > [experimental]
12 > evolution.createmarkers=True
12 > evolution.createmarkers=True
13 > [extensions]
13 > [extensions]
14 > drawdag=$TESTDIR/drawdag.py
14 > drawdag=$TESTDIR/drawdag.py
15 > [alias]
15 > [alias]
16 > debugobsolete = debugobsolete -d '0 0'
16 > debugobsolete = debugobsolete -d '0 0'
17 > [phases]
17 > [phases]
18 > publish=False
18 > publish=False
19 > [templates]
19 > [templates]
20 > wuentryshort = '{instability}:{if(divergentnodes, " ")}{divergentnodes} {reason} {node|shortest}\n'
20 > wuentryshort = '{instability}:{if(divergentnodes, " ")}{divergentnodes} {reason} {node|shortest}\n'
21 > whyunstableshort = '{whyunstable % wuentryshort}'
21 > whyunstableshort = '{whyunstable % wuentryshort}'
22 > wuentryshorter = '{instability}:{divergentnodes % " {node|shortest} ({phase})"} {reason} {node|shortest}\n'
22 > wuentryshorter = '{instability}:{divergentnodes % " {node|shortest} ({phase})"} {reason} {node|shortest}\n'
23 > whyunstableshorter = '{whyunstable % wuentryshorter}'
23 > whyunstableshorter = '{whyunstable % wuentryshorter}'
24 > EOF
24 > EOF
25
25
26
26
27 $ mkcommit() {
27 $ mkcommit() {
28 > echo "$1" > "$1"
28 > echo "$1" > "$1"
29 > hg add "$1"
29 > hg add "$1"
30 > hg ci -m "$1"
30 > hg ci -m "$1"
31 > }
31 > }
32 $ getid() {
32 $ getid() {
33 > hg log --hidden -r "desc('$1')" -T '{node}\n'
33 > hg log --hidden -r "desc('$1')" -T '{node}\n'
34 > }
34 > }
35
35
36 setup repo
36 setup repo
37
37
38 $ hg init reference
38 $ hg init reference
39 $ cd reference
39 $ cd reference
40 $ mkcommit base
40 $ mkcommit base
41 $ mkcommit A_0
41 $ mkcommit A_0
42 $ hg up 0
42 $ hg up 0
43 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
43 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
44 $ mkcommit A_1
44 $ mkcommit A_1
45 created new head
45 created new head
46 $ hg up 0
46 $ hg up 0
47 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
47 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
48 $ mkcommit A_2
48 $ mkcommit A_2
49 created new head
49 created new head
50 $ hg up 0
50 $ hg up 0
51 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
51 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
52 $ cd ..
52 $ cd ..
53
53
54
54
55 $ newcase() {
55 $ newcase() {
56 > hg clone -u 0 -q reference $1
56 > hg clone -u 0 -q reference $1
57 > cd $1
57 > cd $1
58 > }
58 > }
59
59
60 direct divergence
60 direct divergence
61 -----------------
61 -----------------
62
62
63 A_1 have two direct and divergent successors A_1 and A_1
63 A_1 have two direct and divergent successors A_1 and A_1
64
64
65 $ newcase direct
65 $ newcase direct
66 $ hg debugobsolete `getid A_0` `getid A_1`
66 $ hg debugobsolete `getid A_0` `getid A_1`
67 1 new obsolescence markers
67 1 new obsolescence markers
68 obsoleted 1 changesets
68 obsoleted 1 changesets
69 $ hg debugobsolete `getid A_0` `getid A_2`
69 $ hg debugobsolete `getid A_0` `getid A_2`
70 1 new obsolescence markers
70 1 new obsolescence markers
71 2 new content-divergent changesets
71 2 new content-divergent changesets
72 $ hg log -G --hidden
72 $ hg log -G --hidden
73 * 3:392fd25390da A_2
73 * 3:392fd25390da A_2
74 |
74 |
75 | * 2:82623d38b9ba A_1
75 | * 2:82623d38b9ba A_1
76 |/
76 |/
77 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
77 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
78 |/
78 |/
79 @ 0:d20a80d4def3 base
79 @ 0:d20a80d4def3 base
80
80
81 $ hg debugsuccessorssets --hidden 'all()'
81 $ hg debugsuccessorssets --hidden 'all()'
82 d20a80d4def3
82 d20a80d4def3
83 d20a80d4def3
83 d20a80d4def3
84 007dc284c1f8
84 007dc284c1f8
85 82623d38b9ba
85 82623d38b9ba
86 392fd25390da
86 392fd25390da
87 82623d38b9ba
87 82623d38b9ba
88 82623d38b9ba
88 82623d38b9ba
89 392fd25390da
89 392fd25390da
90 392fd25390da
90 392fd25390da
91 $ hg log -r 'contentdivergent()'
91 $ hg log -r 'contentdivergent()'
92 2:82623d38b9ba A_1
92 2:82623d38b9ba A_1
93 3:392fd25390da A_2
93 3:392fd25390da A_2
94 $ hg log -r 'unstable()'
94 $ hg log -r 'unstable()'
95 2:82623d38b9ba A_1
95 2:82623d38b9ba A_1
96 3:392fd25390da A_2
96 3:392fd25390da A_2
97 $ hg debugsuccessorssets 'all()' --closest
97 $ hg debugsuccessorssets 'all()' --closest
98 d20a80d4def3
98 d20a80d4def3
99 d20a80d4def3
99 d20a80d4def3
100 82623d38b9ba
100 82623d38b9ba
101 82623d38b9ba
101 82623d38b9ba
102 392fd25390da
102 392fd25390da
103 392fd25390da
103 392fd25390da
104 $ hg debugsuccessorssets 'all()' --closest --hidden
104 $ hg debugsuccessorssets 'all()' --closest --hidden
105 d20a80d4def3
105 d20a80d4def3
106 d20a80d4def3
106 d20a80d4def3
107 007dc284c1f8
107 007dc284c1f8
108 82623d38b9ba
108 82623d38b9ba
109 392fd25390da
109 392fd25390da
110 82623d38b9ba
110 82623d38b9ba
111 82623d38b9ba
111 82623d38b9ba
112 392fd25390da
112 392fd25390da
113 392fd25390da
113 392fd25390da
114
114
115 check that mercurial refuse to push
115 check that mercurial refuse to push
116
116
117 $ hg init ../other
117 $ hg init ../other
118 $ hg push ../other
118 $ hg push ../other
119 pushing to ../other
119 pushing to ../other
120 searching for changes
120 searching for changes
121 abort: push includes content-divergent changeset: 392fd25390da!
121 abort: push includes content-divergent changeset: 392fd25390da!
122 [255]
122 [255]
123
123
124 $ cd ..
124 $ cd ..
125
125
126
126
127 indirect divergence with known changeset
127 indirect divergence with known changeset
128 -------------------------------------------
128 -------------------------------------------
129
129
130 $ newcase indirect_known
130 $ newcase indirect_known
131 $ hg debugobsolete `getid A_0` `getid A_1`
131 $ hg debugobsolete `getid A_0` `getid A_1`
132 1 new obsolescence markers
132 1 new obsolescence markers
133 obsoleted 1 changesets
133 obsoleted 1 changesets
134 $ hg debugobsolete `getid A_0` `getid A_2`
134 $ hg debugobsolete `getid A_0` `getid A_2`
135 1 new obsolescence markers
135 1 new obsolescence markers
136 2 new content-divergent changesets
136 2 new content-divergent changesets
137 $ mkcommit A_3
137 $ mkcommit A_3
138 created new head
138 created new head
139 $ hg debugobsolete `getid A_2` `getid A_3`
139 $ hg debugobsolete `getid A_2` `getid A_3`
140 1 new obsolescence markers
140 1 new obsolescence markers
141 obsoleted 1 changesets
141 obsoleted 1 changesets
142 $ hg log -G --hidden
142 $ hg log -G --hidden
143 @ 4:01f36c5a8fda A_3
143 @ 4:01f36c5a8fda A_3
144 |
144 |
145 | x 3:392fd25390da A_2 [rewritten as 4:01f36c5a8fda]
145 | x 3:392fd25390da A_2 [rewritten as 4:01f36c5a8fda]
146 |/
146 |/
147 | * 2:82623d38b9ba A_1
147 | * 2:82623d38b9ba A_1
148 |/
148 |/
149 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
149 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
150 |/
150 |/
151 o 0:d20a80d4def3 base
151 o 0:d20a80d4def3 base
152
152
153 $ hg debugsuccessorssets --hidden 'all()'
153 $ hg debugsuccessorssets --hidden 'all()'
154 d20a80d4def3
154 d20a80d4def3
155 d20a80d4def3
155 d20a80d4def3
156 007dc284c1f8
156 007dc284c1f8
157 82623d38b9ba
157 82623d38b9ba
158 01f36c5a8fda
158 01f36c5a8fda
159 82623d38b9ba
159 82623d38b9ba
160 82623d38b9ba
160 82623d38b9ba
161 392fd25390da
161 392fd25390da
162 01f36c5a8fda
162 01f36c5a8fda
163 01f36c5a8fda
163 01f36c5a8fda
164 01f36c5a8fda
164 01f36c5a8fda
165 $ hg log -r 'contentdivergent()'
165 $ hg log -r 'contentdivergent()'
166 2:82623d38b9ba A_1
166 2:82623d38b9ba A_1
167 4:01f36c5a8fda A_3
167 4:01f36c5a8fda A_3
168 $ hg debugsuccessorssets 'all()' --closest
168 $ hg debugsuccessorssets 'all()' --closest
169 d20a80d4def3
169 d20a80d4def3
170 d20a80d4def3
170 d20a80d4def3
171 82623d38b9ba
171 82623d38b9ba
172 82623d38b9ba
172 82623d38b9ba
173 01f36c5a8fda
173 01f36c5a8fda
174 01f36c5a8fda
174 01f36c5a8fda
175 $ hg debugsuccessorssets 'all()' --closest --hidden
175 $ hg debugsuccessorssets 'all()' --closest --hidden
176 d20a80d4def3
176 d20a80d4def3
177 d20a80d4def3
177 d20a80d4def3
178 007dc284c1f8
178 007dc284c1f8
179 82623d38b9ba
179 82623d38b9ba
180 392fd25390da
180 392fd25390da
181 82623d38b9ba
181 82623d38b9ba
182 82623d38b9ba
182 82623d38b9ba
183 392fd25390da
183 392fd25390da
184 392fd25390da
184 392fd25390da
185 01f36c5a8fda
185 01f36c5a8fda
186 01f36c5a8fda
186 01f36c5a8fda
187 $ cd ..
187 $ cd ..
188
188
189
189
190 indirect divergence with known changeset
190 indirect divergence with known changeset
191 -------------------------------------------
191 -------------------------------------------
192
192
193 $ newcase indirect_unknown
193 $ newcase indirect_unknown
194 $ hg debugobsolete `getid A_0` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
194 $ hg debugobsolete `getid A_0` aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
195 1 new obsolescence markers
195 1 new obsolescence markers
196 obsoleted 1 changesets
196 obsoleted 1 changesets
197 $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid A_1`
197 $ hg debugobsolete aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa `getid A_1`
198 1 new obsolescence markers
198 1 new obsolescence markers
199 $ hg debugobsolete `getid A_0` `getid A_2`
199 $ hg debugobsolete `getid A_0` `getid A_2`
200 1 new obsolescence markers
200 1 new obsolescence markers
201 2 new content-divergent changesets
201 2 new content-divergent changesets
202 $ hg log -G --hidden
202 $ hg log -G --hidden
203 * 3:392fd25390da A_2
203 * 3:392fd25390da A_2
204 |
204 |
205 | * 2:82623d38b9ba A_1
205 | * 2:82623d38b9ba A_1
206 |/
206 |/
207 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
207 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
208 |/
208 |/
209 @ 0:d20a80d4def3 base
209 @ 0:d20a80d4def3 base
210
210
211 $ hg debugsuccessorssets --hidden 'all()'
211 $ hg debugsuccessorssets --hidden 'all()'
212 d20a80d4def3
212 d20a80d4def3
213 d20a80d4def3
213 d20a80d4def3
214 007dc284c1f8
214 007dc284c1f8
215 82623d38b9ba
215 82623d38b9ba
216 392fd25390da
216 392fd25390da
217 82623d38b9ba
217 82623d38b9ba
218 82623d38b9ba
218 82623d38b9ba
219 392fd25390da
219 392fd25390da
220 392fd25390da
220 392fd25390da
221 $ hg log -r 'contentdivergent()'
221 $ hg log -r 'contentdivergent()'
222 2:82623d38b9ba A_1
222 2:82623d38b9ba A_1
223 3:392fd25390da A_2
223 3:392fd25390da A_2
224 $ hg debugsuccessorssets 'all()' --closest
224 $ hg debugsuccessorssets 'all()' --closest
225 d20a80d4def3
225 d20a80d4def3
226 d20a80d4def3
226 d20a80d4def3
227 82623d38b9ba
227 82623d38b9ba
228 82623d38b9ba
228 82623d38b9ba
229 392fd25390da
229 392fd25390da
230 392fd25390da
230 392fd25390da
231 $ hg debugsuccessorssets 'all()' --closest --hidden
231 $ hg debugsuccessorssets 'all()' --closest --hidden
232 d20a80d4def3
232 d20a80d4def3
233 d20a80d4def3
233 d20a80d4def3
234 007dc284c1f8
234 007dc284c1f8
235 82623d38b9ba
235 82623d38b9ba
236 392fd25390da
236 392fd25390da
237 82623d38b9ba
237 82623d38b9ba
238 82623d38b9ba
238 82623d38b9ba
239 392fd25390da
239 392fd25390da
240 392fd25390da
240 392fd25390da
241 $ cd ..
241 $ cd ..
242
242
243 do not take unknown node in account if they are final
243 do not take unknown node in account if they are final
244 -----------------------------------------------------
244 -----------------------------------------------------
245
245
246 $ newcase final-unknown
246 $ newcase final-unknown
247 $ hg debugobsolete `getid A_0` `getid A_1`
247 $ hg debugobsolete `getid A_0` `getid A_1`
248 1 new obsolescence markers
248 1 new obsolescence markers
249 obsoleted 1 changesets
249 obsoleted 1 changesets
250 $ hg debugobsolete `getid A_1` `getid A_2`
250 $ hg debugobsolete `getid A_1` `getid A_2`
251 1 new obsolescence markers
251 1 new obsolescence markers
252 obsoleted 1 changesets
252 obsoleted 1 changesets
253 $ hg debugobsolete `getid A_0` bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
253 $ hg debugobsolete `getid A_0` bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
254 1 new obsolescence markers
254 1 new obsolescence markers
255 $ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccc
255 $ hg debugobsolete bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccc
256 1 new obsolescence markers
256 1 new obsolescence markers
257 $ hg debugobsolete `getid A_1` dddddddddddddddddddddddddddddddddddddddd
257 $ hg debugobsolete `getid A_1` dddddddddddddddddddddddddddddddddddddddd
258 1 new obsolescence markers
258 1 new obsolescence markers
259
259
260 $ hg debugsuccessorssets --hidden 'desc('A_0')'
260 $ hg debugsuccessorssets --hidden 'desc('A_0')'
261 007dc284c1f8
261 007dc284c1f8
262 392fd25390da
262 392fd25390da
263 $ hg debugsuccessorssets 'desc('A_0')' --closest
263 $ hg debugsuccessorssets 'desc('A_0')' --closest
264 $ hg debugsuccessorssets 'desc('A_0')' --closest --hidden
264 $ hg debugsuccessorssets 'desc('A_0')' --closest --hidden
265 007dc284c1f8
265 007dc284c1f8
266 82623d38b9ba
266 82623d38b9ba
267
267
268 $ cd ..
268 $ cd ..
269
269
270 divergence that converge again is not divergence anymore
270 divergence that converge again is not divergence anymore
271 -----------------------------------------------------
271 -----------------------------------------------------
272
272
273 $ newcase converged_divergence
273 $ newcase converged_divergence
274 $ hg debugobsolete `getid A_0` `getid A_1`
274 $ hg debugobsolete `getid A_0` `getid A_1`
275 1 new obsolescence markers
275 1 new obsolescence markers
276 obsoleted 1 changesets
276 obsoleted 1 changesets
277 $ hg debugobsolete `getid A_0` `getid A_2`
277 $ hg debugobsolete `getid A_0` `getid A_2`
278 1 new obsolescence markers
278 1 new obsolescence markers
279 2 new content-divergent changesets
279 2 new content-divergent changesets
280 $ mkcommit A_3
280 $ mkcommit A_3
281 created new head
281 created new head
282 $ hg debugobsolete `getid A_1` `getid A_3`
282 $ hg debugobsolete `getid A_1` `getid A_3`
283 1 new obsolescence markers
283 1 new obsolescence markers
284 obsoleted 1 changesets
284 obsoleted 1 changesets
285 $ hg debugobsolete `getid A_2` `getid A_3`
285 $ hg debugobsolete `getid A_2` `getid A_3`
286 1 new obsolescence markers
286 1 new obsolescence markers
287 obsoleted 1 changesets
287 obsoleted 1 changesets
288 $ hg log -G --hidden
288 $ hg log -G --hidden
289 @ 4:01f36c5a8fda A_3
289 @ 4:01f36c5a8fda A_3
290 |
290 |
291 | x 3:392fd25390da A_2 [rewritten as 4:01f36c5a8fda]
291 | x 3:392fd25390da A_2 [rewritten as 4:01f36c5a8fda]
292 |/
292 |/
293 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
293 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
294 |/
294 |/
295 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
295 | x 1:007dc284c1f8 A_0 [rewritten as 2:82623d38b9ba; rewritten as 3:392fd25390da]
296 |/
296 |/
297 o 0:d20a80d4def3 base
297 o 0:d20a80d4def3 base
298
298
299 $ hg debugsuccessorssets --hidden 'all()'
299 $ hg debugsuccessorssets --hidden 'all()'
300 d20a80d4def3
300 d20a80d4def3
301 d20a80d4def3
301 d20a80d4def3
302 007dc284c1f8
302 007dc284c1f8
303 01f36c5a8fda
303 01f36c5a8fda
304 82623d38b9ba
304 82623d38b9ba
305 01f36c5a8fda
305 01f36c5a8fda
306 392fd25390da
306 392fd25390da
307 01f36c5a8fda
307 01f36c5a8fda
308 01f36c5a8fda
308 01f36c5a8fda
309 01f36c5a8fda
309 01f36c5a8fda
310 $ hg log -r 'contentdivergent()'
310 $ hg log -r 'contentdivergent()'
311 $ hg debugsuccessorssets 'all()' --closest
311 $ hg debugsuccessorssets 'all()' --closest
312 d20a80d4def3
312 d20a80d4def3
313 d20a80d4def3
313 d20a80d4def3
314 01f36c5a8fda
314 01f36c5a8fda
315 01f36c5a8fda
315 01f36c5a8fda
316 $ hg debugsuccessorssets 'all()' --closest --hidden
316 $ hg debugsuccessorssets 'all()' --closest --hidden
317 d20a80d4def3
317 d20a80d4def3
318 d20a80d4def3
318 d20a80d4def3
319 007dc284c1f8
319 007dc284c1f8
320 82623d38b9ba
320 82623d38b9ba
321 392fd25390da
321 392fd25390da
322 82623d38b9ba
322 82623d38b9ba
323 82623d38b9ba
323 82623d38b9ba
324 392fd25390da
324 392fd25390da
325 392fd25390da
325 392fd25390da
326 01f36c5a8fda
326 01f36c5a8fda
327 01f36c5a8fda
327 01f36c5a8fda
328 $ cd ..
328 $ cd ..
329
329
330 split is not divergences
330 split is not divergences
331 -----------------------------
331 -----------------------------
332
332
333 $ newcase split
333 $ newcase split
334 $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2`
334 $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2`
335 1 new obsolescence markers
335 1 new obsolescence markers
336 obsoleted 1 changesets
336 obsoleted 1 changesets
337 $ hg log -G --hidden
337 $ hg log -G --hidden
338 o 3:392fd25390da A_2
338 o 3:392fd25390da A_2
339 |
339 |
340 | o 2:82623d38b9ba A_1
340 | o 2:82623d38b9ba A_1
341 |/
341 |/
342 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
342 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
343 |/
343 |/
344 @ 0:d20a80d4def3 base
344 @ 0:d20a80d4def3 base
345
345
346 $ hg debugsuccessorssets --hidden 'all()'
346 $ hg debugsuccessorssets --hidden 'all()'
347 d20a80d4def3
347 d20a80d4def3
348 d20a80d4def3
348 d20a80d4def3
349 007dc284c1f8
349 007dc284c1f8
350 82623d38b9ba 392fd25390da
350 82623d38b9ba 392fd25390da
351 82623d38b9ba
351 82623d38b9ba
352 82623d38b9ba
352 82623d38b9ba
353 392fd25390da
353 392fd25390da
354 392fd25390da
354 392fd25390da
355 $ hg log -r 'contentdivergent()'
355 $ hg log -r 'contentdivergent()'
356 $ hg debugsuccessorssets 'all()' --closest
356 $ hg debugsuccessorssets 'all()' --closest
357 d20a80d4def3
357 d20a80d4def3
358 d20a80d4def3
358 d20a80d4def3
359 82623d38b9ba
359 82623d38b9ba
360 82623d38b9ba
360 82623d38b9ba
361 392fd25390da
361 392fd25390da
362 392fd25390da
362 392fd25390da
363 $ hg debugsuccessorssets 'all()' --closest --hidden
363 $ hg debugsuccessorssets 'all()' --closest --hidden
364 d20a80d4def3
364 d20a80d4def3
365 d20a80d4def3
365 d20a80d4def3
366 007dc284c1f8
366 007dc284c1f8
367 82623d38b9ba 392fd25390da
367 82623d38b9ba 392fd25390da
368 82623d38b9ba
368 82623d38b9ba
369 82623d38b9ba
369 82623d38b9ba
370 392fd25390da
370 392fd25390da
371 392fd25390da
371 392fd25390da
372
372
373 Even when subsequent rewriting happen
373 Even when subsequent rewriting happen
374
374
375 $ mkcommit A_3
375 $ mkcommit A_3
376 created new head
376 created new head
377 $ hg debugobsolete `getid A_1` `getid A_3`
377 $ hg debugobsolete `getid A_1` `getid A_3`
378 1 new obsolescence markers
378 1 new obsolescence markers
379 obsoleted 1 changesets
379 obsoleted 1 changesets
380 $ hg up 0
380 $ hg up 0
381 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
381 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
382 $ mkcommit A_4
382 $ mkcommit A_4
383 created new head
383 created new head
384 $ hg debugobsolete `getid A_2` `getid A_4`
384 $ hg debugobsolete `getid A_2` `getid A_4`
385 1 new obsolescence markers
385 1 new obsolescence markers
386 obsoleted 1 changesets
386 obsoleted 1 changesets
387 $ hg up 0
387 $ hg up 0
388 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
388 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
389 $ mkcommit A_5
389 $ mkcommit A_5
390 created new head
390 created new head
391 $ hg debugobsolete `getid A_4` `getid A_5`
391 $ hg debugobsolete `getid A_4` `getid A_5`
392 1 new obsolescence markers
392 1 new obsolescence markers
393 obsoleted 1 changesets
393 obsoleted 1 changesets
394 $ hg log -G --hidden
394 $ hg log -G --hidden
395 @ 6:e442cfc57690 A_5
395 @ 6:e442cfc57690 A_5
396 |
396 |
397 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
397 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
398 |/
398 |/
399 | o 4:01f36c5a8fda A_3
399 | o 4:01f36c5a8fda A_3
400 |/
400 |/
401 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
401 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
402 |/
402 |/
403 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
403 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
404 |/
404 |/
405 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
405 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
406 |/
406 |/
407 o 0:d20a80d4def3 base
407 o 0:d20a80d4def3 base
408
408
409 $ hg debugsuccessorssets --hidden 'all()'
409 $ hg debugsuccessorssets --hidden 'all()'
410 d20a80d4def3
410 d20a80d4def3
411 d20a80d4def3
411 d20a80d4def3
412 007dc284c1f8
412 007dc284c1f8
413 01f36c5a8fda e442cfc57690
413 01f36c5a8fda e442cfc57690
414 82623d38b9ba
414 82623d38b9ba
415 01f36c5a8fda
415 01f36c5a8fda
416 392fd25390da
416 392fd25390da
417 e442cfc57690
417 e442cfc57690
418 01f36c5a8fda
418 01f36c5a8fda
419 01f36c5a8fda
419 01f36c5a8fda
420 6a411f0d7a0a
420 6a411f0d7a0a
421 e442cfc57690
421 e442cfc57690
422 e442cfc57690
422 e442cfc57690
423 e442cfc57690
423 e442cfc57690
424 $ hg debugsuccessorssets 'all()' --closest
424 $ hg debugsuccessorssets 'all()' --closest
425 d20a80d4def3
425 d20a80d4def3
426 d20a80d4def3
426 d20a80d4def3
427 01f36c5a8fda
427 01f36c5a8fda
428 01f36c5a8fda
428 01f36c5a8fda
429 e442cfc57690
429 e442cfc57690
430 e442cfc57690
430 e442cfc57690
431 $ hg debugsuccessorssets 'all()' --closest --hidden
431 $ hg debugsuccessorssets 'all()' --closest --hidden
432 d20a80d4def3
432 d20a80d4def3
433 d20a80d4def3
433 d20a80d4def3
434 007dc284c1f8
434 007dc284c1f8
435 82623d38b9ba 392fd25390da
435 82623d38b9ba 392fd25390da
436 82623d38b9ba
436 82623d38b9ba
437 82623d38b9ba
437 82623d38b9ba
438 392fd25390da
438 392fd25390da
439 392fd25390da
439 392fd25390da
440 01f36c5a8fda
440 01f36c5a8fda
441 01f36c5a8fda
441 01f36c5a8fda
442 6a411f0d7a0a
442 6a411f0d7a0a
443 e442cfc57690
443 e442cfc57690
444 e442cfc57690
444 e442cfc57690
445 e442cfc57690
445 e442cfc57690
446 $ hg log -r 'contentdivergent()'
446 $ hg log -r 'contentdivergent()'
447
447
448 Check more complex obsolescence graft (with divergence)
448 Check more complex obsolescence graft (with divergence)
449
449
450 $ mkcommit B_0; hg up 0
450 $ mkcommit B_0; hg up 0
451 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
451 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
452 $ hg debugobsolete `getid B_0` `getid A_2`
452 $ hg debugobsolete `getid B_0` `getid A_2`
453 1 new obsolescence markers
453 1 new obsolescence markers
454 obsoleted 1 changesets
454 obsoleted 1 changesets
455 $ mkcommit A_7; hg up 0
455 $ mkcommit A_7; hg up 0
456 created new head
456 created new head
457 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
457 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
458 $ mkcommit A_8; hg up 0
458 $ mkcommit A_8; hg up 0
459 created new head
459 created new head
460 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
460 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
461 $ hg debugobsolete `getid A_5` `getid A_7` `getid A_8`
461 $ hg debugobsolete `getid A_5` `getid A_7` `getid A_8`
462 1 new obsolescence markers
462 1 new obsolescence markers
463 obsoleted 1 changesets
463 obsoleted 1 changesets
464 $ mkcommit A_9; hg up 0
464 $ mkcommit A_9; hg up 0
465 created new head
465 created new head
466 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
466 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
467 $ hg debugobsolete `getid A_5` `getid A_9`
467 $ hg debugobsolete `getid A_5` `getid A_9`
468 1 new obsolescence markers
468 1 new obsolescence markers
469 4 new content-divergent changesets
469 3 new content-divergent changesets
470 $ hg log -G --hidden
470 $ hg log -G --hidden
471 * 10:bed64f5d2f5a A_9
471 * 10:bed64f5d2f5a A_9
472 |
472 |
473 | * 9:14608b260df8 A_8
473 | * 9:14608b260df8 A_8
474 |/
474 |/
475 | * 8:7ae126973a96 A_7
475 | * 8:7ae126973a96 A_7
476 |/
476 |/
477 | x 7:3750ebee865d B_0 [rewritten as 3:392fd25390da]
477 | x 7:3750ebee865d B_0 [rewritten as 3:392fd25390da]
478 | |
478 | |
479 | x 6:e442cfc57690 A_5 [rewritten as 10:bed64f5d2f5a; split as 8:7ae126973a96, 9:14608b260df8]
479 | x 6:e442cfc57690 A_5 [rewritten as 10:bed64f5d2f5a; split as 8:7ae126973a96, 9:14608b260df8]
480 |/
480 |/
481 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
481 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
482 |/
482 |/
483 | * 4:01f36c5a8fda A_3
483 | o 4:01f36c5a8fda A_3
484 |/
484 |/
485 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
485 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
486 |/
486 |/
487 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
487 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
488 |/
488 |/
489 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
489 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
490 |/
490 |/
491 @ 0:d20a80d4def3 base
491 @ 0:d20a80d4def3 base
492
492
493 $ hg debugsuccessorssets --hidden 'all()'
493 $ hg debugsuccessorssets --hidden 'all()'
494 d20a80d4def3
494 d20a80d4def3
495 d20a80d4def3
495 d20a80d4def3
496 007dc284c1f8
496 007dc284c1f8
497 01f36c5a8fda bed64f5d2f5a
497 01f36c5a8fda bed64f5d2f5a
498 01f36c5a8fda 7ae126973a96 14608b260df8
498 01f36c5a8fda 7ae126973a96 14608b260df8
499 82623d38b9ba
499 82623d38b9ba
500 01f36c5a8fda
500 01f36c5a8fda
501 392fd25390da
501 392fd25390da
502 bed64f5d2f5a
502 bed64f5d2f5a
503 7ae126973a96 14608b260df8
503 7ae126973a96 14608b260df8
504 01f36c5a8fda
504 01f36c5a8fda
505 01f36c5a8fda
505 01f36c5a8fda
506 6a411f0d7a0a
506 6a411f0d7a0a
507 bed64f5d2f5a
507 bed64f5d2f5a
508 7ae126973a96 14608b260df8
508 7ae126973a96 14608b260df8
509 e442cfc57690
509 e442cfc57690
510 bed64f5d2f5a
510 bed64f5d2f5a
511 7ae126973a96 14608b260df8
511 7ae126973a96 14608b260df8
512 3750ebee865d
512 3750ebee865d
513 bed64f5d2f5a
513 bed64f5d2f5a
514 7ae126973a96 14608b260df8
514 7ae126973a96 14608b260df8
515 7ae126973a96
515 7ae126973a96
516 7ae126973a96
516 7ae126973a96
517 14608b260df8
517 14608b260df8
518 14608b260df8
518 14608b260df8
519 bed64f5d2f5a
519 bed64f5d2f5a
520 bed64f5d2f5a
520 bed64f5d2f5a
521 $ hg debugsuccessorssets 'all()' --closest
521 $ hg debugsuccessorssets 'all()' --closest
522 d20a80d4def3
522 d20a80d4def3
523 d20a80d4def3
523 d20a80d4def3
524 01f36c5a8fda
524 01f36c5a8fda
525 01f36c5a8fda
525 01f36c5a8fda
526 7ae126973a96
526 7ae126973a96
527 7ae126973a96
527 7ae126973a96
528 14608b260df8
528 14608b260df8
529 14608b260df8
529 14608b260df8
530 bed64f5d2f5a
530 bed64f5d2f5a
531 bed64f5d2f5a
531 bed64f5d2f5a
532 $ hg debugsuccessorssets 'all()' --closest --hidden
532 $ hg debugsuccessorssets 'all()' --closest --hidden
533 d20a80d4def3
533 d20a80d4def3
534 d20a80d4def3
534 d20a80d4def3
535 007dc284c1f8
535 007dc284c1f8
536 82623d38b9ba 392fd25390da
536 82623d38b9ba 392fd25390da
537 82623d38b9ba
537 82623d38b9ba
538 82623d38b9ba
538 82623d38b9ba
539 392fd25390da
539 392fd25390da
540 392fd25390da
540 392fd25390da
541 01f36c5a8fda
541 01f36c5a8fda
542 01f36c5a8fda
542 01f36c5a8fda
543 6a411f0d7a0a
543 6a411f0d7a0a
544 e442cfc57690
544 e442cfc57690
545 e442cfc57690
545 e442cfc57690
546 e442cfc57690
546 e442cfc57690
547 3750ebee865d
547 3750ebee865d
548 392fd25390da
548 392fd25390da
549 7ae126973a96
549 7ae126973a96
550 7ae126973a96
550 7ae126973a96
551 14608b260df8
551 14608b260df8
552 14608b260df8
552 14608b260df8
553 bed64f5d2f5a
553 bed64f5d2f5a
554 bed64f5d2f5a
554 bed64f5d2f5a
555 $ hg log -r 'contentdivergent()'
555 $ hg log -r 'contentdivergent()'
556 4:01f36c5a8fda A_3
557 8:7ae126973a96 A_7
556 8:7ae126973a96 A_7
558 9:14608b260df8 A_8
557 9:14608b260df8 A_8
559 10:bed64f5d2f5a A_9
558 10:bed64f5d2f5a A_9
560
559
561 $ hg log -r bed64f5d2f5a -T '{whyunstable}\n' | sort
560 $ hg log -r bed64f5d2f5a -T '{whyunstable}\n' | sort
562 content-divergent: 4:01f36c5a8fda (draft) 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor 007dc284c1f8
561 content-divergent: 4:01f36c5a8fda (draft) 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor 007dc284c1f8
563 content-divergent: 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor e442cfc57690
562 content-divergent: 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor e442cfc57690
564 $ hg log -r bed64f5d2f5a -T whyunstableshort | sort
563 $ hg log -r bed64f5d2f5a -T whyunstableshort | sort
565 content-divergent: 4:01f36c5a8fda (draft) 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor 007d
564 content-divergent: 4:01f36c5a8fda (draft) 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor 007d
566 content-divergent: 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor e442
565 content-divergent: 8:7ae126973a96 (draft) 9:14608b260df8 (draft) predecessor e442
567 $ hg log -r bed64f5d2f5a -T whyunstableshorter | sort
566 $ hg log -r bed64f5d2f5a -T whyunstableshorter | sort
568 content-divergent: 01f3 (draft) 7ae1 (draft) 1460 (draft) predecessor 007d
567 content-divergent: 01f3 (draft) 7ae1 (draft) 1460 (draft) predecessor 007d
569 content-divergent: 7ae1 (draft) 1460 (draft) predecessor e442
568 content-divergent: 7ae1 (draft) 1460 (draft) predecessor e442
570
569
571 fix the divergence
570 fix the divergence
572
571
573 $ mkcommit A_A; hg up 0
572 $ mkcommit A_A; hg up 0
574 created new head
573 created new head
575 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
574 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
576 $ hg debugobsolete `getid A_9` `getid A_A`
575 $ hg debugobsolete `getid A_9` `getid A_A`
577 1 new obsolescence markers
576 1 new obsolescence markers
578 obsoleted 1 changesets
577 obsoleted 1 changesets
579 $ hg debugobsolete `getid A_7` `getid A_A`
578 $ hg debugobsolete `getid A_7` `getid A_A`
580 1 new obsolescence markers
579 1 new obsolescence markers
581 obsoleted 1 changesets
580 obsoleted 1 changesets
582 $ hg debugobsolete `getid A_8` `getid A_A`
581 $ hg debugobsolete `getid A_8` `getid A_A`
583 1 new obsolescence markers
582 1 new obsolescence markers
584 obsoleted 1 changesets
583 obsoleted 1 changesets
585 $ hg log -G --hidden
584 $ hg log -G --hidden
586 o 11:a139f71be9da A_A
585 o 11:a139f71be9da A_A
587 |
586 |
588 | x 10:bed64f5d2f5a A_9 [rewritten as 11:a139f71be9da]
587 | x 10:bed64f5d2f5a A_9 [rewritten as 11:a139f71be9da]
589 |/
588 |/
590 | x 9:14608b260df8 A_8 [rewritten as 11:a139f71be9da]
589 | x 9:14608b260df8 A_8 [rewritten as 11:a139f71be9da]
591 |/
590 |/
592 | x 8:7ae126973a96 A_7 [rewritten as 11:a139f71be9da]
591 | x 8:7ae126973a96 A_7 [rewritten as 11:a139f71be9da]
593 |/
592 |/
594 | x 7:3750ebee865d B_0 [rewritten as 3:392fd25390da]
593 | x 7:3750ebee865d B_0 [rewritten as 3:392fd25390da]
595 | |
594 | |
596 | x 6:e442cfc57690 A_5 [rewritten as 10:bed64f5d2f5a; split as 8:7ae126973a96, 9:14608b260df8]
595 | x 6:e442cfc57690 A_5 [rewritten as 10:bed64f5d2f5a; split as 8:7ae126973a96, 9:14608b260df8]
597 |/
596 |/
598 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
597 | x 5:6a411f0d7a0a A_4 [rewritten as 6:e442cfc57690]
599 |/
598 |/
600 | o 4:01f36c5a8fda A_3
599 | o 4:01f36c5a8fda A_3
601 |/
600 |/
602 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
601 | x 3:392fd25390da A_2 [rewritten as 5:6a411f0d7a0a]
603 |/
602 |/
604 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
603 | x 2:82623d38b9ba A_1 [rewritten as 4:01f36c5a8fda]
605 |/
604 |/
606 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
605 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
607 |/
606 |/
608 @ 0:d20a80d4def3 base
607 @ 0:d20a80d4def3 base
609
608
610 $ hg debugsuccessorssets --hidden 'all()'
609 $ hg debugsuccessorssets --hidden 'all()'
611 d20a80d4def3
610 d20a80d4def3
612 d20a80d4def3
611 d20a80d4def3
613 007dc284c1f8
612 007dc284c1f8
614 01f36c5a8fda a139f71be9da
613 01f36c5a8fda a139f71be9da
615 82623d38b9ba
614 82623d38b9ba
616 01f36c5a8fda
615 01f36c5a8fda
617 392fd25390da
616 392fd25390da
618 a139f71be9da
617 a139f71be9da
619 01f36c5a8fda
618 01f36c5a8fda
620 01f36c5a8fda
619 01f36c5a8fda
621 6a411f0d7a0a
620 6a411f0d7a0a
622 a139f71be9da
621 a139f71be9da
623 e442cfc57690
622 e442cfc57690
624 a139f71be9da
623 a139f71be9da
625 3750ebee865d
624 3750ebee865d
626 a139f71be9da
625 a139f71be9da
627 7ae126973a96
626 7ae126973a96
628 a139f71be9da
627 a139f71be9da
629 14608b260df8
628 14608b260df8
630 a139f71be9da
629 a139f71be9da
631 bed64f5d2f5a
630 bed64f5d2f5a
632 a139f71be9da
631 a139f71be9da
633 a139f71be9da
632 a139f71be9da
634 a139f71be9da
633 a139f71be9da
635 $ hg debugsuccessorssets 'all()' --closest
634 $ hg debugsuccessorssets 'all()' --closest
636 d20a80d4def3
635 d20a80d4def3
637 d20a80d4def3
636 d20a80d4def3
638 01f36c5a8fda
637 01f36c5a8fda
639 01f36c5a8fda
638 01f36c5a8fda
640 a139f71be9da
639 a139f71be9da
641 a139f71be9da
640 a139f71be9da
642 $ hg debugsuccessorssets 'all()' --closest --hidden
641 $ hg debugsuccessorssets 'all()' --closest --hidden
643 d20a80d4def3
642 d20a80d4def3
644 d20a80d4def3
643 d20a80d4def3
645 007dc284c1f8
644 007dc284c1f8
646 82623d38b9ba 392fd25390da
645 82623d38b9ba 392fd25390da
647 82623d38b9ba
646 82623d38b9ba
648 82623d38b9ba
647 82623d38b9ba
649 392fd25390da
648 392fd25390da
650 392fd25390da
649 392fd25390da
651 01f36c5a8fda
650 01f36c5a8fda
652 01f36c5a8fda
651 01f36c5a8fda
653 6a411f0d7a0a
652 6a411f0d7a0a
654 e442cfc57690
653 e442cfc57690
655 e442cfc57690
654 e442cfc57690
656 e442cfc57690
655 e442cfc57690
657 3750ebee865d
656 3750ebee865d
658 392fd25390da
657 392fd25390da
659 7ae126973a96
658 7ae126973a96
660 a139f71be9da
659 a139f71be9da
661 14608b260df8
660 14608b260df8
662 a139f71be9da
661 a139f71be9da
663 bed64f5d2f5a
662 bed64f5d2f5a
664 a139f71be9da
663 a139f71be9da
665 a139f71be9da
664 a139f71be9da
666 a139f71be9da
665 a139f71be9da
667 $ hg log -r 'contentdivergent()'
666 $ hg log -r 'contentdivergent()'
668
667
669 #if serve
668 #if serve
670
669
671 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid --config web.view=all \
670 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid --config web.view=all \
672 > -A access.log -E errors.log
671 > -A access.log -E errors.log
673 $ cat hg.pid >> $DAEMON_PIDS
672 $ cat hg.pid >> $DAEMON_PIDS
674
673
675 check an obsolete changeset that was rewritten and also split
674 check an obsolete changeset that was rewritten and also split
676
675
677 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=paper' | grep -E 'rewritten|split'
676 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=paper' | grep -E 'rewritten|split'
678 <td>rewritten as <a href="/rev/bed64f5d2f5a?style=paper">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span><br>
677 <td>rewritten as <a href="/rev/bed64f5d2f5a?style=paper">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span><br>
679 split as <a href="/rev/7ae126973a96?style=paper">7ae126973a96</a> <a href="/rev/14608b260df8?style=paper">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
678 split as <a href="/rev/7ae126973a96?style=paper">7ae126973a96</a> <a href="/rev/14608b260df8?style=paper">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
680 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=coal' | grep -E 'rewritten|split'
679 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=coal' | grep -E 'rewritten|split'
681 <td>rewritten as <a href="/rev/bed64f5d2f5a?style=coal">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span><br>
680 <td>rewritten as <a href="/rev/bed64f5d2f5a?style=coal">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span><br>
682 split as <a href="/rev/7ae126973a96?style=coal">7ae126973a96</a> <a href="/rev/14608b260df8?style=coal">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
681 split as <a href="/rev/7ae126973a96?style=coal">7ae126973a96</a> <a href="/rev/14608b260df8?style=coal">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
683 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=gitweb' | grep -E 'rewritten|split'
682 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=gitweb' | grep -E 'rewritten|split'
684 <td>rewritten as <a class="list" href="/rev/bed64f5d2f5a?style=gitweb">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
683 <td>rewritten as <a class="list" href="/rev/bed64f5d2f5a?style=gitweb">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
685 <td>split as <a class="list" href="/rev/7ae126973a96?style=gitweb">7ae126973a96</a> <a class="list" href="/rev/14608b260df8?style=gitweb">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
684 <td>split as <a class="list" href="/rev/7ae126973a96?style=gitweb">7ae126973a96</a> <a class="list" href="/rev/14608b260df8?style=gitweb">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
686 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=monoblue' | grep -E 'rewritten|split'
685 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=monoblue' | grep -E 'rewritten|split'
687 <dd>rewritten as <a href="/rev/bed64f5d2f5a?style=monoblue">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></dd>
686 <dd>rewritten as <a href="/rev/bed64f5d2f5a?style=monoblue">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></dd>
688 <dd>split as <a href="/rev/7ae126973a96?style=monoblue">7ae126973a96</a> <a href="/rev/14608b260df8?style=monoblue">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></dd>
687 <dd>split as <a href="/rev/7ae126973a96?style=monoblue">7ae126973a96</a> <a href="/rev/14608b260df8?style=monoblue">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></dd>
689 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=spartan' | grep -E 'rewritten|split'
688 $ get-with-headers.py localhost:$HGPORT 'rev/e442cfc57690?style=spartan' | grep -E 'rewritten|split'
690 <td class="obsolete">rewritten as <a href="/rev/bed64f5d2f5a?style=spartan">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
689 <td class="obsolete">rewritten as <a href="/rev/bed64f5d2f5a?style=spartan">bed64f5d2f5a</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
691 <td class="obsolete">split as <a href="/rev/7ae126973a96?style=spartan">7ae126973a96</a> <a href="/rev/14608b260df8?style=spartan">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
690 <td class="obsolete">split as <a href="/rev/7ae126973a96?style=spartan">7ae126973a96</a> <a href="/rev/14608b260df8?style=spartan">14608b260df8</a> by &#116;&#101;&#115;&#116; <span class="age">Thu, 01 Jan 1970 00:00:00 +0000</span></td>
692
691
693 $ killdaemons.py
692 $ killdaemons.py
694
693
695 #endif
694 #endif
696
695
697 $ cd ..
696 $ cd ..
698
697
699
698
700 Subset does not diverge
699 Subset does not diverge
701 ------------------------------
700 ------------------------------
702
701
703 Do not report divergent successors-set if it is a subset of another
702 Do not report divergent successors-set if it is a subset of another
704 successors-set. (report [A,B] not [A] + [A,B])
703 successors-set. (report [A,B] not [A] + [A,B])
705
704
706 $ newcase subset
705 $ newcase subset
707 $ hg debugobsolete `getid A_0` `getid A_2`
706 $ hg debugobsolete `getid A_0` `getid A_2`
708 1 new obsolescence markers
707 1 new obsolescence markers
709 obsoleted 1 changesets
708 obsoleted 1 changesets
710 $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2`
709 $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2`
711 1 new obsolescence markers
710 1 new obsolescence markers
712 $ hg debugsuccessorssets --hidden 'desc('A_0')'
711 $ hg debugsuccessorssets --hidden 'desc('A_0')'
713 007dc284c1f8
712 007dc284c1f8
714 82623d38b9ba 392fd25390da
713 82623d38b9ba 392fd25390da
715 $ hg debugsuccessorssets 'desc('A_0')' --closest
714 $ hg debugsuccessorssets 'desc('A_0')' --closest
716 $ hg debugsuccessorssets 'desc('A_0')' --closest --hidden
715 $ hg debugsuccessorssets 'desc('A_0')' --closest --hidden
717 007dc284c1f8
716 007dc284c1f8
718 82623d38b9ba 392fd25390da
717 82623d38b9ba 392fd25390da
719
718
720 $ cd ..
719 $ cd ..
721
720
721 Divergence introduced after a split
722 -----------------------------------
723
724 Make sure divergence introduced in sucessors of a split does not spill to the
725 unrelated part.
726
727 $ newcase split-unrelated-branch
728 $ hg debugobsolete `getid A_0` `getid A_1` `getid A_2`
729 1 new obsolescence markers
730 obsoleted 1 changesets
731 $ hg up 'desc("A_2")'
732 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
733 $ hg commit --amend -m "A_3"
734 $ hg up 'desc("A_2")' --hidden
735 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
736 updated to hidden changeset 392fd25390da
737 (hidden revision '392fd25390da' was rewritten as: 4d672202d2fb)
738 $ hg commit --amend -m "A_4" --config experimental.evolution.allowdivergence=yes
739 2 new content-divergent changesets
740 $ hg log -G --hidden
741 @ 5:6730f214b07b A_4
742 |
743 | * 4:4d672202d2fb A_3
744 |/
745 | x 3:392fd25390da A_2 [rewritten using amend as 5:6730f214b07b; rewritten using amend as 4:4d672202d2fb]
746 |/
747 | o 2:82623d38b9ba A_1
748 |/
749 | x 1:007dc284c1f8 A_0 [split as 2:82623d38b9ba, 3:392fd25390da]
750 |/
751 o 0:d20a80d4def3 base
752
753 $ hg debugsuccessorssets --hidden 'desc('A_0')'
754 007dc284c1f8
755 82623d38b9ba 4d672202d2fb
756 82623d38b9ba 6730f214b07b
757 $ hg debugsuccessorssets --hidden 'desc('A_1')'
758 82623d38b9ba
759 82623d38b9ba
760 $ hg debugsuccessorssets --hidden 'desc('A_2')'
761 392fd25390da
762 6730f214b07b
763 4d672202d2fb
764 $ hg log -r 'contentdivergent()'
765 4:4d672202d2fb A_3
766 5:6730f214b07b A_4
767 $ cd ..
768
769
770
722 Use scmutil.cleanupnodes API to create divergence
771 Use scmutil.cleanupnodes API to create divergence
772 =================================================
723
773
724 $ hg init cleanupnodes
774 $ hg init cleanupnodes
725 $ cd cleanupnodes
775 $ cd cleanupnodes
726 $ hg debugdrawdag <<'EOS'
776 $ hg debugdrawdag <<'EOS'
727 > B1 B3 B4
777 > B1 B3 B4
728 > | \|
778 > | \|
729 > A Z
779 > A Z
730 > EOS
780 > EOS
731
781
732 $ hg update -q B1
782 $ hg update -q B1
733 $ echo 3 >> B
783 $ echo 3 >> B
734 $ hg commit --amend -m B2
784 $ hg commit --amend -m B2
735 $ cat > $TESTTMP/scmutilcleanup.py <<EOF
785 $ cat > $TESTTMP/scmutilcleanup.py <<EOF
736 > from mercurial import registrar, scmutil
786 > from mercurial import registrar, scmutil
737 > cmdtable = {}
787 > cmdtable = {}
738 > command = registrar.command(cmdtable)
788 > command = registrar.command(cmdtable)
739 > @command(b'cleanup')
789 > @command(b'cleanup')
740 > def cleanup(ui, repo):
790 > def cleanup(ui, repo):
741 > def node(expr):
791 > def node(expr):
742 > unfi = repo.unfiltered()
792 > unfi = repo.unfiltered()
743 > rev = unfi.revs(expr).first()
793 > rev = unfi.revs(expr).first()
744 > return unfi.changelog.node(rev)
794 > return unfi.changelog.node(rev)
745 > with repo.wlock(), repo.lock(), repo.transaction(b'delayedstrip'):
795 > with repo.wlock(), repo.lock(), repo.transaction(b'delayedstrip'):
746 > mapping = {node(b'desc(B1)'): [node(b'desc(B3)')],
796 > mapping = {node(b'desc(B1)'): [node(b'desc(B3)')],
747 > node(b'desc(B3)'): [node(b'desc(B4)')]}
797 > node(b'desc(B3)'): [node(b'desc(B4)')]}
748 > scmutil.cleanupnodes(repo, mapping, b'test')
798 > scmutil.cleanupnodes(repo, mapping, b'test')
749 > EOF
799 > EOF
750
800
751 $ rm .hg/localtags
801 $ rm .hg/localtags
752 $ hg cleanup --config extensions.t=$TESTTMP/scmutilcleanup.py
802 $ hg cleanup --config extensions.t=$TESTTMP/scmutilcleanup.py
753 2 new content-divergent changesets
803 2 new content-divergent changesets
754 $ hg log -G -T '{rev}:{node|short} {desc} {instabilities}' -r 'sort(all(), topo)'
804 $ hg log -G -T '{rev}:{node|short} {desc} {instabilities}' -r 'sort(all(), topo)'
755 @ 5:1a2a9b5b0030 B2 content-divergent
805 @ 5:1a2a9b5b0030 B2 content-divergent
756 |
806 |
757 | * 4:70d5a63ca112 B4 content-divergent
807 | * 4:70d5a63ca112 B4 content-divergent
758 | |
808 | |
759 | o 1:48b9aae0607f Z
809 | o 1:48b9aae0607f Z
760 |
810 |
761 o 0:426bada5c675 A
811 o 0:426bada5c675 A
762
812
763 $ hg debugobsolete
813 $ hg debugobsolete
764 a178212c3433c4e77b573f6011e29affb8aefa33 1a2a9b5b0030632400aa78e00388c20f99d3ec44 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
814 a178212c3433c4e77b573f6011e29affb8aefa33 1a2a9b5b0030632400aa78e00388c20f99d3ec44 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
765 a178212c3433c4e77b573f6011e29affb8aefa33 ad6478fb94ecec98b86daae98722865d494ac561 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'test', 'user': 'test'}
815 a178212c3433c4e77b573f6011e29affb8aefa33 ad6478fb94ecec98b86daae98722865d494ac561 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '13', 'operation': 'test', 'user': 'test'}
766 ad6478fb94ecec98b86daae98722865d494ac561 70d5a63ca112acb3764bc1d7320ca90ea688d671 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'test', 'user': 'test'}
816 ad6478fb94ecec98b86daae98722865d494ac561 70d5a63ca112acb3764bc1d7320ca90ea688d671 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'test', 'user': 'test'}
767
817
768 $ hg debugwhyunstable 1a2a9b5b0030
818 $ hg debugwhyunstable 1a2a9b5b0030
769 content-divergent: 70d5a63ca112acb3764bc1d7320ca90ea688d671 (draft) predecessor a178212c3433c4e77b573f6011e29affb8aefa33
819 content-divergent: 70d5a63ca112acb3764bc1d7320ca90ea688d671 (draft) predecessor a178212c3433c4e77b573f6011e29affb8aefa33
770
820
771 $ hg log -r 1a2a9b5b0030 -T '{whyunstable}\n'
821 $ hg log -r 1a2a9b5b0030 -T '{whyunstable}\n'
772 content-divergent: 4:70d5a63ca112 (draft) predecessor a178212c3433
822 content-divergent: 4:70d5a63ca112 (draft) predecessor a178212c3433
773 $ hg log -r 1a2a9b5b0030 -T whyunstableshort
823 $ hg log -r 1a2a9b5b0030 -T whyunstableshort
774 content-divergent: 4:70d5a63ca112 (draft) predecessor a178
824 content-divergent: 4:70d5a63ca112 (draft) predecessor a178
775 $ hg log -r 1a2a9b5b0030 -T whyunstableshorter
825 $ hg log -r 1a2a9b5b0030 -T whyunstableshorter
776 content-divergent: 70d5 (draft) predecessor a178
826 content-divergent: 70d5 (draft) predecessor a178
777
827
778 #if serve
828 #if serve
779
829
780 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
830 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
781 $ cat hg.pid >> $DAEMON_PIDS
831 $ cat hg.pid >> $DAEMON_PIDS
782
832
783 check explanation for a content-divergent changeset
833 check explanation for a content-divergent changeset
784
834
785 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=paper' | grep divergent:
835 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=paper' | grep divergent:
786 <td>content-divergent: <a href="/rev/70d5a63ca112?style=paper">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=paper">a178212c3433</a></td>
836 <td>content-divergent: <a href="/rev/70d5a63ca112?style=paper">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=paper">a178212c3433</a></td>
787 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=coal' | grep divergent:
837 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=coal' | grep divergent:
788 <td>content-divergent: <a href="/rev/70d5a63ca112?style=coal">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=coal">a178212c3433</a></td>
838 <td>content-divergent: <a href="/rev/70d5a63ca112?style=coal">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=coal">a178212c3433</a></td>
789 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=gitweb' | grep divergent:
839 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=gitweb' | grep divergent:
790 <td>content-divergent: <a class="list" href="/rev/70d5a63ca112?style=gitweb">70d5a63ca112</a> (draft) predecessor <a class="list" href="/rev/a178212c3433?style=gitweb">a178212c3433</a></td>
840 <td>content-divergent: <a class="list" href="/rev/70d5a63ca112?style=gitweb">70d5a63ca112</a> (draft) predecessor <a class="list" href="/rev/a178212c3433?style=gitweb">a178212c3433</a></td>
791 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=monoblue' | grep divergent:
841 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=monoblue' | grep divergent:
792 <dd>content-divergent: <a href="/rev/70d5a63ca112?style=monoblue">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=monoblue">a178212c3433</a></dd>
842 <dd>content-divergent: <a href="/rev/70d5a63ca112?style=monoblue">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=monoblue">a178212c3433</a></dd>
793 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=spartan' | grep divergent:
843 $ get-with-headers.py localhost:$HGPORT 'rev/1a2a9b5b0030?style=spartan' | grep divergent:
794 <td class="unstable">content-divergent: <a href="/rev/70d5a63ca112?style=spartan">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=spartan">a178212c3433</a></td>
844 <td class="unstable">content-divergent: <a href="/rev/70d5a63ca112?style=spartan">70d5a63ca112</a> (draft) predecessor <a href="/rev/a178212c3433?style=spartan">a178212c3433</a></td>
795
845
796 $ killdaemons.py
846 $ killdaemons.py
797
847
798 #endif
848 #endif
General Comments 0
You need to be logged in to leave comments. Login now