text: # Copyright 2017 The PDFium Authors. All rights reserved.
  # Use of this source code is governed by a BSD-style license that can be
  # found in the LICENSE file.
  
  """Classes for dealing with git."""
  
  import subprocess
  
  from common import RunCommandPropagateErr
  
  
  class GitHelper(object):
    """Issues git commands. Stateful."""
  
    def __init__(self):
      self.stashed = 0
  
    def Checkout(self, branch):
      """Checks out a branch."""
      RunCommandPropagateErr(['git', 'checkout', branch], exit_status_on_error=1)
  
    def FetchOriginMaster(self):
      """Fetches new changes on origin/master."""
      RunCommandPropagateErr(['git', 'fetch', 'origin', 'master'],
                             exit_status_on_error=1)
  
    def StashPush(self):
      """Stashes uncommitted changes."""
      output = RunCommandPropagateErr(['git', 'stash', '--include-untracked'],
                                      exit_status_on_error=1)
      if 'No local changes to save' in output:
        return False
  
      self.stashed += 1
      return True
  
    def StashPopAll(self):
      """Pops as many changes as this instance stashed."""
      while self.stashed > 0:
        RunCommandPropagateErr(['git', 'stash', 'pop'], exit_status_on_error=1)
        self.stashed -= 1
  
    def GetCurrentBranchName(self):
      """Returns a string with the current branch name."""
      return RunCommandPropagateErr(
          ['git', 'rev-parse', '--abbrev-ref', 'HEAD'],
          exit_status_on_error=1).strip()
  
    def GetCurrentBranchHash(self):
      return RunCommandPropagateErr(
          ['git', 'rev-parse', 'HEAD'], exit_status_on_error=1).strip()
  
    def IsCurrentBranchClean(self):
      output = RunCommandPropagateErr(['git', 'status', '--porcelain'],
                                      exit_status_on_error=1)
      return not output
  
    def BranchExists(self, branch_name):
      """Return whether a branch with the given name exists."""
      output = RunCommandPropagateErr(['git', 'rev-parse', '--verify',
                                       branch_name])
      return output is not None
  
    def CloneLocal(self, source_repo, new_repo):
      RunCommandPropagateErr(['git', 'clone', source_repo, new_repo],
                             exit_status_on_error=1)
  