docs: def add_filepath(self, filepath, fullpath, copy=False):
          """
          Bespoke function to add filepath & fullpath to manifest
          object without hashing. Can defer hashing until all files are
          added. Hashing all at once is much faster as overhead for
          threading is spread over all files
          """
  
          # Ignore directories
          if os.path.isdir(fullpath):
              return False
  
          # Ignore anything matching the ignore patterns
          for pattern in self.ignore:
              if fnmatch.fnmatch(os.path.basename(fullpath), pattern):
                  return False
  
          if filepath not in self.data:
              self.data[filepath] = {}
  
          self.data[filepath]['fullpath'] = fullpath
          if 'hashes' not in self.data[filepath]:
              self.data[filepath]['hashes'] = {hash: None for hash in all_hashes}
  
          if copy:
              self.data[filepath]['copy'] = copy
  
          if hasattr(self, 'existing_filepaths'):
              if filepath in self.existing_filepaths:
                  self.existing_filepaths.remove(filepath)
  
          return True