~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-08-05 16:51:01 UTC
  • mfrom: (5906.1.10 custom-verifier)
  • Revision ID: pqm@pqm.ubuntu.com-20110805165101-e89g9pgybm7db15a
(jelmer) Allow other kinds of file "verifiers" than SHA1. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
300
300
        """
301
301
        return osutils.split_lines(self.get_file_text(file_id, path))
302
302
 
 
303
    def get_file_verifier(self, file_id, path=None, stat_value=None):
 
304
        """Return a verifier for a file.
 
305
 
 
306
        The default implementation returns a sha1.
 
307
 
 
308
        :param file_id: The handle for this file.
 
309
        :param path: The path that this file can be found at.
 
310
            These must point to the same object.
 
311
        :param stat_value: Optional stat value for the object
 
312
        :return: Tuple with verifier name and verifier data
 
313
        """
 
314
        return ("SHA1", self.get_file_sha1(file_id, path=path,
 
315
            stat_value=stat_value))
 
316
 
303
317
    def get_file_sha1(self, file_id, path=None, stat_value=None):
304
318
        """Return the SHA1 file for a file.
305
319
 
 
320
        :note: callers should use get_file_verifier instead
 
321
            where possible, as the underlying repository implementation may
 
322
            have quicker access to a non-sha1 verifier.
 
323
 
306
324
        :param file_id: The handle for this file.
307
325
        :param path: The path that this file can be found at.
308
326
            These must point to the same object.
955
973
        if source_kind != target_kind:
956
974
            changed_content = True
957
975
        elif source_kind == 'file':
958
 
            if (self.source.get_file_sha1(file_id, source_path, source_stat) !=
959
 
                self.target.get_file_sha1(file_id, target_path, target_stat)):
 
976
            if not self.file_content_matches(file_id, file_id, source_path,
 
977
                    target_path, source_stat, target_stat):
960
978
                changed_content = True
961
979
        elif source_kind == 'symlink':
962
980
            if (self.source.get_symlink_target(file_id) !=
1275
1293
                    changed_file_ids.add(result[0])
1276
1294
                    yield result
1277
1295
 
 
1296
    @needs_read_lock
 
1297
    def file_content_matches(self, source_file_id, target_file_id,
 
1298
            source_path=None, target_path=None, source_stat=None, target_stat=None):
 
1299
        """Check if two files are the same in the source and target trees.
 
1300
 
 
1301
        This only checks that the contents of the files are the same,
 
1302
        it does not touch anything else.
 
1303
 
 
1304
        :param source_file_id: File id of the file in the source tree
 
1305
        :param target_file_id: File id of the file in the target tree
 
1306
        :param source_path: Path of the file in the source tree
 
1307
        :param target_path: Path of the file in the target tree
 
1308
        :param source_stat: Optional stat value of the file in the source tree
 
1309
        :param target_stat: Optional stat value of the file in the target tree
 
1310
        :return: Boolean indicating whether the files have the same contents
 
1311
        """
 
1312
        source_verifier_kind, source_verifier_data = self.source.get_file_verifier(
 
1313
            source_file_id, source_path, source_stat)
 
1314
        target_verifier_kind, target_verifier_data = self.target.get_file_verifier(
 
1315
            target_file_id, target_path, target_stat)
 
1316
        if source_verifier_kind == target_verifier_kind:
 
1317
            return (source_verifier_data == target_verifier_data)
 
1318
        # Fall back to SHA1 for now
 
1319
        if source_verifier_kind != "SHA1":
 
1320
            source_sha1 = self.source.get_file_sha1(source_file_id,
 
1321
                    source_path, source_stat)
 
1322
        else:
 
1323
            source_sha1 = source_verifier_data
 
1324
        if target_verifier_kind != "SHA1":
 
1325
            target_sha1 = self.target.get_file_sha1(target_file_id,
 
1326
                    target_path, target_stat)
 
1327
        else:
 
1328
            target_sha1 = target_verifier_data
 
1329
        return (source_sha1 == target_sha1)
1278
1330
 
1279
1331
InterTree.register_optimiser(InterTree)
1280
1332