mercurial/commands.py
changeset 18792 10669e24eb6c
parent 18790 1e28a7f58f33
child 18796 fa6d5c62f3bd
equal deleted inserted replaced
18791:d844e3879f9b 18792:10669e24eb6c
  2134                 ui.write(hex(repl))
  2134                 ui.write(hex(repl))
  2135             ui.write(' %X ' % m._data[2])
  2135             ui.write(' %X ' % m._data[2])
  2136             ui.write('{%s}' % (', '.join('%r: %r' % t for t in
  2136             ui.write('{%s}' % (', '.join('%r: %r' % t for t in
  2137                                          sorted(m.metadata().items()))))
  2137                                          sorted(m.metadata().items()))))
  2138             ui.write('\n')
  2138             ui.write('\n')
       
  2139 
       
  2140 @command('debugpathcomplete',
       
  2141          [('f', 'full', None, _('complete an entire path')),
       
  2142           ('n', 'normal', None, _('show only normal files')),
       
  2143           ('a', 'added', None, _('show only added files')),
       
  2144           ('r', 'removed', None, _('show only removed files'))],
       
  2145          _('FILESPEC...'))
       
  2146 def debugpathcomplete(ui, repo, *specs, **opts):
       
  2147     '''complete part or all of a tracked path
       
  2148 
       
  2149     This command supports shells that offer path name completion. It
       
  2150     currently completes only files already known to the dirstate.
       
  2151 
       
  2152     Completion extends only to the next path segment unless
       
  2153     --full is specified, in which case entire paths are used.'''
       
  2154 
       
  2155     def complete(path, acceptable):
       
  2156         dirstate = repo.dirstate
       
  2157         spec = os.path.normpath(os.path.join(os.getcwd(), path))
       
  2158         rootdir = repo.root + os.sep
       
  2159         if spec != repo.root and not spec.startswith(rootdir):
       
  2160             return [], []
       
  2161         if os.path.isdir(spec):
       
  2162             spec += '/'
       
  2163         spec = spec[len(rootdir):]
       
  2164         fixpaths = os.sep != '/'
       
  2165         if fixpaths:
       
  2166             spec = spec.replace(os.sep, '/')
       
  2167         speclen = len(spec)
       
  2168         fullpaths = opts['full']
       
  2169         files, dirs = set(), set()
       
  2170         adddir, addfile = dirs.add, files.add
       
  2171         for f, st in dirstate.iteritems():
       
  2172             if f.startswith(spec) and st[0] in acceptable:
       
  2173                 if fixpaths:
       
  2174                     f = f.replace('/', os.sep)
       
  2175                 if fullpaths:
       
  2176                     addfile(f)
       
  2177                     continue
       
  2178                 s = f.find(os.sep, speclen)
       
  2179                 if s >= 0:
       
  2180                     adddir(f[:s+1])
       
  2181                 else:
       
  2182                     addfile(f)
       
  2183         return files, dirs
       
  2184 
       
  2185     acceptable = ''
       
  2186     if opts['normal']:
       
  2187         acceptable += 'nm'
       
  2188     if opts['added']:
       
  2189         acceptable += 'a'
       
  2190     if opts['removed']:
       
  2191         acceptable += 'r'
       
  2192     cwd = repo.getcwd()
       
  2193     if not specs:
       
  2194         specs = ['.']
       
  2195 
       
  2196     files, dirs = set(), set()
       
  2197     for spec in specs:
       
  2198         f, d = complete(spec, acceptable or 'nmar')
       
  2199         files.update(f)
       
  2200         dirs.update(d)
       
  2201     for d in dirs:
       
  2202         files.add(d + 'a')
       
  2203         files.add(d + 'b')
       
  2204     ui.write('\n'.join(repo.pathto(p, cwd) for p in sorted(files)))
       
  2205     ui.write('\n')
  2139 
  2206 
  2140 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'))
  2207 @command('debugpushkey', [], _('REPO NAMESPACE [KEY OLD NEW]'))
  2141 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
  2208 def debugpushkey(ui, repopath, namespace, *keyinfo, **opts):
  2142     '''access the pushkey key/value protocol
  2209     '''access the pushkey key/value protocol
  2143 
  2210