mercurial/debugcommands.py
changeset 30959 9e39d196cdf5
parent 30958 23c801570449
child 30960 c8081ea63591
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):