#!/usr/bin/env python import jwt, time, urllib.request, json, datetime, argparse, sys, textwrap from github import Github from colorama import Fore, Style from time import sleep parser = argparse.ArgumentParser(description='Create PR to update nixpkgs fork') parser.add_argument('--private-key') parser.add_argument('--app-id') parser.add_argument('--installation-id') parser.add_argument('--repo') parser.add_argument('--cache-dir') args = vars(parser.parse_args()) channel_req = urllib.request.Request(url='https://nixos.org/channels/nixos-18.09/git-revision') latest_commit = urllib.request.urlopen(channel_req).read().decode('utf-8') try: previous_commit = open(args['cache_dir'] + '/git-revision', 'r').read() except FileNotFoundError: open(args['cache_dir'] + '/git-revision', 'w').write(latest_commit) print("Premier lancement, le hash du dernier commit à été sauvegardé") sys.exit(0) print("Dernier commit : " + latest_commit) print("Commit précédent : " + previous_commit) if latest_commit != previous_commit: bearer_token = jwt.encode({ 'iat': int(time.time()), 'exp': int(time.time()) + (10 * 60), 'iss': args['app_id'] }, open(args['private_key'],"r").read(), algorithm='RS256') req = urllib.request.Request(url='https://api.github.com/app/installations/' + args['installation_id'] + '/access_tokens', method='POST') req.add_header('Authorization', 'Bearer ' + bearer_token.decode('utf-8')) req.add_header('Accept', 'application/vnd.github.machine-man-preview+json') token = json.loads(urllib.request.urlopen(req).read().decode('utf-8'))['token'] g = Github(token) repo = g.get_repo(args['repo']) branch = "upgrade-" + datetime.datetime.now().strftime('%Y-%m-%d') + '-' + latest_commit[:11]; repo.create_git_ref('refs/heads/' + branch, latest_commit) pr_message = textwrap.dedent("""\ ### Pull request automatique ### Avancement mise à jour - [ ] Fusionner la branche """) pr = repo.create_pull(title=branch, body=pr_message, base='nixos-18.09', head=branch) print("Pull request numéro " + str(pr.number) + " créée") print("URL : " + pr.html_url) while pr.mergeable == None: pr = repo.get_pull(pr.number) sleep(1) pr.edit(body = pr.body + "\n- [ ] Exécuter `nixos-rebuild -I nixpkgs=https://github.com/nyanloutre/nixpkgs/archive/" + pr.merge_commit_sha + ".tar.gz switch`") print("État : " + ((Fore.GREEN + "Fusionnable") if pr.mergeable else (Fore.RED + "Conflit")) + Style.RESET_ALL) open(args['cache_dir'] + '/git-revision', 'w').write(latest_commit) else: print(Fore.GREEN + "Aucun changement détecté" + Style.RESET_ALL)