/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.40.10 by Parth Malwankar
assigned copyright to canonical
1
# Copyright (C) 2010 Canonical Ltd
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
from bzrlib.lazy_import import lazy_import
18
lazy_import(globals(), """
19
import os
20
import re
0.40.47 by Parth Malwankar
fixes bug #531336. binary files are now skipped.
21
import cStringIO
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
22
from fnmatch import fnmatch
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
23
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
24
from bzrlib import log as logcmd
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
25
from bzrlib import bzrdir
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
26
from bzrlib.workingtree import WorkingTree
27
from bzrlib.revisionspec import RevisionSpec, RevisionSpec_revid
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
28
from bzrlib import (
29
    errors,
30
    lazy_regex,
0.40.47 by Parth Malwankar
fixes bug #531336. binary files are now skipped.
31
    osutils,
32
    textfile,
33
    trace,
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
34
    )
35
""")
36
37
def compile_pattern(pattern, flags=0):
38
    patternc = None
39
    try:
40
        # use python's re.compile as we need to catch re.error in case of bad pattern
41
        lazy_regex.reset_compile()
42
        patternc = re.compile(pattern, flags)
43
    except re.error, e:
44
        raise errors.BzrError("Invalid pattern: '%s'" % pattern)
45
    return patternc
46
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
47
48
def versioned_grep(revision, compiled_pattern, path_list, recursive,
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
49
        line_number, from_root, eol_marker, print_revno, levels,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
50
        include, exclude, verbose, outf):
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
51
52
    wt, relpath = WorkingTree.open_containing('.')
53
54
    start_rev = revision[0]
55
    end_rev = revision[0]
56
    if len(revision) == 2:
57
        end_rev = revision[1]
58
59
    start_revid = start_rev.as_revision_id(wt.branch)
60
    end_revid   = end_rev.as_revision_id(wt.branch)
61
62
    given_revs = logcmd._graph_view_revisions(wt.branch, start_revid, end_revid)
0.41.13 by Parth Malwankar
working tree grep is now working
63
    given_revs = list(given_revs)
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
64
65
    for revid, revno, merge_depth in given_revs:
66
        if levels == 1 and merge_depth != 0:
67
            # with level=1 show only top level
68
            continue
69
70
        wt.lock_read()
71
        rev = RevisionSpec_revid.from_string("revid:"+revid)
72
        try:
73
            for path in path_list:
74
                tree = rev.as_tree(wt.branch)
75
                path_for_id = osutils.pathjoin(relpath, path)
76
                id = tree.path2id(path_for_id)
77
                if not id:
0.41.22 by Parth Malwankar
added basic --exclude/include tests
78
                    trace.warning("Skipped unknown file '%s'." % path)
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
79
                    continue
80
81
                if osutils.isdir(path):
82
                    path_prefix = path
83
                    dir_grep(tree, path, relpath, recursive, line_number,
84
                        compiled_pattern, from_root, eol_marker, revno, print_revno,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
85
                        include, exclude, verbose, outf, path_prefix)
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
86
                else:
87
                    tree.lock_read()
88
                    try:
89
                        versioned_file_grep(tree, id, '.', path,
90
                            compiled_pattern, eol_marker, line_number, revno,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
91
                            print_revno, include, exclude, verbose, outf)
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
92
                    finally:
93
                        tree.unlock()
94
        finally:
95
            wt.unlock()
96
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
97
def workingtree_grep(compiled_pattern, path_list, recursive,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
98
        line_number, from_root, eol_marker, include, exclude, verbose, outf):
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
99
    revno = print_revno = None # for working tree set revno to None
100
    for path in path_list:
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
101
        tree, branch, relpath = \
102
            bzrdir.BzrDir.open_containing_tree_or_branch('.')
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
103
        if osutils.isdir(path):
104
            path_prefix = path
105
            dir_grep(tree, path, relpath, recursive, line_number,
106
                compiled_pattern, from_root, eol_marker, revno, print_revno,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
107
                include, exclude, verbose, outf, path_prefix)
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
108
        else:
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
109
            _file_grep(open(path).read(), '.', path, compiled_pattern,
110
                eol_marker, line_number, revno, print_revno, include,
111
                exclude, verbose, outf)
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
112
0.40.43 by Parth Malwankar
moved cmd_grep._grep_dir to grep.dir_grep
113
def dir_grep(tree, path, relpath, recursive, line_number, compiled_pattern,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
114
        from_root, eol_marker, revno, print_revno, include, exclude, verbose,
115
        outf, path_prefix):
116
    # setup relpath to open files relative to cwd
117
    rpath = relpath
118
    if relpath:
119
        rpath = osutils.pathjoin('..',relpath)
120
121
    from_dir = osutils.pathjoin(relpath, path)
122
    if from_root:
123
        # start searching recursively from root
124
        from_dir=None
125
        recursive=True
126
127
    tree.lock_read()
128
    try:
129
        for fp, fc, fkind, fid, entry in tree.list_files(include_root=False,
130
            from_dir=from_dir, recursive=recursive):
131
132
            if fc == 'V' and fkind == 'file':
133
                if revno != None:
134
                    versioned_file_grep(tree, fid, rpath, fp,
135
                        compiled_pattern, eol_marker, line_number,
136
                        revno, print_revno, include, exclude, verbose,
137
                        outf, path_prefix)
138
                else:
139
                    # we are grepping working tree.
140
                    if from_dir == None:
141
                        from_dir = '.'
142
143
                    path_for_file = osutils.pathjoin(tree.basedir, from_dir, fp)
144
                    _file_grep(open(path_for_file).read(), rpath, fp,
145
                        compiled_pattern, eol_marker, line_number, revno,
146
                        print_revno, include, exclude, verbose, outf, path_prefix)
147
    finally:
148
        tree.unlock()
0.40.43 by Parth Malwankar
moved cmd_grep._grep_dir to grep.dir_grep
149
150
0.41.8 by Parth Malwankar
code cleanup.
151
def _make_display_path(relpath, path):
152
    """Return path string relative to user cwd.
0.40.42 by Parth Malwankar
fix to make grep paths relative to cwd
153
0.41.8 by Parth Malwankar
code cleanup.
154
    Take tree's 'relpath' and user supplied 'path', and return path
155
    that can be displayed to the user.
156
    """
0.40.15 by Parth Malwankar
some fixes and test updates
157
    if relpath:
0.40.52 by Parth Malwankar
code cleanup and documentation
158
        # update path so to display it w.r.t cwd
159
        # handle windows slash separator
0.40.20 by Parth Malwankar
used path functions from bzrlib.osutils
160
        path = osutils.normpath(osutils.pathjoin(relpath, path))
0.40.22 by Parth Malwankar
fixed display path formatting on windows
161
        path = path.replace('\\', '/')
162
        path = path.replace(relpath + '/', '', 1)
0.41.8 by Parth Malwankar
code cleanup.
163
    return path
164
165
0.41.9 by Parth Malwankar
refactored code towards support for working tree grep.
166
def versioned_file_grep(tree, id, relpath, path, patternc, eol_marker,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
167
        line_number, revno, print_revno, include, exclude, verbose, outf,
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
168
        path_prefix = None):
0.41.10 by Parth Malwankar
code cleanup. added comments. path adjustment is now done
169
    """Create a file object for the specified id and pass it on to _file_grep.
170
    """
171
172
    path = _make_display_path(relpath, path)
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
173
    file_text = tree.get_file_text(id)
174
    _file_grep(file_text, relpath, path, patternc, eol_marker,
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
175
        line_number, revno, print_revno, include, exclude, verbose,
176
        outf, path_prefix)
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
177
178
def _path_in_glob_list(path, glob_list):
179
    present = False
180
    for glob in glob_list:
181
        if fnmatch(path, glob):
182
            present = True
183
            break
184
    return present
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
185
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
186
def _file_grep(file_text, relpath, path, patternc, eol_marker, line_number,
187
        revno, print_revno, include, exclude, verbose, outf, path_prefix=None):
0.41.21 by Parth Malwankar
include/exclude working now. tests not added.
188
0.41.9 by Parth Malwankar
refactored code towards support for working tree grep.
189
    # test and skip binary files
0.40.62 by Parth Malwankar
performance optimization
190
    if '\x00' in file_text[:1024]:
0.40.60 by Parth Malwankar
'binary file skipped' warning is only shown with --verbose flag
191
        if verbose:
192
            trace.warning("Binary file '%s' skipped." % path)
0.41.9 by Parth Malwankar
refactored code towards support for working tree grep.
193
        return
194
0.40.66 by Parth Malwankar
check for binary now happens before we bother about the glob patterns.
195
    if include and not _path_in_glob_list(path, include):
196
        return
197
198
    if exclude and _path_in_glob_list(path, exclude):
199
        return
200
0.40.52 by Parth Malwankar
code cleanup and documentation
201
    if path_prefix and path_prefix != '.':
202
        # user has passed a dir arg, show that as result prefix
203
        path = osutils.pathjoin(path_prefix, path)
204
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
205
    fmt = path + ":%s" + eol_marker
206
    fmt_n = path + ":%d:%s" + eol_marker
207
    fmt_rev = path + "~%s:%s" + eol_marker
208
    fmt_rev_n = path + "~%s:%d:%s" + eol_marker
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
209
0.40.64 by Parth Malwankar
cosmetic: improved comment
210
    # for better performance we moved formatting conditionals out
211
    # of the core loop. hence, the core loop is somewhat duplicated
212
    # for various combinations of formatting options.
213
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
214
    if print_revno and line_number:
215
216
        pfmt = fmt_rev_n
217
        index = 1
218
        for line in file_text.split("\n"):
0.40.65 by Parth Malwankar
core loop uses one less variable.
219
            if patternc.search(line):
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
220
                outf.write(pfmt % (revno, index, line))
221
            index += 1
222
223
    elif print_revno and not line_number:
224
225
        pfmt = fmt_rev
226
        for line in file_text.split("\n"):
0.40.65 by Parth Malwankar
core loop uses one less variable.
227
            if patternc.search(line):
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
228
                outf.write(pfmt % (revno, line))
229
230
    elif not print_revno and line_number:
231
232
        pfmt = fmt_n
233
        index = 1
234
        for line in file_text.split("\n"):
0.40.65 by Parth Malwankar
core loop uses one less variable.
235
            if patternc.search(line):
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
236
                outf.write(pfmt % (index, line))
237
            index += 1
238
239
    else:
0.40.64 by Parth Malwankar
cosmetic: improved comment
240
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
241
        pfmt = fmt
242
        for line in file_text.split("\n"):
0.40.65 by Parth Malwankar
core loop uses one less variable.
243
            if patternc.search(line):
0.40.63 by Parth Malwankar
performance: moved conditionals out of core loop.
244
                outf.write(pfmt % (line,))
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
245
246