82 lines
1.8 KiB
Python
82 lines
1.8 KiB
Python
|
import requests
|
||
|
import re
|
||
|
import os
|
||
|
import sys
|
||
|
import subprocess
|
||
|
|
||
|
from bs4 import BeautifulSoup
|
||
|
|
||
|
HOST = "https://github.com"
|
||
|
REPO = "AChep/keyguard-app"
|
||
|
RELEASE_URL = f"{HOST}/{REPO}/releases/latest"
|
||
|
|
||
|
MAX_ARTIFACTS_COUNT = 5
|
||
|
|
||
|
|
||
|
def get_latest_release_tag():
|
||
|
response = requests.get(RELEASE_URL)
|
||
|
return re.match(r".*tag/([\w\.]+).*", response.url).group(1)
|
||
|
|
||
|
|
||
|
def fdroid_update():
|
||
|
subprocess.run(["fdroid", "update"], check=True)
|
||
|
|
||
|
|
||
|
tag = get_latest_release_tag()
|
||
|
tag_filename = tag.replace(".", "-")
|
||
|
apk_filename = f"repo/Keyguard-{tag_filename}.apk"
|
||
|
|
||
|
# If the file already exists, then there is no
|
||
|
# need to download the file. We assume that the
|
||
|
# files are immutable.
|
||
|
if os.path.exists(apk_filename):
|
||
|
fdroid_update()
|
||
|
sys.exit(0)
|
||
|
|
||
|
#
|
||
|
# Delete old builds
|
||
|
#
|
||
|
|
||
|
existing_apks = []
|
||
|
with os.scandir("repo/") as d:
|
||
|
for entry in d:
|
||
|
if entry.name.endswith(".apk") and entry.is_file():
|
||
|
existing_apks.append(entry.path)
|
||
|
existing_apks.sort()
|
||
|
existing_apks_to_delete = existing_apks[:1 - MAX_ARTIFACTS_COUNT]
|
||
|
for apk in existing_apks_to_delete:
|
||
|
os.remove(apk)
|
||
|
|
||
|
#
|
||
|
# Download the latest .apk from GitHub
|
||
|
#
|
||
|
|
||
|
assets_url = f"{HOST}/{REPO}/releases/expanded_assets/{tag}"
|
||
|
assets_response = requests.get(assets_url)
|
||
|
assets_soup = BeautifulSoup(
|
||
|
assets_response.content,
|
||
|
features="html.parser"
|
||
|
)
|
||
|
|
||
|
assets_urls = [el['href'] for el in assets_soup.select('a[href]')]
|
||
|
assets_apk_url = next(
|
||
|
filter(
|
||
|
lambda url: url.endswith('/androidApp-none-release.apk'),
|
||
|
assets_urls
|
||
|
),
|
||
|
None
|
||
|
)
|
||
|
if not assets_apk_url:
|
||
|
raise Exception("Failed to find a url to the latest .apk file!")
|
||
|
assets_apk_url = f"{HOST}{assets_apk_url}"
|
||
|
|
||
|
apk_response = requests.get(assets_apk_url)
|
||
|
with open(apk_filename, mode="wb") as file:
|
||
|
file.write(apk_response.content)
|
||
|
|
||
|
#
|
||
|
# Update repository
|
||
|
#
|
||
|
|
||
|
fdroid_update()
|