Exemplo n.º 1
0
    def partial_sha_to_index(self, partial_bin_sha, canonical_length):
        """
		:return: index as in `sha_to_index` or None if the sha was not found in this
			index file
		:param partial_bin_sha: an at least two bytes of a partial binary sha
		:param canonical_length: lenght of the original hexadecimal representation of the 
			given partial binary sha
		:raise AmbiguousObjectName:"""
        if len(partial_bin_sha) < 2:
            raise ValueError("Require at least 2 bytes of partial sha")

        first_byte = ord(partial_bin_sha[0])
        get_sha = self.sha
        lo = 0  # lower index, the left bound of the bisection
        if first_byte != 0:
            lo = self._fanout_table[first_byte - 1]
        hi = self._fanout_table[
            first_byte]  # the upper, right bound of the bisection

        # fill the partial to full 20 bytes
        filled_sha = partial_bin_sha + '\0' * (20 - len(partial_bin_sha))

        # find lowest
        while lo < hi:
            mid = (lo + hi) / 2
            c = cmp(filled_sha, get_sha(mid))
            if c < 0:
                hi = mid
            elif not c:
                # perfect match
                lo = mid
                break
            else:
                lo = mid + 1
            # END handle midpoint
        # END bisect

        if lo < self.size():
            cur_sha = get_sha(lo)
            if is_equal_canonical_sha(canonical_length, partial_bin_sha,
                                      cur_sha):
                next_sha = None
                if lo + 1 < self.size():
                    next_sha = get_sha(lo + 1)
                if next_sha and next_sha == cur_sha:
                    raise AmbiguousObjectName(partial_bin_sha)
                return lo
            # END if we have a match
        # END if we found something
        return None
Exemplo n.º 2
0
 def partial_sha_to_index(self, partial_bin_sha, canonical_length):
     """
     :return: index as in `sha_to_index` or None if the sha was not found in this
         index file
     :param partial_bin_sha: an at least two bytes of a partial binary sha
     :param canonical_length: lenght of the original hexadecimal representation of the 
         given partial binary sha
     :raise AmbiguousObjectName:"""
     if len(partial_bin_sha) < 2:
         raise ValueError("Require at least 2 bytes of partial sha")
     
     first_byte = ord(partial_bin_sha[0])
     get_sha = self.sha
     lo = 0                  # lower index, the left bound of the bisection
     if first_byte != 0:
         lo = self._fanout_table[first_byte-1]
     hi = self._fanout_table[first_byte]     # the upper, right bound of the bisection
     
     # fill the partial to full 20 bytes
     filled_sha = partial_bin_sha + '\0'*(20 - len(partial_bin_sha))
     
     # find lowest 
     while lo < hi:
         mid = (lo + hi) / 2
         c = cmp(filled_sha, get_sha(mid))
         if c < 0:
             hi = mid
         elif not c:
             # perfect match
             lo = mid
             break
         else:
             lo = mid + 1
         # END handle midpoint
     # END bisect
     
     if lo < self.size():
         cur_sha = get_sha(lo)
         if is_equal_canonical_sha(canonical_length, partial_bin_sha, cur_sha):
             next_sha = None
             if lo+1 < self.size():
                 next_sha = get_sha(lo+1)
             if next_sha and next_sha == cur_sha:
                 raise AmbiguousObjectName(partial_bin_sha)
             return lo
         # END if we have a match
     # END if we found something
     return None