diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2013-06-07 13:31:15 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2013-06-07 13:32:36 +0200 |
commit | 5f0dc70b8ce51807920fee7909ed3e4ad5f8b660 (patch) | |
tree | 3f45dd7b8d34fa461c2761efa7eecd1cb729c4ec | |
parent | a197ad87598b0a816e7187f6e107c593b4498560 (diff) | |
download | bcfg2-5f0dc70b8ce51807920fee7909ed3e4ad5f8b660.tar.gz bcfg2-5f0dc70b8ce51807920fee7909ed3e4ad5f8b660.tar.bz2 bcfg2-5f0dc70b8ce51807920fee7909ed3e4ad5f8b660.zip |
Client/Tools/VCS: build index after checkoutdebian/1.2.3-17
-rw-r--r-- | debian/changelog | 3 | ||||
-rw-r--r-- | src/lib/Client/Tools/VCS.py | 46 |
2 files changed, 40 insertions, 9 deletions
diff --git a/debian/changelog b/debian/changelog index b26280577..44f97bf84 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,9 @@ bcfg2 (1.2.3-17) unstable; urgency=low * Client/Tools/VCS: add always on top feature * Client/Tools/VCS: some simplyfications using dulwich api * Client/Tools/VCS: add support for symlinks + * Client/Tools/VCS: build index after checkout - -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 07 Jun 2013 04:48:51 +0200 + -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 07 Jun 2013 13:32:09 +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 4c1090bfd..c7f8a80e5 100644 --- a/src/lib/Client/Tools/VCS.py +++ b/src/lib/Client/Tools/VCS.py @@ -10,6 +10,7 @@ import os import shutil import sys import errno +import stat # python-dulwich git imports try: import dulwich @@ -26,6 +27,38 @@ except: import Bcfg2.Client.Tools +def cleanup_mode(mode): + """Cleanup a mode value. + + This will return a mode that can be stored in a tree object. + + :param mode: Mode to clean up. + """ + if stat.S_ISLNK(mode): + return stat.S_IFLNK + elif stat.S_ISDIR(mode): + return stat.S_IFDIR + elif dulwich.index.S_ISGITLINK(mode): + return dulwich.index.S_IFGITLINK + ret = stat.S_IFREG | 0644 + ret |= (mode & 0111) + return ret + + +def index_entry_from_stat(stat_val, hex_sha, flags, mode=None): + """Create a new index entry from a stat value. + + :param stat_val: POSIX stat_result instance + :param hex_sha: Hex sha of the object + :param flags: Index flags + """ + if mode is None: + mode = cleanup_mode(stat_val.st_mode) + return (stat_val.st_ctime, stat_val.st_mtime, stat_val.st_dev, + stat_val.st_ino, mode, stat_val.st_uid, + stat_val.st_gid, stat_val.st_size, hex_sha, flags) + + class VCS(Bcfg2.Client.Tools.Tool): """VCS support.""" name = 'VCS' @@ -103,6 +136,7 @@ class VCS(Bcfg2.Client.Tools.Tool): destr.refs['HEAD'] = entry.get('revision') dtree = destr['HEAD'].tree + index = dulwich.index.Index(destr.index_path()) for fname, mode, sha in destr.object_store.iter_tree_contents(dtree): full_path = os.path.join(destname, fname) dulwich.file.ensure_dir_exists(os.path.dirname(full_path)) @@ -123,15 +157,11 @@ class VCS(Bcfg2.Client.Tools.Tool): file.write(destr[sha].as_raw_string()) os.chmod(full_path, mode) + st = os.lstat(full_path) + index[fname] = index_entry_from_stat(st, sha, 0) + + index.write() return True - # FIXME: figure out how to write the git index properly - #iname = "%s/.git/index" % entry.get('name') - #f = open(iname, 'w+') - #entries = obj_store[sha].iteritems() - #try: - # dulwich.index.write_index(f, entries) - #finally: - # f.close() def Verifysvn(self, entry, _): """Verify svn repositories""" |