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): |