code: def add_filepath(self, filepath, fullpath, copy=False):
          
  
          # 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
docs: 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