Mercurial > public > mercurial-scm > hg-stable
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): |