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