~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/clean_tree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-04-23 13:47:32 UTC
  • mfrom: (5179.1.1 integration2)
  • Revision ID: pqm@pqm.ubuntu.com-20100423134732-e01c947fwuvjwtl2
(vila, for gz) Use signal only where available

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
import errno
19
19
import os
20
20
import shutil
 
21
import sys
21
22
 
22
 
from bzrlib import (
23
 
    bzrdir,
24
 
    errors,
25
 
    ui,
26
 
    )
27
 
from bzrlib.osutils import isdir
 
23
from bzrlib.osutils import has_symlinks, isdir
28
24
from bzrlib.trace import note
29
25
from bzrlib.workingtree import WorkingTree
30
26
 
57
53
    try:
58
54
        deletables = list(iter_deletables(tree, unknown=unknown,
59
55
            ignored=ignored, detritus=detritus))
60
 
        deletables = _filter_out_nested_bzrdirs(deletables)
61
56
        if len(deletables) == 0:
62
57
            note('Nothing to delete.')
63
58
            return 0
64
59
        if not no_prompt:
65
60
            for path, subp in deletables:
66
 
                # FIXME using print is very bad idea
67
 
                # clean_tree should accept to_file argument to write the output
68
61
                print subp
69
62
            val = raw_input('Are you sure you wish to delete these [y/N]?')
70
63
            if val.lower() not in ('y', 'yes'):
75
68
        tree.unlock()
76
69
 
77
70
 
78
 
def _filter_out_nested_bzrdirs(deletables):
79
 
    result = []
80
 
    for path, subp in deletables:
81
 
        # bzr won't recurse into unknowns/ignored directories by default
82
 
        # so we don't pay a penalty for checking subdirs of path for nested
83
 
        # bzrdir.
84
 
        # That said we won't detect the branch in the subdir of non-branch
85
 
        # directory and therefore delete it. (worth to FIXME?)
86
 
        if isdir(path):
87
 
            try:
88
 
                bzrdir.BzrDir.open(path)
89
 
            except errors.NotBranchError:
90
 
                result.append((path,subp))
91
 
            else:
92
 
                # TODO may be we need to notify user about skipped directories?
93
 
                pass
94
 
        else:
95
 
            result.append((path,subp))
96
 
    return result
97
 
 
98
 
 
99
71
def delete_items(deletables, dry_run=False):
100
72
    """Delete files in the deletables iterable"""
101
 
    def onerror(function, path, excinfo):
102
 
        """Show warning for errors seen by rmtree.
103
 
        """
104
 
        # Handle only permission error while removing files.
105
 
        # Other errors are re-raised.
106
 
        if function is not os.remove or excinfo[1].errno != errno.EACCES:
107
 
            raise
108
 
        ui.ui_factory.show_warning('unable to remove %s' % path)
109
73
    has_deleted = False
110
74
    for path, subp in deletables:
111
75
        if not has_deleted:
112
76
            note("deleting paths:")
113
77
            has_deleted = True
 
78
        note('  ' + subp)
114
79
        if not dry_run:
115
80
            if isdir(path):
116
 
                shutil.rmtree(path, onerror=onerror)
 
81
                shutil.rmtree(path)
117
82
            else:
118
 
                try:
119
 
                    os.unlink(path)
120
 
                    note('  ' + subp)
121
 
                except OSError, e:
122
 
                    # We handle only permission error here
123
 
                    if e.errno != errno.EACCES:
124
 
                        raise e
125
 
                    ui.ui_factory.show_warning(
126
 
                        'unable to remove "%s": %s.' % (path, e.strerror))
127
 
        else:
128
 
            note('  ' + subp)
 
83
                os.unlink(path)
129
84
    if not has_deleted:
130
85
        note("No files deleted.")