~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/dirstate.py

  • Committer: John Arbash Meinel
  • Date: 2007-04-20 17:57:13 UTC
  • mto: This revision was merged to the branch mainline in revision 2440.
  • Revision ID: john@arbash-meinel.com-20070420175713-64x3r196vbqad3y2
Add a check that all entries have a valid parent entry.
If we have a non-absent entry, it must have a valid directory entry as a parent.
(You can't have a present entry in an absent directory, or in a missing dir)

Show diffs side-by-side

added added

removed removed

Lines of Context:
2212
2212
                    "dirblock for %r is not sorted:\n%s" % \
2213
2213
                    (dirblock[0], pformat(dirblock)))
2214
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
            else:
 
2233
                if parent_entry[1][tree_index][0] != 'd':
 
2234
                    raise AssertionError(
 
2235
                        "Parent entry for %s is not marked as a valid"
 
2236
                        " directory. %s" % (this_path, parent_entry,))
 
2237
 
2215
2238
        # For each file id, for each tree: either
2216
2239
        # the file id is not present at all; all rows with that id in the
2217
2240
        # key have it marked as 'absent'
2258
2281
                            raise AssertionError(
2259
2282
                            "entry %r inconsistent with previous path %r" % \
2260
2283
                            (entry, previous_path))
 
2284
                        check_valid_parent()
2261
2285
                else:
2262
2286
                    if minikind == 'a':
2263
2287
                        # absent; should not occur anywhere else
2267
2291
                        this_tree_map[file_id] = tree_state[1]
2268
2292
                    else:
2269
2293
                        this_tree_map[file_id] = this_path
 
2294
                        check_valid_parent()
2270
2295
 
2271
2296
    def _wipe_state(self):
2272
2297
        """Forget all state information about the dirstate."""