~bzr-pqm/bzr/bzr.dev

5557.1.15 by John Arbash Meinel
Merge bzr.dev 5597 to resolve NEWS, aka bzr-2.3.txt
1
# Copyright (C) 2009, 2010, 2011 Canonical Ltd
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
2
#
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.
7
#
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.
12
#
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.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
16
17
5376.1.3 by Parth Malwankar
clean-tree now specifically handes EACCES
18
import errno
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
19
import os
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
20
import shutil
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
21
import sys
4020.1.2 by Jelmer Vernooij
Import blackbox test for clean-tree, run regular tests.
22
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
23
from bzrlib import tests, ui
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
24
from bzrlib.controldir import (
25
    ControlDir,
4020.1.2 by Jelmer Vernooij
Import blackbox test for clean-tree, run regular tests.
26
    )
27
from bzrlib.clean_tree import (
28
    clean_tree,
29
    iter_deletables,
30
    )
31
from bzrlib.osutils import (
32
    has_symlinks,
33
    )
34
from bzrlib.tests import (
35
    TestCaseInTempDir,
36
    )
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
37
4020.1.5 by Aaron Bentley
Fix some formatting issues.
38
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
39
class TestCleanTree(TestCaseInTempDir):
4020.1.2 by Jelmer Vernooij
Import blackbox test for clean-tree, run regular tests.
40
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
41
    def test_symlinks(self):
42
        if has_symlinks() is False:
43
            return
44
        os.mkdir('branch')
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
45
        ControlDir.create_standalone_workingtree('branch')
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
46
        os.symlink(os.path.realpath('no-die-please'), 'branch/die-please')
47
        os.mkdir('no-die-please')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
48
        self.assertPathExists('branch/die-please')
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
49
        os.mkdir('no-die-please/child')
50
51
        clean_tree('branch', unknown=True, no_prompt=True)
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
52
        self.assertPathExists('no-die-please')
53
        self.assertPathExists('no-die-please/child')
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
54
55
    def test_iter_deletable(self):
56
        """Files are selected for deletion appropriately"""
57
        os.mkdir('branch')
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
58
        tree = ControlDir.create_standalone_workingtree('branch')
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
59
        transport = tree.bzrdir.root_transport
60
        transport.put_bytes('.bzrignore', '*~\n*.pyc\n.bzrignore\n')
61
        transport.put_bytes('file.BASE', 'contents')
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
62
        tree.lock_write()
63
        try:
64
            self.assertEqual(len(list(iter_deletables(tree, unknown=True))), 1)
4020.1.4 by Aaron Bentley
Assign copyright, update tests.
65
            transport.put_bytes('file', 'contents')
66
            transport.put_bytes('file~', 'contents')
67
            transport.put_bytes('file.pyc', 'contents')
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
68
            dels = sorted([r for a,r in iter_deletables(tree, unknown=True)])
4020.1.7 by Aaron Bentley
Convert asserts to TestCase helper methods
69
            self.assertEqual(['file', 'file.BASE'], dels)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
70
71
            dels = [r for a,r in iter_deletables(tree, detritus=True)]
4020.1.7 by Aaron Bentley
Convert asserts to TestCase helper methods
72
            self.assertEqual(sorted(['file~', 'file.BASE']), dels)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
73
74
            dels = [r for a,r in iter_deletables(tree, ignored=True)]
4020.1.7 by Aaron Bentley
Convert asserts to TestCase helper methods
75
            self.assertEqual(sorted(['file~', 'file.pyc', '.bzrignore']),
76
                             dels)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
77
78
            dels = [r for a,r in iter_deletables(tree, unknown=False)]
4020.1.7 by Aaron Bentley
Convert asserts to TestCase helper methods
79
            self.assertEqual([], dels)
4020.1.1 by Jelmer Vernooij
Import clean-tree from bzrtools.
80
        finally:
81
            tree.unlock()
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
82
83
    def test_delete_items_warnings(self):
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
84
        """Ensure delete_items issues warnings on EACCES. (bug #430785)
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
85
        """
86
        def _dummy_unlink(path):
5376.1.6 by Parth Malwankar
closed review comments
87
            """unlink() files other than files named '0foo'.
88
            """
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
89
            if path.endswith('0foo'):
5376.1.6 by Parth Malwankar
closed review comments
90
                # Simulate 'permission denied' error.
91
                # This should show up as a warning for the
92
                # user.
5376.1.3 by Parth Malwankar
clean-tree now specifically handes EACCES
93
                e = OSError()
94
                e.errno = errno.EACCES
95
                raise e
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
96
97
        def _dummy_rmtree(path, ignore_errors=False, onerror=None):
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
98
            """Call user supplied error handler onerror.
5376.1.6 by Parth Malwankar
closed review comments
99
            """
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
100
            # Indicate failure in removing 'path' if path is subdir0
5376.1.6 by Parth Malwankar
closed review comments
101
            # We later check to ensure that this is indicated
5376.1.9 by Parth Malwankar
improved comments
102
            # to the user as a warning. We raise OSError to construct
103
            # proper excinfo that needs to be passed to onerror
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
104
            try:
105
                raise OSError
106
            except OSError, e:
107
                e.errno = errno.EACCES
108
                excinfo = sys.exc_info()
109
                function = os.remove
110
                if 'subdir0' not in path:
111
                    # onerror should show warning only for os.remove
112
                    # error. For any other failures the error should
113
                    # be shown to the user.
114
                    function = os.listdir
115
                onerror(function=function,
116
                    path=path, excinfo=excinfo)
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
117
118
        self.overrideAttr(os, 'unlink', _dummy_unlink)
119
        self.overrideAttr(shutil, 'rmtree', _dummy_rmtree)
120
        stdout = tests.StringIOWrapper()
121
        stderr = tests.StringIOWrapper()
122
        ui.ui_factory = tests.TestUIFactory(stdout=stdout, stderr=stderr)
5376.1.9 by Parth Malwankar
improved comments
123
6472.2.2 by Jelmer Vernooij
Use controldir rather than bzrdir in a couple more places.
124
        ControlDir.create_standalone_workingtree('.')
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
125
        self.build_tree(['0foo', '1bar', '2baz', 'subdir0/'])
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
126
        clean_tree('.', unknown=True, no_prompt=True)
127
        self.assertContainsRe(stderr.getvalue(),
5376.1.6 by Parth Malwankar
closed review comments
128
            'bzr: warning: unable to remove.*0foo')
5376.1.1 by Parth Malwankar
clean-tree issues warning if it cant delete a file
129
        self.assertContainsRe(stderr.getvalue(),
5376.1.8 by Parth Malwankar
onerror and test updated to handle EACCES specifically
130
            'bzr: warning: unable to remove.*subdir0')
131
132
        # Ensure that error other than EACCES during os.remove are
133
        # not turned into warnings.
134
        self.build_tree(['subdir1/'])
135
        self.assertRaises(OSError, clean_tree, '.',
136
            unknown=True, no_prompt=True)
137