[PATCH 14/14] [git] Clarify branch switch destination calculation
- From: Dirk Wallenstein <halsmit t-online de>
- To: GNOME Desktop Development List <desktop-devel-list gnome org>
- Cc: Frederic Peters <fpeters gnome org>
- Subject: [PATCH 14/14] [git] Clarify branch switch destination calculation
- Date: Tue, 18 May 2010 13:12:34 +0200
Extract the calculation that determines if a branch switch is necessary
into a function. This also simplifies the calculations a bit while
preserving the previous behavior.
Signed-off-by: Dirk Wallenstein <halsmit t-online de>
---
jhbuild/versioncontrol/git.py | 51 ++++++++++++++++++++++++-----------------
1 files changed, 30 insertions(+), 21 deletions(-)
diff --git a/jhbuild/versioncontrol/git.py b/jhbuild/versioncontrol/git.py
index 7638752..174001c 100644
--- a/jhbuild/versioncontrol/git.py
+++ b/jhbuild/versioncontrol/git.py
@@ -204,38 +204,47 @@ class GitBranch(Branch):
extra_env=get_git_extra_env())
return self._execute_git_predicate( ['git', 'show-ref', wanted_ref])
+ def _get_branch_switch_destination(self):
+ current_branch = self._get_current_branch()
+ wanted_branch = self.branch or 'master'
+
+ # Always switch away from a detached head.
+ if not current_branch:
+ return wanted_branch
+
+ assert(current_branch and wanted_branch)
+ # If the current branch is not tracking a remote branch it is assumed to
+ # be a local work branch, and it won't be considered for a change.
+ if current_branch != wanted_branch \
+ and self._is_tracking_a_remote_branch(current_branch):
+ return wanted_branch
+
+ return None
+
def _switch_branch_if_necessary(self, buildscript):
"""
The switch depends on the requested tag, the requested branch, and the
state and type of the current branch.
- Unless other destinations are requested, a detached head will be
- switched to master.
An imminent branch switch generates an error if there are uncommited
changes.
"""
- current_branch = self._get_current_branch()
- wanted_branch = self.branch or 'master'
+ wanted_branch = self._get_branch_switch_destination()
switch_command = []
if self.tag:
switch_command= ['git', 'checkout', self.tag]
- elif not current_branch or current_branch != wanted_branch:
- if not current_branch:
- # if user was not on any branch, get back to a known track
- current_branch = 'master'
- # If the current branch is not tracking a remote branch it is
- # assumed to be a local work branch, and it won't be changed.
- if self._is_tracking_a_remote_branch(current_branch):
- if self._is_local_branch(wanted_branch):
- switch_command = ['git', 'checkout', wanted_branch]
- else:
- if not self._find_remote_branch_online_if_necessary(
- buildscript, 'origin', wanted_branch):
- raise CommandError(_('The requested branch "%s" is '
- 'not available. Neither locally, nor remotely '
- 'in the origin remote.' % wanted_branch))
- switch_command = ['git', 'checkout', '--track', '-b',
- wanted_branch, 'origin/' + wanted_branch]
+ elif wanted_branch:
+ if self._is_local_branch(wanted_branch):
+ switch_command = ['git', 'checkout', wanted_branch]
+ else:
+ if not self._find_remote_branch_online_if_necessary(
+ buildscript, 'origin', wanted_branch):
+ raise CommandError(_('The requested branch "%s" is '
+ 'not available. Neither locally, nor remotely '
+ 'in the origin remote.' % wanted_branch))
+ switch_command = ['git', 'checkout', '--track', '-b',
+ wanted_branch, 'origin/' + wanted_branch]
+
if switch_command:
if self.is_dirty():
raise CommandError(_('Refusing to switch a dirty tree.'))
--
1.7.1
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]