/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/clean_tree.py

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2018-11-16 18:26:22 UTC
  • mfrom: (7167.1.4 run-flake8)
  • Revision ID: breezy.the.bot@gmail.com-20181116182622-qw3gan3hz78a2imw
Add a flake8 test.

Merged from https://code.launchpad.net/~jelmer/brz/run-flake8/+merge/358902

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
 
1
# Copyright (C) 2009, 2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
from __future__ import absolute_import
17
18
 
 
19
import errno
18
20
import os
19
21
import shutil
20
22
 
21
 
from bzrlib.osutils import isdir
22
 
from bzrlib.trace import note
23
 
from bzrlib.workingtree import WorkingTree
24
 
 
 
23
from . import (
 
24
    controldir,
 
25
    errors,
 
26
    ui,
 
27
    )
 
28
from .osutils import isdir
 
29
from .trace import note
 
30
from .workingtree import WorkingTree
 
31
from .i18n import gettext
25
32
 
26
33
def is_detritus(subp):
27
34
    """Return True if the supplied path is detritus, False otherwise"""
47
54
               dry_run=False, no_prompt=False):
48
55
    """Remove files in the specified classes from the tree"""
49
56
    tree = WorkingTree.open_containing(directory)[0]
50
 
    tree.lock_read()
51
 
    try:
 
57
    with tree.lock_read():
52
58
        deletables = list(iter_deletables(tree, unknown=unknown,
53
59
            ignored=ignored, detritus=detritus))
 
60
        deletables = _filter_out_nested_controldirs(deletables)
54
61
        if len(deletables) == 0:
55
 
            note('Nothing to delete.')
 
62
            note(gettext('Nothing to delete.'))
56
63
            return 0
57
64
        if not no_prompt:
58
65
            for path, subp in deletables:
59
 
                print subp
60
 
            val = raw_input('Are you sure you wish to delete these [y/N]?')
61
 
            if val.lower() not in ('y', 'yes'):
62
 
                print 'Canceled'
 
66
                ui.ui_factory.note(subp)
 
67
            prompt = gettext('Are you sure you wish to delete these')
 
68
            if not ui.ui_factory.get_boolean(prompt):
 
69
                ui.ui_factory.note(gettext('Canceled'))
63
70
                return 0
64
71
        delete_items(deletables, dry_run=dry_run)
65
 
    finally:
66
 
        tree.unlock()
 
72
 
 
73
 
 
74
def _filter_out_nested_controldirs(deletables):
 
75
    result = []
 
76
    for path, subp in deletables:
 
77
        # bzr won't recurse into unknowns/ignored directories by default
 
78
        # so we don't pay a penalty for checking subdirs of path for nested
 
79
        # control dir.
 
80
        # That said we won't detect the branch in the subdir of non-branch
 
81
        # directory and therefore delete it. (worth to FIXME?)
 
82
        if isdir(path):
 
83
            try:
 
84
                controldir.ControlDir.open(path)
 
85
            except errors.NotBranchError:
 
86
                result.append((path, subp))
 
87
            else:
 
88
                # TODO may be we need to notify user about skipped directories?
 
89
                pass
 
90
        else:
 
91
            result.append((path, subp))
 
92
    return result
67
93
 
68
94
 
69
95
def delete_items(deletables, dry_run=False):
70
96
    """Delete files in the deletables iterable"""
 
97
    def onerror(function, path, excinfo):
 
98
        """Show warning for errors seen by rmtree.
 
99
        """
 
100
        # Handle only permission error while removing files.
 
101
        # Other errors are re-raised.
 
102
        if function is not os.remove or excinfo[1].errno != errno.EACCES:
 
103
            raise
 
104
        ui.ui_factory.show_warning(gettext('unable to remove %s') % path)
71
105
    has_deleted = False
72
106
    for path, subp in deletables:
73
107
        if not has_deleted:
74
 
            note("deleting paths:")
 
108
            note(gettext("deleting paths:"))
75
109
            has_deleted = True
76
 
        note('  ' + subp)
77
110
        if not dry_run:
78
111
            if isdir(path):
79
 
                shutil.rmtree(path)
 
112
                shutil.rmtree(path, onerror=onerror)
80
113
            else:
81
 
                os.unlink(path)
 
114
                try:
 
115
                    os.unlink(path)
 
116
                    note('  ' + subp)
 
117
                except OSError as e:
 
118
                    # We handle only permission error here
 
119
                    if e.errno != errno.EACCES:
 
120
                        raise e
 
121
                    ui.ui_factory.show_warning(gettext(
 
122
                        'unable to remove "{0}": {1}.').format(
 
123
                                                    path, e.strerror))
 
124
        else:
 
125
            note('  ' + subp)
82
126
    if not has_deleted:
83
 
        note("No files deleted.")
 
127
        note(gettext("No files deleted."))