From 476abc9dad5b2dab6e9109a20a73557e7f992ae9 Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Sat, 1 May 2021 17:34:12 -0500 Subject: [PATCH 1/7] docs: Added table of contents #845 --- .github/workflows/generate-toc.yml | 20 ++++++++++++++++++++ README.md | 5 +++++ 2 files changed, 25 insertions(+) create mode 100644 .github/workflows/generate-toc.yml diff --git a/.github/workflows/generate-toc.yml b/.github/workflows/generate-toc.yml new file mode 100644 index 00000000..976746fc --- /dev/null +++ b/.github/workflows/generate-toc.yml @@ -0,0 +1,20 @@ +name: Generate README table of contents +on: + push: + branches: + - master + paths: + - README.md +jobs: + generate: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v2 + - run: | + curl https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc -o gh-md-toc + chmod a+x gh-md-toc + ./gh-md-toc --insert --no-backup README.md + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Auto update markdown TOC \ No newline at end of file diff --git a/README.md b/README.md index 7d772c44..01b2390a 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,11 @@ With that you can easily view the logs, stop, or re-start the container: > Be sure to always include `-e EULA=TRUE` in your commands, as Mojang/Microsoft requires EULA acceptance. +**TABLE OF CONTENTS** + + + + ## Looking for a Bedrock Dedicated Server For Minecraft clients running on consoles, mobile, or native Windows, you'll need to From b09073716265db41f4769973aad357931ef90c70 Mon Sep 17 00:00:00 2001 From: itzg Date: Sat, 1 May 2021 22:34:32 +0000 Subject: [PATCH 2/7] Auto update markdown TOC --- README.md | 102 +++++++++++++++ gh-md-toc | 361 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 463 insertions(+) create mode 100755 gh-md-toc diff --git a/README.md b/README.md index 01b2390a..57f98170 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,108 @@ With that you can easily view the logs, stop, or re-start the container: **TABLE OF CONTENTS** + * [Looking for a Bedrock Dedicated Server](#looking-for-a-bedrock-dedicated-server) + * [Interacting with the server](#interacting-with-the-server) + * [Data Directory](#data-directory) + * [Attaching data directory to host filesystem](#attaching-data-directory-to-host-filesystem) + * [Converting anonymous /data volume to named volume](#converting-anonymous-data-volume-to-named-volume) + * [Versions](#versions) + * [Running Minecraft server on different Java version](#running-minecraft-server-on-different-java-version) + * [Deprecated Image Tags](#deprecated-image-tags) + * [Healthcheck](#healthcheck) + * [Deployment Templates and Examples](#deployment-templates-and-examples) + * [Helm Charts](#helm-charts) + * [Examples](#examples) + * [Amazon Web Services (AWS) Deployment](#amazon-web-services-aws-deployment) + * [Running a Forge Server](#running-a-forge-server) + * [Managing mods](#managing-mods) + * [Running a Bukkit/Spigot server](#running-a-bukkitspigot-server) + * [Running a Paper server](#running-a-paper-server) + * [Running a Tuinity server](#running-a-tuinity-server) + * [Running an Airplane server](#running-an-airplane-server) + * [Running a Purpur server](#running-a-purpur-server) + * [Running a Yatopia server](#running-a-yatopia-server) + * [Running a Magma server](#running-a-magma-server) + * [Running a Mohist server](#running-a-mohist-server) + * [Running a Catserver type server](#running-a-catserver-type-server) + * [Running a server with a Feed the Beast modpack](#running-a-server-with-a-feed-the-beast-modpack) + * [Environment Variables:](#environment-variables) + * [Upgrading](#upgrading) + * [Example](#example) + * [Running a server with a CurseForge modpack](#running-a-server-with-a-curseforge-modpack) + * [Modpack data directory](#modpack-data-directory) + * [Buggy start scripts](#buggy-start-scripts) + * [Fixing "unable to launch forgemodloader"](#fixing-unable-to-launch-forgemodloader) + * [Running a SpongeVanilla server](#running-a-spongevanilla-server) + * [Running a Fabric Server](#running-a-fabric-server) + * [Using the /data volume](#using-the-data-volume) + * [Optional plugins, mods, and config attach points](#optional-plugins-mods-and-config-attach-points) + * [Auto-downloading SpigotMC/Bukkit/PaperMC plugins](#auto-downloading-spigotmcbukkitpapermc-plugins) + * [Replacing variables inside configs](#replacing-variables-inside-configs) + * [Running with a custom server JAR](#running-with-a-custom-server-jar) + * [Force re-download of the server file](#force-re-download-of-the-server-file) + * [Using Docker Compose](#using-docker-compose) + * [Server configuration](#server-configuration) + * [Server name](#server-name) + * [Server port](#server-port) + * [Difficulty](#difficulty) + * [Whitelist Players](#whitelist-players) + * [Op/Administrator Players](#opadministrator-players) + * [Server icon](#server-icon) + * [Rcon](#rcon) + * [Query](#query) + * [Max players](#max-players) + * [Max world size](#max-world-size) + * [Allow Nether](#allow-nether) + * [Announce Player Achievements](#announce-player-achievements) + * [Enable Command Block](#enable-command-block) + * [Force Gamemode](#force-gamemode) + * [Generate Structures](#generate-structures) + * [Hardcore](#hardcore) + * [Snooper](#snooper) + * [Max Build Height](#max-build-height) + * [Max Tick Time](#max-tick-time) + * [Spawn Animals](#spawn-animals) + * [Spawn Monsters](#spawn-monsters) + * [Spawn NPCs](#spawn-npcs) + * [Set spawn protection](#set-spawn-protection) + * [View Distance](#view-distance) + * [Level Seed](#level-seed) + * [Game Mode](#game-mode) + * [Message of the Day](#message-of-the-day) + * [PVP Mode](#pvp-mode) + * [Level Type and Generator Settings](#level-type-and-generator-settings) + * [Custom Server Resource Pack](#custom-server-resource-pack) + * [World Save Name](#world-save-name) + * [Downloadable world](#downloadable-world) + * [Cloning world from a container path](#cloning-world-from-a-container-path) + * [Overwrite world on start](#overwrite-world-on-start) + * [Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers](#downloadable-modplugin-pack-for-forge-bukkit-and-spigot-servers) + * [Remove old mods/plugins](#remove-old-modsplugins) + * [Online mode](#online-mode) + * [Allow flight](#allow-flight) + * [Other server property mappings](#other-server-property-mappings) + * [Miscellaneous Options](#miscellaneous-options) + * [Running as alternate user/group ID](#running-as-alternate-usergroup-id) + * [Memory Limit](#memory-limit) + * [JVM Options](#jvm-options) + * [Interactive and Color Console](#interactive-and-color-console) + * [OpenJ9 Specific Options](#openj9-specific-options) + * [Enabling rolling logs](#enabling-rolling-logs) + * [Timezone Configuration](#timezone-configuration) + * [Enable Remote JMX for Profiling](#enable-remote-jmx-for-profiling) + * [Enable Aikar's Flags](#enable-aikars-flags) + * [HTTP Proxy](#http-proxy) + * [Using "noconsole" option](#using-noconsole-option) + * [Explicitly disable GUI](#explicitly-disable-gui) + * [Stop Duration](#stop-duration) + * [Autopause](#autopause) + * [Description](#description) + * [Enabling Autopause](#enabling-autopause) + * [Running on RaspberryPi](#running-on-raspberrypi) + + + ## Looking for a Bedrock Dedicated Server diff --git a/gh-md-toc b/gh-md-toc new file mode 100755 index 00000000..ef389e71 --- /dev/null +++ b/gh-md-toc @@ -0,0 +1,361 @@ +#!/usr/bin/env bash + +# +# Steps: +# +# 1. Download corresponding html file for some README.md: +# curl -s $1 +# +# 2. Discard rows where no substring 'user-content-' (github's markup): +# awk '/user-content-/ { ... +# +# 3.1 Get last number in each row like ' ... sitemap.js.*<\/h/)+2, RLENGTH-5) +# +# 5. Find anchor and insert it inside "(...)": +# substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8) +# + +gh_toc_version="0.7.0" + +gh_user_agent="gh-md-toc v$gh_toc_version" + +# +# Download rendered into html README.md by its url. +# +# +gh_toc_load() { + local gh_url=$1 + + if type curl &>/dev/null; then + curl --user-agent "$gh_user_agent" -s "$gh_url" + elif type wget &>/dev/null; then + wget --user-agent="$gh_user_agent" -qO- "$gh_url" + else + echo "Please, install 'curl' or 'wget' and try again." + exit 1 + fi +} + +# +# Converts local md file into html by GitHub +# +# -> curl -X POST --data '{"text": "Hello world github/linguist#1 **cool**, and #1!"}' https://api.github.com/markdown +#

Hello world github/linguist#1 cool, and #1!

'" +gh_toc_md2html() { + local gh_file_md=$1 + URL=https://api.github.com/markdown/raw + + if [ ! -z "$GH_TOC_TOKEN" ]; then + TOKEN=$GH_TOC_TOKEN + else + TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" + if [ -f "$TOKEN_FILE" ]; then + TOKEN="$(cat $TOKEN_FILE)" + fi + fi + if [ ! -z "${TOKEN}" ]; then + AUTHORIZATION="Authorization: token ${TOKEN}" + fi + + # echo $URL 1>&2 + OUTPUT=$(curl -s \ + --user-agent "$gh_user_agent" \ + --data-binary @"$gh_file_md" \ + -H "Content-Type:text/plain" \ + -H "$AUTHORIZATION" \ + "$URL") + + if [ "$?" != "0" ]; then + echo "XXNetworkErrorXX" + fi + if [ "$(echo "${OUTPUT}" | awk '/API rate limit exceeded/')" != "" ]; then + echo "XXRateLimitXX" + else + echo "${OUTPUT}" + fi +} + + +# +# Is passed string url +# +gh_is_url() { + case $1 in + https* | http*) + echo "yes";; + *) + echo "no";; + esac +} + +# +# TOC generator +# +gh_toc(){ + local gh_src=$1 + local gh_src_copy=$1 + local gh_ttl_docs=$2 + local need_replace=$3 + local no_backup=$4 + local no_footer=$5 + + if [ "$gh_src" = "" ]; then + echo "Please, enter URL or local path for a README.md" + exit 1 + fi + + + # Show "TOC" string only if working with one document + if [ "$gh_ttl_docs" = "1" ]; then + + echo "Table of Contents" + echo "=================" + echo "" + gh_src_copy="" + + fi + + if [ "$(gh_is_url "$gh_src")" == "yes" ]; then + gh_toc_load "$gh_src" | gh_toc_grab "$gh_src_copy" + if [ "${PIPESTATUS[0]}" != "0" ]; then + echo "Could not load remote document." + echo "Please check your url or network connectivity" + exit 1 + fi + if [ "$need_replace" = "yes" ]; then + echo + echo "!! '$gh_src' is not a local file" + echo "!! Can't insert the TOC into it." + echo + fi + else + local rawhtml=$(gh_toc_md2html "$gh_src") + if [ "$rawhtml" == "XXNetworkErrorXX" ]; then + echo "Parsing local markdown file requires access to github API" + echo "Please make sure curl is installed and check your network connectivity" + exit 1 + fi + if [ "$rawhtml" == "XXRateLimitXX" ]; then + echo "Parsing local markdown file requires access to github API" + echo "Error: You exceeded the hourly limit. See: https://developer.github.com/v3/#rate-limiting" + TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" + echo "or place GitHub auth token here: ${TOKEN_FILE}" + exit 1 + fi + local toc=`echo "$rawhtml" | gh_toc_grab "$gh_src_copy"` + echo "$toc" + if [ "$need_replace" = "yes" ]; then + if grep -Fxq "" $gh_src && grep -Fxq "" $gh_src; then + echo "Found markers" + else + echo "You don't have or in your file...exiting" + exit 1 + fi + local ts="<\!--ts-->" + local te="<\!--te-->" + local dt=`date +'%F_%H%M%S'` + local ext=".orig.${dt}" + local toc_path="${gh_src}.toc.${dt}" + local toc_footer="" + # http://fahdshariff.blogspot.ru/2012/12/sed-mutli-line-replacement-between-two.html + # clear old TOC + sed -i${ext} "/${ts}/,/${te}/{//!d;}" "$gh_src" + # create toc file + echo "${toc}" > "${toc_path}" + if [ "${no_footer}" != "yes" ]; then + echo -e "\n${toc_footer}\n" >> "$toc_path" + fi + + # insert toc file + if [[ "`uname`" == "Darwin" ]]; then + sed -i "" "/${ts}/r ${toc_path}" "$gh_src" + else + sed -i "/${ts}/r ${toc_path}" "$gh_src" + fi + echo + if [ "${no_backup}" = "yes" ]; then + rm ${toc_path} ${gh_src}${ext} + fi + echo "!! TOC was added into: '$gh_src'" + if [ -z "${no_backup}" ]; then + echo "!! Origin version of the file: '${gh_src}${ext}'" + echo "!! TOC added into a separate file: '${toc_path}'" + fi + echo + fi + fi +} + +# +# Grabber of the TOC from rendered html +# +# $1 - a source url of document. +# It's need if TOC is generated for multiple documents. +# +gh_toc_grab() { + common_awk_script=' + modified_href = "" + split(href, chars, "") + for (i=1;i <= length(href); i++) { + c = chars[i] + res = "" + if (c == "+") { + res = " " + } else { + if (c == "%") { + res = "\\x" + } else { + res = c "" + } + } + modified_href = modified_href res + } + print sprintf("%*s", (level-1)*3, "") "* [" text "](" gh_url modified_href ")" + ' + if [ `uname -s` == "OS/390" ]; then + grepcmd="pcregrep -o" + echoargs="" + awkscript='{ + level = substr($0, length($0), 1) + text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) + href = substr($0, match($0, "href=\"([^\"]+)?\"")+6, RLENGTH-7) + '"$common_awk_script"' + }' + else + grepcmd="grep -Eo" + echoargs="-e" + awkscript='{ + level = substr($0, length($0), 1) + text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) + href = substr($0, match($0, "href=\"[^\"]+?\"")+6, RLENGTH-7) + '"$common_awk_script"' + }' + fi + href_regex='href=\"[^\"]+?\"' + + # if closed is on the new line, then move it on the prev line + # for example: + # was: The command foo1 + # + # became: The command foo1 + sed -e ':a' -e 'N' -e '$!ba' -e 's/\n<\/h/<\/h/g' | + + # find strings that corresponds to template + $grepcmd '//g' | sed 's/<\/code>//g' | + + # remove g-emoji + sed 's/]*[^<]*<\/g-emoji> //g' | + + # now all rows are like: + # ... / placeholders" + echo " $app_name - Create TOC for markdown from STDIN" + echo " $app_name --help Show help" + echo " $app_name --version Show version" + return + fi + + if [ "$1" = '--version' ]; then + echo "$gh_toc_version" + echo + echo "os: `lsb_release -d | cut -f 2`" + echo "kernel: `cat /proc/version`" + echo "shell: `$SHELL --version`" + echo + for tool in curl wget grep awk sed; do + printf "%-5s: " $tool + echo `$tool --version | head -n 1` + done + return + fi + + if [ "$1" = "-" ]; then + if [ -z "$TMPDIR" ]; then + TMPDIR="/tmp" + elif [ -n "$TMPDIR" -a ! -d "$TMPDIR" ]; then + mkdir -p "$TMPDIR" + fi + local gh_tmp_md + if [ `uname -s` == "OS/390" ]; then + local timestamp=$(date +%m%d%Y%H%M%S) + gh_tmp_md="$TMPDIR/tmp.$timestamp" + else + gh_tmp_md=$(mktemp $TMPDIR/tmp.XXXXXX) + fi + while read input; do + echo "$input" >> "$gh_tmp_md" + done + gh_toc_md2html "$gh_tmp_md" | gh_toc_grab "" + return + fi + + if [ "$1" = '--insert' ]; then + need_replace="yes" + shift + fi + + if [ "$1" = '--no-backup' ]; then + need_replace="yes" + no_backup="yes" + shift + fi + + if [ "$1" = '--hide-footer' ]; then + need_replace="yes" + no_footer="yes" + shift + fi + + for md in "$@" + do + echo "" + gh_toc "$md" "$#" "$need_replace" "$no_backup" "$no_footer" + done + + echo "" + echo "Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)" +} + +# +# Entry point +# +gh_toc_app "$@" + From 8b380894f928e20fb8d2021d7a68aa8abf17b8b3 Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Sat, 1 May 2021 17:36:53 -0500 Subject: [PATCH 3/7] ci: gitignore the gh-md-toc script --- .gitignore | 3 +- gh-md-toc | 361 ----------------------------------------------------- 2 files changed, 2 insertions(+), 362 deletions(-) delete mode 100755 gh-md-toc diff --git a/.gitignore b/.gitignore index 4092689f..574e0d91 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /data/ /.idea/ -*.iml \ No newline at end of file +*.iml +/gh-md-toc \ No newline at end of file diff --git a/gh-md-toc b/gh-md-toc deleted file mode 100755 index ef389e71..00000000 --- a/gh-md-toc +++ /dev/null @@ -1,361 +0,0 @@ -#!/usr/bin/env bash - -# -# Steps: -# -# 1. Download corresponding html file for some README.md: -# curl -s $1 -# -# 2. Discard rows where no substring 'user-content-' (github's markup): -# awk '/user-content-/ { ... -# -# 3.1 Get last number in each row like ' ... sitemap.js.*<\/h/)+2, RLENGTH-5) -# -# 5. Find anchor and insert it inside "(...)": -# substr($0, match($0, "href=\"[^\"]+?\" ")+6, RLENGTH-8) -# - -gh_toc_version="0.7.0" - -gh_user_agent="gh-md-toc v$gh_toc_version" - -# -# Download rendered into html README.md by its url. -# -# -gh_toc_load() { - local gh_url=$1 - - if type curl &>/dev/null; then - curl --user-agent "$gh_user_agent" -s "$gh_url" - elif type wget &>/dev/null; then - wget --user-agent="$gh_user_agent" -qO- "$gh_url" - else - echo "Please, install 'curl' or 'wget' and try again." - exit 1 - fi -} - -# -# Converts local md file into html by GitHub -# -# -> curl -X POST --data '{"text": "Hello world github/linguist#1 **cool**, and #1!"}' https://api.github.com/markdown -#

Hello world github/linguist#1 cool, and #1!

'" -gh_toc_md2html() { - local gh_file_md=$1 - URL=https://api.github.com/markdown/raw - - if [ ! -z "$GH_TOC_TOKEN" ]; then - TOKEN=$GH_TOC_TOKEN - else - TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" - if [ -f "$TOKEN_FILE" ]; then - TOKEN="$(cat $TOKEN_FILE)" - fi - fi - if [ ! -z "${TOKEN}" ]; then - AUTHORIZATION="Authorization: token ${TOKEN}" - fi - - # echo $URL 1>&2 - OUTPUT=$(curl -s \ - --user-agent "$gh_user_agent" \ - --data-binary @"$gh_file_md" \ - -H "Content-Type:text/plain" \ - -H "$AUTHORIZATION" \ - "$URL") - - if [ "$?" != "0" ]; then - echo "XXNetworkErrorXX" - fi - if [ "$(echo "${OUTPUT}" | awk '/API rate limit exceeded/')" != "" ]; then - echo "XXRateLimitXX" - else - echo "${OUTPUT}" - fi -} - - -# -# Is passed string url -# -gh_is_url() { - case $1 in - https* | http*) - echo "yes";; - *) - echo "no";; - esac -} - -# -# TOC generator -# -gh_toc(){ - local gh_src=$1 - local gh_src_copy=$1 - local gh_ttl_docs=$2 - local need_replace=$3 - local no_backup=$4 - local no_footer=$5 - - if [ "$gh_src" = "" ]; then - echo "Please, enter URL or local path for a README.md" - exit 1 - fi - - - # Show "TOC" string only if working with one document - if [ "$gh_ttl_docs" = "1" ]; then - - echo "Table of Contents" - echo "=================" - echo "" - gh_src_copy="" - - fi - - if [ "$(gh_is_url "$gh_src")" == "yes" ]; then - gh_toc_load "$gh_src" | gh_toc_grab "$gh_src_copy" - if [ "${PIPESTATUS[0]}" != "0" ]; then - echo "Could not load remote document." - echo "Please check your url or network connectivity" - exit 1 - fi - if [ "$need_replace" = "yes" ]; then - echo - echo "!! '$gh_src' is not a local file" - echo "!! Can't insert the TOC into it." - echo - fi - else - local rawhtml=$(gh_toc_md2html "$gh_src") - if [ "$rawhtml" == "XXNetworkErrorXX" ]; then - echo "Parsing local markdown file requires access to github API" - echo "Please make sure curl is installed and check your network connectivity" - exit 1 - fi - if [ "$rawhtml" == "XXRateLimitXX" ]; then - echo "Parsing local markdown file requires access to github API" - echo "Error: You exceeded the hourly limit. See: https://developer.github.com/v3/#rate-limiting" - TOKEN_FILE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/token.txt" - echo "or place GitHub auth token here: ${TOKEN_FILE}" - exit 1 - fi - local toc=`echo "$rawhtml" | gh_toc_grab "$gh_src_copy"` - echo "$toc" - if [ "$need_replace" = "yes" ]; then - if grep -Fxq "" $gh_src && grep -Fxq "" $gh_src; then - echo "Found markers" - else - echo "You don't have or in your file...exiting" - exit 1 - fi - local ts="<\!--ts-->" - local te="<\!--te-->" - local dt=`date +'%F_%H%M%S'` - local ext=".orig.${dt}" - local toc_path="${gh_src}.toc.${dt}" - local toc_footer="" - # http://fahdshariff.blogspot.ru/2012/12/sed-mutli-line-replacement-between-two.html - # clear old TOC - sed -i${ext} "/${ts}/,/${te}/{//!d;}" "$gh_src" - # create toc file - echo "${toc}" > "${toc_path}" - if [ "${no_footer}" != "yes" ]; then - echo -e "\n${toc_footer}\n" >> "$toc_path" - fi - - # insert toc file - if [[ "`uname`" == "Darwin" ]]; then - sed -i "" "/${ts}/r ${toc_path}" "$gh_src" - else - sed -i "/${ts}/r ${toc_path}" "$gh_src" - fi - echo - if [ "${no_backup}" = "yes" ]; then - rm ${toc_path} ${gh_src}${ext} - fi - echo "!! TOC was added into: '$gh_src'" - if [ -z "${no_backup}" ]; then - echo "!! Origin version of the file: '${gh_src}${ext}'" - echo "!! TOC added into a separate file: '${toc_path}'" - fi - echo - fi - fi -} - -# -# Grabber of the TOC from rendered html -# -# $1 - a source url of document. -# It's need if TOC is generated for multiple documents. -# -gh_toc_grab() { - common_awk_script=' - modified_href = "" - split(href, chars, "") - for (i=1;i <= length(href); i++) { - c = chars[i] - res = "" - if (c == "+") { - res = " " - } else { - if (c == "%") { - res = "\\x" - } else { - res = c "" - } - } - modified_href = modified_href res - } - print sprintf("%*s", (level-1)*3, "") "* [" text "](" gh_url modified_href ")" - ' - if [ `uname -s` == "OS/390" ]; then - grepcmd="pcregrep -o" - echoargs="" - awkscript='{ - level = substr($0, length($0), 1) - text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) - href = substr($0, match($0, "href=\"([^\"]+)?\"")+6, RLENGTH-7) - '"$common_awk_script"' - }' - else - grepcmd="grep -Eo" - echoargs="-e" - awkscript='{ - level = substr($0, length($0), 1) - text = substr($0, match($0, /a>.*<\/h/)+2, RLENGTH-5) - href = substr($0, match($0, "href=\"[^\"]+?\"")+6, RLENGTH-7) - '"$common_awk_script"' - }' - fi - href_regex='href=\"[^\"]+?\"' - - # if closed is on the new line, then move it on the prev line - # for example: - # was: The command foo1 - # - # became: The command foo1 - sed -e ':a' -e 'N' -e '$!ba' -e 's/\n<\/h/<\/h/g' | - - # find strings that corresponds to template - $grepcmd '//g' | sed 's/<\/code>//g' | - - # remove g-emoji - sed 's/]*[^<]*<\/g-emoji> //g' | - - # now all rows are like: - # ... / placeholders" - echo " $app_name - Create TOC for markdown from STDIN" - echo " $app_name --help Show help" - echo " $app_name --version Show version" - return - fi - - if [ "$1" = '--version' ]; then - echo "$gh_toc_version" - echo - echo "os: `lsb_release -d | cut -f 2`" - echo "kernel: `cat /proc/version`" - echo "shell: `$SHELL --version`" - echo - for tool in curl wget grep awk sed; do - printf "%-5s: " $tool - echo `$tool --version | head -n 1` - done - return - fi - - if [ "$1" = "-" ]; then - if [ -z "$TMPDIR" ]; then - TMPDIR="/tmp" - elif [ -n "$TMPDIR" -a ! -d "$TMPDIR" ]; then - mkdir -p "$TMPDIR" - fi - local gh_tmp_md - if [ `uname -s` == "OS/390" ]; then - local timestamp=$(date +%m%d%Y%H%M%S) - gh_tmp_md="$TMPDIR/tmp.$timestamp" - else - gh_tmp_md=$(mktemp $TMPDIR/tmp.XXXXXX) - fi - while read input; do - echo "$input" >> "$gh_tmp_md" - done - gh_toc_md2html "$gh_tmp_md" | gh_toc_grab "" - return - fi - - if [ "$1" = '--insert' ]; then - need_replace="yes" - shift - fi - - if [ "$1" = '--no-backup' ]; then - need_replace="yes" - no_backup="yes" - shift - fi - - if [ "$1" = '--hide-footer' ]; then - need_replace="yes" - no_footer="yes" - shift - fi - - for md in "$@" - do - echo "" - gh_toc "$md" "$#" "$need_replace" "$no_backup" "$no_footer" - done - - echo "" - echo "Created by [gh-md-toc](https://github.com/ekalinin/github-markdown-toc)" -} - -# -# Entry point -# -gh_toc_app "$@" - From c5857bfc0b7fef708f4e48fd42b7da7b946f7aa9 Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Sat, 1 May 2021 17:39:35 -0500 Subject: [PATCH 4/7] ci: ignore md files for regular build trigger --- .github/workflows/build-multiarch.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-multiarch.yml b/.github/workflows/build-multiarch.yml index 76307c28..e50467e6 100644 --- a/.github/workflows/build-multiarch.yml +++ b/.github/workflows/build-multiarch.yml @@ -12,6 +12,8 @@ on: - "[0-9]+.[0-9]+.[0-9]+-multiarch" - "[0-9]+.[0-9]+.[0-9]+-multiarch-latest" - "[0-9]+.[0-9]+.[0-9]+-java15" + paths-ignore: + - "*.md" jobs: docker-buildx: From 74072847ca38046ae0c26f14c0d94eab73560e01 Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Sun, 2 May 2021 18:31:08 -0500 Subject: [PATCH 5/7] docs: Added world-copy-compose-project diagram --- .github/workflows/build-multiarch.yml | 2 ++ docs/world-copy-compose-project.drawio.png | Bin 0 -> 66476 bytes 2 files changed, 2 insertions(+) create mode 100644 docs/world-copy-compose-project.drawio.png diff --git a/.github/workflows/build-multiarch.yml b/.github/workflows/build-multiarch.yml index e50467e6..1a466445 100644 --- a/.github/workflows/build-multiarch.yml +++ b/.github/workflows/build-multiarch.yml @@ -14,6 +14,8 @@ on: - "[0-9]+.[0-9]+.[0-9]+-java15" paths-ignore: - "*.md" + - "docs/**" + - "examples/**" jobs: docker-buildx: diff --git a/docs/world-copy-compose-project.drawio.png b/docs/world-copy-compose-project.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..64976e9c271e95b522a29ebd658d3456d1f2b416 GIT binary patch literal 66476 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�|Ht3z*-wft=ND%2GqUJe7y>g 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

dMy~fJ8D-d}=_Kl=ORX}+iLi$kO$dO(6 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 T72HK Date: Thu, 6 May 2021 22:27:30 +0100 Subject: [PATCH 6/7] Support local paths for modpacks / mods (#858) --- README.md | 4 ++-- start-finalSetupModpack | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 57f98170..08c5fb29 100644 --- a/README.md +++ b/README.md @@ -1123,7 +1123,7 @@ The world will only be downloaded or copied if it doesn't exist already. Set `FO ### Downloadable mod/plugin pack for Forge, Bukkit, and Spigot Servers -Like the `WORLD` option above, you can specify the URL of a "mod pack" +Like the `WORLD` option above, you can specify the URL or path of a "mod pack" to download and install into `mods` for Forge or `plugins` for Bukkit/Spigot. To use this option pass the environment variable `MODPACK`, such as @@ -1133,7 +1133,7 @@ To use this option pass the environment variable `MODPACK`, such as top level of the zip archive. Make sure the jars are compatible with the particular `TYPE` of server you are running. -You may also download individual mods using the `MODS` environment variable and supplying the URL +You may also download individual mods using the `MODS` environment variable and supplying the URL or path to the jar files. Multiple mods/plugins should be comma separated. docker run -d -e MODS=https://www.example.com/mods/mod1.jar,https://www.example.com/mods/mod2.jar ... diff --git a/start-finalSetupModpack b/start-finalSetupModpack index 869d8c22..c854ebb7 100644 --- a/start-finalSetupModpack +++ b/start-finalSetupModpack @@ -36,24 +36,28 @@ if [[ "$MODPACK" ]]; then log "ERROR: failed to download from $downloadUrl" exit 2 fi - - if [ "$TYPE" = "SPIGOT" ]; then - mkdir -p /data/plugins - if ! unzip -o -d /data/plugins /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from $downloadUrl" - fi - else - mkdir -p /data/mods - if ! unzip -o -d /data/mods /tmp/modpack.zip; then - log "ERROR: failed to unzip the modpack from $downloadUrl" - fi + elif [[ "$MODPACK" =~ .*\.zip ]]; then + if ! cp $MODPACK /tmp/modpack.zip; then + log "ERROR: failed to copy from $MODPACK" + exit 2 fi - rm -f /tmp/modpack.zip - else - log "ERROR Invalid URL given for MODPACK: $MODPACK" + log "ERROR Invalid URL or Path given for MODPACK: $MODPACK" exit 1 fi + + if [ "$TYPE" = "SPIGOT" ]; then + mkdir -p /data/plugins + if ! unzip -o -d /data/plugins /tmp/modpack.zip; then + log "ERROR: failed to unzip the modpack from $downloadUrl" + fi + else + mkdir -p /data/mods + if ! unzip -o -d /data/mods /tmp/modpack.zip; then + log "ERROR: failed to unzip the modpack from $downloadUrl" + fi + fi + rm -f /tmp/modpack.zip fi # If supplied with a URL for a plugin download it. @@ -87,8 +91,15 @@ if [[ "$MODS" ]]; then exit 2 fi fi + elif [[ "$i" =~ .*\.jar ]]; then + log "Copying plugin located at $i ..." + out_file=$(basename "$i") + if ! cp "$i" "${out_dir}/$out_file"; then + log "ERROR: failed to copy from $i into $out_dir" + exit 2 + fi else - log "ERROR Invalid URL given in MODS: $i" + log "ERROR Invalid URL or Path given in MODS: $i" exit 2 fi done From bccdc7f5e8f3917d61e0ba9ab256b4f2b774ccc7 Mon Sep 17 00:00:00 2001 From: itzg Date: Thu, 6 May 2021 21:27:45 +0000 Subject: [PATCH 7/7] Auto update markdown TOC --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 08c5fb29..1e3c4fe3 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ With that you can easily view the logs, stop, or re-start the container: * [Enabling Autopause](#enabling-autopause) * [Running on RaspberryPi](#running-on-raspberrypi) - +