From 552ac89929db1794200290550dccdd7f3078d13f Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sat, 18 Apr 2009 15:15:24 -0700 Subject: Modify 'repo abandon' to be more like 'repo checkout' and 'repo start' Signed-off-by: Shawn O. Pearce --- project.py | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'project.py') diff --git a/project.py b/project.py index 029a80f4..3b9535eb 100644 --- a/project.py +++ b/project.py @@ -862,18 +862,38 @@ class Project(object): def AbandonBranch(self, name): """Destroy a local topic branch. """ - try: - tip_rev = self.bare_git.rev_parse(R_HEADS + name) - except GitError: - return + rev = R_HEADS + name + all = self.bare_ref.all + if rev not in all: + # Doesn't exist; assume already abandoned. + # + return True + + head = self.work_git.GetHead() + if head == rev: + # We can't destroy the branch while we are sitting + # on it. Switch to a detached HEAD. + # + head = all[head] - if self.CurrentBranch == name: - self._Checkout( - self.GetRemote(self.remote.name).ToLocal(self.revision), - quiet=True) + rev = self.GetRemote(self.remote.name).ToLocal(self.revision) + if rev in all: + revid = all[rev] + elif IsId(rev): + revid = rev + else: + revid = None - cmd = ['branch', '-D', name] - GitCommand(self, cmd, capture_stdout=True).Wait() + if revid and head == revid: + _lwrite(os.path.join(self.worktree, '.git', HEAD), + '%s\n' % revid) + else: + self._Checkout(rev, quiet=True) + + return GitCommand(self, + ['branch', '-D', name], + capture_stdout = True, + capture_stderr = True).Wait() == 0 def PruneHeads(self): """Prune any topic branches already merged into upstream. -- cgit v1.2.3-54-g00ecf