[patch][0.15] better DirState._validate

John Arbash Meinel john at arbash-meinel.com
Mon Mar 26 16:49:47 BST 2007


Martin Pool wrote:
> Following on from John's move_children_correctly here is a patch that:

Thanks. I'm sorry that I didn't get a chance to catch all the other edge
cases before I submitted it. (I can only blame it being 7pm on a Friday)

> 
> * updates DirState._validate to be more correct
> * adds some tests for different types of incorrectness that we can detect
> * changes assertRaisess to return the exception object, so that we
> can examine it

Yay!

> * moves some test-creation code into the test_dirstate base class so
> that it can be used by more tests
> 
> Since John's fix needs to be merged for 0.15 but it's validation
> changes I want to put this in for the rc3, but review would be very
> welcome.
> 
> 

v- I think having a check that all entries are the right width (number
of columns) is reasonable. In case anyone starts poking at _dirblocks
directly. Since they are lists, there is no strong constraint, but they
do have a very specific form.

> +        # TODO: All entries must have some content that's not 'a' or 'r',
> +        # otherwise it could just be removed.
> +        #
> +        # TODO: All relocations must point directly to a real entry.
> +        #
> +        # TODO: No repeated keys.
> +        #
> +        # -- mbp 20070325
>          from pprint import pformat
> -        # TODO: All entries should have the same length?
> +        self._read_dirblocks_if_needed()
>          if len(self._dirblocks) > 0:
>              assert self._dirblocks[0][0] == '', \
>                      "dirblocks don't start with root block:\n" + \
> @@ -2191,57 +2199,67 @@
>                  pformat(dir_names))
>          for dirblock in self._dirblocks:

v- You say 'accumulate' but you don't seem to be doing it. Is it a
change you later removed?

>              # within each dirblock, the entries are sorted by filename and
> -            # then by id.
> +            # then by id.  also accumulate all ids in the dirstate for later
> +            # use.
> +            for entry in dirblock[1]:
> +                assert dirblock[0] == entry[0][0], \
> +                    "entry key for %r doesn't match directory name in\n%r" % \
> +                    (entry, pformat(dirblock))
>              assert dirblock[1] == sorted(dirblock[1]), \
>                  "dirblock for %r is not sorted:\n%s" % \
>                  (dirblock[0], pformat(dirblock))

...

Otherwise +1.

John
=:->



More information about the bazaar mailing list