From f871619d7fedbf973c249ad6e16c0fcf7e819cf8 Mon Sep 17 00:00:00 2001 From: Mitja Felicijan Date: Sat, 2 Aug 2025 20:28:26 +0200 Subject: Update --- tools/fossil-projects.sh | 17 ++++++ tools/github-projects.py | 138 +++++++++++++++++++++++++++++++++++++++++++ tools/projects.py | 149 ----------------------------------------------- 3 files changed, 155 insertions(+), 149 deletions(-) create mode 100644 tools/fossil-projects.sh create mode 100644 tools/github-projects.py delete mode 100644 tools/projects.py (limited to 'tools') diff --git a/tools/fossil-projects.sh b/tools/fossil-projects.sh new file mode 100644 index 0000000..bb6e673 --- /dev/null +++ b/tools/fossil-projects.sh @@ -0,0 +1,17 @@ +set -xe + +OUT=../content/pages/projects.fossil.md.part + +echo -e "## Fossil repositories\n" > $OUT + +find ~/Projects/ -type f -name "*.fossil" -not -path "*/website/*" | while read -r file; do + cp $file ../static/projects/ +done + +find ../static/projects/ -type f -name "*.fossil" | while read -r file; do + base=$(basename "$file") + size=$(stat -c %s "$file" | numfmt --to=iec) + modified_date=$(stat -c %Y "$file") + formatted_date=$(date -d @"$modified_date" +"%Y-%m-%d %H:%M:%S") + echo -e "- [$base](/projects/$base)
Size: $size, Modified: $formatted_date" >> $OUT +done diff --git a/tools/github-projects.py b/tools/github-projects.py new file mode 100644 index 0000000..e2afe95 --- /dev/null +++ b/tools/github-projects.py @@ -0,0 +1,138 @@ +"""Fetches my public repositories and downloads tagged versions.""" +from datetime import datetime +import sys +import json +import requests + +USERNAME = "mitjafelicijan" +CACHE_BUSTER = int(datetime.now().timestamp()) +DOUBLE_NL = "\n\n" + +headers = { + "Accept": "application/vnd.github.v3+json" +} + +def generate_markdown_file(include_repositories): + file = open("../content/pages/projects.github.md.part", "w") + + file.write(DOUBLE_NL) + file.write("## GitHub repositories") + file.write(DOUBLE_NL) + + file.write("
") + file.write(DOUBLE_NL) + + for repo in include_repositories: + file.write(f"- [{repo['name']}](#{repo['name'].lower()}) \n") + + file.write(DOUBLE_NL) + file.write("
") + file.write(DOUBLE_NL) + + for repo in include_repositories: + print(f"> {repo['name']}") + + file.write(f"## {repo['name']}\n") + file.write(f"{repo['description']}\n") + + file.write(DOUBLE_NL) + file.write("
") + file.write(DOUBLE_NL) + file.write("|Released|Description|Download|\n") + file.write("|--------|-----------|--------|\n") + + for release in repo['releases']: + print(f" - {release['name']} - {release['created_at']}") + dt = datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%SZ") + file.write(f"|{dt.strftime('%Y-%m-%d')}|{release['name']}| [{release['filename']}](/projects/{release['filename']}) |\n") + + file.write(DOUBLE_NL) + file.write("
") + file.write(DOUBLE_NL) + + file.write("") + file.write(DOUBLE_NL) + + file.write(DOUBLE_NL) + file.write("") + file.write(DOUBLE_NL) + + file.close() + +def download_tarball(url, filepath): + with requests.get(url, stream=True, timeout=30) as response: + response.raise_for_status() + + with open(filepath, "wb") as file: + for chunk in response.iter_content(chunk_size=8192): + file.write(chunk) + +def assert_rate_limit(response): + rate_limit_limit = int(response.headers.get("x-ratelimit-limit")) + rate_limit_remaining = int(response.headers.get("x-ratelimit-remaining")) + rate_limit_reset = int(response.headers.get("x-ratelimit-reset")) + print(f"Rate limit: {rate_limit_remaining}/{rate_limit_limit}") + print(f"Reset time: {datetime.fromtimestamp(rate_limit_reset)}") + + if rate_limit_remaining == 0: + sys.exit(1) + +def fetch_github_data(): + include_repositories = [] + print(headers) + response = requests.get(f"https://api.github.com/users/{USERNAME}/repos?ts={CACHE_BUSTER}&per_page=100", + headers=headers, + timeout=10) + + assert_rate_limit(response) + + if response.status_code == 200: + repos = response.json() + for repo in repos: + # Check if repository has "winc" topic. This means I want to include + # this repository on this page. + if "winc" in repo["topics"]: + include_repositories.append(repo) + else: + print(f"Failed to retrieve repositories: {response.status_code}") + sys.exit(1) + + for repo in include_repositories: + print(f"Name: {repo['name']}, URL: {repo['html_url']}") + + response = requests.get(f"https://api.github.com/repos/{USERNAME}/{repo['name']}/releases?ts={CACHE_BUSTER}", + headers=headers, + timeout=10) + + assert_rate_limit(response) + + if response.status_code == 200: + repo["releases"] = response.json() + for release in repo["releases"]: + release["filename"] = f"{repo['name']}-{release['tag_name']}.tar.gz" + print(f" > {release['tag_name']}, {release['name']}, {release['filename']}") + download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}") + + return include_repositories + +include_repositories = fetch_github_data() + +# with open("out.json", "w") as json_file: +# json.dump(include_repositories, json_file, indent=4) + +generate_markdown_file(include_repositories) + +# with open("out.json", "r") as fp: +# include_repositories = json.load(fp) +# generate_markdown_file(include_repositories) diff --git a/tools/projects.py b/tools/projects.py deleted file mode 100644 index 65cea8d..0000000 --- a/tools/projects.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Fetches my public repositories and downloads tagged versions.""" -from datetime import datetime -import sys -import json -import requests - -USERNAME = "mitjafelicijan" -CACHE_BUSTER = int(datetime.now().timestamp()) -DOUBLE_NL = "\n\n" - -headers = { - "Accept": "application/vnd.github.v3+json" -} - - -def generate_markdown_file(include_repositories): - file = open("../content/pages/projects.md", "w") - - file.write("---\n") - file.write("title: Personal projects\n") - file.write("date: 2024-10-21T12:00:00+02:00\n") - file.write("url: projects.html\n") - file.write("type: page\n") - file.write("draft: false\n") - file.write("---") - file.write(DOUBLE_NL) - - file.write("
") - file.write(DOUBLE_NL) - - for repo in include_repositories: - file.write(f"- [{repo['name']}](#{repo['name'].lower()}) \n") - - file.write(DOUBLE_NL) - file.write("
") - file.write(DOUBLE_NL) - - for repo in include_repositories: - print(f"> {repo['name']}") - - file.write(f"## {repo['name']}\n") - file.write(f"{repo['description']}\n") - - file.write(DOUBLE_NL) - file.write("
") - file.write(DOUBLE_NL) - file.write("|Released|Description|Download|\n") - file.write("|--------|-----------|--------|\n") - - for release in repo['releases']: - print(f" - {release['name']} - {release['created_at']}") - dt = datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%SZ") - file.write(f"|{dt.strftime('%Y-%m-%d')}|{release['name']}| [{release['filename']}](/projects/{release['filename']}) |\n") - - file.write(DOUBLE_NL) - file.write("
") - file.write(DOUBLE_NL) - - file.write("") - file.write(DOUBLE_NL) - - file.write(DOUBLE_NL) - file.write("") - file.write(DOUBLE_NL) - - file.close() - - - -def download_tarball(url, filepath): - with requests.get(url, stream=True, timeout=30) as response: - response.raise_for_status() - - with open(filepath, "wb") as file: - for chunk in response.iter_content(chunk_size=8192): - file.write(chunk) - - -def assert_rate_limit(response): - rate_limit_limit = int(response.headers.get("x-ratelimit-limit")) - rate_limit_remaining = int(response.headers.get("x-ratelimit-remaining")) - rate_limit_reset = int(response.headers.get("x-ratelimit-reset")) - print(f"Rate limit: {rate_limit_remaining}/{rate_limit_limit}") - print(f"Reset time: {datetime.fromtimestamp(rate_limit_reset)}") - - if rate_limit_remaining == 0: - sys.exit(1) - - -def fetch_github_data(): - include_repositories = [] - print(headers) - response = requests.get(f"https://api.github.com/users/{USERNAME}/repos?ts={CACHE_BUSTER}&per_page=100", - headers=headers, - timeout=10) - - assert_rate_limit(response) - - if response.status_code == 200: - repos = response.json() - for repo in repos: - # Check if repository has "winc" topic. This means I want to include - # this repository on this page. - if "winc" in repo["topics"]: - include_repositories.append(repo) - else: - print(f"Failed to retrieve repositories: {response.status_code}") - sys.exit(1) - - for repo in include_repositories: - print(f"Name: {repo['name']}, URL: {repo['html_url']}") - - response = requests.get(f"https://api.github.com/repos/{USERNAME}/{repo['name']}/releases?ts={CACHE_BUSTER}", - headers=headers, - timeout=10) - - assert_rate_limit(response) - - if response.status_code == 200: - repo["releases"] = response.json() - for release in repo["releases"]: - release["filename"] = f"{repo['name']}-{release['tag_name']}.tar.gz" - print(f" > {release['tag_name']}, {release['name']}, {release['filename']}") - download_tarball(release["tarball_url"], f"../static/projects/{release['filename']}") - - return include_repositories - - -include_repositories = fetch_github_data() - -# with open("out.json", "w") as json_file: -# json.dump(include_repositories, json_file, indent=4) - -generate_markdown_file(include_repositories) - -# with open("out.json", "r") as fp: -# include_repositories = json.load(fp) -# generate_markdown_file(include_repositories) -- cgit v1.2.3