git-p4: work with a detached head
When submitting, git-p4 finds the current branch in order to know if it is allowed to submit (configuration "git-p4.allowSubmit"). On a detached head, detecting the branch would fail, and git-p4 would report a cryptic error. This change teaches git-p4 to recognise a detached head and submit successfully. Signed-off-by: Luke Diamand <luke@diamand.org> Signed-off-by: Jeff King <peff@peff.net>maint
							parent
							
								
									cbff4b25e4
								
							
						
					
					
						commit
						00ad6e3182
					
				
							
								
								
									
										23
									
								
								git-p4.py
								
								
								
								
							
							
						
						
									
										23
									
								
								git-p4.py
								
								
								
								
							|  | @ -544,7 +544,12 @@ def p4Where(depotPath): | ||||||
|     return clientPath |     return clientPath | ||||||
|  |  | ||||||
| def currentGitBranch(): | 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): | def isValidGitDir(path): | ||||||
|     if (os.path.exists(path + "/HEAD") |     if (os.path.exists(path + "/HEAD") | ||||||
|  | @ -1653,8 +1658,6 @@ class P4Submit(Command, P4UserMap): | ||||||
|     def run(self, args): |     def run(self, args): | ||||||
|         if len(args) == 0: |         if len(args) == 0: | ||||||
|             self.master = currentGitBranch() |             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: |         elif len(args) == 1: | ||||||
|             self.master = args[0] |             self.master = args[0] | ||||||
|             if not branchExists(self.master): |             if not branchExists(self.master): | ||||||
|  | @ -1662,9 +1665,10 @@ class P4Submit(Command, P4UserMap): | ||||||
|         else: |         else: | ||||||
|             return False |             return False | ||||||
|  |  | ||||||
|         allowSubmit = gitConfig("git-p4.allowSubmit") |         if self.master: | ||||||
|         if len(allowSubmit) > 0 and not self.master in allowSubmit.split(","): |             allowSubmit = gitConfig("git-p4.allowSubmit") | ||||||
|             die("%s is not in git-p4.allowSubmit" % self.master) |             if len(allowSubmit) > 0 and not self.master in allowSubmit.split(","): | ||||||
|  |                 die("%s is not in git-p4.allowSubmit" % self.master) | ||||||
|  |  | ||||||
|         [upstream, settings] = findUpstreamBranchPoint() |         [upstream, settings] = findUpstreamBranchPoint() | ||||||
|         self.depotPath = settings['depot-paths'][0] |         self.depotPath = settings['depot-paths'][0] | ||||||
|  | @ -1732,7 +1736,12 @@ class P4Submit(Command, P4UserMap): | ||||||
|         self.check() |         self.check() | ||||||
|  |  | ||||||
|         commits = [] |         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.append(line.strip()) | ||||||
|         commits.reverse() |         commits.reverse() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @ -241,7 +241,7 @@ test_expect_success 'unresolvable host in P4PORT should display error' ' | ||||||
| 	) | 	) | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_failure 'submit from detached head' ' | test_expect_success 'submit from detached head' ' | ||||||
| 	test_when_finished cleanup_git && | 	test_when_finished cleanup_git && | ||||||
| 	git p4 clone --dest="$git" //depot && | 	git p4 clone --dest="$git" //depot && | ||||||
| 	( | 	( | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Luke Diamand
						Luke Diamand