# 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


class GitHelper(object):
  """Issues git commands. Stateful."""

  def __init__(self):
    self.stashed = 0

  def Checkout(self, branch):
    """Checks out a branch."""
    subprocess.check_output(['git', 'checkout', branch])

  def FetchOriginMaster(self):
    """Fetches new changes on origin/master."""
    subprocess.check_output(['git', 'fetch', 'origin', 'master'])

  def StashPush(self):
    """Stashes uncommitted changes."""
    output = subprocess.check_output(['git', 'stash', '--include-untracked'])
    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:
      subprocess.check_output(['git', 'stash', 'pop'])
      self.stashed -= 1

  def GetCurrentBranchName(self):
    """Returns a string with the current branch name."""
    return subprocess.check_output(
        ['git', 'rev-parse', '--abbrev-ref', 'HEAD']).strip()

  def GetCurrentBranchHash(self):
    return subprocess.check_output(
        ['git', 'rev-parse', 'HEAD']).strip()

  def IsCurrentBranchClean(self):
    output = subprocess.check_output(['git', 'status', '--porcelain'])
    return not output

  def BranchExists(self, branch_name):
    """Return whether a branch with the given name exists."""
    try:
      subprocess.check_output(['git', 'rev-parse', '--verify',
                               branch_name])
      return True
    except subprocess.CalledProcessError:
      return False

  def CloneLocal(self, source_repo, new_repo):
    subprocess.check_call(['git', 'clone', source_repo, new_repo])
