comparison mercurial/debugcommands.py @ 30940:c8081ea63591

debugcommands: move 'debugpathcomplete' in the new module
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Wed, 01 Feb 2017 17:47:35 +0100
parents 9e39d196cdf5
children 7103122495e2
comparison
equal deleted inserted replaced
30939:9e39d196cdf5 30940:c8081ea63591
1347 fm.startitem() 1347 fm.startitem()
1348 ind = i if opts.get('index') else None 1348 ind = i if opts.get('index') else None
1349 cmdutil.showmarker(fm, m, index=ind) 1349 cmdutil.showmarker(fm, m, index=ind)
1350 fm.end() 1350 fm.end()
1351 1351
1352 @command('debugpathcomplete',
1353 [('f', 'full', None, _('complete an entire path')),
1354 ('n', 'normal', None, _('show only normal files')),
1355 ('a', 'added', None, _('show only added files')),
1356 ('r', 'removed', None, _('show only removed files'))],
1357 _('FILESPEC...'))
1358 def debugpathcomplete(ui, repo, *specs, **opts):
1359 '''complete part or all of a tracked path
1360
1361 This command supports shells that offer path name completion. It
1362 currently completes only files already known to the dirstate.
1363
1364 Completion extends only to the next path segment unless
1365 --full is specified, in which case entire paths are used.'''
1366
1367 def complete(path, acceptable):
1368 dirstate = repo.dirstate
1369 spec = os.path.normpath(os.path.join(pycompat.getcwd(), path))
1370 rootdir = repo.root + pycompat.ossep
1371 if spec != repo.root and not spec.startswith(rootdir):
1372 return [], []
1373 if os.path.isdir(spec):
1374 spec += '/'
1375 spec = spec[len(rootdir):]
1376 fixpaths = pycompat.ossep != '/'
1377 if fixpaths:
1378 spec = spec.replace(pycompat.ossep, '/')
1379 speclen = len(spec)
1380 fullpaths = opts['full']
1381 files, dirs = set(), set()
1382 adddir, addfile = dirs.add, files.add
1383 for f, st in dirstate.iteritems():
1384 if f.startswith(spec) and st[0] in acceptable:
1385 if fixpaths:
1386 f = f.replace('/', pycompat.ossep)
1387 if fullpaths:
1388 addfile(f)
1389 continue
1390 s = f.find(pycompat.ossep, speclen)
1391 if s >= 0:
1392 adddir(f[:s])
1393 else:
1394 addfile(f)
1395 return files, dirs
1396
1397 acceptable = ''
1398 if opts['normal']:
1399 acceptable += 'nm'
1400 if opts['added']:
1401 acceptable += 'a'
1402 if opts['removed']:
1403 acceptable += 'r'
1404 cwd = repo.getcwd()
1405 if not specs:
1406 specs = ['.']
1407
1408 files, dirs = set(), set()
1409 for spec in specs:
1410 f, d = complete(spec, acceptable or 'nmar')
1411 files.update(f)
1412 dirs.update(d)
1413 files.update(dirs)
1414 ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
1415 ui.write('\n')
1416
1352 @command('debugupgraderepo', [ 1417 @command('debugupgraderepo', [
1353 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')), 1418 ('o', 'optimize', [], _('extra optimization to perform'), _('NAME')),
1354 ('', 'run', False, _('performs an upgrade')), 1419 ('', 'run', False, _('performs an upgrade')),
1355 ]) 1420 ])
1356 def debugupgraderepo(ui, repo, run=False, optimize=None): 1421 def debugupgraderepo(ui, repo, run=False, optimize=None):