summaryrefslogtreecommitdiff
path: root/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'package.py')
-rw-r--r--package.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/package.py b/package.py
new file mode 100644
index 0000000..e48c769
--- /dev/null
+++ b/package.py
@@ -0,0 +1,95 @@
+#!/usr/bin/env python3
+import re
+import hashlib
+import shutil
+import subprocess
+import json
+from pathlib import Path
+
+import click
+
+def tree_size(path):
+ return sum(entry.stat().st_size for entry in path.glob('**/*') if entry.is_file())
+
+@click.command()
+@click.option('--major', 'increment', flag_value='major')
+@click.option('--minor', 'increment', flag_value='minor', default=True)
+@click.option('--patch', 'increment', flag_value='patch', default=True)
+@click.argument('version', required=False)
+def do_release(version, increment):
+ if not version:
+ tag = subprocess.run('git describe --tags --abbrev=0 --match v*'.split(),
+ check=True, capture_output=True, text=True)
+ major, minor, patch = map(int, re.fullmatch(r'v([0-9]+)\.([0-9]+)\.([0-9]+)', tag.stdout.strip()).groups())
+ match increment:
+ case 'major':
+ major, minor, patch = (major+1, 0, 0)
+ case 'minor':
+ major, minor, patch = (major, minor+1, 0)
+ case 'patch':
+ major, minor, patch = (major, minor, patch+1)
+ version = f'{major}.{minor}.{patch}'
+
+ res = subprocess.run('git status --porcelain --untracked-files=no'.split(),
+ check=True, capture_output=True, text=True)
+ if res.stdout.strip():
+ raise click.ClickException('There are uncommitted changes in this repository.')
+
+ print('Cleaning old footprints')
+ footprint_dir = Path('de.jaseg.kimesh.footprints') / 'footprints'
+ shutil.rmtree(footprint_dir, ignore_errors=True)
+ footprint_dir.mkdir()
+
+ print('Re-generating footprints')
+ for n in range(2, 9):
+ subprocess.run(['python', '-m', 'footprint_generator',
+ '-w', '0.100,0.120,0.150,0.200,0.250,0.300,0.350,0.400,0.500,0.600,0.700,0.800,1.000,1.200,1.500,1.800',
+ '-c', '0.100,0.120,0.150,0.200,0.300,0.400,0.500',
+ '-n', str(n),
+ str(footprint_dir / f'kimesh_anchors_{n}wire.pretty')
+ ], check=True)
+
+ res = subprocess.run('git ls-files'.split(), check=True, capture_output=True, text=True)
+ for path in res.stdout.splitlines():
+ if re.fullmatch(r'de\.jaseg\.kimesh\.[^/]*-v[.0-9]*\.zip', path.strip()):
+ print(f'Removing old release zip {path} from git index.')
+ subprocess.run(['git', 'rm', '--cached', path], check=True, capture_output=True)
+
+ for pkg_dir in Path('de.jaseg.kimesh.plugin'), Path('de.jaseg.kimesh.footprints'):
+ meta_path = pkg_dir / 'metadata.json'
+ print(f'Updating metadata file {meta_path}')
+ meta_file = json.loads(meta_path.read_text())
+ subprocess.run(['git', 'add', str(meta_path)], check=True, capture_output=True)
+ ver_dict = {
+ 'version': version,
+ 'status': 'stable',
+ 'kicad_version': '7.99',
+ }
+ meta_file['versions'].append(ver_dict)
+ meta_path.write_text(json.dumps(meta_file, indent=4))
+
+ zip_fn = Path(shutil.make_archive(f'{pkg_dir.name}-v{version}', 'zip', pkg_dir, '.'))
+ print(f'Adding new release zip {zip_fn} to git index.')
+ subprocess.run(['git', 'add', str(zip_fn)], check=True, capture_output=True)
+
+ ver_dict['download_sha256'] = hashlib.sha256(zip_fn.read_bytes()).hexdigest()
+ ver_dict['download_size'] = zip_fn.stat().st_size
+ ver_dict['download_url'] = f'https://git.jaseg.de/kimesh.git/plain/{zip_fn.name}?h=v{version}'
+ ver_dict['install_size'] = tree_size(pkg_dir)
+ meta_path.write_text(json.dumps(meta_file, indent=4))
+
+ print(f'Adding updated metadata file {meta_path} to git index')
+ subprocess.run(['git', 'add', str(meta_path)], check=True, capture_output=True)
+ print('Create git commit')
+ subprocess.run(['git', 'commit', '-m', f'Version {version}', '--no-edit'], check=True, capture_output=True)
+ res = subprocess.run('git rev-parse --short HEAD'.split(), check=True, capture_output=True, text=True)
+ print(f'Created commit {res.stdout.strip()}')
+ print(f'Creating and signing version tag v{version}')
+ subprocess.run(['git',
+ '-c', 'user.signingkey=E36F75307F0A0EC2D145FF5CED7A208EEEC76F2D',
+ '-c', 'user.email=python-mpv@jaseg.de',
+ 'tag', '-s', f'v{version}', '-m', f'Version v{version}'],
+ check=True)
+
+if __name__ == '__main__':
+ do_release()