/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5365.5.25 by John Arbash Meinel
Merge bzr.dev 5387 in prep for NEWS
1
# Copyright (C) 2009, 2010 Canonical Ltd
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
2
#
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
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.
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
7
#
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
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.
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
12
#
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
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
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
16
6379.6.1 by Jelmer Vernooij
Import absolute_import in a few places.
17
from __future__ import absolute_import
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
18
5376.1.3 by Parth Malwankar
clean-tree now specifically handes EACCES
19
import errno
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
20
import os
21
import shutil
22
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
23
from . import (
6207.3.3 by jelmer at samba
Fix tests and the like.
24
    controldir,
5376.1.6 by Parth Malwankar
closed review comments
25
    errors,
26
    ui,
27
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
28
from .osutils import isdir
29
from .trace import note
30
from .workingtree import WorkingTree
31
from .i18n import gettext
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
32
33
def is_detritus(subp):
34
    """Return True if the supplied path is detritus, False otherwise"""
35
    return subp.endswith('.THIS') or subp.endswith('.BASE') or\
36
        subp.endswith('.OTHER') or subp.endswith('~') or subp.endswith('.tmp')
37
38
39
def iter_deletables(tree, unknown=False, ignored=False, detritus=False):
40
    """Iterate through files that may be deleted"""
41
    for subp in tree.extras():
42
        if detritus and is_detritus(subp):
43
            yield tree.abspath(subp), subp
44
            continue
45
        if tree.is_ignored(subp):
46
            if ignored:
47
                yield tree.abspath(subp), subp
48
        else:
49
            if unknown:
50
                yield tree.abspath(subp), subp
51
52
4020.1.5 by Aaron Bentley
Fix some formatting issues.
53
def clean_tree(directory, unknown=False, ignored=False, detritus=False,
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
54
               dry_run=False, no_prompt=False):
55
    """Remove files in the specified classes from the tree"""
56
    tree = WorkingTree.open_containing(directory)[0]
57
    tree.lock_read()
58
    try:
59
        deletables = list(iter_deletables(tree, unknown=unknown,
60
            ignored=ignored, detritus=detritus))
5195.4.4 by Alexander Belchenko
make _filter_out_nested_bzrdirs private method and clarify the non-recursive behavior of tree.extras() and implication of hidden bzrdirs behind non-versioned directory.
61
        deletables = _filter_out_nested_bzrdirs(deletables)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
62
        if len(deletables) == 0:
6138.3.2 by Jonathan Riddell
gettext-ify bzrlib/commit.py
63
            note(gettext('Nothing to delete.'))
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
64
            return 0
65
        if not no_prompt:
66
            for path, subp in deletables:
6228.1.1 by Benoît Pierre
Fix clean_tree messages and prompt handling.
67
                ui.ui_factory.note(subp)
6228.1.4 by Benoît Pierre
Translate prompt messages in clean_tree.
68
            prompt = gettext('Are you sure you wish to delete these')
6228.1.1 by Benoît Pierre
Fix clean_tree messages and prompt handling.
69
            if not ui.ui_factory.get_boolean(prompt):
6228.1.4 by Benoît Pierre
Translate prompt messages in clean_tree.
70
                ui.ui_factory.note(gettext('Canceled'))
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
71
                return 0
72
        delete_items(deletables, dry_run=dry_run)
73
    finally:
74
        tree.unlock()
75
76
5195.4.4 by Alexander Belchenko
make _filter_out_nested_bzrdirs private method and clarify the non-recursive behavior of tree.extras() and implication of hidden bzrdirs behind non-versioned directory.
77
def _filter_out_nested_bzrdirs(deletables):
5195.4.2 by Alexander Belchenko
clean-tree: don't delete nested bzrdirs.
78
    result = []
79
    for path, subp in deletables:
5195.4.4 by Alexander Belchenko
make _filter_out_nested_bzrdirs private method and clarify the non-recursive behavior of tree.extras() and implication of hidden bzrdirs behind non-versioned directory.
80
        # bzr won't recurse into unknowns/ignored directories by default
5195.4.6 by Alexander Belchenko
more comments
81
        # so we don't pay a penalty for checking subdirs of path for nested
82
        # bzrdir.
83
        # That said we won't detect the branch in the subdir of non-branch
84
        # directory and therefore delete it. (worth to FIXME?)
5195.4.2 by Alexander Belchenko
clean-tree: don't delete nested bzrdirs.
85
        if isdir(path):
86
            try:
6207.3.3 by jelmer at samba
Fix tests and the like.
87
                controldir.ControlDir.open(path)
5195.4.2 by Alexander Belchenko
clean-tree: don't delete nested bzrdirs.
88
            except errors.NotBranchError:
89
                result.append((path,subp))
5195.4.6 by Alexander Belchenko
more comments
90
            else:
91
                # TODO may be we need to notify user about skipped directories?
92
                pass
5195.4.2 by Alexander Belchenko
clean-tree: don't delete nested bzrdirs.
93
        else:
94
            result.append((path,subp))
95
    return result
96
97
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
98
def delete_items(deletables, dry_run=False):
99
    """Delete files in the deletables iterable"""
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
100
    def onerror(function, path, excinfo):
101
        """Show warning for errors seen by rmtree.
102
        """
5376.1.9 by Parth Malwankar
improved comments
103
        # Handle only permission error while removing files.
104
        # Other errors are re-raised.
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
105
        if function is not os.remove or excinfo[1].errno != errno.EACCES:
106
            raise
6138.3.2 by Jonathan Riddell
gettext-ify bzrlib/commit.py
107
        ui.ui_factory.show_warning(gettext('unable to remove %s') % path)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
108
    has_deleted = False
109
    for path, subp in deletables:
110
        if not has_deleted:
6138.3.2 by Jonathan Riddell
gettext-ify bzrlib/commit.py
111
            note(gettext("deleting paths:"))
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
112
            has_deleted = True
113
        if not dry_run:
5376.1.3 by Parth Malwankar
clean-tree now specifically handes EACCES
114
            if isdir(path):
115
                shutil.rmtree(path, onerror=onerror)
116
            else:
117
                try:
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
118
                    os.unlink(path)
5376.1.6 by Parth Malwankar
closed review comments
119
                    note('  ' + subp)
6619.3.2 by Jelmer Vernooij
Apply 2to3 except fix.
120
                except OSError as e:
5376.1.3 by Parth Malwankar
clean-tree now specifically handes EACCES
121
                    # We handle only permission error here
122
                    if e.errno != errno.EACCES:
123
                        raise e
6138.3.2 by Jonathan Riddell
gettext-ify bzrlib/commit.py
124
                    ui.ui_factory.show_warning(gettext(
6147.1.1 by Jonathan Riddell
use .format() instead of % for string formatting where there are multiple formats in one string to allow for translations
125
                        'unable to remove "{0}": {1}.').format(
126
                                                    path, e.strerror))
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
127
        else:
128
            note('  ' + subp)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
129
    if not has_deleted:
6138.3.2 by Jonathan Riddell
gettext-ify bzrlib/commit.py
130
        note(gettext("No files deleted."))