20
20
from bzrlib.inventory import InventoryEntry
21
21
from bzrlib.trace import mutter, note, warning
22
22
from bzrlib.errors import NotBranchError
23
from bzrlib.branch import Branch
24
from bzrlib.osutils import quotefn
23
from bzrlib.branch import Branch, is_control_file
25
from bzrlib.workingtree import WorkingTree
26
27
def glob_expand_for_win32(file_list):
47
48
def add_reporter_print(path, kind, entry):
48
49
"""Print a line to stdout for each file that's added."""
49
print "added", quotefn(path)
50
print "added", bzrlib.osutils.quotefn(path)
51
52
def _prepare_file_list(file_list):
52
53
"""Prepare a file list for use by smart_add_*."""
68
69
Returns the number of files added.
70
71
file_list = _prepare_file_list(file_list)
71
b = Branch.open_containing(file_list[0])[0]
72
return smart_add_branch(b, file_list, recurse, reporter)
72
tree = WorkingTree.open_containing(file_list[0])[0]
73
return smart_add_tree(tree, file_list, recurse, reporter)
75
def smart_add_branch(branch, file_list, recurse=True, reporter=add_reporter_null):
76
def smart_add_tree(tree, file_list, recurse=True, reporter=add_reporter_null):
76
77
"""Add files to version, optionally recursing into directories.
78
79
This is designed more towards DWIM for humans than API simplicity.
86
87
from bzrlib.errors import BadFileKindError, ForbiddenFileError
89
88
assert isinstance(recurse, bool)
91
90
file_list = _prepare_file_list(file_list)
92
91
user_list = file_list[:]
93
tree = branch.working_tree()
94
92
inv = tree.read_working_inventory()
97
95
for f in file_list:
98
96
rf = tree.relpath(f)
99
af = branch.abspath(rf)
101
99
kind = bzrlib.osutils.file_kind(af)
110
108
mutter("smart add of %r, abs=%r", f, af)
112
if bzrlib.branch.is_control_file(af):
110
if is_control_file(af):
113
111
raise ForbiddenFileError('cannot add control file %s' % f)
115
113
versioned = (inv.path2id(rf) != None)
129
mutter("branch root doesn't need to be added")
127
mutter("tree root doesn't need to be added")
132
130
mutter("%r is already versioned", f)
134
132
mutter("%r is a bzr tree", f)
136
count += __add_one(branch, inv, rf, kind, reporter)
134
count += __add_one(tree, inv, rf, kind, reporter)
138
136
if kind == 'directory' and recurse and not sub_tree:
139
137
for subf in os.listdir(af):
144
142
mutter("skip ignored sub-file %r", subp)
146
144
mutter("queue to add sub-file %r", subp)
147
file_list.append(branch.abspath(subp))
145
file_list.append(tree.abspath(subp))
150
148
mutter('added %d entries', count)
153
branch.working_tree()._write_inventory(inv)
151
tree._write_inventory(inv)
157
def __add_one(branch, inv, path, kind, reporter):
155
def __add_one(tree, inv, path, kind, reporter):
158
156
"""Add a file or directory, automatically add unversioned parents."""
160
158
# Nothing to do if path is already versioned.
161
# This is safe from infinite recursion because the branch root is
159
# This is safe from infinite recursion because the tree root is
162
160
# always versioned.
163
161
if inv.path2id(path) != None:
167
count = __add_one(branch, inv, dirname(path), 'directory', reporter)
165
count = __add_one(tree, inv, dirname(path), 'directory', reporter)
169
167
entry = inv.add_path(path, kind=kind)
170
168
mutter("added %r kind %r file_id={%s}", path, kind, entry.file_id)