Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 104 additions & 0 deletions .github/workflows/updatesource.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: Update StikJIT Source

on:
release:
types: [published]
workflow_dispatch:

# Add permissions block to ensure the workflow can push changes
permissions:
contents: write

jobs:
update-source:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: 0-Blu/StikJIT
ref: main

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests

- name: Record job start time
id: job_start_time
run: echo "start_time=$(date +%s)" >> $GITHUB_OUTPUT

- name: Debug repository information
run: |
echo "Repository: 0-Blu/StikJIT"
echo "Event name: $GITHUB_EVENT_NAME"
echo "Current directory: $(pwd)"
echo "Repository contents:"
ls -la

- name: Update StikJIT source
id: update_source
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Configure git
git config --global user.name 'GitHub Action'
git config --global user.email 'action@github.com'

# Run the update script
python update_json.py

# Check for changes and commit if needed
git add repo.json
if git diff --staged --quiet; then
echo "changes=false" >> $GITHUB_OUTPUT
echo "No changes detected in repo.json"
else
echo "Changes detected in repo.json:"
git diff --staged
git commit -m "Updated source with latest StikJIT release"
# Push to main branch of original repository
git push origin main
echo "changes=true" >> $GITHUB_OUTPUT
fi

- name: Calculate job duration
id: duration
if: always()
run: |
end_time=$(date +%s)
duration=$((end_time - ${{ steps.job_start_time.outputs.start_time }}))
echo "duration=$duration seconds" >> $GITHUB_OUTPUT

- name: Create job summary
run: |
if [[ "${{ steps.update_source.outputs.changes }}" == "true" ]]; then
echo "## Update StikJIT Source Summary 🚀" >> $GITHUB_STEP_SUMMARY
echo "✅ Changes Detected and Pushed" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "The repo.json file has been updated with the latest release information." >> $GITHUB_STEP_SUMMARY
else
echo "## Update StikJIT Source Summary 🚀" >> $GITHUB_STEP_SUMMARY
echo "🔍 No Changes Detected" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "The repo.json file is up to date. No changes were necessary." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "This could be because:" >> $GITHUB_STEP_SUMMARY
echo "- The release version is already in the repo.json file" >> $GITHUB_STEP_SUMMARY
echo "- The release doesn't contain an IPA file" >> $GITHUB_STEP_SUMMARY
echo "- The release tag doesn't match the expected version format" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "🕐 Execution Time" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "This job took ${{ steps.duration.outputs.duration }} to complete." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "📆 Next Scheduled Run" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "The next scheduled run will be triggered when a new release is published." >> $GITHUB_STEP_SUMMARY
190 changes: 190 additions & 0 deletions update_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
import json
import re
import requests
import os
import sys
from datetime import datetime

def prepare_description(text):
text = re.sub('<[^<]+?>', '', text) # Remove HTML tags
text = re.sub(r'#{1,6}\s?', '', text) # Remove markdown header tags
text = re.sub(r'\*{2}', '', text) # Remove all occurrences of two consecutive asterisks
text = re.sub(r'(?<=\r|\n)-', '•', text) # Only replace - with • if it is preceded by \r or \n
text = re.sub(r'`', '"', text) # Replace ` with "
text = re.sub(r'\r\n\r\n', '\r \n', text) # Replace \r\n\r\n with \r \n (avoid incorrect display of the description regarding paragraphs)
return text

def fetch_latest_release(repo_url):
api_url = f"https://api.github.com/repos/{repo_url}/releases"
headers = {
"Accept": "application/vnd.github+json",
}
try:
print(f"Fetching releases from: {api_url}")
response = requests.get(api_url, headers=headers)
response.raise_for_status()
releases = response.json()
if not releases:
print("No releases found in the repository")
return None
print(f"Found {len(releases)} releases")
print(f"Latest release: {releases[0]['tag_name']}")
return releases
except requests.RequestException as e:
print(f"Error fetching releases: {e}")
return None

def get_file_size(url):
try:
response = requests.head(url)
response.raise_for_status()
return int(response.headers.get('Content-Length', 0))
except requests.RequestException as e:
print(f"Error getting file size: {e}")
return 0

def update_json_file(json_file, latest_release):
if isinstance(latest_release, list) and latest_release:
latest_release = latest_release[0]
else:
print("Error getting latest release")
return False

try:
print(f"Reading JSON file: {json_file}")
with open(json_file, "r") as file:
data = json.load(file)
except json.JSONDecodeError as e:
print(f"Error reading JSON file: {e}")
return False
except FileNotFoundError:
print(f"File {json_file} not found")
return False

app = data["apps"][0]
current_version = app.get("version", "unknown")
print(f"Current version in repo.json: {current_version}")

full_version = latest_release["tag_name"]
tag = latest_release["tag_name"]
version_match = re.search(r"(\d+\.\d+\.\d+)", full_version)
if not version_match:
print(f"Could not extract version from tag: {full_version}")
return False

version = version_match.group(1)
print(f"Latest release version: {version}")

# Check if the version is already in the versions list
existing_versions = [v["version"] for v in app["versions"]]
print(f"Existing versions: {existing_versions}")

if version in existing_versions and version == current_version:
print(f"Version {version} already exists and is current, no update needed")
return False

version_date = latest_release["published_at"]
date_obj = datetime.strptime(version_date, "%Y-%m-%dT%H:%M:%SZ")
version_date = date_obj.strftime("%Y-%m-%d")

description = latest_release["body"] or "No description provided"
description = prepare_description(description)

assets = latest_release.get("assets", [])
print(f"Found {len(assets)} assets in the release")
for asset in assets:
print(f"Asset: {asset['name']}")

download_url = None
size = None
for asset in assets:
if asset["name"].endswith(".ipa"):
download_url = asset["browser_download_url"]
size = asset["size"]
print(f"Found IPA file: {asset['name']}, size: {size}")
break

if download_url is None or size is None:
print("Error: IPA file not found in release assets.")
return False

version_entry = {
"version": version,
"date": version_date,
"localizedDescription": description,
"downloadURL": download_url,
"size": size,
"minOSVersion": "17.4" # Adding minOSVersion for StikJIT
}

# Always update with the latest version
print(f"Adding new version entry: {version}")
app["versions"].insert(0, version_entry)

print(f"Updating app with version {version}")
app.update({
"version": version,
"versionDate": version_date,
"versionDescription": description,
"downloadURL": download_url,
"size": size
})

if "news" not in data:
data["news"] = []

news_identifier = f"release-{full_version}"
date_string = date_obj.strftime("%d/%m/%y")
news_entry = {
"appID": "com.stik.sj",
"caption": f"Update of StikJIT just got released!",
"date": latest_release["published_at"],
"identifier": news_identifier,
"imageURL": "https://github.com/0-Blu/StikJIT/blob/main/assets/StikJIT.png?raw=true",
"notify": True,
"tintColor": "#293B45",
"title": f"{full_version} - StikJIT {date_string}",
"url": f"https://github.com/0-Blu/StikJIT/releases/tag/{tag}"
}

news_entry_exists = any(item["identifier"] == news_identifier for item in data["news"])
if not news_entry_exists:
print(f"Adding news entry for version {full_version}")
data["news"].append(news_entry)
else:
print(f"News entry for version {full_version} already exists")

try:
print(f"Writing updated JSON to {json_file}")
with open(json_file, "w") as file:
json.dump(data, file, indent=2)
print("JSON file updated successfully.")
return True
except IOError as e:
print(f"Error writing to JSON file: {e}")
return False

def main():
# Use the original repository instead of fork
repo_url = "0-Blu/StikJIT"
json_file = "repo.json"

print(f"Using repository: {repo_url}")
print(f"Updating file: {json_file}")

try:
fetched_data_latest = fetch_latest_release(repo_url)
if fetched_data_latest:
success = update_json_file(json_file, fetched_data_latest)
if not success:
print("Failed to update JSON file or no changes were needed")
sys.exit(0) # Exit with success code since no changes needed is not an error
else:
print("No releases found to update")
sys.exit(1)
except Exception as e:
print(f"An error occurred: {e}")
sys.exit(1)

if __name__ == "__main__":
main()