воскресенье, 7 октября 2012 г.

Скрипт для обновления Miranda NG из репозитория SVN.



Совершенно незаметно для меня Miranda IM вместо своей предполагаемой кончины подобно фениксу переродилась в Miranda NG. Мессенджер этот я давно уже собираю из исходных кодов, которые успешно добываю из SVN-репозитория. Раньше их была 1000 и 1 штука, а сейчас он один, да еще и бинарные плагины лежат в одном месте. В один прекрасный день мне надоело всё делать руками и захотелось автоматизировать процесс. В ходе долгих мучений родился bat-скрипт, который вообще всё делает сам. Достаточно его только запустить.
Скрипт простой и линейный, проверок в нём практически нет, но тем не менее работу он свою делает.
Для его работы необходимы следующие условия:
  • Работающий клиент для SVN-репозиториев, например TortoiseSVN, который должен быть прописан в переменной окружения "PATH";
  • Наличие Microsoft Visual Studio;
  • Программа unzip.exe, которую модно найти по адресу http://www.info-zip.org/UnZip.html;
  • Программа wget.exe, которую можно взять по адресу http://gnuwin32.sourceforge.net/packages/wget.htm.
Сам "скрипт" состоит из нескольких частей:
inst_mir.bat - сам скрипт. О нем чуть позже.
exclude.lst - список исключений. На самом деле этот файл нужен, чтобы не переносить в сборку отладочную информацию.
iconsdl.lst - список пакетов значков, которых по тем или иным причинам нет в репозитории, но есть на сайте среди готовых сборок.
plugins.lst - список используемых плагинов. Простой список dll-файлов из папки "Plugins".
pluginsdl.lst - список плагинов, которых по тем или иным причинам нет в репозитории. Простой список без расширений.

Вроде всё. Теперь пора подготовить папку исходников для сборки.
Сначала с помощью SVN-клиента извлекаем содержимое репозитория по ссылке https://mysvn.ru/ghazan/myranda/trunk. Теперь переходим в папку "bin10" внутри нашей компии репозитории и открываем файлы "mir_full_pro.sln" и "mir_icons.sln" в MSVS. Там же производим настройку проектов: конфигурация "Release" и платформа "Win32". В туже папку кладем unzip.exe и wget.exe. Всё это можно прописать в скрипте, но мне было так проще.

Теперь все 5 файлов складываем в в туже папку и все их открываем и редактируем.
Начнем с inst_mir.bat. В самом его начале прописаны две переменных:
set MIRDIR=d:\miranda-ng - папка, в которую установлена Miranda NG.
set PLUGDIR=Release - папка внутри "bin10", в которой будут лежать собранные файлы.

Теперь очередь exclude.lst. В нем всего одна строчка:
.pdb

В файле iconsdl.lst у меня прописано тольк "historypp_icons", потому что сам плагин написан на Delphi и не собирается в MSVS со всеми остальными.

В файле plugins.lst я собрал довольно много плагинов, которыми пользуюсь. Приведу только часть списка:
AddContactPlus.dll
AdvaImg.dll
AdvancedAutoAway.dll
AIM.dll
AssocMgr.dll
AuthState.dll
AvatarHistory.dll
AVS.dll


Файл pluginsdl.lst тоже заполнил списком того, что не собирается в MSVC:
historypp
quicksearch


Теперь всё готово для сборки!
Переходим в папку "bin10" и запускаем inst_mir.bat. В процессе выполнения будет произведено обновление репозитория до актуальной ревизии, сборка всех файлов, корректное закрытие программы, загрузка недостающих файлов, обновление и повторный запуск новой версии программы.

Ну и сам код скрипта:

@echo off
set MIRDIR=d:\miranda-ng
set PLUGDIR=Release
echo [ Updater by Radjah ]
echo.
echo [*] Updating sources...
cd ..
svn up
cd bin10
echo.
echo [*] Building...
del /f /q build.log
start /wait devenv /OUT build.log mir_full_pro.sln /Build
echo.
echo [*] Building icon cillections...
start /wait devenv /OUT build.log mir_icons.sln /Build
echo.
echo [*] Generating russian langpack..
cd ..\langpacks\ru\
LangpackSuite.exe \q \nLangpack_russian
cd ..\..\bin10
echo.
echo [*] Closing Miranda NG...
%PLUGDIR%\MimCmd.exe quit
echo [*] Waiting...
ping 127.0.0.1 -n 10 > nul
taskkill /f /im miranda32.exe
echo [*] Installing Core...
xcopy %PLUGDIR% %MIRDIR% /Y /EXCLUDE:exclude.lst
echo.
echo [*] Installing icons...
xcopy %PLUGDIR%\Icons %MIRDIR%\Icons /Y /E
echo.
echo [*] Installing Core plugins...
xcopy %PLUGDIR%\Core %MIRDIR%\Core /Y /E /EXCLUDE:exclude.lst
echo.
echo [*] Downloading binary plugins...
for /F %%i in (pluginsdl.lst) do (
echo ...%%i
wget http://miranda-ng.org/distr/x32/Plugins/%%i.zip -O %%i.zip
cd %PLUGDIR%
..\unzip -o ..\%%i.zip
cd ..
del /F /Q %%i.zip)
echo [*] Downloading binary icon collections...
for /F %%i in (iconsdl.lst) do (
echo ...%%i
wget http://miranda-ng.org/distr/x32/Icons/%%i.zip -O %%i.zip
cd %PLUGDIR%
..\unzip -o ..\%%i.zip
cd ..
del /F /Q %%i.zip)
echo [*] Installing optional plugins...
for /F %%i in (plugins.lst) do (
echo ...%%i into %MIRDIR%Plugins\...
copy /Y %PLUGDIR%\Plugins\%%i %MIRDIR%\Plugins\%%i)
echo.
echo [*] Installing russian langpack...
copy ..\langpacks\ru\Langpack_russian.txt %MIRDIR%\
echo.
echo [*] Running Miranda NG...
cd %MIRDIR%
start Miranda32.exe
echo.
echo [*] Done!
pause