comparison mercurial/debugcommands.py @ 30959:9e39d196cdf5

debugcommands: move 'debugobsolete' in the new module
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 01 Feb 2017 17:46:21 +0100
parents 23c801570449
children c8081ea63591
comparison
equal deleted inserted replaced
30958:23c801570449 30959:9e39d196cdf5
39 fileset, 39 fileset,
40 hg, 40 hg,
41 localrepo, 41 localrepo,
42 lock as lockmod, 42 lock as lockmod,
43 merge as mergemod, 43 merge as mergemod,
44 obsolete,
44 policy, 45 policy,
45 pycompat, 46 pycompat,
46 repair, 47 repair,
47 revlog, 48 revlog,
48 scmutil, 49 scmutil,
1235 for a in args: 1236 for a in args:
1236 completions.update(n for n in names if n.startswith(a)) 1237 completions.update(n for n in names if n.startswith(a))
1237 ui.write('\n'.join(sorted(completions))) 1238 ui.write('\n'.join(sorted(completions)))
1238 ui.write('\n') 1239 ui.write('\n')
1239 1240
1241 @command('debugobsolete',
1242 [('', 'flags', 0, _('markers flag')),
1243 ('', 'record-parents', False,
1244 _('record parent information for the precursor')),
1245 ('r', 'rev', [], _('display markers relevant to REV')),
1246 ('', 'index', False, _('display index of the marker')),
1247 ('', 'delete', [], _('delete markers specified by indices')),
1248 ] + commands.commitopts2 + commands.formatteropts,
1249 _('[OBSOLETED [REPLACEMENT ...]]'))
1250 def debugobsolete(ui, repo, precursor=None, *successors, **opts):
1251 """create arbitrary obsolete marker
1252
1253 With no arguments, displays the list of obsolescence markers."""
1254
1255 def parsenodeid(s):
1256 try:
1257 # We do not use revsingle/revrange functions here to accept
1258 # arbitrary node identifiers, possibly not present in the
1259 # local repository.
1260 n = bin(s)
1261 if len(n) != len(nullid):
1262 raise TypeError()
1263 return n
1264 except TypeError:
1265 raise error.Abort('changeset references must be full hexadecimal '
1266 'node identifiers')
1267
1268 if opts.get('delete'):
1269 indices = []
1270 for v in opts.get('delete'):
1271 try:
1272 indices.append(int(v))
1273 except ValueError:
1274 raise error.Abort(_('invalid index value: %r') % v,
1275 hint=_('use integers for indices'))
1276
1277 if repo.currenttransaction():
1278 raise error.Abort(_('cannot delete obsmarkers in the middle '
1279 'of transaction.'))
1280
1281 with repo.lock():
1282 n = repair.deleteobsmarkers(repo.obsstore, indices)
1283 ui.write(_('deleted %i obsolescence markers\n') % n)
1284
1285 return
1286
1287 if precursor is not None:
1288 if opts['rev']:
1289 raise error.Abort('cannot select revision when creating marker')
1290 metadata = {}
1291 metadata['user'] = opts['user'] or ui.username()
1292 succs = tuple(parsenodeid(succ) for succ in successors)
1293 l = repo.lock()
1294 try:
1295 tr = repo.transaction('debugobsolete')
1296 try:
1297 date = opts.get('date')
1298 if date:
1299 date = util.parsedate(date)
1300 else:
1301 date = None
1302 prec = parsenodeid(precursor)
1303 parents = None
1304 if opts['record_parents']:
1305 if prec not in repo.unfiltered():
1306 raise error.Abort('cannot used --record-parents on '
1307 'unknown changesets')
1308 parents = repo.unfiltered()[prec].parents()
1309 parents = tuple(p.node() for p in parents)
1310 repo.obsstore.create(tr, prec, succs, opts['flags'],
1311 parents=parents, date=date,
1312 metadata=metadata)
1313 tr.close()
1314 except ValueError as exc:
1315 raise error.Abort(_('bad obsmarker input: %s') % exc)
1316 finally:
1317 tr.release()
1318 finally:
1319 l.release()
1320 else:
1321 if opts['rev']:
1322 revs = scmutil.revrange(repo, opts['rev'])
1323 nodes = [repo[r].node() for r in revs]
1324 markers = list(obsolete.getmarkers(repo, nodes=nodes))
1325 markers.sort(key=lambda x: x._data)
1326 else:
1327 markers = obsolete.getmarkers(repo)
1328
1329 markerstoiter = markers
1330 isrelevant = lambda m: True
1331 if opts.get('rev') and opts.get('index'):
1332 markerstoiter = obsolete.getmarkers(repo)
1333 markerset = set(markers)
1334 isrelevant = lambda m: m in markerset
1335
1336 fm = ui.formatter('debugobsolete', opts)
1337 for i, m in enumerate(markerstoiter):
1338 if not isrelevant(m):
1339 # marker can be irrelevant when we're iterating over a set
1340 # of markers (markerstoiter) which is bigger than the set
1341 # of markers we want to display (markers)
1342 # this can happen if both --index and --rev options are
1343 # provided and thus we need to iterate over all of the markers
1344 # to get the correct indices, but only display the ones that
1345 # are relevant to --rev value
1346 continue
1347 fm.startitem()
1348 ind = i if opts.get('index') else None
1349 cmdutil.showmarker(fm, m, index=ind)
1350 fm.end()
1351
1240 @command('debugupgraderepo', [ 1352 @command('debugupgraderepo', [
1241 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')), 1353 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),
1242 ('', 'run', False, _('performs an upgrade')), 1354 ('', 'run', False, _('performs an upgrade')),
1243 ]) 1355 ])
1244 def debugupgraderepo(ui, repo, run=False, optimize=None): 1356 def debugupgraderepo(ui, repo, run=False, optimize=None):