##// END OF EJS Templates
Add locate command....
Bryan O'Sullivan -
r627:b6c42714 default
parent child Browse files
Show More
@@ -183,6 +183,34 b' import [-p <n> -b <base> -q] <patches>::'
183 183 init::
184 184 Initialize a new repository in the current directory.
185 185
186 locate [options] [patterns]::
187 Print all files under Mercurial control whose names or paths match
188 the given patterns.
189
190 Patterns are shell-style globs. To restrict searches to specific
191 directories, use the "-i <pat>" option. To eliminate particular
192 directories from searching, use the "-x <pat>" option.
193
194 This command searches the current directory and its
195 subdirectories. To search an entire repository, move to the root
196 of the repository.
197
198 If no patterns are given to match, this command prints all file
199 names.
200
201 If you want to feed the output of this command into the "xargs"
202 command, use the "-0" option to both this command and "xargs".
203 This will avoid the problem of "xargs" treating single filenames
204 that contain white space as multiple file names.
205
206 options:
207
208 -0, --print0 end filenames with NUL, for use with xargs
209 -f, --fullpath print complete paths from the filesystem root
210 -i, --include <pat> include directories matching the given globs
211 -r, --rev <rev> search the repository as it stood at rev
212 -x, --exclude <pat> exclude directories matching the given globs
213
186 214 log [-r revision ...] [-p] [file]::
187 215 Print the revision history of the specified file or the entire project.
188 216
@@ -8,7 +8,7 b''
8 8 from demandload import *
9 9 demandload(globals(), "os re sys signal")
10 10 demandload(globals(), "fancyopts ui hg util")
11 demandload(globals(), "hgweb mdiff random signal time traceback")
11 demandload(globals(), "fnmatch hgweb mdiff random signal time traceback")
12 12 demandload(globals(), "errno socket version struct")
13 13
14 14 class UnknownCommand(Exception): pass
@@ -631,6 +631,46 b' def init(ui, source=None):'
631 631 sys.exit(1)
632 632 repo = hg.repository(ui, ".", create=1)
633 633
634 def locate(ui, repo, *pats, **opts):
635 """locate files matching specific patterns"""
636 if [p for p in pats if os.sep in p]:
637 ui.warn("error: patterns may not contain '%s'\n" % os.sep)
638 ui.warn("use '-i <dir>' instead\n")
639 sys.exit(1)
640 def compile(pats, head = '^', tail = os.sep, on_empty = True):
641 if not pats:
642 class c:
643 def match(self, x): return on_empty
644 return c()
645 regexp = r'%s(?:%s)%s' % (
646 head,
647 '|'.join([fnmatch.translate(os.path.normpath(os.path.normcase(p)))[:-1]
648 for p in pats]),
649 tail)
650 print regexp
651 return re.compile(regexp)
652 exclude = compile(opts['exclude'], on_empty = False)
653 include = compile(opts['include'])
654 pat = compile([os.path.normcase(p) for p in pats], head = '', tail = '$')
655 end = '\n'
656 if opts['print0']: end = '\0'
657 if opts['rev']: node = repo.manifest.lookup(opts['rev'])
658 else: node = repo.manifest.tip()
659 manifest = repo.manifest.read(node)
660 cwd = repo.getcwd()
661 cwd_plus = cwd and (cwd + os.sep)
662 found = []
663 for f in manifest:
664 f = os.path.normcase(f)
665 if exclude.match(f) or not(include.match(f) and
666 f.startswith(cwd_plus) and
667 pat.match(os.path.basename(f))): continue
668 if opts['fullpath']: f = os.path.join(repo.root, f)
669 elif cwd: f = f[len(cwd_plus):]
670 found.append(f)
671 found.sort()
672 for f in found: ui.write(f, end)
673
634 674 def log(ui, repo, f=None, **opts):
635 675 """show the revision history of the repository or a single file"""
636 676 if f:
@@ -1037,6 +1077,13 b' table = {'
1037 1077 ('b', 'base', "", 'base path')],
1038 1078 "hg import [options] <patches>"),
1039 1079 "^init": (init, [], 'hg init'),
1080 "locate": (locate,
1081 [('0', 'print0', None, 'end records with NUL'),
1082 ('f', 'fullpath', None, 'print complete paths'),
1083 ('i', 'include', [], 'include path in search'),
1084 ('r', 'rev', '', 'revision'),
1085 ('x', 'exclude', [], 'exclude path from search')],
1086 'hg locate [options] [files]'),
1040 1087 "^log|history": (log,
1041 1088 [('r', 'rev', [], 'revision'),
1042 1089 ('p', 'patch', None, 'show patch')],
@@ -508,6 +508,11 b' class localrepository:'
508 508 if f[0] == '/': f = f[1:]
509 509 return filelog(self.opener, f)
510 510
511 def getcwd(self):
512 cwd = os.getcwd()
513 if cwd == self.root: return ''
514 return cwd[len(self.root) + 1:]
515
511 516 def wfile(self, f, mode='r'):
512 517 return self.wopener(f, mode)
513 518
General Comments 0
You need to be logged in to leave comments. Login now