aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts/dist.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/scripts/dist.py')
-rw-r--r--mesonbuild/scripts/dist.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/mesonbuild/scripts/dist.py b/mesonbuild/scripts/dist.py
new file mode 100644
index 0000000..1b50655
--- /dev/null
+++ b/mesonbuild/scripts/dist.py
@@ -0,0 +1,85 @@
+# Copyright 2017 The Meson development team
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import os
+import shutil
+import argparse
+import subprocess
+import pickle
+import hashlib
+import tarfile, zipfile
+from glob import glob
+
+def create_hash(fname):
+ hashname = fname + '.sha256sum'
+ 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]))
+
+def create_zip(zipfilename, packaging_dir):
+ prefix = os.path.split(packaging_dir)[0]
+ removelen = len(prefix)+1
+ zf = zipfile.ZipFile(zipfilename, 'w', compression=zipfile.ZIP_DEFLATED,
+ allowZip64=True)
+ zf.write(packaging_dir, packaging_dir[removelen:])
+ for root, dirs, files in os.walk(packaging_dir):
+ for d in dirs:
+ dname = os.path.join(root, d)
+ zf.write(dname, dname[removelen:])
+ for f in files:
+ fname = os.path.join(root, f)
+ zf.write(fname, fname[removelen:])
+ zf.close()
+
+def create_dist(dist_name, src_root, bld_root, dist_sub):
+ distdir = os.path.join(dist_sub, dist_name)
+ gitdir = os.path.join(src_root, '.git')
+ if os.path.exists(distdir):
+ shutil.rmtree(distdir)
+ os.makedirs(distdir)
+ dest_gitdir = os.path.join(distdir, '.git')
+ shutil.copytree(gitdir, dest_gitdir)
+ subprocess.check_call(['git', 'reset', '--hard'], cwd=distdir)
+ shutil.rmtree(dest_gitdir)
+ for f in glob(os.path.join(distdir, '.git*')):
+ os.unlink(f)
+ xzname = distdir + '.tar.xz'
+ zipname = distdir + '.zip'
+ tf = tarfile.open(xzname, 'w:xz')
+ tf.add(distdir, os.path.split(distdir)[1])
+ tf.close()
+ create_hash(xzname)
+ create_zip(zipname, distdir)
+ create_hash(zipname)
+
+def run(args):
+ src_root = args[0]
+ bld_root = args[1]
+ priv_dir = os.path.join(bld_root, 'meson-private')
+ dist_sub = os.path.join(bld_root, 'meson-dist')
+
+ buildfile = os.path.join(priv_dir, 'build.dat')
+
+ build = pickle.load(open(buildfile, 'rb'))
+
+ 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.')
+ return 1
+ create_dist(dist_name, src_root, bld_root, dist_sub)
+
+ return 0