import subprocess from typing import Any from typing import List from typing import Optional from typing import Set class CalledProcessError(RuntimeError): pass def added_files() -> Set[str]: cmd = ('git', 'diff', '--staged', '--name-only', '--diff-filter=A') return set(cmd_output(*cmd).splitlines()) def cmd_output(*cmd: str, retcode: Optional[int] = 0, **kwargs: Any) -> str: kwargs.setdefault('stdout', subprocess.PIPE) kwargs.setdefault('stderr', subprocess.PIPE) proc = subprocess.Popen(cmd, **kwargs) stdout, stderr = proc.communicate() stdout = stdout.decode() if retcode is not None and proc.returncode != retcode: raise CalledProcessError(cmd, retcode, proc.returncode, stdout, stderr) return stdout def zsplit(s: str) -> List[str]: s = s.strip('\0') if s: return s.split('\0') else: return []