1- name : Sync Fork with Upstream
1+ name : Sync Fork on Upstream Release
22
33on :
44 schedule :
5- # Check every 6 hours
5+ # Check for new releases every 6 hours
66 - cron : " 0 */6 * * *"
77 workflow_dispatch :
88 inputs :
99 force_build :
10- description : " Force build even if no changes "
10+ description : " Force build even if no new release "
1111 type : boolean
1212 default : false
1313
1414jobs :
15- sync :
15+ check-release :
1616 runs-on : ubuntu-latest
1717 outputs :
18- has_changes : ${{ steps.sync.outputs.has_changes }}
18+ has_new_release : ${{ steps.check.outputs.has_new_release }}
19+ latest_version : ${{ steps.check.outputs.latest_version }}
20+
21+ steps :
22+ - name : Checkout fork
23+ uses : actions/checkout@v4
24+
25+ - name : Check for new upstream release
26+ id : check
27+ run : |
28+ # Get latest release from upstream
29+ LATEST=$(curl -s https://api.github.com/repos/21st-dev/1code/releases/latest | jq -r '.tag_name // empty')
30+
31+ if [ -z "$LATEST" ]; then
32+ echo "No releases found upstream"
33+ echo "has_new_release=false" >> $GITHUB_OUTPUT
34+ exit 0
35+ fi
36+
37+ echo "Upstream latest release: $LATEST"
38+
39+ # Get our last synced version (stored in a file)
40+ CURRENT=""
41+ if [ -f ".last-synced-version" ]; then
42+ CURRENT=$(cat .last-synced-version)
43+ fi
44+
45+ echo "Our last synced version: $CURRENT"
46+ echo "latest_version=$LATEST" >> $GITHUB_OUTPUT
47+
48+ # Check if we need to sync
49+ if [ "$LATEST" != "$CURRENT" ] || [ "${{ github.event.inputs.force_build }}" == "true" ]; then
50+ echo "New release detected or force build requested"
51+ echo "has_new_release=true" >> $GITHUB_OUTPUT
52+ else
53+ echo "Already up to date"
54+ echo "has_new_release=false" >> $GITHUB_OUTPUT
55+ fi
56+
57+ sync-and-build :
58+ needs : check-release
59+ if : needs.check-release.outputs.has_new_release == 'true'
60+ runs-on : ubuntu-latest
1961
2062 steps :
2163 - name : Checkout fork
@@ -29,41 +71,36 @@ jobs:
2971 git config user.name "github-actions[bot]"
3072 git config user.email "github-actions[bot]@users.noreply.github.com"
3173
32- - name : Add upstream remote
74+ - name : Add upstream and sync
75+ id : sync
3376 run : |
3477 git remote add upstream https://github.com/21st-dev/1code.git || true
3578 git fetch upstream main
3679
37- - name : Check for changes and sync
38- id : sync
39- run : |
40- # Get current HEAD
41- BEFORE=$(git rev-parse HEAD)
42-
4380 # Try to merge upstream changes
4481 if git merge upstream/main --no-edit; then
45- AFTER=$(git rev-parse HEAD)
46-
47- if [ "$BEFORE" != "$AFTER" ] || [ "${{ github.event.inputs.force_build }}" == "true" ]; then
48- echo "has_changes=true" >> $GITHUB_OUTPUT
49- echo "Changes detected or force build requested"
50- else
51- echo "has_changes=false" >> $GITHUB_OUTPUT
52- echo "No changes from upstream"
53- fi
82+ echo "Merge successful"
83+ echo "sync_success=true" >> $GITHUB_OUTPUT
5484 else
55- # Merge conflict - abort and skip this sync
56- echo "::warning::Merge conflict detected. Skipping sync. Please resolve manually."
85+ echo "::warning::Merge conflict detected. Please resolve manually."
5786 git merge --abort
58- echo "has_changes=false" >> $GITHUB_OUTPUT
87+ echo "sync_success=false" >> $GITHUB_OUTPUT
88+ exit 0
5989 fi
6090
91+ - name : Update last synced version
92+ if : steps.sync.outputs.sync_success == 'true'
93+ run : |
94+ echo "${{ needs.check-release.outputs.latest_version }}" > .last-synced-version
95+ git add .last-synced-version
96+ git commit -m "Sync with upstream ${{ needs.check-release.outputs.latest_version }}" || true
97+
6198 - name : Push changes
62- if : steps.sync.outputs.has_changes == 'true'
99+ if : steps.sync.outputs.sync_success == 'true'
63100 run : git push origin main
64101
65102 trigger-build :
66- needs : sync
67- if : needs.sync .outputs.has_changes == 'true'
103+ needs : [check-release, sync-and-build]
104+ if : needs.check-release .outputs.has_new_release == 'true'
68105 uses : ./.github/workflows/build-release.yml
69106 secrets : inherit
0 commit comments