diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2013-06-07 04:44:40 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-06-18 19:11:43 +0200 |
commit | 3005879f1cbbfef2ec438a82a69f2fa0907d2dcf (patch) | |
tree | b00d355a7199d1861ed313e2598fe3390509cb8c | |
parent | d543984b06796fd5c65def5e67d1dfd6cb068b6c (diff) | |
download | bcfg2-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.
-rw-r--r-- | src/lib/Bcfg2/Client/Tools/VCS.py | 29 |
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') |