summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 13:31:15 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-07 13:32:36 +0200
commit5f0dc70b8ce51807920fee7909ed3e4ad5f8b660 (patch)
tree3f45dd7b8d34fa461c2761efa7eecd1cb729c4ec
parenta197ad87598b0a816e7187f6e107c593b4498560 (diff)
downloadbcfg2-debian/1.2.3-17.tar.gz
bcfg2-debian/1.2.3-17.tar.bz2
bcfg2-debian/1.2.3-17.zip
Client/Tools/VCS: build index after checkoutdebian/1.2.3-17
-rw-r--r--debian/changelog3
-rw-r--r--src/lib/Client/Tools/VCS.py46
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"""