Skip to content

Commit

Permalink
Merge branch 'ld/p4-detached-head' into next
Browse files Browse the repository at this point in the history
Make git-p4 work on a detached head.

* ld/p4-detached-head:
  git-p4: work with a detached head
  git-p4: add option to system() to return subshell status
  git-p4: add failing test for submit from detached head
  • Loading branch information
peff committed Nov 25, 2015
2 parents a2ee2a4 + 00ad6e3 commit 36ab36a
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 9 deletions.
29 changes: 20 additions & 9 deletions git-p4.py
Expand Up @@ -203,14 +203,16 @@ def p4_has_move_command():
# assume it failed because @... was invalid changelist
return True

def system(cmd):
def system(cmd, ignore_error=False):
expand = isinstance(cmd,basestring)
if verbose:
sys.stderr.write("executing %s\n" % str(cmd))
retcode = subprocess.call(cmd, shell=expand)
if retcode:
if retcode and not ignore_error:
raise CalledProcessError(retcode, cmd)

return retcode

def p4_system(cmd):
"""Specifically invoke p4 as the system command. """
real_cmd = p4_build_cmd(cmd)
Expand Down Expand Up @@ -553,7 +555,12 @@ def p4Where(depotPath):
return clientPath

def currentGitBranch():
return read_pipe("git name-rev HEAD").split(" ")[1].strip()
retcode = system(["git", "symbolic-ref", "-q", "HEAD"], ignore_error=True)
if retcode != 0:
# on a detached head
return None
else:
return read_pipe(["git", "name-rev", "HEAD"]).split(" ")[1].strip()

def isValidGitDir(path):
if (os.path.exists(path + "/HEAD")
Expand Down Expand Up @@ -1854,18 +1861,17 @@ def exportGitTags(self, gitTags):
def run(self, args):
if len(args) == 0:
self.master = currentGitBranch()
if len(self.master) == 0 or not gitBranchExists("refs/heads/%s" % self.master):
die("Detecting current git branch failed!")
elif len(args) == 1:
self.master = args[0]
if not branchExists(self.master):
die("Branch %s does not exist" % self.master)
else:
return False

allowSubmit = gitConfig("git-p4.allowSubmit")
if len(allowSubmit) > 0 and not self.master in allowSubmit.split(","):
die("%s is not in git-p4.allowSubmit" % self.master)
if self.master:
allowSubmit = gitConfig("git-p4.allowSubmit")
if len(allowSubmit) > 0 and not self.master in allowSubmit.split(","):
die("%s is not in git-p4.allowSubmit" % self.master)

[upstream, settings] = findUpstreamBranchPoint()
self.depotPath = settings['depot-paths'][0]
Expand Down Expand Up @@ -1933,7 +1939,12 @@ def run(self, args):
self.check()

commits = []
for line in read_pipe_lines(["git", "rev-list", "--no-merges", "%s..%s" % (self.origin, self.master)]):
if self.master:
commitish = self.master
else:
commitish = 'HEAD'

for line in read_pipe_lines(["git", "rev-list", "--no-merges", "%s..%s" % (self.origin, commitish)]):
commits.append(line.strip())
commits.reverse()

Expand Down
16 changes: 16 additions & 0 deletions t/t9800-git-p4-basic.sh
Expand Up @@ -241,6 +241,22 @@ test_expect_success 'unresolvable host in P4PORT should display error' '
)
'

test_expect_success 'submit from detached head' '
test_when_finished cleanup_git &&
git p4 clone --dest="$git" //depot &&
(
cd "$git" &&
git checkout p4/master &&
>detached_head_test &&
git add detached_head_test &&
git commit -m "add detached_head" &&
git config git-p4.skipSubmitEdit true &&
git p4 submit &&
git p4 rebase &&
git log p4/master | grep detached_head
)
'

test_expect_success 'kill p4d' '
kill_p4d
'
Expand Down

0 comments on commit 36ab36a

Please sign in to comment.