mirror of https://github.com/fhem/fhem-mirror.git
132 lines
5.3 KiB
YAML
132 lines
5.3 KiB
YAML
name: Mirror from SVN
|
|
|
|
on:
|
|
push:
|
|
|
|
# Allows you to run this workflow manually from the Actions tab
|
|
workflow_dispatch:
|
|
|
|
schedule:
|
|
- cron: '21 */2 * * *' # every second hour to keep cache up to date
|
|
|
|
jobs:
|
|
# This workflow contains a single job called "build"
|
|
mirror:
|
|
# The type of runner that the job will run on
|
|
runs-on: ubuntu-latest
|
|
continue-on-error: true
|
|
|
|
env:
|
|
TRAVIS_REPO_SLUG: ${{ github.repository }}
|
|
steps:
|
|
|
|
- name: install git-svn package
|
|
run: |
|
|
sudo apt-get remove git git-man
|
|
sudo apt-get update
|
|
sudo apt-get install git-svn --no-install-recommends
|
|
|
|
- name: checkout mirror config branch
|
|
uses: actions/checkout@v2.4.0
|
|
|
|
- name: Get current date as seconds
|
|
id: get-date
|
|
run: |
|
|
echo "::set-output name=timestamp::$(/bin/date -u "+%Y%m%d%H" )"
|
|
shell: bash
|
|
|
|
- name: generate merged authors file
|
|
run: |
|
|
ls -RLa ${GITHUB_WORKSPACE}
|
|
cd /tmp
|
|
mkdir -p ${GITHUB_WORKSPACE}/authors
|
|
svn log https://svn.fhem.de/fhem --xml --quiet | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = $1 <>/' > ${GITHUB_WORKSPACE}/authors_svn.txt;
|
|
cat ${GITHUB_WORKSPACE}/authors.txt ${GITHUB_WORKSPACE}/authors_svn.txt | sort -u -k1,1 > ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
|
|
ls -la ${GITHUB_WORKSPACE}/authors/authors_merged.txt;
|
|
|
|
- name: Cache runners svn-2-git-fhem mirror directory
|
|
# Some room for improvement because we create a new cache on every run where a new ref is fetched, this isn't very nice, normaly weneed only the last one and it takes 7 days until they are deleted
|
|
id: cache-fhem
|
|
uses: actions/cache@v2.1.7
|
|
with:
|
|
path: ./src/fhem-mirror/.git
|
|
key: ${{ runner.os }}-fhemsvndir-${{ steps.get-date.outputs.timestamp }}
|
|
restore-keys: |
|
|
${{ runner.os }}-fhemsvndir-
|
|
|
|
#- name: 'Tar files'
|
|
# run: tar -cvf ${GITHUB_WORKSPACE}/svnMirror.tar ./src/fhem-mirror/
|
|
|
|
#- uses: actions/upload-artifact@v2
|
|
# with:
|
|
# name: mirror-artifact
|
|
# path: ./svnMirror.tar
|
|
|
|
- name: init mirror repository if it is not already a mirror
|
|
timeout-minutes: 1800
|
|
run: |
|
|
if [[ ! -d "${GITHUB_WORKSPACE}/src/fhem-mirror/.git" ]]; then
|
|
git init "${GITHUB_WORKSPACE}/src/fhem-mirror" ;
|
|
cd "${GITHUB_WORKSPACE}/src/fhem-mirror";
|
|
git svn init --trunk=trunk --tags=tags --prefix=svn/ https://svn.fhem.de/fhem;
|
|
git config --replace-all svn-remote.svn.preserve-empty-dirs "true" ;
|
|
git config --replace-all svn-remote.svn.placeholder-filename ".gitkeep" ;
|
|
git config --replace-all svn.authorsfile "${GITHUB_WORKSPACE}/authors_merged.txt" ;
|
|
# Run extra fetches after init, go pick up some base refs for the cache on first run only!
|
|
timeout 300 git svn -q fetch || timeout 300 git svn -q fetch || timeout 300 git svn -q fetch || true
|
|
else
|
|
echo "Current .git/config file content:";
|
|
cat ${GITHUB_WORKSPACE}/src/fhem-mirror/.git/config;
|
|
fi
|
|
|
|
- name: fetch svn to git master branch
|
|
id: fetchsvn
|
|
timeout-minutes: 1800
|
|
run: |
|
|
echo "::set-output name=SVN_FETCH_STATUS::incomplete"
|
|
cd "${GITHUB_WORKSPACE}/src/fhem-mirror";
|
|
RET=0
|
|
timeout 1200 git svn -q fetch || timeout 120 git svn -q fetch || RET=$?; # Limit each run to 20 minutes to not overload fhem.de servers and build cache in chunks
|
|
if [[ $RET == 0 ]]; then
|
|
git checkout travis
|
|
git branch -f master
|
|
git checkout master
|
|
git config --global user.email "actions@gitbhub.com"
|
|
git config --global user.name "Github Actions"
|
|
git reset --hard "remotes/svn/trunk"
|
|
echo "::set-output name=SVN_FETCH_STATUS::complete"
|
|
elif [[ $RET != 124 ]]; then
|
|
echo "::set-output name=SVN_FETCH_STATUS::error"
|
|
fi
|
|
|
|
- name: Verify no fetch error state
|
|
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'error' }}
|
|
run: |
|
|
echo "A permanent error occured"
|
|
exit 1
|
|
|
|
- name: Recreate tags from svn
|
|
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'complete' }}
|
|
working-directory: ./src/fhem-mirror
|
|
run: |
|
|
git for-each-ref --format="%(refname:lstrip=-1) %(objectname)" refs/remotes/svn/tags/FHEM_*_? \
|
|
| while read BRANCH REF
|
|
do
|
|
TAG_NAME=${BRANCH#FHEM_}
|
|
TAG_NAME=$(echo $TAG_NAME | sed 's/_/./g')
|
|
BODY="$(git log -1 --format=format:%B $REF)"
|
|
echo "branch=$BRANCH ref=$REF parent=$(git rev-parse $REF^) tagname=$TAG_NAME body=$BODY" >&2
|
|
git tag -a -f -m "$BODY" $TAG_NAME $REF^
|
|
# git branch -r -d origin/tags/$BRANCH
|
|
done
|
|
|
|
- name: Push force changes to master branch in same repo
|
|
if: ${{ steps.fetchsvn.outputs.SVN_FETCH_STATUS == 'complete' }}
|
|
uses: ad-m/github-push-action@v0.6.0
|
|
with:
|
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
branch: master
|
|
directory: ./src/fhem-mirror
|
|
force: true
|
|
tags: true
|