class_docstr: File-based Code Driver handles source control management for the project with files
      
class_docstr_tok: ["File-based","Code","Driver","handles","source","control","management","for","the","project","with","files"]
docstr: Return whether there are unstaged changes
docstr_tok: ["Return","whether","there","are","unstaged","changes"]
code: def _has_unstaged_changes(self):
      """Return whether there are unstaged changes"""
      # TODO: fix circular logic: for empty tracked filepaths, must return "unstaged" until commit is created.
      # TODO: otherwise initial commit will always fail because of no unstaged changes
      tracked_filepaths = self._get_tracked_files()
      commit_hash = self._calculate_commit_hash(tracked_filepaths)
      if self.exists_ref(commit_hash):
          return False
      return True
  
imports: import os
  import shutil
  import errno
  import pathspec
  import tempfile
  import hashlib
  import checksumdir
  from datmo.core.util.misc_functions import list_all_filepaths
  from datmo.core.util.i18n import get
  from datmo.core.util.exceptions import PathDoesNotExist, FileIOError, UnstagedChanges, CodeNotInitialized, CommitDoesNotExist
  from datmo.core.controller.code.driver import CodeDriver
label_desc: Use image node_id 8 for calling the FileCodeDriver obj's underlying member method code with example usage: obj._has_unstaged_changes() and returns: True, False