summaryrefslogtreecommitdiffstats
path: root/src/lib/Bcfg2/Client/Tools/VCS.py
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 13:38:32 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-18 23:10:53 +0200
commitb78d3a3d2761a71ab0bc12ac2e53c13555e8ea16 (patch)
tree58614a3821a0e2fa79109176a1a1deb844e76e3d /src/lib/Bcfg2/Client/Tools/VCS.py
parent72e7bff7123e3639bf7da0866c633bdc123d1af4 (diff)
downloadbcfg2-b78d3a3d2761a71ab0bc12ac2e53c13555e8ea16.tar.gz
bcfg2-b78d3a3d2761a71ab0bc12ac2e53c13555e8ea16.tar.bz2
bcfg2-b78d3a3d2761a71ab0bc12ac2e53c13555e8ea16.zip
Client/Tools/VCS: build index after checkout
Diffstat (limited to 'src/lib/Bcfg2/Client/Tools/VCS.py')
-rw-r--r--src/lib/Bcfg2/Client/Tools/VCS.py47
1 files changed, 38 insertions, 9 deletions
diff --git a/src/lib/Bcfg2/Client/Tools/VCS.py b/src/lib/Bcfg2/Client/Tools/VCS.py
index 947cff11f..26e404cfa 100644
--- a/src/lib/Bcfg2/Client/Tools/VCS.py
+++ b/src/lib/Bcfg2/Client/Tools/VCS.py
@@ -1,7 +1,6 @@
"""VCS support."""
# TODO:
-# * git_write_index
# * add svn support
# * integrate properly with reports
missing = []
@@ -10,6 +9,7 @@ import errno
import os
import shutil
import sys
+import stat
# python-dulwich git imports
try:
@@ -27,6 +27,38 @@ except ImportError:
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 | int('644', 8)
+ ret |= (mode & int('111', 8))
+ 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."""
__handles__ = [('Path', 'vcs')]
@@ -99,6 +131,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))
@@ -120,15 +153,11 @@ class VCS(Bcfg2.Client.Tools.Tool):
file.close()
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"""