code: def differences_between(self, current_files, parent_files, changes, prefixes):
          
          parent_oid = None
  
          if any(is_tree for _, is_tree, _ in changes):
              if len(changes) == 1:
                  wanted_path = list(changes)[0][0]
                  parent_oid = frozenset([oid for path, is_tree, oid in parent_files if path == wanted_path and is_tree])
              else:
                  parent_values = defaultdict(set)
                  parent_changes = parent_files - current_files
                  for path, is_tree, oid in parent_changes:
                      if is_tree:
                          parent_values[path].add(oid)
  
          for path, is_tree, oid in changes:
              if is_tree and path not in prefixes:
                  continue
  
              if not is_tree:
                  yield path, None, True
              else:
                  parent_oids = parent_oid if parent_oid is not None else parent_values.get(path, empty)
                  cf_and_pf, changes = self.tree_structures_for(path, oid, parent_oids, prefixes)
                  if changes:
                      yield cf_and_pf, changes, False
docs: yield (thing, changes, is_path)
  
          If is_path is true, changes is None and thing is the path as a tuple.
  
          If is_path is false, thing is the current_files and parent_files for
          that changed treeentry and changes is the difference between current_files
          and parent_files.
  
          The code here is written to squeeze as much performance as possible out
          of this operation.