summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 04:44:40 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 04:44:59 +0200
commit1213aa69ee3dbc2cc7bdb3faefe7ccc11651598c (patch)
tree654d02f0b84077eae37f03cf069e95d44e7498bc
parent9ea1c2de18711b8d422264f50897c8662e111dd5 (diff)
downloadbcfg2-1213aa69ee3dbc2cc7bdb3faefe7ccc11651598c.tar.gz
bcfg2-1213aa69ee3dbc2cc7bdb3faefe7ccc11651598c.tar.bz2
bcfg2-1213aa69ee3dbc2cc7bdb3faefe7ccc11651598c.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.
-rw-r--r--debian/changelog3
-rw-r--r--src/lib/Client/Tools/VCS.py29
2 files changed, 26 insertions, 6 deletions
diff --git a/debian/changelog b/debian/changelog
index 40d8b2164..ee19daf29 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
bcfg2 (1.2.3-17) unstable; urgency=low
* Client/Tools/VCS: create directory for repository
+ * Client/Tools/VCS: add always on top feature
- -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 07 Jun 2013 04:26:36 +0200
+ -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 07 Jun 2013 04:33:54 +0200
bcfg2 (1.2.3-16) unstable; urgency=low
diff --git a/src/lib/Client/Tools/VCS.py b/src/lib/Client/Tools/VCS.py
index 330524f2f..b61a39c7e 100644
--- a/src/lib/Client/Tools/VCS.py
+++ b/src/lib/Client/Tools/VCS.py
@@ -51,11 +51,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
@@ -82,8 +95,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)
@@ -96,6 +114,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')