def on_need_compare(self, pair):
        """Re-classify pair based on file attributes and options."""
        # print("on_need_compare", pair)
        # If no metadata is available, we could only classify file entries as
        # 'existing'.
        # Now we use peer information to improve this classification.
        c_pair = (pair.local_classification, pair.remote_classification)

        org_pair = c_pair
        org_operation = pair.operation

        # print("need_compare", pair)

        if pair.is_dir:
            # For directores, we cannot compare existing peer entries.
            # Instead, we simply log (and traverse the children later).
            pair.local_classification = pair.remote_classification = "existing"
            pair.operation = "equal"
            self._log_action("", "visit", "?", pair.local, min_level=4)
            # self._log_action("", "equal", "=", pair.local, min_level=4)
            return

        elif c_pair == ("existing", "existing"):
            # Naive classification derived from file time and size
            time_cmp = eps_compare(
                pair.local.mtime, pair.remote.mtime, FileEntry.EPS_TIME
            )
            if time_cmp < 0:
                c_pair = ("unmodified", "modified")  # remote is newer
            elif time_cmp > 0:
                c_pair = ("modified", "unmodified")  # local is newer
            elif pair.local.size == pair.remote.size:
                c_pair = ("unmodified", "unmodified")  # equal
            else:
                c_pair = ("modified", "modified")  # conflict!

        elif c_pair == ("new", "new"):
            # Naive classification derived from file time and size
            time_cmp = eps_compare(
                pair.local.mtime, pair.remote.mtime, FileEntry.EPS_TIME
            )
            if time_cmp == 0 and pair.local.size == pair.remote.size:
                c_pair = ("unmodified", "unmodified")  # equal
            else:
                c_pair = ("modified", "modified")  # conflict!

        # elif c_pair == ("unmodified", "unmodified"):

        pair.local_classification = c_pair[0]
        pair.remote_classification = c_pair[1]

        pair.operation = operation_map.get(c_pair)
        # print("on_need_compare {} => {}".format(org_pair, pair))
        if not pair.operation:
            raise RuntimeError(
                "Undefined operation for pair classification {}".format(c_pair)
            )
        elif pair.operation == org_operation:
            raise RuntimeError("Could not re-classify  {}".format(org_pair))

        handler = getattr(self, "on_" + pair.operation, None)
        res = handler(pair)
        #         self._log_action("", "different", "?", pair.local, min_level=2)
        return res
def on_need_compare ( self , pair ) : c_pair = ( pair . local_classification , pair . remote_classification ) org_pair = c_pair org_operation = pair . operation if pair . is_dir : pair . local_classification = pair . remote_classification = "existing" pair . operation = "equal" self . _log_action ( "" , "visit" , "?" , pair . local , min_level = 4 ) return elif c_pair == ( "existing" , "existing" ) : time_cmp = eps_compare ( pair . local . mtime , pair . remote . mtime , FileEntry . EPS_TIME ) if time_cmp < 0 : c_pair = ( "unmodified" , "modified" ) elif time_cmp > 0 : c_pair = ( "modified" , "unmodified" ) elif pair . local . size == pair . remote . size : c_pair = ( "unmodified" , "unmodified" ) else : c_pair = ( "modified" , "modified" ) elif c_pair == ( "new" , "new" ) : time_cmp = eps_compare ( pair . local . mtime , pair . remote . mtime , FileEntry . EPS_TIME ) if time_cmp == 0 and pair . local . size == pair . remote . size : c_pair = ( "unmodified" , "unmodified" ) else : c_pair = ( "modified" , "modified" ) pair . local_classification = c_pair [ 0 ] pair . remote_classification = c_pair [ 1 ] pair . operation = operation_map . get ( c_pair ) if not pair . operation : raise RuntimeError ( "Undefined operation for pair classification {}" . format ( c_pair ) ) elif pair . operation == org_operation : raise RuntimeError ( "Could not re-classify  {}" . format ( org_pair ) ) handler = getattr ( self , "on_" + pair . operation , None ) res = handler ( pair ) return res
Re-classify pair based on file attributes and options.