/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.1 by Parth Malwankar
initial skeleton
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
0.41.1 by Parth Malwankar
0.0.1 final
16
"""Print lines matching PATTERN for specified files and revisions."""
0.40.1 by Parth Malwankar
initial skeleton
17
18
import os
0.40.3 by Parth Malwankar
basic file grep is working
19
import sys
0.40.1 by Parth Malwankar
initial skeleton
20
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
21
from bzrlib import errors
0.40.2 by Parth Malwankar
initial framework for grep
22
from bzrlib.commands import Command, register_command, display_command
0.41.19 by Parth Malwankar
updated to accept --include and --exclude. unused at this point.
23
from bzrlib.option import Option, ListOption
0.40.2 by Parth Malwankar
initial framework for grep
24
25
from bzrlib.lazy_import import lazy_import
26
lazy_import(globals(), """
0.40.3 by Parth Malwankar
basic file grep is working
27
import re
28
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
29
import grep
0.40.28 by Parth Malwankar
basic revision spec is used for grepping
30
0.40.2 by Parth Malwankar
initial framework for grep
31
import bzrlib
0.41.11 by Parth Malwankar
moved top level grep code to versioned_grep.
32
from bzrlib.revisionspec import RevisionSpec
0.40.2 by Parth Malwankar
initial framework for grep
33
from bzrlib import (
0.40.4 by Parth Malwankar
intermediate checkin. added support for --null
34
    osutils,
0.40.2 by Parth Malwankar
initial framework for grep
35
    bzrdir,
0.40.7 by Parth Malwankar
issue a warning while searching unversioned file
36
    trace,
0.40.2 by Parth Malwankar
initial framework for grep
37
    )
38
""")
0.40.1 by Parth Malwankar
initial skeleton
39
0.40.127 by Parth Malwankar
bumped up version number to 0.2.0.
40
version_info = (0, 2, 0, 'final', 0)
0.40.1 by Parth Malwankar
initial skeleton
41
0.40.46 by Parth Malwankar
--levels=0 now implicitly prints revnos. added test for --levels=0.
42
# FIXME: _parse_levels should be shared with bzrlib.builtins. this is a copy
43
# to avoid the error
44
#   "IllegalUseOfScopeReplacer: ScopeReplacer object '_parse_levels' was used
45
#   incorrectly: Object already cleaned up, did you assign it to another
46
#   variable?: _factory
47
# with lazy import
48
def _parse_levels(s):
49
    try:
50
        return int(s)
51
    except ValueError:
52
        msg = "The levels argument must be an integer."
53
        raise errors.BzrCommandError(msg)
54
55
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
56
class GrepOptions(object):
57
    """Container to pass around grep options.
58
59
    This class is used as a container to pass around user option and
60
    some other params (like outf) to processing functions. This makes
61
    it easier to add more options as grep evolves.
62
    """
63
    verbose = False
64
    ignore_case = False
65
    no_recursive = False
66
    from_root = False
67
    null = False
68
    levels = None
69
    line_number = False
70
    path_list = None
71
    revision = None
72
    pattern = None
73
    include = None
74
    exclude = None
75
    fixed_string = False
76
    files_with_matches = False
77
    files_without_match = False
78
    color = False
79
80
    # derived options
81
    recursive = None
82
    eol_marker = None
83
    patternc = None
84
    print_revno = None
85
    fixed_string = None
86
    outf = None
87
88
0.40.1 by Parth Malwankar
initial skeleton
89
class cmd_grep(Command):
0.40.36 by Parth Malwankar
improved docs and minor code cleanup
90
    """Print lines matching PATTERN for specified files and revisions.
91
0.41.14 by Parth Malwankar
updated help and added test.
92
    This command searches the specified files and revisions for a given
93
    pattern.  The pattern is specified as a Python regular expressions[1].
94
95
    If the file name is not specified, the revisions starting with the
96
    current directory are searched recursively. If the revision number is
97
    not specified, the working copy is searched. To search the last committed
98
    revision, use the '-r -1' or '-r last:1' option.
99
100
    Unversioned files are not searched unless explicitly specified on the
0.41.15 by Parth Malwankar
bzr-grep now searches working copy by default.
101
    command line. Unversioned directores are not searched.
0.41.14 by Parth Malwankar
updated help and added test.
102
103
    When searching a pattern, the output is shown in the 'filepath:string'
104
    format. If a revision is explicitly searched, the output is shown as
105
    'filepath~N:string', where N is the revision number.
0.40.36 by Parth Malwankar
improved docs and minor code cleanup
106
0.41.19 by Parth Malwankar
updated to accept --include and --exclude. unused at this point.
107
    --include and --exclude options can be used to search only (or exclude
108
    from search) files with base name matches the specified Unix style GLOB
109
    pattern.  The GLOB pattern an use *, ?, and [...] as wildcards, and \\
0.41.22 by Parth Malwankar
added basic --exclude/include tests
110
    to quote wildcard or backslash character literally. Note that the glob
111
    pattern is not a regular expression.
0.41.19 by Parth Malwankar
updated to accept --include and --exclude. unused at this point.
112
0.40.36 by Parth Malwankar
improved docs and minor code cleanup
113
    [1] http://docs.python.org/library/re.html#regular-expression-syntax
0.40.2 by Parth Malwankar
initial framework for grep
114
    """
115
0.40.82 by Parth Malwankar
chenged encoding_type to 'replace' to handle unicode better
116
    encoding_type = 'replace'
0.40.2 by Parth Malwankar
initial framework for grep
117
    takes_args = ['pattern', 'path*']
118
    takes_options = [
119
        'verbose',
0.40.28 by Parth Malwankar
basic revision spec is used for grepping
120
        'revision',
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
121
        Option('color',
122
               help='Show match in color.'),
0.40.111 by Parth Malwankar
ordered the command line options correctly.
123
        ListOption('exclude', type=str, argname='glob', short_name='X',
124
            help="Skip files whose base name matches GLOB."),
125
        ListOption('include', type=str, argname='glob', short_name='I',
126
            help="Search only files whose base name matches GLOB."),
0.40.112 by Parth Malwankar
support for -l, --files-with-matches. no tests yet.
127
        Option('files-with-matches', short_name='l',
0.40.121 by Parth Malwankar
initial implementation of -L/--files-without-matches. no tests.
128
               help='Print only the name of each input file in '
129
               'which PATTERN is found.'),
0.40.126 by Parth Malwankar
renamed --files-without-matches => --files-without-match
130
        Option('files-without-match', short_name='L',
0.40.121 by Parth Malwankar
initial implementation of -L/--files-without-matches. no tests.
131
               help='Print only the name of each input file in '
132
               'which PATTERN is not found.'),
0.40.83 by Parth Malwankar
added support for -F/--fixed-string.
133
        Option('fixed-string', short_name='F',
134
               help='Interpret PATTERN is a single fixed string (not regex).'),
0.40.111 by Parth Malwankar
ordered the command line options correctly.
135
        Option('from-root',
136
               help='Search for pattern starting from the root of the branch. '
137
               '(implies --recursive)'),
138
        Option('ignore-case', short_name='i',
139
               help='ignore case distinctions while matching.'),
140
        Option('levels',
0.40.121 by Parth Malwankar
initial implementation of -L/--files-without-matches. no tests.
141
           help='Number of levels to display - 0 for all, 1 for collapsed '
142
           '(1 is default).',
0.40.111 by Parth Malwankar
ordered the command line options correctly.
143
           argname='N',
144
           type=_parse_levels),
0.40.24 by Parth Malwankar
added support for --line-number.
145
        Option('line-number', short_name='n',
146
               help='show 1-based line number.'),
0.41.6 by Parth Malwankar
renamed --recurse/--no-recurse => --recursive/--no-recursive
147
        Option('no-recursive',
148
               help="Don't recurse into subdirectories. (default is --recursive)"),
0.40.19 by Parth Malwankar
null option should be -Z instead of -z
149
        Option('null', short_name='Z',
0.41.3 by Parth Malwankar
minor fix in help text: ascii => ASCII
150
               help='Write an ASCII NUL (\\0) separator '
0.40.4 by Parth Malwankar
intermediate checkin. added support for --null
151
               'between output lines rather than a newline.'),
0.40.2 by Parth Malwankar
initial framework for grep
152
        ]
153
154
155
    @display_command
0.41.19 by Parth Malwankar
updated to accept --include and --exclude. unused at this point.
156
    def run(self, verbose=False, ignore_case=False, no_recursive=False,
157
            from_root=False, null=False, levels=None, line_number=False,
158
            path_list=None, revision=None, pattern=None, include=None,
0.40.121 by Parth Malwankar
initial implementation of -L/--files-without-matches. no tests.
159
            exclude=None, fixed_string=False, files_with_matches=False,
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
160
            files_without_match=False, color=False):
0.41.4 by Parth Malwankar
--recurse is default.
161
0.40.38 by Parth Malwankar
added --levels options. added tests for range search.
162
        if levels==None:
163
            levels=1
164
0.40.2 by Parth Malwankar
initial framework for grep
165
        if path_list == None:
166
            path_list = ['.']
167
        else:
168
            if from_root:
169
                raise errors.BzrCommandError('cannot specify both --from-root and PATH.')
170
0.40.126 by Parth Malwankar
renamed --files-without-matches => --files-without-match
171
        if files_with_matches and files_without_match:
0.40.121 by Parth Malwankar
initial implementation of -L/--files-without-matches. no tests.
172
            raise errors.BzrCommandError('cannot specify both '
173
                '-l/--files-with-matches and -L/--files-without-matches.')
174
0.40.30 by Parth Malwankar
revno is now printed when rspec is given
175
        print_revno = False
0.40.46 by Parth Malwankar
--levels=0 now implicitly prints revnos. added test for --levels=0.
176
        if revision != None or levels == 0:
177
            # print revision numbers as we may be showing multiple revisions
178
            print_revno = True
179
0.40.9 by Parth Malwankar
factored out grep related code to grep.py
180
        eol_marker = '\n'
181
        if null:
182
            eol_marker = '\0'
183
0.40.83 by Parth Malwankar
added support for -F/--fixed-string.
184
        # if the pattern isalnum, implicitly switch to fixed_string for faster grep
0.40.86 by Parth Malwankar
the check for implicit fixed_string now allows for spaces.
185
        if grep.is_fixed_string(pattern):
0.40.83 by Parth Malwankar
added support for -F/--fixed-string.
186
            fixed_string = True
187
188
        patternc = None
189
        if not fixed_string:
190
            re_flags = 0
191
            if ignore_case:
192
                re_flags = re.IGNORECASE
193
            patternc = grep.compile_pattern(pattern, re_flags)
0.40.3 by Parth Malwankar
basic file grep is working
194
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
195
        GrepOptions.verbose = verbose
196
        GrepOptions.ignore_case = ignore_case
197
        GrepOptions.no_recursive = no_recursive
198
        GrepOptions.from_root = from_root
199
        GrepOptions.null = null
200
        GrepOptions.levels = levels
201
        GrepOptions.line_number = line_number
202
        GrepOptions.path_list = path_list
203
        GrepOptions.revision = revision
204
        GrepOptions.pattern = pattern
205
        GrepOptions.include = include
206
        GrepOptions.exclude = exclude
207
        GrepOptions.fixed_string = fixed_string
208
        GrepOptions.files_with_matches = files_with_matches
209
        GrepOptions.files_without_match = files_without_match
210
        GrepOptions.color = color
211
        GrepOptions.eol_marker = eol_marker
212
        GrepOptions.patternc = patternc
213
        GrepOptions.print_revno = print_revno
214
        GrepOptions.recursive = not no_recursive
215
        GrepOptions.fixed_string = fixed_string
216
        GrepOptions.outf = self.outf
217
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
218
        if revision == None:
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
219
            grep.workingtree_grep(GrepOptions)
0.41.12 by Parth Malwankar
initial support for working tree grep (no test cases yet!)
220
        else:
0.43.1 by Parth Malwankar
added GrepOptions object for easy parameter passing
221
            grep.versioned_grep(GrepOptions)
0.40.33 by Parth Malwankar
better message while skipping unversioned file
222
0.40.29 by Parth Malwankar
directory grepping is now the _grep_dir function
223
0.40.1 by Parth Malwankar
initial skeleton
224
register_command(cmd_grep)
0.40.2 by Parth Malwankar
initial framework for grep
225
0.40.11 by Parth Malwankar
added basic test
226
def test_suite():
227
    from bzrlib.tests import TestUtil
228
229
    suite = TestUtil.TestSuite()
230
    loader = TestUtil.TestLoader()
231
    testmod_names = [
232
        'test_grep',
233
        ]
234
235
    suite.addTest(loader.loadTestsFromModuleNames(
236
            ["%s.%s" % (__name__, tmn) for tmn in testmod_names]))
237
    return suite
238