Merge pull request #1920 from QuLogic/hg-dist

Add Mercurial dist support
pull/1978/head
Jussi Pakkanen 8 years ago committed by GitHub
commit 624709bfc1
  1. 5
      docs/markdown/Release-notes-for-0.42.0.md
  2. 36
      mesonbuild/scripts/dist.py
  3. 46
      run_unittests.py

@ -7,4 +7,7 @@ short-description: Release notes for 0.42 (preliminary)
# New features
Add features here as code is merged to master.
## Distribution tarballs from Mercurial repositories
Creating distribution tarballs can now be made out of projects based on
Mercurial. As before, this remains possible only with the Ninja backend.

@ -13,6 +13,7 @@
# limitations under the License.
import lzma
import os
import shutil
import subprocess
@ -29,10 +30,11 @@ def create_hash(fname):
m = hashlib.sha256()
m.update(open(fname, 'rb').read())
with open(hashname, 'w') as f:
f.write('%s %s\n' % (m.hexdigest(), os.path.split(fname)[-1]))
f.write('%s %s\n' % (m.hexdigest(), os.path.basename(fname)))
def create_zip(zipfilename, packaging_dir):
prefix = os.path.split(packaging_dir)[0]
prefix = os.path.dirname(packaging_dir)
removelen = len(prefix) + 1
with zipfile.ZipFile(zipfilename,
'w',
@ -70,7 +72,8 @@ def process_submodules(dirname):
continue
del_gitfiles(os.path.join(dirname, v))
def create_dist(dist_name, src_root, bld_root, dist_sub):
def create_dist_git(dist_name, src_root, bld_root, dist_sub):
distdir = os.path.join(dist_sub, dist_name)
if os.path.exists(distdir):
shutil.rmtree(distdir)
@ -81,13 +84,29 @@ def create_dist(dist_name, src_root, bld_root, dist_sub):
xzname = distdir + '.tar.xz'
# Should use shutil but it got xz support only in 3.5.
with tarfile.open(xzname, 'w:xz') as tf:
tf.add(distdir, os.path.split(distdir)[1])
tf.add(distdir, dist_name)
# Create only .tar.xz for now.
# zipname = distdir + '.zip'
# create_zip(zipname, distdir)
shutil.rmtree(distdir)
return (xzname, )
def create_dist_hg(dist_name, src_root, bld_root, dist_sub):
os.makedirs(dist_sub, exist_ok=True)
tarname = os.path.join(dist_sub, dist_name + '.tar')
xzname = tarname + '.xz'
subprocess.check_call(['hg', 'archive', '-R', src_root, '-S', '-t', 'tar', tarname])
with lzma.open(xzname, 'wb') as xf, open(tarname, 'rb') as tf:
shutil.copyfileobj(tf, xf)
os.unlink(tarname)
# Create only .tar.xz for now.
# zipname = os.path.join(dist_sub, dist_name + '.zip')
# subprocess.check_call(['hg', 'archive', '-R', src_root, '-S', '-t', 'zip', zipname])
return (xzname, )
def check_dist(packagename, meson_command):
print('Testing distribution package %s.' % packagename)
unpackdir = tempfile.mkdtemp()
@ -132,10 +151,13 @@ def run(args):
dist_name = build.project_name + '-' + build.project_version
if not os.path.isdir(os.path.join(src_root, '.git')):
print('Dist currently only works with Git repos.')
if os.path.isdir(os.path.join(src_root, '.git')):
names = create_dist_git(dist_name, src_root, bld_root, dist_sub)
elif os.path.isdir(os.path.join(src_root, '.hg')):
names = create_dist_hg(dist_name, src_root, bld_root, dist_sub)
else:
print('Dist currently only works with Git or Mercurial repos.')
return 1
names = create_dist(dist_name, src_root, bld_root, dist_sub)
if names is None:
return 1
error_count = 0

@ -1161,18 +1161,50 @@ class AllPlatformTests(BasePlatformTests):
self.build()
self.run_tests()
def test_dist(self):
def test_dist_git(self):
if not shutil.which('git'):
raise unittest.SkipTest('Git not found')
def git_init(project_dir):
subprocess.check_call(['git', 'init'], cwd=project_dir)
subprocess.check_call(['git', 'config',
'user.name', 'Author Person'], cwd=project_dir)
subprocess.check_call(['git', 'config',
'user.email', 'teh_coderz@example.com'], cwd=project_dir)
subprocess.check_call(['git', 'add', 'meson.build', 'distexe.c'], cwd=project_dir)
subprocess.check_call(['git', 'commit', '-a', '-m', 'I am a project'], cwd=project_dir)
try:
self.dist_impl()
self.dist_impl(git_init)
except PermissionError:
# When run under Windows CI, something (virus scanner?)
# holds on to the git files so cleaning up the dir
# fails sometimes.
pass
def dist_impl(self):
def test_dist_hg(self):
if not shutil.which('hg'):
raise unittest.SkipTest('Mercurial not found')
if self.backend is not Backend.ninja:
raise unittest.SkipTest('Dist is only supported with Ninja')
def hg_init(project_dir):
subprocess.check_call(['hg', 'init'], cwd=project_dir)
with open(os.path.join(project_dir, '.hg', 'hgrc'), 'w') as f:
print('[ui]', file=f)
print('username=Author Person <teh_coderz@example.com>', file=f)
subprocess.check_call(['hg', 'add', 'meson.build', 'distexe.c'], cwd=project_dir)
subprocess.check_call(['hg', 'commit', '-m', 'I am a project'], cwd=project_dir)
try:
self.dist_impl(hg_init)
except PermissionError:
# When run under Windows CI, something (virus scanner?)
# holds on to the hg files so cleaning up the dir
# fails sometimes.
pass
def dist_impl(self, vcs_init):
# Create this on the fly because having rogue .git directories inside
# the source tree leads to all kinds of trouble.
with tempfile.TemporaryDirectory() as project_dir:
@ -1189,13 +1221,7 @@ int main(int argc, char **argv) {
return 0;
}
''')
subprocess.check_call(['git', 'init'], cwd=project_dir)
subprocess.check_call(['git', 'config',
'user.name', 'Author Person'], cwd=project_dir)
subprocess.check_call(['git', 'config',
'user.email', 'teh_coderz@example.com'], cwd=project_dir)
subprocess.check_call(['git', 'add', 'meson.build', 'distexe.c'], cwd=project_dir)
subprocess.check_call(['git', 'commit', '-a', '-m', 'I am a project'], cwd=project_dir)
vcs_init(project_dir)
self.init(project_dir)
self.build('dist')
distfile = os.path.join(self.distdir, 'disttest-1.4.3.tar.xz')

Loading…
Cancel
Save