def METHOD_NAME(self, path, destination, existing):
    if not os.path.exists(destination):
        try:
            os.makedirs(destination)
        except OSError as e:
            # Raised when it already exists, but are there other cases?
            logger.debug('Failed to create destination dir {}: {}', destination, e)
    # 'recursively' traverse and hard link
    working_dir = os.getcwd()
    os.chdir(path)  # change working dir to make dir joins easier
    for root, dirs, files in os.walk('.'):
        dst_dir = os.path.abspath(os.path.join(destination, root))
        for d in dirs:
            try:
                os.mkdir(d)
            except OSError as e:
                # Raised when it already exists, but are there other cases?
                logger.debug('Failed to create subdir {}: {}', d, e)
        for f in files:
            src_file = os.path.join(root, f)
            dst_file = os.path.join(dst_dir, f)
            logger.debug('Hardlinking {} to {}', src_file, dst_file)
            try:
                os.link(src_file, dst_file)
            except OSError as e:
                logger.debug('Failed to create hardlink for file {}: {}', f, e)
                if existing == 'fail':
                    raise  # reraise to fail the entry in the calling function
    os.chdir(working_dir)