# HG changeset patch # User Bjoern Ricks # Date 1314953128 0 # Node ID 9824e409388bf8663c455a22e2799fd825548cbd # Parent 10c0492da0146921b2c99586ea9186b168fa00b8 Refactor git branching If a checkout is already available and the branch is changed in the config git command would always fail because it doesn't know the branch to track. Therefore always check if the branch is locally available and if not checkout the remote branch diff -r 10c0492da014 -r 9824e409388b treepkg/git.py --- a/treepkg/git.py Fri Sep 02 08:43:23 2011 +0000 +++ b/treepkg/git.py Fri Sep 02 08:45:28 2011 +0000 @@ -34,14 +34,26 @@ defaults to master """ self.url = url + self.local_branch = "local" self.branch = branch + if ":" in branch: + branches = branch.split(":") + self.local_branch = branches[0] + self.branch = branches[1] + # use master as default + if not branch: + self.branch = "master" def checkout(self, localdir): """Clones the repository at url into the localdir""" run.call(cmdexpand("git clone -q $url $localdir", **locals())) if branch: - run.call(cmdexpand("git checkout -q --track -b local $branch", - branch=self.branch), cwd=localdir) + self.checkout_branch(localdir) + + def checkout_branch(self, localdir): + run.call(cmdexpand("git checkout -q --track -b $local $branch", + branch=self.branch, local=self.local_branch), cwd=localdir) + def export(self, localdir, destdir): """Exports the working copy in localdir to destdir""" @@ -53,11 +65,25 @@ """Copies the working copy to destdir (including .git dir)""" shutils.copytree(localdir, destdir) - def update(self, localdir, branch=None): + def update(self, localdir): """Runs git pull on the localdir.""" run.call(cmdexpand("git pull -q"), cwd=localdir) - if branch: - run.call(cmdexpand("git checkout -q $branch", branch=branch), + output = capture_output(cmdexpand("git branch"), cwd=localdir) + branches = output.splitlines() + cur_branch = None + all_branches = [] + for tbranch in branches: + tbranch = tbranch.strip() + if tbranch.startswith("*"): + cur_branch = tbranch[2:] + tbranch = curbranch + all_branches.append(tbranch) + if not self.local_branch in all_branches: + self.checkout_branch(localdir) + # TODO: check if self.local_branch is curbranch + # doesn't hurt if a checkout is done on the current branch + if self.branch: + run.call(cmdexpand("git checkout -q $branch", branch=self.local_branch), cwd=localdir) @@ -101,14 +127,12 @@ """ gitdir = os.path.join(self.localdir, ".git") branch = self.repository.branch - if not branch: - branch = "master" if os.path.exists(gitdir): self.log_info("Updating the working copy in %r for repo " \ "%s and branch %s", self.localdir, self.repository.url, branch) - self.repository.update(self.localdir, self.repository.branch) + self.repository.update(self.localdir) else: # TODO: better check if localdir contains files if os.path.exists(self.localdir):