~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/builtins.py

  • Committer: John Arbash Meinel
  • Date: 2009-03-26 16:35:00 UTC
  • mfrom: (4208 +trunk)
  • mto: (3735.40.9 vilajam)
  • mto: This revision was merged to the branch mainline in revision 4280.
  • Revision ID: john@arbash-meinel.com-20090326163500-os7lvdpsdxnxstd0
Merge bzr.dev 4208.

This brings in some more smart-server improvements, 
as well as the iter_files_bytes as chunked, and 
multi-file and directory logging.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1977
1977
 
1978
1978
    :Path filtering:
1979
1979
 
1980
 
      If a parameter is given and it's not a branch, the log will be filtered
1981
 
      to show only those revisions that changed the nominated file or
1982
 
      directory.
 
1980
      If parameters are given and the first one is not a branch, the log
 
1981
      will be filtered to show only those revisions that changed the
 
1982
      nominated files or directories.
1983
1983
 
1984
1984
      Filenames are interpreted within their historical context. To log a
1985
1985
      deleted file, specify a revision range so that the file existed at
2008
2008
      explicitly ask for this (and no way to stop logging a file back
2009
2009
      until it was last renamed).
2010
2010
 
2011
 
      Note: If the path is a directory, only revisions that directly changed
2012
 
      that directory object are currently shown. This is considered a bug.
2013
 
      (Support for filtering against multiple files and for files within a
2014
 
      directory is under development.)
2015
 
 
2016
2011
    :Other filtering:
2017
2012
 
2018
2013
      The --message option can be used for finding revisions that match a
2033
2028
 
2034
2029
        [ALIASES]
2035
2030
        tip = log -r-1 -n1
2036
 
        top = log -r-10.. --short --forward
 
2031
        top = log -l10 --line
2037
2032
        show = log -v -p -n1 --long
2038
2033
 
2039
2034
      ``bzr tip`` will then show the latest revision while ``bzr top``
2063
2058
      the revnocache plugin. This plugin buffers historical information
2064
2059
      trading disk space for faster speed.
2065
2060
    """
2066
 
    takes_args = ['location?']
 
2061
    takes_args = ['file*']
2067
2062
    _see_also = ['log-formats', 'revisionspec']
2068
2063
    takes_options = [
2069
2064
            Option('forward',
2101
2096
    encoding_type = 'replace'
2102
2097
 
2103
2098
    @display_command
2104
 
    def run(self, location=None, timezone='original',
 
2099
    def run(self, file_list=None, timezone='original',
2105
2100
            verbose=False,
2106
2101
            show_ids=False,
2107
2102
            forward=False,
2112
2107
            message=None,
2113
2108
            limit=None,
2114
2109
            show_diff=False):
2115
 
        from bzrlib.log import show_log, _get_fileid_to_log
 
2110
        from bzrlib.log import (
 
2111
            Logger,
 
2112
            make_log_request_dict,
 
2113
            _get_info_for_log_files,
 
2114
            )
2116
2115
        direction = (forward and 'forward') or 'reverse'
2117
2116
 
2118
2117
        if change is not None:
2124
2123
            else:
2125
2124
                revision = change
2126
2125
 
2127
 
        # log everything
2128
 
        file_id = None
2129
 
        if location:
2130
 
            # find the file id to log:
2131
 
 
2132
 
            tree, b, fp = bzrdir.BzrDir.open_containing_tree_or_branch(
2133
 
                location)
2134
 
            if fp != '':
2135
 
                file_id = _get_fileid_to_log(revision, tree, b, fp)
 
2126
        file_ids = []
 
2127
        filter_by_dir = False
 
2128
        if file_list:
 
2129
            # find the file ids to log and check for directory filtering
 
2130
            b, file_info_list, rev1, rev2 = _get_info_for_log_files(revision,
 
2131
                file_list)
 
2132
            for relpath, file_id, kind in file_info_list:
2136
2133
                if file_id is None:
2137
2134
                    raise errors.BzrCommandError(
2138
2135
                        "Path unknown at end or start of revision range: %s" %
2139
 
                        location)
 
2136
                        relpath)
 
2137
                # If the relpath is the top of the tree, we log everything
 
2138
                if relpath == '':
 
2139
                    file_ids = []
 
2140
                    break
 
2141
                else:
 
2142
                    file_ids.append(file_id)
 
2143
                filter_by_dir = filter_by_dir or (
 
2144
                    kind in ['directory', 'tree-reference'])
2140
2145
        else:
2141
 
            # local dir only
 
2146
            # log everything
2142
2147
            # FIXME ? log the current subdir only RBC 20060203
2143
2148
            if revision is not None \
2144
2149
                    and len(revision) > 0 and revision[0].get_branch():
2147
2152
                location = '.'
2148
2153
            dir, relpath = bzrdir.BzrDir.open_containing(location)
2149
2154
            b = dir.open_branch()
2150
 
 
2151
 
        b.lock_read()
2152
 
        try:
2153
2155
            rev1, rev2 = _get_revision_range(revision, b, self.name())
 
2156
 
 
2157
        # Decide on the type of delta & diff filtering to use
 
2158
        # TODO: add an --all-files option to make this configurable & consistent
 
2159
        if not verbose:
 
2160
            delta_type = None
 
2161
        else:
 
2162
            delta_type = 'full'
 
2163
        if not show_diff:
 
2164
            diff_type = None
 
2165
        elif file_ids:
 
2166
            diff_type = 'partial'
 
2167
        else:
 
2168
            diff_type = 'full'
 
2169
 
 
2170
        b.lock_read()
 
2171
        try:
 
2172
            # Build the log formatter
2154
2173
            if log_format is None:
2155
2174
                log_format = log.log_formatter_registry.get_default(b)
2156
 
 
2157
2175
            lf = log_format(show_ids=show_ids, to_file=self.outf,
2158
2176
                            show_timezone=timezone,
2159
2177
                            delta_format=get_verbosity_level(),
2160
2178
                            levels=levels)
2161
2179
 
2162
 
            show_log(b,
2163
 
                     lf,
2164
 
                     file_id,
2165
 
                     verbose=verbose,
2166
 
                     direction=direction,
2167
 
                     start_revision=rev1,
2168
 
                     end_revision=rev2,
2169
 
                     search=message,
2170
 
                     limit=limit,
2171
 
                     show_diff=show_diff)
 
2180
            # Choose the algorithm for doing the logging. It's annoying
 
2181
            # having multiple code paths like this but necessary until
 
2182
            # the underlying repository format is faster at generating
 
2183
            # deltas or can provide everything we need from the indices.
 
2184
            # The default algorithm - match-using-deltas - works for
 
2185
            # multiple files and directories and is faster for small
 
2186
            # amounts of history (200 revisions say). However, it's too
 
2187
            # slow for logging a single file in a repository with deep
 
2188
            # history, i.e. > 10K revisions. In the spirit of "do no
 
2189
            # evil when adding features", we continue to use the
 
2190
            # original algorithm - per-file-graph - for the "single
 
2191
            # file that isn't a directory without showing a delta" case.
 
2192
            match_using_deltas = (len(file_ids) != 1 or filter_by_dir
 
2193
                or delta_type)
 
2194
 
 
2195
            # Build the LogRequest and execute it
 
2196
            if len(file_ids) == 0:
 
2197
                file_ids = None
 
2198
            rqst = make_log_request_dict(
 
2199
                direction=direction, specific_fileids=file_ids,
 
2200
                start_revision=rev1, end_revision=rev2, limit=limit,
 
2201
                message_search=message, delta_type=delta_type,
 
2202
                diff_type=diff_type, _match_using_deltas=match_using_deltas)
 
2203
            Logger(b, rqst).show(lf)
2172
2204
        finally:
2173
2205
            b.unlock()
2174
2206
 
2177
2209
    """Take the input of a revision option and turn it into a revision range.
2178
2210
 
2179
2211
    It returns RevisionInfo objects which can be used to obtain the rev_id's
2180
 
    of the desired revisons. It does some user input validations.
 
2212
    of the desired revisions. It does some user input validations.
2181
2213
    """
2182
2214
    if revisionspec_list is None:
2183
2215
        rev1 = None