From ca0be76fdc18b308ee755ba0bd4aa4120cb09613 Mon Sep 17 00:00:00 2001 From: Keunes <11229646+keunes@users.noreply.github.com> Date: Sat, 15 Apr 2023 21:17:17 +0200 Subject: Add changelog script (#6399) --- createContributors.py | 90 ------------------------------------------- makeRelease.sh | 4 -- scripts/createContributors.py | 90 +++++++++++++++++++++++++++++++++++++++++++ scripts/getChangelog.py | 90 +++++++++++++++++++++++++++++++++++++++++++ scripts/makeRelease.sh | 4 ++ 5 files changed, 184 insertions(+), 94 deletions(-) delete mode 100644 createContributors.py delete mode 100755 makeRelease.sh create mode 100644 scripts/createContributors.py create mode 100644 scripts/getChangelog.py create mode 100644 scripts/makeRelease.sh diff --git a/createContributors.py b/createContributors.py deleted file mode 100644 index fba19c793..000000000 --- a/createContributors.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -import pycountry -import requests -import configparser -import os - -contributorsFile = open("CONTRIBUTORS.md", "w") - -###### Developers ##### -MAINTAINERS = ['ByteHamster', 'keunes'] -FORMER_MAINTAINERS = ['mfietz', 'TomHennen'] - -csvFile = open("app/src/main/assets/developers.csv", "w") -contributorsFile.write('# Developers\n\n') -page = 1 -hasMore = True -first = True -while hasMore: - nextPage = ('https://api.github.com/repos/AntennaPod/AntennaPod/contributors' - + '?q=contributions&order=desc&per_page=100&page=' + str(page)) - print("Loading " + nextPage) - json = requests.get(nextPage).json() - for contributor in json: - role = 'Contributor' - if contributor['login'] == 'danieloeh': - role = 'Original creator of AntennaPod (retired)' - elif contributor['login'] in MAINTAINERS: - role = 'Maintainer' - elif contributor['login'] in FORMER_MAINTAINERS: - role = 'Maintainer (retired)' - csvFile.write(contributor['login'].replace(";", "") + ';' + str(contributor['id']) + ';' + role + '\n') - if not first: - contributorsFile.write(', ') - first = False - contributorsFile.write('[' + contributor['login'] + '](https://github.com/' + contributor['login'] + ')') - page = page + 1 - hasMore = len(json) > 0 -csvFile.close() - -###### Translators ##### -config = configparser.ConfigParser() -config.read(os.path.expanduser("~") + '/.transifexrc') -if 'https://www.transifex.com' in config and config['https://www.transifex.com']['username'] == 'api': - TRANSIFEX_TOKEN = config['https://www.transifex.com']['token'] -else: - TRANSIFEX_TOKEN = "" - -languages = dict() - -nextPage = 'https://rest.api.transifex.com/team_memberships?filter[organization]=o:antennapod' -while nextPage is not None: - print("Loading " + nextPage) - r = requests.get(nextPage, - headers={'Authorization': 'Bearer ' + TRANSIFEX_TOKEN, - 'Accept': 'application/vnd.api+json'}) - for item in r.json()['data']: - language = item['relationships']['language']['data']['id'] - user = item['relationships']['user']['data']['id'] - if not language in languages: - langCode = language.replace('l:', '') - try: - langName = pycountry.languages.lookup(langCode).name - except: - try: - langName = pycountry.languages.lookup( - langCode.split('_')[0]).name + ' (' + langCode + ')' - except: - langName = code - print('\033[91mLanguage code not found:' + langCode + '\033[0m') - languages[language] = {'name': langName, 'translators': []} - languages[language]['translators'].append(user.replace('u:', '')) - nextPage = r.json()['links']['next'] - -languages = list(languages.values()) -languages.sort(key=lambda x : x['name'].lower()) - -csvFile = open("app/src/main/assets/translators.csv", "w") -contributorsFile.write('\n\n# Translators\n\n') -contributorsFile.write('| Language | Translators |\n| :-- | :-- |\n') -for language in languages: - translators = sorted(language['translators'], key=str.lower) - langName = language['name'] - joinedTranslators = ', '.join(translators).replace(';', '') - contributorsFile.write('| ' + langName + ' | ' + joinedTranslators + ' |\n') - csvFile.write(langName + ';' + joinedTranslators + '\n') -csvFile.close() -contributorsFile.close() - -print('Done') - diff --git a/makeRelease.sh b/makeRelease.sh deleted file mode 100755 index 34c79f319..000000000 --- a/makeRelease.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -curl -s https://raw.githubusercontent.com/AntennaPod/antennapod.github.io/master/_config.yml | yq -r ".languages[]" > ./app/src/main/assets/website-languages.txt -python ./createContributors.py diff --git a/scripts/createContributors.py b/scripts/createContributors.py new file mode 100644 index 000000000..fba19c793 --- /dev/null +++ b/scripts/createContributors.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +import pycountry +import requests +import configparser +import os + +contributorsFile = open("CONTRIBUTORS.md", "w") + +###### Developers ##### +MAINTAINERS = ['ByteHamster', 'keunes'] +FORMER_MAINTAINERS = ['mfietz', 'TomHennen'] + +csvFile = open("app/src/main/assets/developers.csv", "w") +contributorsFile.write('# Developers\n\n') +page = 1 +hasMore = True +first = True +while hasMore: + nextPage = ('https://api.github.com/repos/AntennaPod/AntennaPod/contributors' + + '?q=contributions&order=desc&per_page=100&page=' + str(page)) + print("Loading " + nextPage) + json = requests.get(nextPage).json() + for contributor in json: + role = 'Contributor' + if contributor['login'] == 'danieloeh': + role = 'Original creator of AntennaPod (retired)' + elif contributor['login'] in MAINTAINERS: + role = 'Maintainer' + elif contributor['login'] in FORMER_MAINTAINERS: + role = 'Maintainer (retired)' + csvFile.write(contributor['login'].replace(";", "") + ';' + str(contributor['id']) + ';' + role + '\n') + if not first: + contributorsFile.write(', ') + first = False + contributorsFile.write('[' + contributor['login'] + '](https://github.com/' + contributor['login'] + ')') + page = page + 1 + hasMore = len(json) > 0 +csvFile.close() + +###### Translators ##### +config = configparser.ConfigParser() +config.read(os.path.expanduser("~") + '/.transifexrc') +if 'https://www.transifex.com' in config and config['https://www.transifex.com']['username'] == 'api': + TRANSIFEX_TOKEN = config['https://www.transifex.com']['token'] +else: + TRANSIFEX_TOKEN = "" + +languages = dict() + +nextPage = 'https://rest.api.transifex.com/team_memberships?filter[organization]=o:antennapod' +while nextPage is not None: + print("Loading " + nextPage) + r = requests.get(nextPage, + headers={'Authorization': 'Bearer ' + TRANSIFEX_TOKEN, + 'Accept': 'application/vnd.api+json'}) + for item in r.json()['data']: + language = item['relationships']['language']['data']['id'] + user = item['relationships']['user']['data']['id'] + if not language in languages: + langCode = language.replace('l:', '') + try: + langName = pycountry.languages.lookup(langCode).name + except: + try: + langName = pycountry.languages.lookup( + langCode.split('_')[0]).name + ' (' + langCode + ')' + except: + langName = code + print('\033[91mLanguage code not found:' + langCode + '\033[0m') + languages[language] = {'name': langName, 'translators': []} + languages[language]['translators'].append(user.replace('u:', '')) + nextPage = r.json()['links']['next'] + +languages = list(languages.values()) +languages.sort(key=lambda x : x['name'].lower()) + +csvFile = open("app/src/main/assets/translators.csv", "w") +contributorsFile.write('\n\n# Translators\n\n') +contributorsFile.write('| Language | Translators |\n| :-- | :-- |\n') +for language in languages: + translators = sorted(language['translators'], key=str.lower) + langName = language['name'] + joinedTranslators = ', '.join(translators).replace(';', '') + contributorsFile.write('| ' + langName + ' | ' + joinedTranslators + ' |\n') + csvFile.write(langName + ';' + joinedTranslators + '\n') +csvFile.close() +contributorsFile.close() + +print('Done') + diff --git a/scripts/getChangelog.py b/scripts/getChangelog.py new file mode 100644 index 000000000..cd02f3383 --- /dev/null +++ b/scripts/getChangelog.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 + +import requests +import time +import re + +REPO = "AntennaPod/AntennaPod" + +print("Hello, welcome to the AntennaPod PR list generator!") +print("First, please enter your GitHub API token.") +print("If you don't have one yet, create it at https://github.com/settings/tokens") + +def get_token(): + TOKEN = "" + while not TOKEN: + TOKEN = input('Token: ').strip() + return TOKEN + +TOKEN = get_token() +print("Grand, thank you! (" + TOKEN + " is noted)") + +print() +print("Now, what do you want to compare?") +print("Please enter a release code or branch") +print("[default: latest GitHub release]") +BASE = input('Base: ') +if BASE == "": + response = requests.get("https://api.github.com/repos/" + REPO + "/releases/latest", headers={'Authorization': 'token ' + TOKEN}) + while response.status_code == 401: + print("Error: Invalid GitHub API token.") + TOKEN = get_token() + response = requests.get("https://api.github.com/repos/" + REPO + "/releases/latest", headers={'Authorization': 'token ' + TOKEN}) + release = response.json() + BASE = release["tag_name"] + print("Okido, latest release (" + BASE + ") it is!") +else: + print("Noted") + +print() +print("Then, what should be our endpoint?") +print("[default: 'master']") +HEAD = input('Head: ') +if HEAD == "": + print("Righty, master it is!") + HEAD="master" +else: + print("Roger that.") + +def print_seen(): + print(" [already seen] " + pr_details["title"] + " (#" + str(pr_details["number"]) + ")") + +print() +prsSeen = set() +filename = BASE + " - " + HEAD + " changelog.csv" +outputFile = open(filename, 'w') +outputFile.write("Type,Merge date,URL,Title,Author,Type,Functionality group\n") +commits = requests.get("https://api.github.com/repos/" + REPO + "/compare/" + BASE + "..." + HEAD, headers={'Authorization': 'token ' + TOKEN}).json() +numCommits = len(commits["commits"]) +for i in range(numCommits): + sha = commits["commits"][i]["sha"] + commit = commits["commits"][i] + print("Commit "+ str(i+1) + " of " + str(numCommits)) + if "Merge pull request #" in commit["commit"]["message"] or "Merge branch" in commit["commit"]["message"]: + print(" [is merge commit]") + continue + pr_match = re.search(r'\(#(\d{4})\)', commit["commit"]["message"]) + if pr_match: + pr_number = pr_match.group(1) + if pr_number in prsSeen: + print_seen() + continue + pr_details = requests.get("https://api.github.com/repos/" + REPO + "/pulls/" + pr_number, headers={'Authorization': 'token ' + TOKEN}).json() + outputFile.write("PR," + pr_details["merged_at"] + "," + pr_details["html_url"] + ",\"" + pr_details["title"] + "\"," + pr_details["user"]["login"] + "\n") + print(" " + pr_details["title"] + " (#" + str(pr_details["number"]) + ")") + prsSeen.add(pr_number) + continue + time.sleep(1.5) # Avoid rate limit + prs = requests.get("https://api.github.com/search/issues?q=repo:" + REPO + "+type:pr+is:merged+" + sha, headers={'Authorization': 'token ' + TOKEN}).json() + if len(prs["items"]) == 0: + outputFile.write("Commit," + commit["commit"]["committer"]["date"] + "," + commit["html_url"] + ",\"" + commit["commit"]["message"].splitlines()[0] + "\"," + commit["committer"]["login"] + "\n") + print(" [orphan] " + commit["commit"]["message"].splitlines()[0]) + continue + pr_details = prs["items"][0] + if pr_details["number"] in prsSeen: + print_seen() + continue + outputFile.write("PR," + pr_details["pull_request"]["merged_at"] + "," + pr_details["html_url"] + ",\"" + pr_details["title"] + "\"," + pr_details["user"]["login"] + "\n") + print(" " + pr_details["title"] + " (#" + str(pr_details["number"]) + ")") + prsSeen.add(pr_details["number"]) +outputFile.close() diff --git a/scripts/makeRelease.sh b/scripts/makeRelease.sh new file mode 100644 index 000000000..34c79f319 --- /dev/null +++ b/scripts/makeRelease.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +curl -s https://raw.githubusercontent.com/AntennaPod/antennapod.github.io/master/_config.yml | yq -r ".languages[]" > ./app/src/main/assets/website-languages.txt +python ./createContributors.py -- cgit v1.2.3