~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/dirstate.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1407
1407
        The new dirstate will be an empty tree - that is it has no parents,
1408
1408
        and only a root node - which has id ROOT_ID.
1409
1409
 
1410
 
        The object will be write locked when returned to the caller,
1411
 
        unless there was an exception in the writing, in which case it
1412
 
        will be unlocked.
1413
 
 
1414
1410
        :param path: The name of the file for the dirstate.
1415
 
        :return: A DirState object.
 
1411
        :return: A write-locked DirState object.
1416
1412
        """
1417
1413
        # This constructs a new DirState object on a path, sets the _state_file
1418
1414
        # to a new empty file for that path. It then calls _set_data() with our
2216
2212
                    "dirblock for %r is not sorted:\n%s" % \
2217
2213
                    (dirblock[0], pformat(dirblock)))
2218
2214
 
 
2215
 
 
2216
        def check_valid_parent():
 
2217
            """Check that the current entry has a valid parent.
 
2218
 
 
2219
            This makes sure that the parent has a record,
 
2220
            and that the parent isn't marked as "absent" in the
 
2221
            current tree. (It is invalid to have a non-absent file in an absent
 
2222
            directory.)
 
2223
            """
 
2224
            if entry[0][0:2] == ('', ''):
 
2225
                # There should be no parent for the root row
 
2226
                return
 
2227
            parent_entry = self._get_entry(tree_index, path_utf8=entry[0][0])
 
2228
            if parent_entry == (None, None):
 
2229
                raise AssertionError(
 
2230
                    "no parent entry for: %s in tree %s"
 
2231
                    % (this_path, tree_index))
 
2232
            if parent_entry[1][tree_index][0] != 'd':
 
2233
                raise AssertionError(
 
2234
                    "Parent entry for %s is not marked as a valid"
 
2235
                    " directory. %s" % (this_path, parent_entry,))
 
2236
 
2219
2237
        # For each file id, for each tree: either
2220
2238
        # the file id is not present at all; all rows with that id in the
2221
2239
        # key have it marked as 'absent'
2262
2280
                            raise AssertionError(
2263
2281
                            "entry %r inconsistent with previous path %r" % \
2264
2282
                            (entry, previous_path))
 
2283
                        check_valid_parent()
2265
2284
                else:
2266
2285
                    if minikind == 'a':
2267
2286
                        # absent; should not occur anywhere else
2271
2290
                        this_tree_map[file_id] = tree_state[1]
2272
2291
                    else:
2273
2292
                        this_tree_map[file_id] = this_path
 
2293
                        check_valid_parent()
2274
2294
 
2275
2295
    def _wipe_state(self):
2276
2296
        """Forget all state information about the dirstate."""