# get usage help this way:
# ./gamepack_manager -h
-: "${CP:=cp -v}"
-: "${CP_R:=cp -r --preserve=timestamps}"
+: "${CP:=cp -va}"
+: "${CP_R:=cp -Rva}"
: "${GIT:=git}"
: "${SVN:=svn}"
: "${WGET:=wget}"
# Obsolete packs #
#######################################################
-# Quake2World was renamed as Quetoo
-# Other gamepacks have better version available
-
-# OpenArena unknown zip http://ingar.intranifty.net/files/netradiant/gamepacks/OpenArenaPack.zip
-# Quake proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/QuakePack.zip
-# Quake2World GPL svn svn://jdolan.dyndns.org/quake2world/trunk/gtkradiant
-# Tremulous proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/TremulousPack/branches/1.5/
-# Unvanquished unknown zip http://ingar.intranifty.net/gtkradiant/files/gamepacks/UnvanquishedPack.zip
-# Warsow GPL svn https://svn.bountysource.com/wswpack/trunk/netradiant/games/WarsowPack/
-# Warsow GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/WarsowPack.zip
+# Quake2World was renamed as Quetoo.
+# JediAcademy and JediOutcast gamepacks are unusable.
+# Other gamepacks have better version available.
+
+# JediAcademy no proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/JAPack/branches/1.5/
+# JediOutcast no proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/JK2Pack/branches/1.5/
+# Kingpin no unknown zip http://download.kingpin.info/kingpin/editing/maps/map_editors/NetRadiant/addon/Kingpinpack.zip
+# Neverball no proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/NeverballPack.zip
+# OpenArena no unknown zip http://ingar.intranifty.net/files/netradiant/gamepacks/OpenArenaPack.zip
+# Quake2World no GPL svn svn://jdolan.dyndns.org/quake2world/trunk/gtkradiant
+# Quake3 no proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q3Pack/trunk/ 29
+# Quake no proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/QuakePack.zip
+# Tremulous no proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/TremulousPack/branches/1.5/
+# Tremulous no proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/TremulousPack.zip
+# Unvanquished no unknown zip http://ingar.intranifty.net/gtkradiant/files/gamepacks/UnvanquishedPack.zip
+# Warfork no GPL zip https://cdn.discordapp.com/attachments/611741789237411850/659512520553267201/netradiant_warfork_gamepack.zip
+# Warsow no GPL svn https://svn.bountysource.com/wswpack/trunk/netradiant/games/WarsowPack/
+# Warsow no GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/WarsowPack.zip
#######################################################
# Usable packs #
#######################################################
-DarkPlaces GPL svn svn://svn.icculus.org/gtkradiant-gamepacks/DarkPlacesPack/branches/1.5/
-Doom3 proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Doom3Pack/branches/1.5/
-ET proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/ETPack/branches/1.5/
-Heretic2 proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Her2Pack/branches/1.5/
-JediAcademy proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/JAPack/branches/1.5/
-Neverball proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/NeverballPack.zip
-Nexuiz GPL gitdir git://git.icculus.org/divverent/nexuiz.git misc/netradiant-NexuizPack master
-OpenArena GPL git https://github.com/NeonKnightOA/oagamepack.git
-Osirion GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/OsirionPack.zip
-Prey proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/PreyPack/trunk/
-Q3 proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q3Pack/trunk/ 29
-Q3Rally proprietary svn https://svn.code.sf.net/p/q3rallysa/code/tools/radiant-config/radiant15-netradiant/
-Quake2 proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q2Pack/branches/1.5/
-Quake4 proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q4Pack/branches/1.5/
-Quake GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/Quake1Pack.zip
-Quetoo GPL svn svn://svn.icculus.org/gtkradiant-gamepacks/QuetooPack/branches/1.5/
-Tremulous proprietary zip http://ingar.intranifty.net/files/netradiant/gamepacks/TremulousPack.zip
-TurtleArena proprietary git https://github.com/Turtle-Arena/turtle-arena-radiant-pack.git
-UFOAI proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/UFOAIPack/branches/1.5/
-Unvanquished BSD git https://github.com/Unvanquished/unvanquished-mapeditor-support.git
-Warsow GPL git https://github.com/Warsow/NetRadiantPack.git
-Wolf proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/WolfPack/branches/1.5/
-Xonotic GPL git https://gitlab.com/xonotic/netradiant-xonoticpack.git
+AlienArena yes GPL svn https://svn.code.sf.net/p/alienarena-cc/code/trunk/tools/netradiant_gamepack/AlienArenaPack
+DarkPlaces yes GPL svn svn://svn.icculus.org/gtkradiant-gamepacks/DarkPlacesPack/branches/1.5/
+Doom3 yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Doom3Pack/branches/1.5/
+ET yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/ETPack/branches/1.5/
+Heretic2 yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Her2Pack/branches/1.5/
+Kingpin yes unknown git https://gitlab.com/netradiant/gamepacks/kingpin-mapeditor-support.git
+Neverball yes proprietary git https://gitlab.com/netradiant/gamepacks/neverball-mapeditor-support.git
+Nexuiz yes GPL gitdir git://git.icculus.org/divverent/nexuiz.git misc/netradiant-NexuizPack master
+OpenArena yes GPL git https://github.com/NeonKnightOA/oagamepack.git
+Osirion yes GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/OsirionPack.zip
+Prey yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/PreyPack/trunk/
+Q3Rally yes proprietary svn https://svn.code.sf.net/p/q3rallysa/code/tools/radiant-config/radiant15-netradiant/
+Quake2 yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q2Pack/branches/1.5/
+Quake3 yes proprietary git https://gitlab.com/netradiant/gamepacks/quake3-mapeditor-support.git
+Quake4 yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/Q4Pack/branches/1.5/
+QuakeLive yes proprietary git https://gitlab.com/netradiant/gamepacks/quakelive-mapeditor-support.git
+Quake yes GPL zip http://ingar.intranifty.net/files/netradiant/gamepacks/Quake1Pack.zip
+Quetoo yes GPL svn svn://svn.icculus.org/gtkradiant-gamepacks/QuetooPack/branches/1.5/
+SmokinGuns yes unknown git https://github.com/smokin-guns/smokinguns-mapeditor-support.git
+SoF2 yes unknown git https://gitlab.com/netradiant/gamepacks/sof2-mapeditor-support.git
+STVEF yes unknown git https://gitlab.com/netradiant/gamepacks/stvef-mapeditor-support.git
+Tremulous yes proprietary git https://gitlab.com/netradiant/gamepacks/tremulous-mapeditor-support.git
+TurtleArena yes proprietary git https://github.com/Turtle-Arena/turtle-arena-radiant-pack.git
+UFOAI yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/UFOAIPack/branches/1.5/
+Unvanquished yes BSD git https://github.com/Unvanquished/unvanquished-mapeditor-support.git
+UrbanTerror yes unknown git https://gitlab.com/netradiant/gamepacks/urbanterror-mapeditor-support.git
+Warfork yes GPL git https://gitlab.com/netradiant/gamepacks/warfork-mapeditor-support.git
+Warsow yes GPL git https://github.com/Warsow/NetRadiantPack.git
+Wolf yes proprietary svn svn://svn.icculus.org/gtkradiant-gamepacks/WolfPack/branches/1.5/
+WoP yes proprietary git https://github.com/PadWorld-Entertainment/wop-mapeditor-support.git
+Xonotic yes GPL git https://gitlab.com/xonotic/netradiant-xonoticpack.git
+ZEQ2Lite yes unknown git https://gitlab.com/netradiant/gamepacks/zeq2lite-mapeditor-support.git
EOF
}
+if command -v gsed >/dev/null
+then
+ SED=gsed
+elif sed --help >/dev/null 2>&1
+then
+ SED=sed
+else
+ printf 'ERROR: GNU sed is missing\n' >&2
+ exit 1
+fi
+
+printRealPath ()
+{
+ if command -v grealpath >/dev/null
+ then
+ grealpath "${1}"
+ elif command -v realpath >/dev/null
+ then
+ realpath "${1}"
+ elif command -v greadlink >/dev/null
+ then
+ # test greadlink first as greadlink has the feature on macos
+ # but readlink only has it on linux, note that it's probably
+ # the same on bsd
+ # note: (g)readlink requires the file to be create first
+ greadlink -f "${1}"
+ elif command -v readlink >/dev/null
+ then
+ # --help and -f options are GNU readlink things
+ if readlink --help >/dev/null 2>&1
+ then
+ readlink -f "${1}"
+ else
+ if ! python -c "import os; print(os.path.realpath('${1}'))"
+ then
+ printf 'ERROR: GNU realpath or other way to compute real path of a file is missing\n' >&2
+ exit 1
+ fi
+ fi
+ fi
+}
+
sanitizeDB () {
- sed -e 's/#.*//;s/[ \t][ \t][ \t]*/\t/g;s/^[ \t]*//;s/[ \t]*$//' \
+ ${SED} -e 's/#.*//;s/[ \t][ \t][ \t]*/\t/g;s/^[ \t]*//;s/[ \t]*$//' \
| grep -v '^$'
}
dedupeList () {
printList "${1}" \
| tr '\n' ' ' \
- | sed -e 's/ $//'
+ | ${SED} -e 's/ $//'
}
printGamePackDB () {
printLicenseList () {
printGamePackDB \
- | awk '{ print $2 }' \
+ | awk '{ print $3 }' \
| sort -u
}
for license in ${license_list}
do
printGamePackDB \
- | awk '$2 == "'"${license}"'"' \
+ | awk '$3 == "'"${license}"'"' \
| awk '{ print $1 }'
- done
+ done | sort -u
}
printNameListByName () {
break
;;
'all')
- local name_list
name_list="$(printNameList)"
break
;;
+ 'validated')
+ name_list="${name_list} validated"
+ ;;
*)
if printNameList | inList "${name}"
then
- local name_list
name_list="${name_list} ${name}"
else
printError "unknown name: ${name}"
for name in ${name_list}
do
+ if [ "${name}" = 'validated' ]
+ then
+ printGamePackDB \
+ | awk '$2 == "yes"' \
+ | awk '{ print $1 }'
+ fi
+
printGamePackDB \
| awk '$1 == "'"${name}"'"' \
| awk '{ print $1 }'
download_dir="${1}"
name="${2}"
- license="$(getValue "${name}" '2')"
- source_type="$(getValue "${name}" '3')"
- source_url="$(getValue "${name}" '4')"
+ validation="$(getValue "${name}" 2)"
+ license="$(getValue "${name}" 3)"
+ source_type="$(getValue "${name}" 4)"
+ source_url="$(getValue "${name}" 5)"
pack="${name}${pack_suffix}"
case "${source_type}" in
'svn')
- reference="$(getValue "${name}" '5')"
+ reference="$(getValue "${name}" 6)"
if [ -z "${reference}" ]
then
reference='HEAD'
)
${RM_R} "${pack}"
${MKDIR} "${pack}"
- ${MV} 'zipdownload/'*'/'* "${pack}/"
+ if [ -d 'zipdownload/games' ]
+ then
+ ${MV} 'zipdownload/'* "${pack}/"
+ else
+ ${MV} 'zipdownload/'*'/'* "${pack}/"
+ fi
${RM_R} 'zipdownload'
;;
'gitdir')
- local subdir="$(getValue "${name}" '5')"
- local branch="$(getValue "${name}" '6')"
+ local subdir="$(getValue "${name}" 6)"
+ local branch="$(getValue "${name}" 7)"
${RM_R} "${pack}"
${GIT} archive --remote="${source_url}" --prefix="${pack}/" "${branch}":"${subdir}" \
| ${TAR} xvf -
;;
esac
- # mkeditorpacks-based gamepack
if [ -d "${download_dir}/${pack}/build/netradiant" ]
then
+ # mkeditorpacks-based gamepack
pack="${pack}/build/netradiant"
+ elif [ -d "${download_dir}/${pack}/netradiant" ]
+ then
+ # other layout
+ pack="${pack}/netradiant"
fi
path="${download_dir}/${pack}"
local prog_name
tab="$(printf '\t')"
- prog_name="$(basename "$(readlink -f "${0}")")"
+ prog_name='gamepack-manager'
cat <<-EOF
Usage: ${prog_name} [OPTION] [SELECTION <ARGUMENTS>] [ACTION]
SELECTIONS:
${tab}-n, --name NAMES…
${tab}${tab}select games by name (default: none)
- ${tab}${tab}special keyword: all, none
+ ${tab}${tab}special keyword: validated, all, none
${tab}${tab}available games:
- $(printNameList | sed -e 's/^/\t\t\t/')
+ $(printNameList | ${SED} -e 's/^/\t\t\t/')
${tab}-l, --license LICENSES…
${tab}${tab}select games by license (default: none)
${tab}${tab}special keyword: free, all, none
${tab}${tab}available licenses:
- $(printLicenseList | sed -e 's/^/\t\t\t/')
+ $(printLicenseList | ${SED} -e 's/^/\t\t\t/')
ACTIONS:
${tab}-ln, --list-names
${tab}-ll, --list-licenses
${tab}${tab}list all game licenses
- ${tab}-ls, --list
+ ${tab}-ls, --list-selected
${tab}${tab}list selected games
${tab}-d, --download
${tab}-h, --help
${tab}${tab}print this help
- Example:
+ Examples:
+ ${tab}${prog_name} --license GPL BSD --list-selected
${tab}${prog_name} --license GPL BSD --download --install
+ ${tab}${prog_name} --name validated --list-selected
+ ${tab}${prog_name} --name validated --download --install
+
EOF
exit
fi
case "${1}" in
- '--list-licenses'|'-ll')
+ '--list-names'|'-ln')
arg_type=''
- list_licenses='true'
+ list_names='true'
option_list="${option_list} ${1}"
;;
- '--list-names'|'-ln')
+ '--list-licenses'|'-ll')
arg_type=''
- list_names='true'
+ list_licenses='true'
option_list="${option_list} ${1}"
;;
'--list-selected'|'-ls')
;;
*)
case "${arg_type}" in
- 'pack-license')
- license_list="${license_list} ${1}"
- ;;
'pack-name')
name_list="${name_list} ${1}"
;;
+ 'pack-license')
+ license_list="${license_list} ${1}"
+ ;;
'download-dir')
if [ -z "${download_dir}" ]
then
install_dir="${default_install_dir}"
fi
-if "${by_license}"
+if "${by_name}"
then
- selected_list="${selected_list} $(printNameListByLicense "${license_list}")"
+ selected_list="${selected_list} $(printNameListByName "${name_list}")"
fi
-if "${by_name}"
+if "${by_license}"
then
- selected_list="${selected_list} $(printNameListByName "${name_list}")"
+ selected_list="${selected_list} $(printNameListByLicense "${license_list}")"
fi
selected_list="$(dedupeList "${selected_list}")"
if "${mkdir_download}"
then
${MKDIR_P} "${download_dir}"
- real_download_dir="$(readlink -f "${download_dir}")"
+ real_download_dir="$(printRealPath "${download_dir}")"
fi
if "${mkdir_install}"
then
${MKDIR_P} "${install_dir}"
- real_install_dir="$(readlink -f "${install_dir}")"
+ real_install_dir="$(printRealPath "${install_dir}")"
fi
-if "${list_licenses}"
+if "${list_names}"
then
- printLicenseList
+ printNameList
fi
-if "${list_names}"
+if "${list_licenses}"
then
- printNameList
+ printLicenseList
fi
+
if "${list_selected}"
then
printList "${selected_list}"