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