Уведомление о новой последней ревизии в SVN с помощью libnotify

в 8:47, , рубрики: bash, svn, Ubuntu, разработка

Привет, читатели!

Хотелось бы вам рассказать, как я сделал для себя «напоминалку» о том, что в SVN появилась более новая ревизия, чем та, с которой я работаю.

Первая мысль — написать Bash-скрипт, который будет по CRON уведомлять меня о новой ревизии. Возникает вопрос: по e-mail или стандартными средствами Ubuntu? Я склонился использовать утилиту «notify-send», так как не хотел захламлять ящик практически ненужными сообщениями.

Под катом немного кода.

Разработка

Требования к уведомлению достаточно просты:

  • Номер ревизии;
  • Комментарий коммита.

Первое, что необходимо — это получить номер ревизии в ветке и локальный номер ревизии:

my_version=$(svn info | grep  -ohP 'Revision: d*' | grep -ohP 'd*')
url=$(svn info | grep -P "^URL:" | grep -ohP "svn://.*")
version=$(svn info $url | grep  -ohP 'Revision: d*' | grep -ohP 'd*')

my_version — хранит в себе информацию о текущей версии на локальном репозитории, а version, соответственно, на удаленном.

Теперь получаем сообщение коммита, относящегося к последней ревизии:

message=$(svn log -q -v --xml --with-all-revprops -r $version | grep msg | sed -e "s/<msg>([^<]*)</msg>/1/g");

И отравляем уведомление, если ревизии не совпадают:

if [ "$version" != "$my_version" ]; then
$(/usr/bin/aplay -q $dirname/message.wav)
/usr/bin/notify-send "New revision: $version" "$message"

fi

Возникли трудности при выводе уведомления на экран: связано это с тем, что в cron не определена глобальная переменная DBUS_SESSION_BUS_ADDRESS. Проблема решилась следующим образом:

LOGIN_NAME="alex"
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGIN_NAME gnome-session)/environ)";

Также, как видно, добавил воспроизведение звука при уведомлении.

Теперь добавим выполнение программы в crontab и все готово.

Исходный код здесь.

Спасибо за внимание, жду ваших комментариев!

Автор: ya-est

Источник



https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js