~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/add.py

merge permissions branch, also fixup tests so they are lined up with bzr.dev to help prevent conflicts.

Show diffs side-by-side

added added

removed removed

Lines of Context:
93
93
 
94
94
    Returns the number of files added.
95
95
    """
96
 
    import os
 
96
    import os, errno
97
97
    from bzrlib.errors import BadFileKindError, ForbiddenFileError
98
98
    assert isinstance(recurse, bool)
99
99
 
100
100
    file_list = _prepare_file_list(file_list)
101
101
    user_list = file_list[:]
102
102
    inv = tree.read_working_inventory()
103
 
    count = 0
 
103
    added = []
 
104
    ignored = {}
104
105
 
105
106
    for f in file_list:
106
107
        rf = tree.relpath(f)
107
108
        af = tree.abspath(rf)
108
109
 
109
 
        kind = bzrlib.osutils.file_kind(af)
 
110
        try:
 
111
            kind = bzrlib.osutils.file_kind(af)
 
112
        except OSError, e:
 
113
            if hasattr(e, 'errno') and e.errno == errno.ENOENT:
 
114
                raise errors.NoSuchFile(rf)
 
115
            raise
110
116
 
111
117
        if not InventoryEntry.versionable_kind(kind):
112
118
            if f in user_list:
141
147
        elif sub_tree:
142
148
            mutter("%r is a bzr tree", f)
143
149
        else:
144
 
            count += __add_one(tree, inv, rf, kind, action)
 
150
            added.extend(__add_one(tree, inv, rf, kind, action))
145
151
 
146
152
        if kind == 'directory' and recurse and not sub_tree:
147
153
            for subf in os.listdir(af):
148
154
                subp = bzrlib.osutils.pathjoin(rf, subf)
149
155
                if subf == bzrlib.BZRDIR:
150
156
                    mutter("skip control directory %r", subp)
151
 
                elif tree.is_ignored(subp):
152
 
                    mutter("skip ignored sub-file %r", subp)
153
157
                else:
154
 
                    mutter("queue to add sub-file %r", subp)
155
 
                    file_list.append(tree.abspath(subp))
156
 
 
157
 
 
158
 
    mutter('added %d entries', count)
 
158
                    ignore_glob = tree.is_ignored(subp)
 
159
                    if ignore_glob is not None:
 
160
                        mutter("skip ignored sub-file %r", subp)
 
161
                        if ignore_glob not in ignored:
 
162
                            ignored[ignore_glob] = []
 
163
                        ignored[ignore_glob].append(subp)
 
164
                    else:
 
165
                        mutter("queue to add sub-file %r", subp)
 
166
                        file_list.append(tree.abspath(subp))
 
167
 
 
168
 
 
169
    mutter('added %d entries', len(added))
159
170
    
160
 
    if count > 0:
 
171
    if len(added) > 0:
161
172
        tree._write_inventory(inv)
162
173
 
163
 
    return count
 
174
    return added, ignored
164
175
 
165
176
def __add_one(tree, inv, path, kind, action):
166
177
    """Add a file or directory, automatically add unversioned parents."""
169
180
    # This is safe from infinite recursion because the tree root is
170
181
    # always versioned.
171
182
    if inv.path2id(path) != None:
172
 
        return 0
 
183
        return []
173
184
 
174
185
    # add parent
175
 
    count = __add_one(tree, inv, dirname(path), 'directory', action)
 
186
    added = __add_one(tree, inv, dirname(path), 'directory', action)
176
187
    action(inv, path, kind)
177
188
 
178
 
    return count + 1
 
189
    return added + [path]