/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.8.21 by John Arbash Meinel
Splitting up the version info code into a lazy factory style.
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
#
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
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.
0.8.21 by John Arbash Meinel
Splitting up the version info code into a lazy factory style.
7
#
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
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.
0.8.21 by John Arbash Meinel
Splitting up the version info code into a lazy factory style.
12
#
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""Routines for extracting all version information from a bzr branch."""
18
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
19
import time
0.8.21 by John Arbash Meinel
Splitting up the version info code into a lazy factory style.
20
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
21
from breezy.osutils import local_time_offset, format_date
22
from breezy import (
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
23
    registry,
24
    revision as _mod_revision,
25
    )
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
26
0.8.1 by John Arbash Meinel
Creating a plugin to ease generating version information from a tree.
27
0.8.13 by John Arbash Meinel
Including file-revisions fields, updated test suite.
28
def create_date_str(timestamp=None, offset=None):
29
    """Just a wrapper around format_date to provide the right format.
0.8.23 by John Arbash Meinel
whitespace and formatting cleanups.
30
0.8.13 by John Arbash Meinel
Including file-revisions fields, updated test suite.
31
    We don't want to use '%a' in the time string, because it is locale
32
    dependant. We also want to force timezone original, and show_offset
33
34
    Without parameters this function yields the current date in the local
35
    time zone.
36
    """
37
    if timestamp is None and offset is None:
38
        timestamp = time.time()
39
        offset = local_time_offset()
40
    return format_date(timestamp, offset, date_fmt='%Y-%m-%d %H:%M:%S',
41
                       timezone='original', show_offset=True)
42
0.8.4 by John Arbash Meinel
Cleaned up formats include-history always displays the log message.
43
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
44
class VersionInfoBuilder(object):
0.8.23 by John Arbash Meinel
whitespace and formatting cleanups.
45
    """A class which lets you build up information about a revision."""
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
46
47
    def __init__(self, branch, working_tree=None,
7143.15.2 by Jelmer Vernooij
Run autopep8.
48
                 check_for_clean=False,
49
                 include_revision_history=False,
50
                 include_file_revisions=False,
51
                 template=None,
52
                 revision_id=None):
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
53
        """Build up information about the given branch.
54
        If working_tree is given, it can be checked for changes.
55
56
        :param branch: The branch to work on
57
        :param working_tree: If supplied, preferentially check
58
            the working tree for changes.
59
        :param check_for_clean: If False, we will skip the expense
60
            of looking for changes.
61
        :param include_revision_history: If True, the output
62
            will include the full mainline revision history, including
63
            date and message
64
        :param include_file_revisions: The output should
65
            include the explicit last-changed revision for each file.
2948.4.3 by Lukáš Lalinský
Fix problems from Alexander's review.
66
        :param template: Template for the output formatting, not used by
67
            all builders.
6196.1.1 by Jelmer Vernooij
Add --revision argument to 'bzr version-info'.
68
        :param revision_id: Revision id to print version for (optional)
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
69
        """
70
        self._branch = branch
71
        self._check = check_for_clean
72
        self._include_history = include_revision_history
73
        self._include_file_revs = include_file_revisions
2948.4.1 by Lukáš Lalinský
Custom template-based version info formatter.
74
        self._template = template
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
75
76
        self._clean = None
77
        self._file_revisions = {}
6196.1.1 by Jelmer Vernooij
Add --revision argument to 'bzr version-info'.
78
        self._revision_id = revision_id
79
6406.1.3 by Jelmer Vernooij
Fix version_info tree.
80
        if self._revision_id is None:
81
            self._tree = working_tree
82
            self._working_tree = working_tree
83
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
84
            self._tree = self._branch.repository.revision_tree(
85
                self._revision_id)
6406.1.3 by Jelmer Vernooij
Fix version_info tree.
86
            # the working tree is not relevant if an explicit revision was specified
87
            self._working_tree = None
88
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
89
    def _extract_file_revisions(self):
90
        """Extract the working revisions for all files"""
91
92
        # Things seem clean if we never look :)
93
        self._clean = True
94
6406.1.3 by Jelmer Vernooij
Fix version_info tree.
95
        if self._working_tree is self._tree:
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
96
            basis_tree = self._working_tree.basis_tree()
2255.2.63 by John Arbash Meinel
track down a couple other places where we are using list_files.
97
            # TODO: jam 20070215 The working tree should actually be locked at
98
            #       a higher level, but this will do for now.
99
            self._working_tree.lock_read()
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
100
        else:
7143.15.2 by Jelmer Vernooij
Run autopep8.
101
            basis_tree = self._branch.repository.revision_tree(
102
                self._revision_id)
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
103
2255.2.63 by John Arbash Meinel
track down a couple other places where we are using list_files.
104
        basis_tree.lock_read()
105
        try:
106
            # Build up the list from the basis inventory
107
            for info in basis_tree.list_files(include_root=True):
108
                self._file_revisions[info[0]] = info[-1].revision
109
6406.1.3 by Jelmer Vernooij
Fix version_info tree.
110
            if not self._check or self._working_tree is not self._tree:
2255.2.63 by John Arbash Meinel
track down a couple other places where we are using list_files.
111
                return
112
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
113
            delta = self._working_tree.changes_from(basis_tree,
7358.11.3 by Jelmer Vernooij
TreeDelta holds TreeChange objects rather than tuples of various sizes.
114
                                                    include_root=True,
115
                                                    want_unversioned=True)
2255.2.63 by John Arbash Meinel
track down a couple other places where we are using list_files.
116
117
            # Using a 2-pass algorithm for renames. This is because you might have
118
            # renamed something out of the way, and then created a new file
119
            # in which case we would rather see the new marker
120
            # Or you might have removed the target, and then renamed
121
            # in which case we would rather see the renamed marker
7358.11.3 by Jelmer Vernooij
TreeDelta holds TreeChange objects rather than tuples of various sizes.
122
            for change in delta.renamed:
123
                self._clean = False
124
                self._file_revisions[change.path[0]] = u'renamed to %s' % (change.path[1],)
125
            for change in delta.removed:
126
                self._clean = False
127
                self._file_revisions[change.path[0]] = 'removed'
128
            for change in delta.added:
129
                self._clean = False
130
                self._file_revisions[change.path[1]] = 'new'
131
            for change in delta.renamed:
132
                self._clean = False
133
                self._file_revisions[change.path[1]] = u'renamed from %s' % (
134
                    change.path[0],)
7358.17.1 by Jelmer Vernooij
Add TreeDelta.copied and TreeChange.copied fields.
135
            for change in delta.copied:
136
                self._clean = False
137
                self._file_revisions[change.path[1]] = u'copied from %s' % (
138
                    change.path[0],)
7358.11.3 by Jelmer Vernooij
TreeDelta holds TreeChange objects rather than tuples of various sizes.
139
            for change in delta.modified:
140
                self._clean = False
141
                self._file_revisions[change.path[1]] = 'modified'
142
            for change in delta.unversioned:
143
                self._clean = False
144
                self._file_revisions[change.path[1]] = 'unversioned'
2255.2.63 by John Arbash Meinel
track down a couple other places where we are using list_files.
145
        finally:
146
            basis_tree.unlock()
147
            if self._working_tree is not None:
148
                self._working_tree.unlock()
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
149
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
150
    def _iter_revision_history(self):
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
151
        """Find the messages for all revisions in history."""
152
6406.1.3 by Jelmer Vernooij
Fix version_info tree.
153
        last_rev = self._get_revision_id()
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
154
7143.15.2 by Jelmer Vernooij
Run autopep8.
155
        repository = self._branch.repository
6754.8.4 by Jelmer Vernooij
Use new context stuff.
156
        with repository.lock_read():
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
157
            graph = repository.get_graph()
158
            revhistory = list(graph.iter_lefthand_ancestry(
159
                last_rev, [_mod_revision.NULL_REVISION]))
160
            for revision_id in reversed(revhistory):
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
161
                rev = repository.get_revision(revision_id)
6165.4.30 by Jelmer Vernooij
Fix remaining tests.
162
                yield (rev.revision_id, rev.message,
163
                       rev.timestamp, rev.timezone)
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
164
165
    def _get_revision_id(self):
166
        """Get the revision id we are working on."""
6196.1.1 by Jelmer Vernooij
Add --revision argument to 'bzr version-info'.
167
        if self._revision_id is not None:
168
            return self._revision_id
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
169
        if self._working_tree is not None:
170
            return self._working_tree.last_revision()
171
        return self._branch.last_revision()
172
5967.11.2 by Benoît Pierre
Update version-info formats to support dotted revnos.
173
    def _get_revno_str(self, revision_id):
174
        numbers = self._branch.revision_id_to_dotted_revno(revision_id)
175
        revno_str = '.'.join([str(num) for num in numbers])
176
        return revno_str
177
0.8.20 by John Arbash Meinel
Updated version-info to the latest bzr.dev codebase. Changed to using VersionInfoBuilder, and made tests pass.
178
    def generate(self, to_file):
179
        """Output the version information to the supplied file.
180
181
        :param to_file: The file to write the stream to. The output
182
                will already be encoded, so to_file should not try
183
                to change encodings.
184
        :return: None
185
        """
186
        raise NotImplementedError(VersionInfoBuilder.generate)
0.8.21 by John Arbash Meinel
Splitting up the version info code into a lazy factory style.
187
188
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
189
format_registry = registry.Registry()
190
191
192
format_registry.register_lazy(
193
    'rio',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
194
    'breezy.version_info_formats.format_rio',
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
195
    'RioVersionInfoBuilder',
3231.1.1 by Wesley J. Landaker
Add some more text to the --rio option help in version-info.
196
    'Version info in RIO (simple text) format (default).')
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
197
format_registry.default_key = 'rio'
198
format_registry.register_lazy(
199
    'python',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
200
    'breezy.version_info_formats.format_python',
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
201
    'PythonVersionInfoBuilder',
202
    'Version info in Python format.')
203
format_registry.register_lazy(
204
    'custom',
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
205
    'breezy.version_info_formats.format_custom',
2948.4.2 by Lukáš Lalinský
Use registry for the list of formats. Documentation.
206
    'CustomVersionInfoBuilder',
207
    'Version info in Custom template-based format.')