~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/dirstate.py

  • Committer: Jelmer Vernooij
  • Date: 2011-05-08 11:20:31 UTC
  • mto: This revision was merged to the branch mainline in revision 5844.
  • Revision ID: jelmer@samba.org-20110508112031-dqa1cw1gjhqsj2zr
Move vf-specific gather_stats bits to vf_repository.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
265
265
        # return '%X.%X' % (int(st.st_mtime), st.st_mode)
266
266
 
267
267
 
 
268
def _unpack_stat(packed_stat):
 
269
    """Turn a packed_stat back into the stat fields.
 
270
 
 
271
    This is meant as a debugging tool, should not be used in real code.
 
272
    """
 
273
    (st_size, st_mtime, st_ctime, st_dev, st_ino,
 
274
     st_mode) = struct.unpack('>LLLLLL', binascii.a2b_base64(packed_stat))
 
275
    return dict(st_size=st_size, st_mtime=st_mtime, st_ctime=st_ctime,
 
276
                st_dev=st_dev, st_ino=st_ino, st_mode=st_mode)
 
277
 
 
278
 
268
279
class SHA1Provider(object):
269
280
    """An interface for getting sha1s of a file."""
270
281
 
1734
1745
                self._sha_cutoff_time()
1735
1746
            if (stat_value.st_mtime < self._cutoff_time
1736
1747
                and stat_value.st_ctime < self._cutoff_time):
1737
 
                entry[1][0] = ('f', sha1, entry[1][0][2], entry[1][0][3],
1738
 
                    packed_stat)
 
1748
                entry[1][0] = ('f', sha1, stat_value.st_size, entry[1][0][3],
 
1749
                               packed_stat)
1739
1750
                self._dirblock_state = DirState.IN_MEMORY_MODIFIED
1740
1751
 
1741
1752
    def _sha_cutoff_time(self):
2463
2474
            # the suffix is from tree_index+1:parent_count+1.
2464
2475
            new_location_suffix = [DirState.NULL_PARENT_DETAILS] * (parent_count - tree_index)
2465
2476
            # now stitch in all the entries from this tree
2466
 
            for path, entry in tree.inventory.iter_entries_by_dir():
 
2477
            for path, entry in tree.iter_entries_by_dir():
2467
2478
                # here we process each trees details for each item in the tree.
2468
2479
                # we first update any existing entries for the id at other paths,
2469
2480
                # then we either create or update the entry for the id at the
2681
2692
        if tracing:
2682
2693
            trace.mutter("set_state_from_inventory complete.")
2683
2694
 
 
2695
    def set_state_from_scratch(self, working_inv, parent_trees, parent_ghosts):
 
2696
        """Wipe the currently stored state and set it to something new.
 
2697
 
 
2698
        This is a hard-reset for the data we are working with.
 
2699
        """
 
2700
        # Technically, we really want a write lock, but until we write, we
 
2701
        # don't really need it.
 
2702
        self._requires_lock()
 
2703
        # root dir and root dir contents with no children. We have to have a
 
2704
        # root for set_state_from_inventory to work correctly.
 
2705
        empty_root = (('', '', inventory.ROOT_ID),
 
2706
                      [('d', '', 0, False, DirState.NULLSTAT)])
 
2707
        empty_tree_dirblocks = [('', [empty_root]), ('', [])]
 
2708
        self._set_data([], empty_tree_dirblocks)
 
2709
        self.set_state_from_inventory(working_inv)
 
2710
        self.set_parent_trees(parent_trees, parent_ghosts)
 
2711
 
2684
2712
    def _make_absent(self, current_old):
2685
2713
        """Mark current_old - an entry - as absent for tree 0.
2686
2714
 
3177
3205
    # If we have gotten this far, that means that we need to actually
3178
3206
    # process this entry.
3179
3207
    link_or_sha1 = None
 
3208
    worth_saving = True
3180
3209
    if minikind == 'f':
3181
3210
        executable = state._is_executable(stat_value.st_mode,
3182
3211
                                         saved_executable)
3198
3227
        else:
3199
3228
            entry[1][0] = ('f', '', stat_value.st_size,
3200
3229
                           executable, DirState.NULLSTAT)
 
3230
            worth_saving = False
3201
3231
    elif minikind == 'd':
3202
3232
        link_or_sha1 = None
3203
3233
        entry[1][0] = ('d', '', 0, False, packed_stat)
3209
3239
                state._get_block_entry_index(entry[0][0], entry[0][1], 0)
3210
3240
            state._ensure_block(block_index, entry_index,
3211
3241
                               osutils.pathjoin(entry[0][0], entry[0][1]))
 
3242
        else:
 
3243
            worth_saving = False
3212
3244
    elif minikind == 'l':
3213
3245
        link_or_sha1 = state._read_link(abspath, saved_link_or_sha1)
3214
3246
        if state._cutoff_time is None:
3220
3252
        else:
3221
3253
            entry[1][0] = ('l', '', stat_value.st_size,
3222
3254
                           False, DirState.NULLSTAT)
3223
 
    state._dirblock_state = DirState.IN_MEMORY_MODIFIED
 
3255
    if worth_saving:
 
3256
        state._dirblock_state = DirState.IN_MEMORY_MODIFIED
3224
3257
    return link_or_sha1
3225
3258
 
3226
3259