diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2015-03-20 15:45:32 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2015-03-20 15:51:04 +0200 |
commit | 29fa1dd52289ea3141c251f66b70bf660c7724e1 (patch) | |
tree | e0dd85f14047939bc37510e1210217df1cda678b /wrap.py | |
parent | df357211a81a63919c64336ce7e4cc373a744e74 (diff) | |
download | meson-29fa1dd52289ea3141c251f66b70bf660c7724e1.zip meson-29fa1dd52289ea3141c251f66b70bf660c7724e1.tar.gz meson-29fa1dd52289ea3141c251f66b70bf660c7724e1.tar.bz2 |
Add support for checking out git repos to subprojects automatically.
Diffstat (limited to 'wrap.py')
-rw-r--r-- | wrap.py | 39 |
1 files changed, 34 insertions, 5 deletions
@@ -14,13 +14,19 @@ import mlog import urllib.request, os, hashlib, shutil +import subprocess class PackageDefinition: def __init__(self, fname): self.values = {} ifile = open(fname) first = ifile.readline().strip() - if first != '[mesonwrap]': + + if first == '[wrap-file]': + self.type = 'file' + elif first == '[wrap-git]': + self.type = 'git' + else: raise RuntimeError('Invalid format of package file') for line in ifile: line = line.strip() @@ -45,12 +51,35 @@ class Resolver: def resolve(self, packagename): fname = os.path.join(self.subdir_root, packagename + '.wrap') if not os.path.isfile(fname): + if os.path.isdir(dirname): + # No wrap file but dir exists -> user put it there manually. + return packagename return None - if not os.path.isdir(self.cachedir): - os.mkdir(self.cachedir) p = PackageDefinition(fname) - self.download(p, packagename) - self.extract_package(p) + if p.type == 'file': + if not os.path.isdir(self.cachedir): + os.mkdir(self.cachedir) + self.download(p, packagename) + self.extract_package(p) + elif p.type == 'git': + checkoutdir = os.path.join(self.subdir_root, p.get('directory')) + revno = p.get('revision') + is_there = os.path.isdir(checkoutdir) + if is_there: + if revno.lower() == 'head': + subprocess.check_call(['git', 'pull'], cwd=checkoutdir) + else: + subprocess.check_call(['git', 'fetch'], cwd=checkoutdir) + subprocess.check_call(['git', 'checkout', revno], + cwd=checkoutdir) + else: + subprocess.check_call(['git', 'clone', p.get('url'), p.get('directory')], + cwd=self.subdir_root) + if revno.lower() != 'head': + subprocess.check_call(['git', 'checkout', revno], + cwd=checkoutdir) + else: + raise RuntimeError('Unreachable code.') return p.get('directory') def get_data(self, url): |