summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Server/Plugins/Git.py
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-11-15 17:03:23 -0500
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-11-16 09:57:53 -0500
commit12684bada59c9ddc08165dad757682514b54634c (patch)
tree17fcba524c1ce6f157a3c93e3a9a77b5d1fa9d6f /src/lib/Bcfg2/Server/Plugins/Git.py
parenta6a29aa01744cc893741ddf558f415b7c705d3f6 (diff)
downloadbcfg2-12684bada59c9ddc08165dad757682514b54634c.tar.gz
bcfg2-12684bada59c9ddc08165dad757682514b54634c.tar.bz2
bcfg2-12684bada59c9ddc08165dad757682514b54634c.zip
Git: Added ability to update to a specific tree-ish
Diffstat (limited to 'src/lib/Bcfg2/Server/Plugins/Git.py')
-rw-r--r--src/lib/Bcfg2/Server/Plugins/Git.py51
1 files changed, 41 insertions, 10 deletions
diff --git a/src/lib/Bcfg2/Server/Plugins/Git.py b/src/lib/Bcfg2/Server/Plugins/Git.py
index 61d581009..8cc63a46f 100644
--- a/src/lib/Bcfg2/Server/Plugins/Git.py
+++ b/src/lib/Bcfg2/Server/Plugins/Git.py
@@ -52,17 +52,48 @@ class Git(Bcfg2.Server.Plugin.Version):
self.logger.error(msg)
raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
- def Update(self):
+ def Update(self, ref=None):
""" Git.Update() => True|False
Update the working copy against the upstream repository
"""
+ self.logger.info("Git: Git.Update(ref='%s')" % ref)
+ self.debug_log("Git: Performing garbage collection on repo at %s" %
+ self.vcs_root)
try:
- self.repo.git.pull("--rebase")
- self.logger.info("Git repo at %s updated to %s" %
- (self.vcs_root, self.get_revision()))
- return True
- except: # pylint: disable=W0702
- err = sys.exc_info()[1]
- msg = "Failed to pull from git repository: %s" % err
- self.logger.error(msg)
- raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
+ self.repo.git.gc('--auto')
+ except git.GitCommandError:
+ self.logger.warning("Git: Failed to perform garbage collection: %s"
+ % sys.exc_info()[1])
+
+ if ref:
+ self.debug_log("Git: Checking out %s" % ref)
+ try:
+ self.repo.git.checkout('-f', ref)
+ except git.GitCommandError:
+ err = sys.exc_info()[1]
+ msg = "Git: Failed to checkout %s: %s" % (ref, err)
+ self.logger.error(msg)
+ raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
+
+ # determine if we should try to pull to get the latest commit
+ # on this head
+ tracking = None
+ if not self.repo.head.is_detached:
+ self.debug_log("Git: Determining if %s is a tracking branch" %
+ self.repo.head.ref.name)
+ tracking = self.repo.head.ref.tracking_branch()
+
+ if tracking is not None:
+ self.debug_log("Git: %s is a tracking branch, pulling from %s" %
+ (self.repo.head.ref.name, tracking))
+ try:
+ self.repo.git.pull("--rebase")
+ except: # pylint: disable=W0702
+ err = sys.exc_info()[1]
+ msg = "Git: Failed to pull from upstream: %s" % err
+ self.logger.error(msg)
+ raise Bcfg2.Server.Plugin.PluginExecutionError(msg)
+
+ self.logger.info("Git: Repo at %s updated to %s" %
+ (self.vcs_root, self.get_revision()))
+ return True