~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_dirstate_helpers_c.pyx

  • Committer: Robert Collins
  • Date: 2008-09-25 01:54:42 UTC
  • mfrom: (3709.4.1 iter-changes.less-sha1)
  • mto: This revision was merged to the branch mainline in revision 3741.
  • Revision ID: robertc@robertcollins.net-20080925015442-p9mtzse65w5gy2uv
Integrate less aggressive sha logic with C iter-changes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
800
800
def update_entry(self, entry, abspath, stat_value):
801
801
    """Update the entry based on what is actually on disk.
802
802
 
 
803
    This function only calculates the sha if it needs to - if the entry is
 
804
    uncachable, or clearly different to the first parent's entry, no sha
 
805
    is calculated, and None is returned.
 
806
 
803
807
    :param entry: This is the dirblock entry for the file in question.
804
808
    :param abspath: The path on disk for this file.
805
809
    :param stat_value: (optional) if we already have done a stat on the
806
810
        file, re-use it.
807
 
    :return: The sha1 hexdigest of the file (40 bytes) or link target of a
808
 
            symlink.
 
811
    :return: None, or The sha1 hexdigest of the file (40 bytes) or link
 
812
        target of a symlink.
809
813
    """
810
814
    return _update_entry(self, entry, abspath, stat_value)
811
815
 
813
817
cdef _update_entry(self, entry, abspath, stat_value):
814
818
    """Update the entry based on what is actually on disk.
815
819
 
 
820
    This function only calculates the sha if it needs to - if the entry is
 
821
    uncachable, or clearly different to the first parent's entry, no sha
 
822
    is calculated, and None is returned.
 
823
 
816
824
    :param self: The dirstate object this is operating on.
817
825
    :param entry: This is the dirblock entry for the file in question.
818
826
    :param abspath: The path on disk for this file.
819
827
    :param stat_value: The stat value done on the path.
820
 
    :return: The sha1 hexdigest of the file (40 bytes) or link target of a
821
 
            symlink.
 
828
    :return: None, or The sha1 hexdigest of the file (40 bytes) or link
 
829
        target of a symlink.
822
830
    """
823
831
    # TODO - require pyrex 0.9.8, then use a pyd file to define access to the
824
832
    # _st mode of the compiled stat objects.
857
865
    # process this entry.
858
866
    link_or_sha1 = None
859
867
    if minikind == c'f':
860
 
        link_or_sha1 = self._sha1_file(abspath)
861
868
        executable = self._is_executable(stat_value.st_mode,
862
869
                                         saved_executable)
863
870
        if self._cutoff_time is None:
864
871
            self._sha_cutoff_time()
865
872
        if (stat_value.st_mtime < self._cutoff_time
866
 
            and stat_value.st_ctime < self._cutoff_time):
 
873
            and stat_value.st_ctime < self._cutoff_time
 
874
            and len(entry[1]) > 1
 
875
            and entry[1][1][0] != 'a'):
 
876
                # Could check for size changes for further optimised
 
877
                # avoidance of sha1's. However the most prominent case of
 
878
                # over-shaing is during initial add, which this catches.
 
879
            link_or_sha1 = self._sha1_file(abspath)
867
880
            entry[1][0] = ('f', link_or_sha1, stat_value.st_size,
868
881
                           executable, packed_stat)
869
882
        else:
974
987
    cdef object root_dir_info
975
988
    cdef object bisect_left
976
989
    cdef object pathjoin
 
990
    cdef object fstat
 
991
    cdef object sha_file
977
992
 
978
993
    def __init__(self, include_unchanged, use_filesystem_for_exec,
979
994
        search_specific_files, state, source_index, target_index,
1021
1036
        self.root_dir_info = None
1022
1037
        self.bisect_left = bisect.bisect_left
1023
1038
        self.pathjoin = osutils.pathjoin
 
1039
        self.fstat = os.fstat
 
1040
        self.sha_file = osutils.sha_file
1024
1041
 
1025
1042
    cdef _process_entry(self, entry, path_info):
1026
1043
        """Compare an entry and real disk to generate delta information.
1117
1134
                    if source_minikind != c'f':
1118
1135
                        content_change = 1
1119
1136
                    else:
1120
 
                        # We could check the size, but we already have the
1121
 
                        # sha1 hash.
1122
 
                        content_change = (link_or_sha1 != source_details[1])
 
1137
                        # If the size is the same, check the sha:
 
1138
                        if target_details[2] == source_details[2]:
 
1139
                            if link_or_sha1 is None:
 
1140
                                # Stat cache miss:
 
1141
                                file_obj = file(path_info[4], 'rb')
 
1142
                                try:
 
1143
                                    # XXX: TODO: Use lower level file IO rather
 
1144
                                    # than python objects for sha-misses.
 
1145
                                    statvalue = self.fstat(file_obj.fileno())
 
1146
                                    link_or_sha1 = self.sha_file(file_obj)
 
1147
                                finally:
 
1148
                                    file_obj.close()
 
1149
                                self.state._observed_sha1(entry, link_or_sha1,
 
1150
                                    statvalue)
 
1151
                            content_change = (link_or_sha1 != source_details[1])
 
1152
                        else:
 
1153
                            # Size changed, so must be different
 
1154
                            content_change = 1
1123
1155
                    # Target details is updated at update_entry time
1124
1156
                    if self.use_filesystem_for_exec:
1125
1157
                        # We don't need S_ISREG here, because we are sure