nerd-fonts/chocolatey/generate_packages.py
2018-04-15 21:12:29 +05:30

101 lines
3 KiB
Python

from __future__ import print_function
import os
import re
import shutil
import subprocess
import sys
import xml.etree.ElementTree as ET
import yaml
XMLNS = {'nuspec': 'http://schemas.microsoft.com/packaging/2015/06/nuspec.xsd'}
def pwd():
""" Current dir of the script. """
return os.path.realpath(os.path.dirname(sys.argv[0]))
def kebab_case(inp):
""" Convert from `CamelCase` to `kebab-case`. """
s1 = re.sub('(.)([A-Z][a-z]+)', r'\1-\2', inp)
return re.sub('([a-z0-9])([A-Z])', r'\1-\2', s1).lower()
def generate_nuspec(font, version):
""" Write the `.nuspec` file. """
font_id = kebab_case(font) + '-nerd-font'
# Parse the tree
tree = ET.parse('base.nuspec')
root = tree.getroot()
# id
id_ = root[0].find('nuspec:id', namespaces=XMLNS)
id_.text = font_id
# version
ver_ = root[0].find('nuspec:version', namespaces=XMLNS)
ver_.text = version
# title
title_ = root[0].find('nuspec:title', namespaces=XMLNS)
title_.text = font + ' Nerd Font'
font_dir = os.path.join(pwd(), font_id)
if not os.path.exists(font_dir):
os.mkdir(font_dir)
with open(os.path.join(font_dir, font_id + '.nuspec'), 'wb') as f:
f.write(ET.tostring(root, encoding='utf8'))
# Copy tools
tools_src_dir = os.path.join(pwd(), 'tools')
tools_dest_dir = os.path.join(font_dir, 'tools')
if os.path.exists(tools_dest_dir):
shutil.rmtree(tools_dest_dir)
shutil.copytree(tools_src_dir, tools_dest_dir)
def generate_choco_scripts(font, version, sha256_hash, installed_fonts):
""" Generates chocolatey install and uninstall scripts """
# Install script
font_id = kebab_case(font)
tools_dir = os.path.join(pwd(), font_id + '-nerd-font', 'tools')
with open(os.path.join(tools_dir, 'chocolateyinstall.ps1'), 'r+') as f:
script = f.read()
script = script.format(
font=font,
version='v%s' % (version),
hash=sha256_hash)
f.seek(0)
f.write(script)
with open(os.path.join(tools_dir, 'chocolateybeforemodify.ps1'), 'r+') as f:
script = f.read()
script = script.format(fonts=','.join('"%s"' % (x) for x in installed_fonts))
f.seek(0)
f.write(script)
def main():
""" Generate chocolatey `.nuspec` files. """
print('Reading config')
with open('fonts.yml') as f:
config = yaml.load(f)
# generate `.nuspec`
for font in config['fonts']:
print('Generating chocolatey package for', font['name'])
generate_nuspec(font['name'], config['version'])
generate_choco_scripts(font['name'], config['version'], font['sha256'],
font['installed_fonts'])
# create choco `.nupkg` package
for dir_ in os.listdir(pwd()):
if os.path.isdir(dir_) and dir_ != 'tools':
subprocess.call
print('Packaging', dir_)
subprocess.call(['choco', 'pack'], cwd=os.path.join(pwd(), dir_))
print('Done')
if __name__ == '__main__':
main()