~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/add.py

Improved help for remerge and merge

Show diffs side-by-side

added added

removed removed

Lines of Context:
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.workingtree import is_control_file
23
24
import bzrlib.osutils
24
25
from bzrlib.workingtree import WorkingTree
25
26
 
97
98
    import os, errno
98
99
    from bzrlib.errors import BadFileKindError, ForbiddenFileError
99
100
    assert isinstance(recurse, bool)
100
 
    
101
 
    orig_list = file_list
 
101
 
102
102
    file_list = _prepare_file_list(file_list)
103
 
    mutter("smart add of %r, originally %r", file_list, orig_list)
 
103
    user_list = file_list[:]
104
104
    inv = tree.read_working_inventory()
105
105
    added = []
106
106
    ignored = {}
107
 
    user_files = set(file_list)
108
 
 
109
 
    for filepath in file_list:
110
 
        # convert a random abs or cwd-relative path to tree relative.
111
 
        rf = tree.relpath(filepath)
112
 
 
113
 
        # validate user parameters. Our recursive code avoids adding new files
114
 
        # that need such validation 
115
 
        if filepath in user_files and tree.is_control_filename(rf):
116
 
            raise ForbiddenFileError('cannot add control file %s' % filepath)
117
 
 
118
 
        # find the kind of the path being added. This is not
119
 
        # currently determined when we list directories 
120
 
        # recursively, but in theory we can determine while 
121
 
        # doing the directory listing on *some* platformans.
122
 
        # TODO: a safe, portable, clean interface which will 
123
 
        # be faster than os.listdir() + stat. Specifically,
124
 
        # readdir - dirent.d_type supplies the file type when
125
 
        # it is defined. (Apparently Mac OSX has the field but
126
 
        # does not fill it in ?!) Robert C, Martin P.
 
107
 
 
108
    for f in file_list:
 
109
        rf = tree.relpath(f)
 
110
        af = tree.abspath(rf)
 
111
 
127
112
        try:
128
 
            kind = bzrlib.osutils.file_kind(filepath)
 
113
            kind = bzrlib.osutils.file_kind(af)
129
114
        except OSError, e:
130
115
            if hasattr(e, 'errno') and e.errno == errno.ENOENT:
131
 
                raise errors.NoSuchFile(filepath)
 
116
                raise errors.NoSuchFile(rf)
132
117
            raise
133
118
 
134
 
        # we need to call this to determine the inventory kind to create.
135
119
        if not InventoryEntry.versionable_kind(kind):
136
 
            if filepath in user_files:
137
 
                raise BadFileKindError("cannot add %s of type %s" % (filepath, kind))
 
120
            if f in user_list:
 
121
                raise BadFileKindError("cannot add %s of type %s" % (f, kind))
138
122
            else:
139
 
                warning("skipping %s (can't add file of kind '%s')", filepath, kind)
 
123
                warning("skipping %s (can't add file of kind '%s')", f, kind)
140
124
                continue
141
125
 
142
 
        # TODO make has_filename faster or provide a better api for accessing/determining 
143
 
        # this status. perhaps off the inventory directory object.
144
 
        versioned = inv.has_filename(rf)
 
126
        mutter("smart add of %r, abs=%r", f, af)
 
127
        
 
128
        if tree.is_control_filename(af):
 
129
            raise ForbiddenFileError('cannot add control file %s' % f)
 
130
            
 
131
        versioned = (inv.path2id(rf) != None)
145
132
 
146
133
        if kind == 'directory':
147
134
            try:
148
 
                sub_branch = bzrlib.bzrdir.BzrDir.open(filepath)
 
135
                sub_branch = WorkingTree.open(af)
149
136
                sub_tree = True
150
137
            except NotBranchError:
151
138
                sub_tree = False
155
142
            sub_tree = False
156
143
 
157
144
        if rf == '':
158
 
            # mutter("tree root doesn't need to be added")
 
145
            mutter("tree root doesn't need to be added")
159
146
            sub_tree = False
160
147
        elif versioned:
161
 
            pass
162
 
            # mutter("%r is already versioned", filepath)
 
148
            mutter("%r is already versioned", f)
163
149
        elif sub_tree:
164
 
            mutter("%r is a nested bzr tree", filepath)
 
150
            mutter("%r is a bzr tree", f)
165
151
        else:
166
152
            added.extend(__add_one(tree, inv, rf, kind, action))
167
153
 
168
154
        if kind == 'directory' and recurse and not sub_tree:
169
 
            for subf in os.listdir(filepath):
170
 
                # here we could use TreeDirectory rather than 
171
 
                # string concatenation.
 
155
            for subf in os.listdir(af):
172
156
                subp = bzrlib.osutils.pathjoin(rf, subf)
173
 
                # TODO: is_control_filename is very slow. Make it faster. 
174
 
                # TreeDirectory.is_control_filename could also make this 
175
 
                # faster - its impossible for a non root dir to have a 
176
 
                # control file.
177
157
                if tree.is_control_filename(subp):
178
158
                    mutter("skip control directory %r", subp)
179
159
                else:
180
 
                    # ignore while selecting files - if we globbed in the
181
 
                    # outer loop we would ignore user files.
182
160
                    ignore_glob = tree.is_ignored(subp)
183
161
                    if ignore_glob is not None:
184
 
                        # mutter("skip ignored sub-file %r", subp)
 
162
                        mutter("skip ignored sub-file %r", subp)
185
163
                        if ignore_glob not in ignored:
186
164
                            ignored[ignore_glob] = []
187
165
                        ignored[ignore_glob].append(subp)
188
166
                    else:
189
 
                        #mutter("queue to add sub-file %r", subp)
 
167
                        mutter("queue to add sub-file %r", subp)
190
168
                        file_list.append(tree.abspath(subp))
191
169
 
 
170
    mutter('added %d entries', len(added))
 
171
    
192
172
    if len(added) > 0:
193
173
        tree._write_inventory(inv)
 
174
 
194
175
    return added, ignored
195
176
 
196
177