1*3ac0a46fSAndroid Build Coastguard Worker# Copyright 2017 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker# found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker"""Classes for dealing with git.""" 5*3ac0a46fSAndroid Build Coastguard Worker 6*3ac0a46fSAndroid Build Coastguard Workerimport subprocess 7*3ac0a46fSAndroid Build Coastguard Worker 8*3ac0a46fSAndroid Build Coastguard Workerfrom common import RunCommandPropagateErr 9*3ac0a46fSAndroid Build Coastguard Worker 10*3ac0a46fSAndroid Build Coastguard Worker 11*3ac0a46fSAndroid Build Coastguard Workerclass GitHelper: 12*3ac0a46fSAndroid Build Coastguard Worker """Issues git commands. Stateful.""" 13*3ac0a46fSAndroid Build Coastguard Worker 14*3ac0a46fSAndroid Build Coastguard Worker def __init__(self): 15*3ac0a46fSAndroid Build Coastguard Worker self.stashed = 0 16*3ac0a46fSAndroid Build Coastguard Worker 17*3ac0a46fSAndroid Build Coastguard Worker def Checkout(self, branch): 18*3ac0a46fSAndroid Build Coastguard Worker """Checks out a branch.""" 19*3ac0a46fSAndroid Build Coastguard Worker RunCommandPropagateErr(['git', 'checkout', branch], exit_status_on_error=1) 20*3ac0a46fSAndroid Build Coastguard Worker 21*3ac0a46fSAndroid Build Coastguard Worker def FetchOriginMaster(self): 22*3ac0a46fSAndroid Build Coastguard Worker """Fetches new changes on origin/main.""" 23*3ac0a46fSAndroid Build Coastguard Worker RunCommandPropagateErr(['git', 'fetch', 'origin', 'main'], 24*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1) 25*3ac0a46fSAndroid Build Coastguard Worker 26*3ac0a46fSAndroid Build Coastguard Worker def StashPush(self): 27*3ac0a46fSAndroid Build Coastguard Worker """Stashes uncommitted changes.""" 28*3ac0a46fSAndroid Build Coastguard Worker output = RunCommandPropagateErr(['git', 'stash', '--include-untracked'], 29*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1) 30*3ac0a46fSAndroid Build Coastguard Worker if 'No local changes to save' in output: 31*3ac0a46fSAndroid Build Coastguard Worker return False 32*3ac0a46fSAndroid Build Coastguard Worker 33*3ac0a46fSAndroid Build Coastguard Worker self.stashed += 1 34*3ac0a46fSAndroid Build Coastguard Worker return True 35*3ac0a46fSAndroid Build Coastguard Worker 36*3ac0a46fSAndroid Build Coastguard Worker def StashPopAll(self): 37*3ac0a46fSAndroid Build Coastguard Worker """Pops as many changes as this instance stashed.""" 38*3ac0a46fSAndroid Build Coastguard Worker while self.stashed > 0: 39*3ac0a46fSAndroid Build Coastguard Worker RunCommandPropagateErr(['git', 'stash', 'pop'], exit_status_on_error=1) 40*3ac0a46fSAndroid Build Coastguard Worker self.stashed -= 1 41*3ac0a46fSAndroid Build Coastguard Worker 42*3ac0a46fSAndroid Build Coastguard Worker def GetCurrentBranchName(self): 43*3ac0a46fSAndroid Build Coastguard Worker """Returns a string with the current branch name.""" 44*3ac0a46fSAndroid Build Coastguard Worker return RunCommandPropagateErr(['git', 'rev-parse', '--abbrev-ref', 'HEAD'], 45*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1).strip() 46*3ac0a46fSAndroid Build Coastguard Worker 47*3ac0a46fSAndroid Build Coastguard Worker def GetCurrentBranchHash(self): 48*3ac0a46fSAndroid Build Coastguard Worker return RunCommandPropagateErr(['git', 'rev-parse', 'HEAD'], 49*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1).strip() 50*3ac0a46fSAndroid Build Coastguard Worker 51*3ac0a46fSAndroid Build Coastguard Worker def IsCurrentBranchClean(self): 52*3ac0a46fSAndroid Build Coastguard Worker output = RunCommandPropagateErr(['git', 'status', '--porcelain'], 53*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1) 54*3ac0a46fSAndroid Build Coastguard Worker return not output 55*3ac0a46fSAndroid Build Coastguard Worker 56*3ac0a46fSAndroid Build Coastguard Worker def BranchExists(self, branch_name): 57*3ac0a46fSAndroid Build Coastguard Worker """Return whether a branch with the given name exists.""" 58*3ac0a46fSAndroid Build Coastguard Worker output = RunCommandPropagateErr( 59*3ac0a46fSAndroid Build Coastguard Worker ['git', 'rev-parse', '--verify', branch_name]) 60*3ac0a46fSAndroid Build Coastguard Worker return output is not None 61*3ac0a46fSAndroid Build Coastguard Worker 62*3ac0a46fSAndroid Build Coastguard Worker def CloneLocal(self, source_repo, new_repo): 63*3ac0a46fSAndroid Build Coastguard Worker RunCommandPropagateErr(['git', 'clone', source_repo, new_repo], 64*3ac0a46fSAndroid Build Coastguard Worker exit_status_on_error=1) 65