| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | import os | 
					
						
							|  |  |  | import fnmatch | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | from Tkinter import * | 
					
						
							|  |  |  | import SearchEngine | 
					
						
							|  |  |  | from SearchDialogBase import SearchDialogBase | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def grep(text, io=None, flist=None): | 
					
						
							|  |  |  |     root = text._root() | 
					
						
							|  |  |  |     engine = SearchEngine.get(root) | 
					
						
							|  |  |  |     if not hasattr(engine, "_grepdialog"): | 
					
						
							|  |  |  |         engine._grepdialog = GrepDialog(root, engine, flist) | 
					
						
							|  |  |  |     dialog = engine._grepdialog | 
					
						
							| 
									
										
										
										
											2003-06-07 03:21:17 +00:00
										 |  |  |     searchphrase = text.get("sel.first", "sel.last") | 
					
						
							|  |  |  |     dialog.open(text, searchphrase, io) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class GrepDialog(SearchDialogBase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     title = "Find in Files Dialog" | 
					
						
							|  |  |  |     icon = "Grep" | 
					
						
							|  |  |  |     needwrapbutton = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, root, engine, flist): | 
					
						
							|  |  |  |         SearchDialogBase.__init__(self, root, engine) | 
					
						
							|  |  |  |         self.flist = flist | 
					
						
							|  |  |  |         self.globvar = StringVar(root) | 
					
						
							|  |  |  |         self.recvar = BooleanVar(root) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-07 03:21:17 +00:00
										 |  |  |     def open(self, text, searchphrase, io=None): | 
					
						
							|  |  |  |         SearchDialogBase.open(self, text, searchphrase) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         if io: | 
					
						
							|  |  |  |             path = io.filename or "" | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             path = "" | 
					
						
							|  |  |  |         dir, base = os.path.split(path) | 
					
						
							|  |  |  |         head, tail = os.path.splitext(base) | 
					
						
							|  |  |  |         if not tail: | 
					
						
							|  |  |  |             tail = ".py" | 
					
						
							|  |  |  |         self.globvar.set(os.path.join(dir, "*" + tail)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_entries(self): | 
					
						
							|  |  |  |         SearchDialogBase.create_entries(self) | 
					
						
							|  |  |  |         self.globent = self.make_entry("In files:", self.globvar) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_other_buttons(self): | 
					
						
							|  |  |  |         f = self.make_frame() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         btn = Checkbutton(f, anchor="w", | 
					
						
							|  |  |  |                 variable=self.recvar, | 
					
						
							|  |  |  |                 text="Recurse down subdirectories") | 
					
						
							|  |  |  |         btn.pack(side="top", fill="both") | 
					
						
							|  |  |  |         btn.select() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def create_command_buttons(self): | 
					
						
							|  |  |  |         SearchDialogBase.create_command_buttons(self) | 
					
						
							|  |  |  |         self.make_button("Search Files", self.default_command, 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def default_command(self, event=None): | 
					
						
							|  |  |  |         prog = self.engine.getprog() | 
					
						
							|  |  |  |         if not prog: | 
					
						
							|  |  |  |             return | 
					
						
							|  |  |  |         path = self.globvar.get() | 
					
						
							|  |  |  |         if not path: | 
					
						
							|  |  |  |             self.top.bell() | 
					
						
							|  |  |  |             return | 
					
						
							| 
									
										
											  
											
												Merged revisions 56443-56466 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/p3yk
................
  r56454 | kurt.kaiser | 2007-07-18 22:26:14 -0700 (Wed, 18 Jul 2007) | 2 lines
  Make relative imports explicit for py3k
................
  r56455 | kurt.kaiser | 2007-07-18 23:12:15 -0700 (Wed, 18 Jul 2007) | 2 lines
  Was modifying dict during iteration.
................
  r56457 | guido.van.rossum | 2007-07-19 07:33:19 -0700 (Thu, 19 Jul 2007) | 2 lines
  Fix failing test.
................
  r56466 | guido.van.rossum | 2007-07-19 20:58:16 -0700 (Thu, 19 Jul 2007) | 35 lines
  Merged revisions 56413-56465 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk
  ........
    r56439 | georg.brandl | 2007-07-17 23:37:55 -0700 (Tue, 17 Jul 2007) | 2 lines
    Use "Unix" as platform name, not "UNIX".
  ........
    r56441 | guido.van.rossum | 2007-07-18 10:19:14 -0700 (Wed, 18 Jul 2007) | 3 lines
    SF patch# 1755885 by Kurt Kaiser: show location of Unicode escape errors.
    (Slightly tweaked for style and refcounts.)
  ........
    r56444 | kurt.kaiser | 2007-07-18 12:58:42 -0700 (Wed, 18 Jul 2007) | 2 lines
    Fix failing unicode test caused by change to ast.c at r56441
  ........
    r56451 | georg.brandl | 2007-07-18 15:36:53 -0700 (Wed, 18 Jul 2007) | 2 lines
    Add description for wave.setcomptype() values
  ........
    r56456 | walter.doerwald | 2007-07-19 06:04:38 -0700 (Thu, 19 Jul 2007) | 3 lines
    Document that codecs.lookup() returns a CodecInfo object.
    (fixes SF bug #1754453).
  ........
    r56463 | facundo.batista | 2007-07-19 16:57:38 -0700 (Thu, 19 Jul 2007) | 6 lines
    Added a select.select call in the test server loop to make sure the
    socket is ready to be read from before attempting a read (this
    prevents an error 10035 on some Windows platforms). [GSoC - Alan
    McIntyre]
  ........
................
											
										 
											2007-07-20 04:05:57 +00:00
										 |  |  |         from .OutputWindow import OutputWindow | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         save = sys.stdout | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             sys.stdout = OutputWindow(self.flist) | 
					
						
							|  |  |  |             self.grep_it(prog, path) | 
					
						
							|  |  |  |         finally: | 
					
						
							|  |  |  |             sys.stdout = save | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def grep_it(self, prog, path): | 
					
						
							|  |  |  |         dir, base = os.path.split(path) | 
					
						
							|  |  |  |         list = self.findfiles(dir, base, self.recvar.get()) | 
					
						
							|  |  |  |         list.sort() | 
					
						
							|  |  |  |         self.close() | 
					
						
							|  |  |  |         pat = self.engine.getpat() | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |         print("Searching %r in %s ..." % (pat, path)) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         hits = 0 | 
					
						
							|  |  |  |         for fn in list: | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 f = open(fn) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |             except IOError as msg: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |                 print(msg) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |                 continue | 
					
						
							|  |  |  |             lineno = 0 | 
					
						
							|  |  |  |             while 1: | 
					
						
							|  |  |  |                 block = f.readlines(100000) | 
					
						
							|  |  |  |                 if not block: | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  |                 for line in block: | 
					
						
							|  |  |  |                     lineno = lineno + 1 | 
					
						
							|  |  |  |                     if line[-1:] == '\n': | 
					
						
							|  |  |  |                         line = line[:-1] | 
					
						
							|  |  |  |                     if prog.search(line): | 
					
						
							|  |  |  |                         sys.stdout.write("%s: %s: %s\n" % (fn, lineno, line)) | 
					
						
							|  |  |  |                         hits = hits + 1 | 
					
						
							|  |  |  |         if hits: | 
					
						
							|  |  |  |             if hits == 1: | 
					
						
							|  |  |  |                 s = "" | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 s = "s" | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("Found", hits, "hit%s." % s) | 
					
						
							|  |  |  |             print("(Hint: right-click to open locations.)") | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print("No hits.") | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def findfiles(self, dir, base, rec): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             names = os.listdir(dir or os.curdir) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except os.error as msg: | 
					
						
							| 
									
										
										
										
											2007-02-09 05:37:30 +00:00
										 |  |  |             print(msg) | 
					
						
							| 
									
										
										
										
											2000-08-15 01:13:23 +00:00
										 |  |  |             return [] | 
					
						
							|  |  |  |         list = [] | 
					
						
							|  |  |  |         subdirs = [] | 
					
						
							|  |  |  |         for name in names: | 
					
						
							|  |  |  |             fn = os.path.join(dir, name) | 
					
						
							|  |  |  |             if os.path.isdir(fn): | 
					
						
							|  |  |  |                 subdirs.append(fn) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 if fnmatch.fnmatch(name, base): | 
					
						
							|  |  |  |                     list.append(fn) | 
					
						
							|  |  |  |         if rec: | 
					
						
							|  |  |  |             for subdir in subdirs: | 
					
						
							|  |  |  |                 list.extend(self.findfiles(subdir, base, rec)) | 
					
						
							|  |  |  |         return list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def close(self, event=None): | 
					
						
							|  |  |  |         if self.top: | 
					
						
							|  |  |  |             self.top.grab_release() | 
					
						
							|  |  |  |             self.top.withdraw() |