~bzr-pqm/bzr/bzr.dev

5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2005, 2006, 2008-2011 Canonical Ltd
1267 by Martin Pool
- notes on conversion of existing history to weaves
2
#
1080 by Martin Pool
- test tool for converting history to weave files
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.
1267 by Martin Pool
- notes on conversion of existing history to weaves
7
#
1080 by Martin Pool
- test tool for converting history to weave files
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.
1267 by Martin Pool
- notes on conversion of existing history to weaves
12
#
1080 by Martin Pool
- test tool for converting history to weave files
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
1080 by Martin Pool
- test tool for converting history to weave files
16
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
17
"""bzr upgrade logic."""
18
6379.6.1 by Jelmer Vernooij
Import absolute_import in a few places.
19
from __future__ import absolute_import
20
4360.10.40 by Vincent Ladeuil
Fix imports ;)
21
from bzrlib import (
22
    errors,
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
23
    trace,
4360.10.40 by Vincent Ladeuil
Fix imports ;)
24
    ui,
6072.3.1 by Jelmer Vernooij
Format URLs in ``bzr upgrade`` before display.
25
    urlutils,
4360.10.40 by Vincent Ladeuil
Fix imports ;)
26
    )
6207.3.3 by jelmer at samba
Fix tests and the like.
27
from bzrlib.controldir import (
28
    ControlDir,
5582.10.8 by Jelmer Vernooij
More fixes.
29
    format_registry,
30
    )
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
31
from bzrlib.i18n import gettext
3577.4.1 by Andrew Bennetts
Make 'bzr upgrade' work over HPSS.
32
from bzrlib.remote import RemoteBzrDir
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
33
34
35
class Convert(object):
36
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
37
    def __init__(self, url=None, format=None, control_dir=None):
38
        """Convert a Bazaar control directory to a given format.
39
40
        Either the url or control_dir parameter must be given.
41
42
        :param url: the URL of the control directory or None if the
43
          control_dir is explicitly given instead
44
        :param format: the format to convert to or None for the default
4360.10.10 by Ian Clatworthy
minor clean-ups
45
        :param control_dir: the control directory or None if it is
46
          specified via the URL parameter instead
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
47
        """
1534.5.13 by Robert Collins
Correct buggy test.
48
        self.format = format
4634.144.9 by Martin Pool
Suppress user warnings about cross-format fetch during upgrade
49
        # XXX: Change to cleanup
50
        warning_id = 'cross_format_fetch'
4634.144.11 by Martin Pool
Rename squelched to suppressed
51
        saved_warning = warning_id in ui.ui_factory.suppressed_warnings
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
52
        if url is None and control_dir is None:
53
            raise AssertionError(
54
                "either the url or control_dir parameter must be set.")
55
        if control_dir is not None:
56
            self.bzrdir = control_dir
57
        else:
6207.3.3 by jelmer at samba
Fix tests and the like.
58
            self.bzrdir = ControlDir.open_unsupported(url)
3577.4.1 by Andrew Bennetts
Make 'bzr upgrade' work over HPSS.
59
        if isinstance(self.bzrdir, RemoteBzrDir):
60
            self.bzrdir._ensure_real()
61
            self.bzrdir = self.bzrdir._real_bzrdir
1534.5.7 by Robert Collins
Start factoring out the upgrade policy logic.
62
        if self.bzrdir.root_transport.is_readonly():
63
            raise errors.UpgradeReadonly
64
        self.transport = self.bzrdir.root_transport
4634.144.11 by Martin Pool
Rename squelched to suppressed
65
        ui.ui_factory.suppressed_warnings.add(warning_id)
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
66
        try:
67
            self.convert()
68
        finally:
4634.144.9 by Martin Pool
Suppress user warnings about cross-format fetch during upgrade
69
            if not saved_warning:
4634.144.11 by Martin Pool
Rename squelched to suppressed
70
                ui.ui_factory.suppressed_warnings.remove(warning_id)
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
71
72
    def convert(self):
1558.7.2 by Aaron Bentley
Upgrade works in repositories
73
        try:
74
            branch = self.bzrdir.open_branch()
5158.6.9 by Martin Pool
Simplify various code to use user_url
75
            if branch.user_url != self.bzrdir.user_url:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
76
                ui.ui_factory.note(gettext(
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
77
                    'This is a checkout. The branch (%s) needs to be upgraded'
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
78
                    ' separately.') % (urlutils.unescape_for_display(
6072.3.2 by Jelmer Vernooij
Use utf8 as encoding for urls passed to note().
79
                        branch.user_url, 'utf-8')))
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
80
            del branch
81
        except (errors.NotBranchError, errors.IncompatibleRepositories):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
82
            # might not be a format we can open without upgrading; see e.g.
3602.2.1 by Martin Pool
Fix and test for problem upgrading stacked branches
83
            # https://bugs.launchpad.net/bzr/+bug/253891
1558.7.2 by Aaron Bentley
Upgrade works in repositories
84
            pass
4119.7.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
85
        if self.format is None:
4170.3.5 by Jelmer Vernooij
Fix upgrade if there is no local repository present.
86
            try:
87
                rich_root = self.bzrdir.find_repository()._format.rich_root_data
88
            except errors.NoRepositoryPresent:
89
                rich_root = False # assume no rich roots
90
            if rich_root:
4119.7.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
91
                format_name = "default-rich-root"
92
            else:
93
                format_name = "default"
94
            format = format_registry.make_bzrdir(format_name)
95
        else:
96
            format = self.format
97
        if not self.bzrdir.needs_format_conversion(format):
1534.5.10 by Robert Collins
Make upgrade driver unaware of the specific formats in play.
98
            raise errors.UpToDateFormat(self.bzrdir._format)
1534.5.16 by Robert Collins
Review feedback.
99
        if not self.bzrdir.can_convert_format():
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
100
            raise errors.BzrError(gettext("cannot upgrade from bzrdir format %s") %
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
101
                           self.bzrdir._format)
4119.7.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
102
        self.bzrdir.check_conversion_target(format)
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
103
        ui.ui_factory.note(gettext('starting upgrade of %s') % 
6072.3.2 by Jelmer Vernooij
Use utf8 as encoding for urls passed to note().
104
            urlutils.unescape_for_display(self.transport.base, 'utf-8'))
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
105
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
106
        self.backup_oldpath, self.backup_newpath = self.bzrdir.backup_bzrdir()
4119.7.1 by Jelmer Vernooij
Make upgrade default to a rich-root-capable format if the source format uses rich roots.
107
        while self.bzrdir.needs_format_conversion(format):
108
            converter = self.bzrdir._format.get_converter(format)
4961.2.15 by Martin Pool
Remove more pb-passing
109
            self.bzrdir = converter.convert(self.bzrdir, None)
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
110
        ui.ui_factory.note(gettext('finished'))
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
111
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
112
    def clean_up(self):
113
        """Clean-up after a conversion.
114
115
        This removes the backup.bzr directory.
116
        """
4360.10.12 by Ian Clatworthy
use transport.delete_tree() instead of osutils.rmtree() for clean-up
117
        transport = self.transport
118
        backup_relpath = transport.relpath(self.backup_newpath)
4360.10.27 by Matthew Fuller
Wrap a progress bar around removing the backup dir; it may take a
119
        child_pb = ui.ui_factory.nested_progress_bar()
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
120
        child_pb.update(gettext('Deleting backup.bzr'))
4360.10.27 by Matthew Fuller
Wrap a progress bar around removing the backup dir; it may take a
121
        try:
122
            transport.delete_tree(backup_relpath)
123
        finally:
124
            child_pb.finished()
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
125
126
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
127
def upgrade(url, format=None, clean_up=False, dry_run=False):
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
128
    """Upgrade locations to format.
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
129
 
130
    This routine wraps the smart_upgrade() routine with a nicer UI.
131
    In particular, it ensures all URLs can be opened before starting
132
    and reports a summary at the end if more than one upgrade was attempted.
133
    This routine is useful for command line tools. Other bzrlib clients
134
    probably ought to use smart_upgrade() instead.
135
4360.10.28 by Matthew Fuller
Revert upgrade() to taking only a single URL. Other code attempting
136
    :param url: a URL of the locations to upgrade.
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
137
    :param format: the format to convert to or None for the best default
138
    :param clean-up: if True, the backup.bzr directory is removed if the
139
      upgrade succeeded for a given repo/branch/tree
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
140
    :param dry_run: show what would happen but don't actually do any upgrades
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
141
    :return: the list of exceptions encountered
142
    """
6207.3.3 by jelmer at samba
Fix tests and the like.
143
    control_dirs = [ControlDir.open_unsupported(url)]
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
144
    attempted, succeeded, exceptions = smart_upgrade(control_dirs,
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
145
        format, clean_up=clean_up, dry_run=dry_run)
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
146
    if len(attempted) > 1:
147
        attempted_count = len(attempted)
148
        succeeded_count = len(succeeded)
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
149
        failed_count = attempted_count - succeeded_count
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
150
        ui.ui_factory.note(
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
151
            gettext('\nSUMMARY: {0} upgrades attempted, {1} succeeded,'\
152
                    ' {2} failed').format(
153
                     attempted_count, succeeded_count, failed_count))
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
154
    return exceptions
155
156
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
157
def smart_upgrade(control_dirs, format, clean_up=False,
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
158
    dry_run=False):
159
    """Convert control directories to a new format intelligently.
160
161
    If the control directory is a shared repository, dependent branches
162
    are also converted provided the repository converted successfully.
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
163
    If the conversion of a branch fails, remaining branches are still tried.
164
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
165
    :param control_dirs: the BzrDirs to upgrade
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
166
    :param format: the format to convert to or None for the best default
4360.10.29 by Matthew Fuller
The param is clean_up, not clean-up.
167
    :param clean_up: if True, the backup.bzr directory is removed if the
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
168
      upgrade succeeded for a given repo/branch/tree
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
169
    :param dry_run: show what would happen but don't actually do any upgrades
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
170
    :return: attempted-control-dirs, succeeded-control-dirs, exceptions
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
171
    """
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
172
    all_attempted = []
173
    all_succeeded = []
174
    all_exceptions = []
175
    for control_dir in control_dirs:
176
        attempted, succeeded, exceptions = _smart_upgrade_one(control_dir,
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
177
            format, clean_up=clean_up, dry_run=dry_run)
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
178
        all_attempted.extend(attempted)
179
        all_succeeded.extend(succeeded)
180
        all_exceptions.extend(exceptions)
181
    return all_attempted, all_succeeded, all_exceptions
182
183
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
184
def _smart_upgrade_one(control_dir, format, clean_up=False,
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
185
    dry_run=False):
186
    """Convert a control directory to a new format intelligently.
187
4360.10.10 by Ian Clatworthy
minor clean-ups
188
    See smart_upgrade for parameter details.
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
189
    """
4360.10.11 by Ian Clatworthy
for a repo, just do dependent branches (not lw checkouts) for now
190
    # If the URL is a shared repository, find the dependent branches
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
191
    dependents = None
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
192
    try:
193
        repo = control_dir.open_repository()
194
    except errors.NoRepositoryPresent:
195
        # A branch or checkout using a shared repository higher up
196
        pass
197
    else:
198
        # The URL is a repository. If it successfully upgrades,
4360.10.11 by Ian Clatworthy
for a repo, just do dependent branches (not lw checkouts) for now
199
        # then upgrade the dependent branches as well.
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
200
        if repo.is_shared():
4360.10.17 by Ian Clatworthy
review feedback from abentley
201
            dependents = repo.find_branches(using=True)
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
202
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
203
    # Do the conversions
4360.10.1 by Ian Clatworthy
initial cut at smarter upgrades
204
    attempted = [control_dir]
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
205
    succeeded, exceptions = _convert_items([control_dir], format, clean_up,
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
206
                                           dry_run)
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
207
    if succeeded and dependents:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
208
        ui.ui_factory.note(gettext('Found %d dependent branches - upgrading ...')
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
209
                           % (len(dependents),))
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
210
        # Convert dependent branches
4360.10.11 by Ian Clatworthy
for a repo, just do dependent branches (not lw checkouts) for now
211
        branch_cdirs = [b.bzrdir for b in dependents]
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
212
        successes, problems = _convert_items(branch_cdirs, format, clean_up,
4360.10.30 by Matthew Fuller
The various repository formats that do packing, pack themselves as
213
            dry_run, label="branch")
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
214
        attempted.extend(branch_cdirs)
4360.10.3 by Ian Clatworthy
fix tests
215
        succeeded.extend(successes)
216
        exceptions.extend(problems)
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
217
218
    # Return the result
219
    return attempted, succeeded, exceptions
220
4360.10.49 by Vincent Ladeuil
Make _get_object_and_label() private to upgrade.py, its inmplementation is both incomplete and returning info that are not used.
221
# FIXME: There are several problems below:
222
# - RemoteRepository doesn't support _unsupported (really ?)
223
# - raising AssertionError is rude and may not be necessary
224
# - no tests
225
# - the only caller uses only the label
226
def _get_object_and_label(control_dir):
227
    """Return the primary object and type label for a control directory.
228
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
229
    :return: object, label where:
230
      * object is a Branch, Repository or WorkingTree and
231
      * label is one of:
232
        * branch            - a branch
233
        * repository        - a repository
234
        * tree              - a lightweight checkout
4360.10.49 by Vincent Ladeuil
Make _get_object_and_label() private to upgrade.py, its inmplementation is both incomplete and returning info that are not used.
235
    """
236
    try:
237
        try:
238
            br = control_dir.open_branch(unsupported=True,
239
                                         ignore_fallbacks=True)
240
        except NotImplementedError:
241
            # RemoteRepository doesn't support the unsupported parameter
242
            br = control_dir.open_branch(ignore_fallbacks=True)
243
    except errors.NotBranchError:
244
        pass
245
    else:
246
        return br, "branch"
247
    try:
248
        repo = control_dir.open_repository()
249
    except errors.NoRepositoryPresent:
250
        pass
251
    else:
252
        return repo, "repository"
253
    try:
254
        wt = control_dir.open_workingtree()
255
    except (errors.NoWorkingTree, errors.NotLocalUrl):
256
        pass
257
    else:
258
        return wt, "tree"
259
    raise AssertionError("unknown type of control directory %s", control_dir)
260
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
261
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
262
def _convert_items(items, format, clean_up, dry_run, label=None):
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
263
    """Convert a sequence of control directories to the given format.
264
 
265
    :param items: the control directories to upgrade
266
    :param format: the format to convert to or None for the best default
267
    :param clean-up: if True, the backup.bzr directory is removed if the
268
      upgrade succeeded for a given repo/branch/tree
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
269
    :param dry_run: show what would happen but don't actually do any upgrades
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
270
    :param label: the label for these items or None to calculate one
271
    :return: items successfully upgraded, exceptions
272
    """
273
    succeeded = []
274
    exceptions = []
4360.10.31 by Matthew Fuller
Wrap a progress bar around the iteration of entries to upgrade.
275
    child_pb = ui.ui_factory.nested_progress_bar()
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
276
    child_pb.update(gettext('Upgrading bzrdirs'), 0, len(items))
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
277
    for i, control_dir in enumerate(items):
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
278
        # Do the conversion
4360.10.12 by Ian Clatworthy
use transport.delete_tree() instead of osutils.rmtree() for clean-up
279
        location = control_dir.root_transport.base
4360.10.49 by Vincent Ladeuil
Make _get_object_and_label() private to upgrade.py, its inmplementation is both incomplete and returning info that are not used.
280
        bzr_object, bzr_label = _get_object_and_label(control_dir)
4360.10.31 by Matthew Fuller
Wrap a progress bar around the iteration of entries to upgrade.
281
        type_label = label or bzr_label
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
282
        child_pb.update(gettext("Upgrading %s") % (type_label), i+1, len(items))
283
        ui.ui_factory.note(gettext('Upgrading {0} {1} ...').format(type_label, 
6072.3.2 by Jelmer Vernooij
Use utf8 as encoding for urls passed to note().
284
            urlutils.unescape_for_display(location, 'utf-8'),))
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
285
        try:
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
286
            if not dry_run:
287
                cv = Convert(control_dir=control_dir, format=format)
6228.2.1 by Benoît Pierre
Change upgrade code: already up-to-date exceptions are not treated as errors.
288
        except errors.UpToDateFormat, ex:
289
            ui.ui_factory.note(str(ex))
290
            succeeded.append(control_dir)
291
            continue
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
292
        except Exception, ex:
4360.10.46 by Vincent Ladeuil
Get rid of _verbose_warning and rework the messages overall display (revealing some incoherences) and fixing the tests accordingly.
293
            trace.warning('conversion error: %s' % ex)
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
294
            exceptions.append(ex)
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
295
            continue
296
297
        # Do any required post processing
298
        succeeded.append(control_dir)
299
        if clean_up:
300
            try:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
301
                ui.ui_factory.note(gettext('Removing backup ...'))
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
302
                if not dry_run:
303
                    cv.clean_up()
304
            except Exception, ex:
6138.3.4 by Jonathan Riddell
add gettext() to uses of trace.note()
305
                trace.warning(gettext('failed to clean-up {0}: {1}') % (location, ex))
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
306
                exceptions.append(ex)
307
4360.10.31 by Matthew Fuller
Wrap a progress bar around the iteration of entries to upgrade.
308
    child_pb.finished()
309
4360.10.4 by Ian Clatworthy
support multiple urls, --pack and --dry-run
310
    # Return the result
4360.10.2 by Ian Clatworthy
drop stacked vs unstacked logic; support multiple URLs
311
    return succeeded, exceptions