18
18
from bzrlib.osutils import has_symlinks, isdir
20
20
from bzrlib.branch import Branch
23
def is_detritus(subp):
23
24
return subp.endswith('.THIS') or subp.endswith('.BASE') or\
24
25
subp.endswith('.OTHER') or subp.endswith('~') or subp.endswith('.tmp')
26
def iter_deletables(tree, unknown=True, ignored=False, detrius=False):
27
def iter_deletables(tree, unknown=True, ignored=False, detritus=False):
27
28
"""Iterate through files that may be deleted"""
28
29
for subp in tree.extras():
29
if detrius and is_detrius(subp):
30
if detritus and is_detritus(subp):
30
31
yield tree.abspath(subp), subp
32
33
if tree.is_ignored(subp):
37
38
yield tree.abspath(subp), subp
39
def clean_tree(directory, ignored=False, detrius=False, dry_run=False):
40
def clean_tree(directory, ignored=False, detritus=False, dry_run=False,
40
42
br = Branch.open_containing(directory)[0]
41
43
tree = br.working_tree()
42
deletables = iter_deletables(tree, ignored=ignored, detrius=detrius)
43
delete_items(deletables, dry_run=dry_run)
44
deletables = iter_deletables(tree, ignored=ignored, detritus=detritus)
45
delete_items(deletables, dry_run=dry_run, to_file=to_file)
45
def delete_items(deletables, dry_run=False):
47
def delete_items(deletables, dry_run=False, to_file=sys.stdout):
46
48
"""Delete files in the deletables iterable"""
48
50
for path, subp in deletables:
50
print "deleting paths:"
52
print >> to_file, "deleting paths:"
54
print >> to_file, ' ', subp
55
57
shutil.rmtree(path)
61
print >> to_file, "No files deleted."
59
63
from bzrlib.selftest import TestCaseInTempDir
60
64
from unittest import makeSuite
66
from StringIO import StringIO
62
67
class TestCleanTree(TestCaseInTempDir):
63
68
def test_symlinks(self):
64
69
if has_symlinks() is False:
69
74
os.mkdir('no-die-please')
70
75
assert os.path.exists('branch/die-please')
71
76
os.mkdir('no-die-please/child')
78
clean_tree('branch', to_file=StringIO())
73
79
assert os.path.exists('no-die-please')
74
80
assert os.path.exists('no-die-please/child')
85
91
dels = [r for a,r in iter_deletables(tree)]
86
92
assert 'file~' not in dels
87
93
assert 'file.pyc' not in dels
88
dels = [r for a,r in iter_deletables(tree, detrius=True)]
94
dels = [r for a,r in iter_deletables(tree, detritus=True)]
89
95
assert 'file~' in dels
90
96
assert 'file.pyc' not in dels
91
97
dels = [r for a,r in iter_deletables(tree, ignored=True)]