parent
992b50e382
commit
d7c65303dd
@ -0,0 +1,98 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
### |
||||
### Quick-start build-and-run script for RuneLite, merging dev branches for a |
||||
### custom build. |
||||
### |
||||
|
||||
# OPTIONS |
||||
RUNELITE_REPO_DIR="$HOME/Documents/git/runelite" |
||||
BRANCHES_TO_MERGE=( |
||||
add-tablecomponent-to-overlay-ui |
||||
# dev-update-opponent-info-table-bounty-target |
||||
lookup-players-that-despawn |
||||
#differentiate-gauntlet-loots # conflicts with discord sub-regions |
||||
charlie-texts |
||||
discord-sub-regions |
||||
toa-consumables |
||||
multi-step-cryptic-spade |
||||
quest-speedrunning-widget-overlays |
||||
) |
||||
MAX_AGE_BEFORE_REBUILD="$(( 24 * 60 * 60 ))" # 1 day |
||||
UPSTREAM_REMOTE='upstream' |
||||
UPSTREAM_BRANCH='master' |
||||
for branch in "${BRANCHES_TO_MERGE[@]}"; do |
||||
if grep -qE '^internal' <<< "$branch"; then |
||||
UPSTREAM_REMOTE='internal-upstream' |
||||
UPSTREAM_BRANCH='internal' |
||||
break |
||||
fi |
||||
done |
||||
|
||||
# Show exit output on script completion |
||||
# On script error, wait for user input to close |
||||
function orl_exit { |
||||
exit_code=$? |
||||
if [ "$exit_code" -eq 0 ]; then |
||||
echo 'Running runelite!' |
||||
sleep 3 |
||||
else |
||||
echo 'An error occurred while running command' |
||||
echo " ${BASH_COMMAND}" |
||||
echo 'Press any key to exit...' |
||||
read -n1 -r |
||||
fi |
||||
} |
||||
trap orl_exit EXIT |
||||
|
||||
RUNELITE_TARGET_COMMIT_FILENAME='runelite-client/target/commit' |
||||
function build_client { |
||||
# Update local dev branch and build |
||||
git checkout dev || git checkout -b dev upstream/master |
||||
git reset --hard upstream/master |
||||
git merge --no-gpg-sign --no-edit "${BRANCHES_TO_MERGE[@]}" || exit 1 |
||||
mvn clean package -DskipTests -U || exit 1 |
||||
git checkout - |
||||
echo "$UPSTREAM_MASTER_COMMIT" > "$RUNELITE_TARGET_COMMIT_FILENAME" |
||||
} |
||||
|
||||
set -e |
||||
|
||||
# go to repo |
||||
cd "$RUNELITE_REPO_DIR" |
||||
|
||||
# check if jar is up-to-date with latest upstream tag |
||||
git fetch -q "$UPSTREAM_REMOTE" |
||||
UPSTREAM_MASTER_COMMIT="$(git rev-parse "$UPSTREAM_REMOTE"/"$UPSTREAM_BRANCH")" |
||||
# TODO: use `git describe [--abbrev=0]` ? (may not work due to point releases) |
||||
# TODO: add --exclude to ^ to avoid describing point releases (TODO: don't do that--we need point release for latest hub plugins) |
||||
PREVIOUS_TAG="$(git tag -l | grep -v 'internal' | sort -rV | head -n 1 | sed -r -e 's/.*-(.+)/\1/')" |
||||
MAJOR_VERSION="$(cut -d '.' -f 1 <<< "$PREVIOUS_TAG")" |
||||
MINOR_VERSION="$(cut -d '.' -f 2 <<< "$PREVIOUS_TAG")" |
||||
PATCH_VERSION="$(cut -d '.' -f 3 <<< "$PREVIOUS_TAG")" |
||||
NEXT_VERSION="${MAJOR_VERSION}.${MINOR_VERSION}.$((PATCH_VERSION + 1))" |
||||
SHADED_JAR=runelite-client/target/client-"${NEXT_VERSION}"-SNAPSHOT-shaded.jar |
||||
|
||||
# build a new client if one doesn't already exist or if the current shaded jar |
||||
# is older than the max rebuild age and is behind upstream master's commit |
||||
if ! [ -f "$SHADED_JAR" ]; then |
||||
echo "No build exists for current snapshot; rebuilding" |
||||
build_client |
||||
else |
||||
SHADED_JAR_MTIME="$(stat -c %Y "$SHADED_JAR")" |
||||
CURRENT_MTIME="$(date +%s)" |
||||
if [ "$(( "$CURRENT_MTIME" - "$SHADED_JAR_MTIME" ))" -gt "$MAX_AGE_BEFORE_REBUILD" ]; then |
||||
if ! [ -f "$RUNELITE_TARGET_COMMIT_FILENAME" ] \ |
||||
|| [ "$UPSTREAM_MASTER_COMMIT" != "$(cat "$RUNELITE_TARGET_COMMIT_FILENAME")" ]; then |
||||
echo "Current built client is old enough for rebuild and master has new commits; rebuilding" |
||||
build_client |
||||
else |
||||
echo "Current built client is old enough for rebuild, but there no new commits to build; skipping rebuild" |
||||
fi |
||||
else |
||||
echo "Current built client is not beyond max age before rebuild; skipping rebuild" |
||||
fi |
||||
fi |
||||
|
||||
# run the dev client |
||||
nohup java -ea -Drunelite.pluginhub.version="${PREVIOUS_TAG}" -jar runelite-client/target/client-"${NEXT_VERSION}"-SNAPSHOT-shaded.jar --developer-mode --debug </dev/null >/dev/null 2>&1 & |
@ -0,0 +1,175 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
### |
||||
### Helper script for quickly setting up a git branch and directory/file |
||||
### structure for creating a new release post for runelite.net |
||||
### |
||||
|
||||
set -e |
||||
|
||||
description() { |
||||
echo 'Creates a new branch and file structure for the weekly release blog post in the runelite.net repository' |
||||
} |
||||
helpdoc() { |
||||
echo |
||||
echo "usage: $(basename "$0") [<options>]" |
||||
echo |
||||
echo 'options:' |
||||
echo ' -a <author> first name to use, defaults to `git config user.name'"'" |
||||
echo ' -f <version> version number to generate shortlog from, defaults to previous' |
||||
echo ' major release' |
||||
echo ' -n <version> version number to increment to, defaults to a patch version' |
||||
echo ' bump' |
||||
echo ' -p <path> path of runelite repository relative to runelite.net repo,' |
||||
echo ' defaults to `../runelite'"'" |
||||
echo ' -t mark the blog post for today'"'"'s date, not tomorrow'"'"'s date' |
||||
} |
||||
|
||||
# process args |
||||
while getopts ':a:f:n:p:th' arg; do |
||||
case "$arg" in |
||||
a) |
||||
blog_author="$OPTARG" |
||||
;; |
||||
f) |
||||
previous_version="$OPTARG" |
||||
;; |
||||
h) |
||||
description |
||||
helpdoc |
||||
exit 0 |
||||
;; |
||||
n) |
||||
version="$OPTARG" |
||||
;; |
||||
p) |
||||
runelite_repo_path="$OPTARG" |
||||
;; |
||||
t) |
||||
blog_date='today' |
||||
;; |
||||
\?) |
||||
echo "Invalid option: ${OPTARG}" >&2 |
||||
helpdoc |
||||
exit 1 |
||||
;; |
||||
:) |
||||
echo "Option -${OPTARG} requires an argument." >&2 |
||||
helpdoc |
||||
exit 1 |
||||
;; |
||||
esac |
||||
done |
||||
|
||||
# remove args processed with getopts |
||||
shift $(( OPTIND-1 )) |
||||
|
||||
# ensure shell is in runelite.net repo, navigate to root dir if necessary, fetch upstream |
||||
if ! (git remote -v | grep -q -E 'upstream[[:space:]]+git@github.com:runelite/runelite.net.git'); then |
||||
echo 'You do not appear to be in a clone of the runelite.net repository!' >&2 |
||||
exit 1 |
||||
fi |
||||
cd "$(git rev-parse --show-toplevel)" |
||||
git fetch -q upstream |
||||
|
||||
# ensure runelite repo path is correct, fetch upstream in runelite repo |
||||
default_path='../runelite' |
||||
repo_path="${runelite_repo_path:-$default_path}" |
||||
|
||||
if ! (git -C "$repo_path" remote -v | grep -q -E 'upstream[[:space:]]+git@github.com:runelite/runelite.git'); then |
||||
echo "The repo path '${repo_path}' does not appear to be a clone of the runelite repository!" >&2 |
||||
exit 1 |
||||
fi |
||||
(git -C "$repo_path" git fetch -q upstream) >/dev/null |
||||
|
||||
# validate versions |
||||
latest_tag="$(git -C "$repo_path" tag -l | grep -v 'internal' | sort -rV | head -n 1 | sed -r -e 's/(.*-)([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+).*/\1\2/')" |
||||
LATEST_TAG_VERSION="${latest_tag##*-}" |
||||
if [ -z "$previous_version" ]; then |
||||
: # no-op |
||||
elif ! [[ "$previous_version" =~ ^[1-9][[:digit:]]*\.([[:digit:]]|[1-9][[:digit:]]*)\.([[:digit:]]|[1-9][[:digit:]]*)(\.([[:digit:]]|[1-9][[:digit:]]*))?$ ]]; then |
||||
echo "Invalid previous version number: '$previous_version'" >&2 |
||||
helpdoc |
||||
exit 1 |
||||
else |
||||
latest_tag="runelite-parent-${previous_version}" |
||||
fi |
||||
|
||||
if [ -z "$version" ]; then |
||||
patch_number="${LATEST_TAG_VERSION##*.}" |
||||
version="${LATEST_TAG_VERSION%.*}.$((patch_number + 1))" |
||||
elif ! [[ "$version" =~ ^[1-9][[:digit:]]*\.[1-9][[:digit:]]*\.[1-9][[:digit:]]*$ ]]; then |
||||
echo "Invalid version number: '$version'" >&2 |
||||
helpdoc |
||||
exit 1 |
||||
fi |
||||
|
||||
NEW_VERSION="$version" |
||||
|
||||
# get data, define vars |
||||
git_username_trimmed="$(git config user.name | cut -d ' ' -f '1')" |
||||
default_date='+1 day' |
||||
BLOG_DATE="${blog_date:-$default_date}" |
||||
BLOG_AUTHOR="${blog_author:-$git_username_trimmed}" |
||||
git_shortlog_options=(--no-merges --perl-regexp '--author=^((?!Runelite auto updater|RuneLite Cache-Code Autoupdater).*)$' "${latest_tag}"..upstream/master) |
||||
SHORTLOG_SINCE_LAST_TAG="$(git -C "$repo_path" --no-pager shortlog "${git_shortlog_options[@]}")" |
||||
NUMBER_OF_CONTRIBUTORS="$(git -C "$repo_path" --no-pager shortlog -s "${git_shortlog_options[@]}" | wc -l)" |
||||
BLOG_POST_DATE="$(date -d "${BLOG_DATE} 10:00am" +'%Y-%m-%d-%H-%M')" |
||||
|
||||
# create new branch, deleting branch of same name if it exists |
||||
git checkout master >/dev/null 2>&1 |
||||
if git branch | grep -q "$NEW_VERSION"; then |
||||
git branch -D "$NEW_VERSION" >/dev/null 2>&1 |
||||
fi |
||||
(git pull --ff-only && git checkout -b "$NEW_VERSION") >/dev/null 2>&1 |
||||
|
||||
# create dirs and files |
||||
relative_img_path="img/blog/${NEW_VERSION}-Release" |
||||
img_name="placeholder.png" |
||||
IMAGE_DIR="public/${relative_img_path}/${img_name}" |
||||
PLACEHOLDER_IMAGE_PATH="${relative_img_path}/${img_name}" |
||||
BLOG_FILE_PATH="src/_posts/${BLOG_POST_DATE}-${NEW_VERSION}-Release.md" |
||||
|
||||
install -Dv /dev/null "${IMAGE_DIR}" >/dev/null |
||||
tee "${BLOG_FILE_PATH}" >/dev/null 2>&1 <<EOF |
||||
--- |
||||
title: '${NEW_VERSION} Release' |
||||
description: 'TODO: A major feature, an important bug fix, and other important news' |
||||
author: ${BLOG_AUTHOR} |
||||
--- |
||||
|
||||
TODO: The RuneLite plugin now has a new major feature. Thanks to [@Test](https://github.com/test) for |
||||
this contribution. |
||||
|
||||
TODO: ![Alt text for this new feature](/${PLACEHOLDER_IMAGE_PATH}) |
||||
|
||||
TODO: Another plugin has a new feature. Thanks to [@Example](https://github.com/example) for this |
||||
contribution. |
||||
|
||||
TODO: ![Alt text for this new feature](/${PLACEHOLDER_IMAGE_PATH}) |
||||
|
||||
TODO: Other information, such as more major features (with or without images), important news, or other |
||||
information such as removal of features/plugins can be placed here. |
||||
|
||||
There are also several smaller improvements and bug fixes, including: |
||||
|
||||
- TODO: use real changes below |
||||
- The RuneLite plugin will no longer cause the client to crash |
||||
- Obstacle highlighting has been added for the Test area |
||||
- The idle notifier will notify you when you've stopped writing code |
||||
- etc... |
||||
|
||||
Enjoy! |
||||
|
||||
\\- ${BLOG_AUTHOR} |
||||
|
||||
### New commits |
||||
|
||||
We had ${NUMBER_OF_CONTRIBUTORS} contributors this release! |
||||
|
||||
\`\`\` |
||||
${SHORTLOG_SINCE_LAST_TAG} |
||||
\`\`\` |
||||
EOF |
||||
|
||||
echo 'Blog branch and structure created!' |
Loading…
Reference in new issue