Skip to content

Commit

Permalink
create repository
Browse files Browse the repository at this point in the history
  • Loading branch information
ktmeaton committed Feb 18, 2021
1 parent a4c28c5 commit c5aed92
Show file tree
Hide file tree
Showing 5 changed files with 253 additions and 0 deletions.
58 changes: 58 additions & 0 deletions .github/workflows/release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#------------------------------------------------------------------------------
name: Release
#------------------------------------------------------------------------------
# Workflow conditions
on:
push:
tags:
- 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
#------------------------------------------------------------------------------
jobs:
#----------------------------------------------------------------------------
release-notes:
name: Release Notes 📰
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v2
with:
lfs: true
fetch-depth: 0

# Check 2 most recent tags, overwrites
- name: Tagged Release Notes
run: |
workflow/scripts/notes_release.sh `git tag | tail -n2 | head -n1` `git tag | tail -n1` > release-notes.md
- name: Upload Artifact
uses: actions/upload-artifact@v2
with:
name: release-notes
path: release-notes.md
retention-days: 7
#----------------------------------------------------------------------------
tagged-release:
name: Tagged Release
needs: [release-notes]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ubuntu-latest

steps:

- name: Download Release Notes
uses: actions/download-artifact@v2
with:
name: release-notes

- name: Create Release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: true
prerelease: false
body_path: release-notes.md
5 changes: 5 additions & 0 deletions docs/Release_0-1-0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Release v0.1.0

1. Create repository.
1. Add scripts.
1. Add release workflow.
57 changes: 57 additions & 0 deletions scripts/changelog_update.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
#!/bin/bash

NEW_VER=$1

#------------------------------
# Constants
BASE=`git log -r | head -n 1 | cut -d " " -f2`
TAGS=`git tag | tr '\n' ' '`
HEAD="HEAD"
SCRIPTS_DIR="scripts"
NOTES_DIR="docs/releases"
# -1 will impose no restrictions on the number of commits
MAX_COMMITS=-1

#------------------------------
# Parse Versions
arr_ver=($BASE $TAGS $HEAD)
num_ver=${#arr_ver[@]}

# An obscure way to reverse a list
arr_ver=(`for ((i=${num_ver}-1; i>=0; i--)); do echo ${arr_ver[$i]}; done | tr '\n' ' ' `)
prev_ver=${arr_ver[0]}
latest_ver=${arr_ver[1]}

#------------------------------
# Get New Ver
# By default next ver will be a new patch if not specified
if [[ -z $NEW_VER ]]; then
arr_latest_ver=( `echo $latest_ver | sed 's/v//g' | tr "." " "` )
major=${arr_latest_ver[0]}
minor=${arr_latest_ver[1]}
patch=${arr_latest_ver[2]}
NEW_VER="v"$major.$minor.`expr $patch + 1`
fi

#------------------------------
# Remove old changelog
new_ver_log=${NOTES_DIR}/"CHANGELOG_"`echo $NEW_VER | sed 's/v//g' | sed 's/\./-/g'`".md"

if [[ -f CHANGELOG.md ]]; then
echo "CHANGELOG.md will be moved to ${new_ver_log}"
mv CHANGELOG.md ${new_ver_log}
fi

#------------------------------
# Changelog Header
echo -e "# Changelog\n" > CHANGELOG.md

#------------------------------
# Write updates
for ((i=1; i<${num_ver}; i++));
do
cur_ver=${arr_ver[$i]}
echo "Comparing $cur_ver to $prev_ver"
${SCRIPTS_DIR}/notes_release.sh ${cur_ver} ${prev_ver} $MAX_COMMITS >> CHANGELOG.md
prev_ver=$cur_ver
done
36 changes: 36 additions & 0 deletions scripts/notes_commits.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#!/bin/bash

OLD_VER=$1
# Default is the first commit
first_commit=`git log -r | head -n 1 | cut -d " " -f2`
OLD_VER="$OLD_VER:=${first_commit}}"

echo $OLD_VER
exit

NEW_VER=$2
# Default number of commits to print is 20 (use -1 for infinite)
MAX_COMMITS=$3
MAX_COMMITS="${MAX_COMMITS:=20}"

# Fetch the remote origin url
origin=`git remote -v | grep -E "origin.*push" | sed 's/origin\t//g' | sed 's/ (push)//g' | sed 's/\.git//g'`
# Get the base url for commits
base="$origin/commit"

# Counter for commits to print
i=0;

git log --pretty=oneline --abbrev-commit ${OLD_VER}..${NEW_VER} | \
while read line;
do
if [[ $i -ge $MAX_COMMITS && $MAX_COMMITS != -1 ]]; then
break
fi
hash=`echo $line | cut -d " " -f 1`
msg=`echo $line | sed "s/$hash //g"`
echo -e "* [\`\`\`$hash\`\`\`]($BASE/$hash) $msg";

# Increment commit counter
i=`expr $i + 1`
done;
97 changes: 97 additions & 0 deletions scripts/notes_release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#!/bin/bash

# First ="a58299c51609ad"
OLD_VER=$1
NEW_VER=$2
# if MAX_COMMITS not specified, will use default in notes_commits script
MAX_COMMITS=$3

SCRIPTS_DIR=workflow/scripts
NOTES_DIR=docs/releases
REPO="ktmeaton/plague-phylogeography"

# ----------------
# PR info

# Retieve PR hashes
arr_pr_commits=( `git ls-remote origin 'pull/*/head' | awk '{print substr($1,1,7)}' | tr '\n' ' ' ` )
pr_id=( `git ls-remote origin 'pull/*/head' | cut -f 2 | cut -d "/" -f 3 | tr '\n' ' ' ` )
num_pr=${#arr_pr_commits[@]}

# Retrieve commit hashes
arr_new_ver_commits=( $(${SCRIPTS_DIR}/notes_commits.sh ${OLD_VER} ${NEW_VER} | cut -d '`' -f 4 | tr '\n' ' ') )

arr_ver_pr=()
# Search for matching PRs
for commit in ${arr_new_ver_commits[@]}; do
for ((i=0; i<num_pr; i++)); do
pr=${arr_pr_commits[$i]}
if [[ $pr == $commit ]]; then
ver_pr=${pr_id[$i]};
arr_ver_pr=(${arr_ver_pr[@]} $ver_pr)
fi;
done
done

# ----------------
# Version Parsing
if [[ $NEW_VER == "HEAD" ]]; then
target_ver=$OLD_VER
else
target_ver=$NEW_VER
fi

arr_ver=(`echo ${target_ver} | sed 's/v//g' | tr '.' ' '`)
major=${arr_ver[0]}
minor=${arr_ver[1]}
patch=${arr_ver[2]}

if [[ $NEW_VER == "HEAD" ]]; then
rel="Development"
else
rel="Release v$major.$minor.$patch"
fi

# ----------------
# Release Header
echo "## ${rel}"
echo

# ----------------
# PR Header

# If a pull request was found
if [[ $ver_pr ]]; then
echo "### Pull Requests"
echo

for pr in ${arr_ver_pr[@]}; do
pr_title=`curl -s https://api.github.com/repos/${REPO}/pulls/2 | grep title | cut -d '"' -f 4 `
echo "* [\`\`\`pull/${pr}\`\`\`](https://github.com/${REPO}/pull/${pr}) ${pr_title}"
done
echo
fi

# ----------------
# Notes Header

# If on the head, look at 'next' release notes
if [[ $NEW_VER == "HEAD" ]]; then
patch=`expr $patch + 1`
fi

target_notes=${NOTES_DIR}/Release_$major-$minor-$patch.md

if [[ -f $target_notes ]]; then
echo "### Notes"
echo
grep -r '[0-9]\. ' $target_notes
echo
fi

# ----------------
# Commits Header
echo "### Commits"
echo
${SCRIPTS_DIR}/notes_commits.sh ${OLD_VER} ${NEW_VER} ${MAX_COMMITS}
echo

0 comments on commit c5aed92

Please sign in to comment.