~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory.py

  • Committer: Robert Collins
  • Date: 2009-07-10 05:18:29 UTC
  • mto: This revision was merged to the branch mainline in revision 4524.
  • Revision ID: robertc@robertcollins.net-20090710051829-zesmf7tf2jwohfip
Fix fallout from the delta checking work, don't error on deltas containing the root inventory item in CHK delta application, and clean up Inventory docs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
712
712
 
713
713
 
714
714
class CommonInventory(object):
715
 
    """Basic inventory logic, defined in terms of primitives like has_id."""
 
715
    """Basic inventory logic, defined in terms of primitives like has_id.
 
716
 
 
717
    An inventory is the metadata about the contents of a tree.
 
718
 
 
719
    This is broadly a map from file_id to entries such as directories, files,
 
720
    symlinks and tree references. Each entry maintains its own metadata like
 
721
    SHA1 and length for files, or children for a directory.
 
722
 
 
723
    Entries can be looked up either by path or by file_id.
 
724
 
 
725
    InventoryEntry objects must not be modified after they are
 
726
    inserted, other than through the Inventory API.
 
727
    """
716
728
 
717
729
    def __contains__(self, file_id):
718
730
        """True if this entry contains a file with given id.
1019
1031
 
1020
1032
 
1021
1033
class Inventory(CommonInventory):
1022
 
    """Inventory of versioned files in a tree.
1023
 
 
1024
 
    This describes which file_id is present at each point in the tree,
1025
 
    and possibly the SHA-1 or other information about the file.
1026
 
    Entries can be looked up either by path or by file_id.
1027
 
 
1028
 
    The inventory represents a typical unix file tree, with
1029
 
    directories containing files and subdirectories.  We never store
1030
 
    the full path to a file, because renaming a directory implicitly
1031
 
    moves all of its contents.  This class internally maintains a
 
1034
    """Mutable dict based in-memory inventory.
 
1035
 
 
1036
    We never store the full path to a file, because renaming a directory
 
1037
    implicitly moves all of its contents.  This class internally maintains a
1032
1038
    lookup tree that allows the children under a directory to be
1033
1039
    returned quickly.
1034
1040
 
1035
 
    InventoryEntry objects must not be modified after they are
1036
 
    inserted, other than through the Inventory API.
1037
 
 
1038
1041
    >>> inv = Inventory()
1039
1042
    >>> inv.add(InventoryFile('123-123', 'hello.c', ROOT_ID))
1040
1043
    InventoryFile('123-123', 'hello.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None)
1041
1044
    >>> inv['123-123'].name
1042
1045
    'hello.c'
1043
1046
 
1044
 
    May be treated as an iterator or set to look up file ids:
 
1047
    Id's may be looked up from paths:
1045
1048
 
1046
 
    >>> bool(inv.path2id('hello.c'))
1047
 
    True
 
1049
    >>> inv.path2id('hello.c')
 
1050
    '123-123'
1048
1051
    >>> '123-123' in inv
1049
1052
    True
1050
1053
 
1051
 
    May also look up by name:
 
1054
    There are iterators over the contents:
1052
1055
 
1053
 
    >>> [x[0] for x in inv.iter_entries()]
 
1056
    >>> [entry[0] for entry in inv.iter_entries()]
1054
1057
    ['', u'hello.c']
1055
 
    >>> inv = Inventory('TREE_ROOT-12345678-12345678')
1056
 
    >>> inv.add(InventoryFile('123-123', 'hello.c', ROOT_ID))
1057
 
    Traceback (most recent call last):
1058
 
    BzrError: parent_id {TREE_ROOT} not in inventory
1059
 
    >>> inv.add(InventoryFile('123-123', 'hello.c', 'TREE_ROOT-12345678-12345678'))
1060
 
    InventoryFile('123-123', 'hello.c', parent_id='TREE_ROOT-12345678-12345678', sha1=None, len=None, revision=None)
1061
1058
    """
 
1059
 
1062
1060
    def __init__(self, root_id=ROOT_ID, revision_id=None):
1063
1061
        """Create or read an inventory.
1064
1062
 
1680
1678
        result.id_to_entry.apply_delta(id_to_entry_delta)
1681
1679
        if parent_id_basename_delta:
1682
1680
            result.parent_id_basename_to_file_id.apply_delta(parent_id_basename_delta)
 
1681
        parents.discard(None)
1683
1682
        for parent in parents:
1684
1683
            try:
1685
1684
                if result[parent].kind != 'directory':