Skip to content

Instantly share code, notes, and snippets.

@maximal
Last active April 24, 2019 11:49
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save maximal/db20551d9645656402ed to your computer and use it in GitHub Desktop.
Save maximal/db20551d9645656402ed to your computer and use it in GitHub Desktop.
Обновление тестовых версий (EAP) сред разработки компании JetBrains для Linux
#!/bin/bash
##
# Обновление тестовых версий (EAP) сред разработки компании JetBrains для Linux.
# В данном случае скачивается PhpStorm и GoLand, но скрипт подойдёт для любой среды разработки,
# выкладываемой компанией JetBrains в EAP.
#
#
# @author MaximAL
# @since 2019-04-24 Добавил опцию командной строки `no-eap` для получения стабильных версий вместо EAP.
# @since 2019-03-18 Сделал получение релизов через официальное JSON API.
# @since 2015-08-27 Поменял паттерн `fileRegex` под текущие реалии.
# @since 2015-04-10 Первая версия
# @copyright © MaximAL 2015—2019
##
## Продукты: PhpStorm, GoLand
products=('PS' 'GO')
# Базовая директория; как правило, `/opt`
baseDir='/opt'
# Ссылка на JSON с релизами
if [[ "$1" == "no-eap" ]]; then
releaseUrl="https://data.services.jetbrains.com/products/releases?latest=false&code="
else
releaseUrl="https://data.services.jetbrains.com/products/releases?latest=false&type=eap&code="
fi
# Регулярное выражение для ссылки на новую версию.
fileRegex='https?://[^\"]+\.tar\.gz'
# Поехали!
echo "Updating JetBrains IDEs…"
for product in "${products[@]}"; do
echo "Product: $product"
productUrl="$releaseUrl$product"
echo " Quering $productUrl…"
fileUrl=`wget -q -O - "$productUrl" | grep -Po "$fileRegex" | head -n1`
if [ -z $fileUrl ]; then
echo " URL $productUrl does not contain link like $fileRegex."
exit 1
fi
echo " File URL: $fileUrl"
echo -n " Fetching directory name…"
dirName=`wget -q -O - "$fileUrl" | tar tz | head -n1 | grep --max-count=1 -Po '[^/]+' | head -n1`
echo -e "\b: $dirName"
if [ -e "$baseDir/$dirName" ]; then
echo " Directory $baseDir/$dirName already exists. Seems like you are using last version of $product."
else
linkName=`echo $dirName | grep -Po '^[^-]+'`
cd "$baseDir"
echo ' Getting archive…'
wget -O - "$fileUrl" | tar xzp
echo " Setting symbolic link…"
rm -f "$linkName"
ln -s "$dirName" "$linkName"
echo " Update done:"
echo " Directory: $baseDir/$dirName/"
echo " Symlink: $baseDir/$linkName"
fi
done
@maximal
Copy link
Author

maximal commented Apr 30, 2015

Постараюсь сразу ответить на главный вопрос:

Зачем? Ведь есть обновление из самой среды.

Во-первых, иногда обновления неинкрементальны (скорее вопрос к разработчикам, но видимо, на то есть свои причины), и не работают из самой среды, их нужно ставить вручную „начисто“. Скрипт, сам скачивающий новый архив и сохраняющий пути для файлов запуска с помощью символических ссылок, от этого избавляет.

Во-вторых, я кладу среду разработки в /opt, где у меня лежат всякие сторонние приложения не из репозиториев, либо из нетрастовых репозиториев. IDEA (как и её EAP) — не из репозиториев; считаю, что ей там самое место. Ну, и я преднамеренно не даю пользователю прав на запись в эту папку, поэтому скрипт, доступный только руту/судо, может обновлять Идею.

Я далеко не эксперт в файловой системе Линукса, поправьте, если ошибаюсь, но для меня сейчас пока что такое расположение выглядит логичным.

@Mausglov
Copy link

у меня сейчас не работает, починил за счет добавки на sed:
https://gist.github.com/Mausglov/b2c466a131a2021d8489/revisions

@maximal
Copy link
Author

maximal commented Aug 27, 2015

@Mausglov, чуток поменял паттерн $fileRegex под текущие реалии.

@maximal
Copy link
Author

maximal commented Mar 18, 2019

@Mausglov, новая версия!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment