summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 04:44:40 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-18 19:11:43 +0200
commit3005879f1cbbfef2ec438a82a69f2fa0907d2dcf (patch)
treeb00d355a7199d1861ed313e2598fe3390509cb8c /src/lib/Bcfg2/Client
parentd543984b06796fd5c65def5e67d1dfd6cb068b6c (diff)
downloadbcfg2-3005879f1cbbfef2ec438a82a69f2fa0907d2dcf.tar.gz
bcfg2-3005879f1cbbfef2ec438a82a69f2fa0907d2dcf.tar.bz2
bcfg2-3005879f1cbbfef2ec438a82a69f2fa0907d2dcf.zip
Client/Tools/VCS: add always on top feature
You can specify a refname (like refs/heads/master) as revision and you will always get the current tree of this refname. During verify it is checked if the ref had changed in the remote repo and if an "update" is necessary.
Diffstat (limited to 'src/lib/Bcfg2/Client')
-rw-r--r--src/lib/Bcfg2/Client/Tools/VCS.py29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/VCS.py b/src/lib/Bcfg2/Client/Tools/VCS.py
index 23f04b5e3..1f96ad5b4 100644
--- a/src/lib/Bcfg2/Client/Tools/VCS.py
+++ b/src/lib/Bcfg2/Client/Tools/VCS.py
@@ -47,11 +47,24 @@ class VCS(Bcfg2.Client.Tools.Tool):
self.logger.info("Repository %s does not exist" %
entry.get('name'))
return False
- cur_rev = repo.head()
- if cur_rev != entry.get('revision'):
+ try:
+ expected_rev = entry.get('revision')
+ cur_rev = repo.head()
+ except:
+ return False
+
+ try:
+ client, path = dulwich.client.get_transport_and_path(entry.get('sourceurl'))
+ remote_refs = client.fetch_pack(path, (lambda x: None), None, None, None)
+ if expected_rev in remote_refs:
+ expected_rev = remote_refs[expected_rev]
+ except:
+ pass
+
+ if cur_rev != expected_rev:
self.logger.info("At revision %s need to go to revision %s" %
- (cur_rev, entry.get('revision')))
+ (cur_rev.strip(), expected_rev.strip()))
return False
return True
@@ -78,8 +91,13 @@ class VCS(Bcfg2.Client.Tools.Tool):
destr,
determine_wants=destr.object_store.determine_wants_all,
progress=sys.stdout.write)
- destr.refs['refs/heads/master'] = entry.get('revision')
- dtree = destr[entry.get('revision')].tree
+
+ if entry.get('revision') in remote_refs:
+ destr.refs['HEAD'] = remote_refs[entry.get('revision')]
+ else:
+ destr.refs['HEAD'] = entry.get('revision')
+
+ dtree = destr['HEAD'].tree
obj_store = destr.object_store
for fname, mode, sha in obj_store.iter_tree_contents(dtree):
fullpath = os.path.join(destname, fname)
@@ -92,6 +110,7 @@ class VCS(Bcfg2.Client.Tools.Tool):
f.write(destr[sha].data)
f.close()
os.chmod(os.path.join(destname, fname), mode)
+
return True
# FIXME: figure out how to write the git index properly
#iname = "%s/.git/index" % entry.get('name')