diff --git a/build/changelog.py b/build/changelog.py new file mode 100755 index 0000000..d7764c3 --- /dev/null +++ b/build/changelog.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +import os +import sys +import json +import urllib3 +import base64 +import datetime + +def get_time(s): + if 'fromisoformat' in dir(datetime.datetime): + return datetime.datetime.fromisoformat(s) + else: + return __import__('dateutil.parser').parser.parse(s) + +http = urllib3.PoolManager() + +GITHUB_AUTH = None +tok = os.getenv('GITHUB_TOKEN') +usn = os.getenv('GITHUB_USERNAME') +psw = os.getenv('GITHUB_PASSWORD') +if tok is not None: + GITHUB_AUTH = 'token {}'.format(tok) +elif usn is not None and psw is not None: + GITHUB_AUTH = 'Basic {}'.format(base64.b64encode('{}:{}'.format(usn, psw).encode('utf-8')).decode('utf-8')) + +def get(url): + headers = { + 'Accept': 'application/vnd.github.v3+json', + 'User-Agent': 'zjunet-build-agent/0.1', + } + if GITHUB_AUTH is not None: + headers['Authorization'] = GITHUB_AUTH + r = http.request('GET', url, headers=headers) + assert r.status // 100 == 2, 'HTTP Status {} != 2xx while requesting {}'.format(r.status, url) + if r.status != 200: + print('WARNING: HTTP {} while requesting {}'.format(r.status, url)) + return r.data + +def api_get(url): + return json.loads(get('https://api.github.com/' + url)) + +author_cache = {} +def get_author(name): + if name in author_cache: + return author_cache[name] + print('Reading data for {}'.format(name), end=' : ', flush=True, file=sys.stderr) + data = api_get('users/{}'.format(name)) + data = { + 'name': data['name'], + 'email': data['email'], + } + author_cache[name] = data + print('{} <{}>'.format(data['name'], data['email']), flush=True, file=sys.stderr) + return data + +def get_changelog(owner, name): + print('Reading releases of {} in {}'.format(owner, name), flush=True, file=sys.stderr) + releases = api_get('repos/{}/{}/releases'.format(owner, name)) + releases = filter(lambda v: not v['draft'] and not v['prerelease'], releases) + + data = [] + for rel in releases: + name = rel['name'] or rel['tag_name'] + item = { + 'time': get_time(rel['published_at']), + 'name': name, + 'version': name[name.rfind('v') + 1:].split(','), + 'author': get_author(rel['author']['login']), + 'changes': None, + } + tbody = rel['body'].strip() + if tbody != '': + if tbody[0] != '-' and '\n' not in tbody: + item['changes'] = '- ' + tbody + else: + item['changes'] = tbody + + data.append(item) + return ChangeLog(data) + +class ChangeLog: + def __init__(self, data): + self.raw = data + def rpm(self): + rel = '%changelog\n' + for item in self.raw: + rel += '* {} {} <{}> - {}\n'.format(item['time'].strftime('%a %b %d %Y'), item['author']['name'], item['author']['email'], '.'.join(item['version'])) + if item['changes'] is not None: + rel += item['changes'] + '\n' + return rel + +available_formats = dir(ChangeLog) + +if len(sys.argv) != 2: + print('Usage: {} \nAvailable formats: {}'.format(sys.argv[0], ','.join(ChangeLog))) +else: + changelog = get_changelog('QSCTech', 'zjunet') + if hasattr(changelog, sys.argv[1]): + print(getattr(changelog, sys.argv[1])()) + else: + print('Invalid format {}\nAvailable formats: {}'.format()) diff --git a/build/debian/build.sh b/build/debian/build.sh index dfc09dc..18bbc8e 100755 --- a/build/debian/build.sh +++ b/build/debian/build.sh @@ -36,7 +36,7 @@ Version: $VERSION Section: net Priority: optional Architecture: all -Depends: xl2tpd (>= 1.3.1), curl, dnsutils +Depends: xl2tpd (>= 1.3.7), curl, dnsutils Maintainer: Tespent Description: Command Line Scripts for ZJU This script provides a VPN / WLAN / NEXTHOP for ZJUer. diff --git a/build/openwrt/build.sh b/build/openwrt/build.sh index d8ce337..a5b1072 100755 --- a/build/openwrt/build.sh +++ b/build/openwrt/build.sh @@ -26,7 +26,7 @@ Version: $VERSION Section: net Priority: optional Architecture: all -Depends: xl2tpd (>= 1.3.1), curl, bind-dig +Depends: xl2tpd (>= 1.3.7), curl, bind-dig Maintainer: Tespent Description: Command Line Scripts for ZJU This script provides a VPN / WLAN / NEXTHOP for ZJUer. diff --git a/build/rpm/build_spec.sh b/build/rpm/build_spec.sh index c65501a..5bea7b2 100755 --- a/build/rpm/build_spec.sh +++ b/build/rpm/build_spec.sh @@ -13,7 +13,7 @@ echo "Group: Applications/Internet" >> zjunet.spec echo "URL: https://github.com/QSCTech/zjunet/" >> zjunet.spec echo "Vendor: Qiu Shi Chao Website of Zhejiang University" >> zjunet.spec echo "Packager: Tespent " >> zjunet.spec -echo "Requires: xl2tpd >= 1.3.1, curl, bind-utils" >> zjunet.spec +echo "Requires: xl2tpd >= 1.3.7, curl, bind-utils" >> zjunet.spec echo "BuildRoot: %{_builddir}/%{name}-root" >> zjunet.spec echo "Source: %{name}-%{version}.tar.gz" >> zjunet.spec echo "BuildArch: noarch" >> zjunet.spec @@ -63,23 +63,5 @@ echo "" >> zjunet.spec echo "%post" >> zjunet.spec echo "/usr/share/zjunet/zjunet-postinst || true" >> zjunet.spec echo "" >> zjunet.spec -echo "%changelog" >> zjunet.spec -echo "* Sun Feb 08 2015 Senorsen - 0.2.4" >> zjunet.spec -echo "- Genrate debian and opkg packages using fakeroot (in case of wrong uid)" >> zjunet.spec -echo "- Replace test IP with a more stable one" >> zjunet.spec -echo "* Sun Nov 23 2014 Zeno Zeng - 0.2.3" >> zjunet.spec -echo "- build.sh & zjunet.sh now share lib/version" >> zjunet.spec -echo "- fork when calling xl2tpd-control" >> zjunet.spec -echo "* Sat Nov 22 2014 Senorsen - 0.2.2" >> zjunet.spec -echo "- P-t-P server address issues" >> zjunet.spec -echo "- comment typo fixed" >> zjunet.spec -echo "* Wed Nov 12 2014 Zeno Zeng - 0.2.1" >> zjunet.spec -echo "- xqyww123 fixed the compatibility with systemd" >> zjunet.spec -echo "- chaosink fixed the string escape problem in user.sh" >> zjunet.spec -echo "* Wed Oct 15 2014 Zeno Zeng - 0.2.0" >> zjunet.spec -echo "- Use xl2tpd.conf, abandon \$HOME/.zjunet/" >> zjunet.spec -echo "- Setup route after connect / disconnect wlan" >> zjunet.spec -echo "* Mon Oct 13 2014 Zeno Zeng - 0.1.2" >> zjunet.spec -echo "* Thu Oct 02 2014 Zeno Zeng - 0.1.0" >> zjunet.spec -echo "- Initial version of the package" >> zjunet.spec +../changelog.py rpm >> zjunet.spec