Compare commits

...

149 Commits

Author SHA1 Message Date
rzaitov 5da1a6efa0 Update and rename readme.md to readme.txt 2014-06-02 20:11:19 +04:00
rzaitov e532e485cb Rename readme.txt to readme.md 2014-06-02 20:10:40 +04:00
rzaitov c8c2a84ceb Update readme.txt 2014-06-02 20:09:58 +04:00
Rustam Zaitov 9277793568 В обобщенные шаги добавил проставление bandleid 2014-06-02 19:40:01 +04:00
Rustam Zaitov b3f5305208 Реализовал поддержку сборки с разными профилями обеспечения 2014-06-02 15:09:22 +04:00
Rustam Zaitov f7e1e7797e для сборки ios проектов всегда собирается ipa файл 2014-02-21 12:56:47 +04:00
rzaitov 5ab8823237 Update readme.txt 2014-02-21 11:27:25 +03:00
Rustam Zaitov 44a32011b8 исправлена ошибка в названии настройки короткой версии
CFShortBundleVersion заменено на CFBundleShortVersionString
2014-01-17 13:36:07 +04:00
Rustam Zaitov 83abffdf33 убрал имя файла из комманды бэкапа 2014-01-17 13:23:14 +04:00
Rustam Zaitov cad3af5a5f вернул команду восстановления из бэкапа 2014-01-17 13:12:53 +04:00
Rustam Zaitov c412b15416 Merge branch 'master' of github.com:rzaitov/BuildScript 2014-01-17 12:15:51 +04:00
Rustam Zaitov 93a6c5d111 По просьбе Антона в выходнои имени файла номер билда отделяется от номера версии дефисом а не точкой 2014-01-17 12:14:54 +04:00
rzaitov b38b1e351a Update readme.txt 2014-01-16 20:54:46 +03:00
Rustam Zaitov 707c091a8d Убрал дублирование из скриптов 2014-01-16 21:38:43 +04:00
Rustam Zaitov aa5da41bdd Обновил сэмпл настроек 2014-01-16 21:23:20 +04:00
rzaitov e2ee11fe6f Update readme.txt 2014-01-16 20:12:28 +03:00
Maxim Smirnov 78b05e7109 навел порядок с именованием артифактов 2014-01-16 20:45:33 +04:00
Maxim Smirnov 0db2b0aa39 исправил ошибку в задании app файла 2014-01-16 20:17:41 +04:00
Maxim Smirnov 896ffc7af6 Задаем название app файла 2014-01-16 20:03:20 +04:00
Rustam Zaitov 4309cedffb убрал ошибку хардкодинга константы 2014-01-16 19:40:29 +04:00
Rustam Zaitov 3972439ba6 Merge branch 'common-steps' 2013-12-30 17:48:47 +04:00
Rustam Zaitov 68415f6313 исправил путаницу с названием проекта и именем файла проекта 2013-12-30 17:33:34 +04:00
Rustam Zaitov 49158c43ca Добавил пояснение к sln конфигурации андройда 2013-12-30 17:16:02 +04:00
Rustam Zaitov 98af62bec5 Merge branch 'common-steps' 2013-12-30 16:47:41 +04:00
Rustam Zaitov f9912d3fbf добавил инструкцию 2013-12-30 16:47:22 +04:00
Rustam Zaitov 3ddc372634 заменил название переменной project_path на project_name поскольку требуется именно имя файла а не путь к нему 2013-12-30 16:08:34 +04:00
Rustam Zaitov a052b1cfe3 Добавил пример настроек, которые необходимо переопределять в проекте 2013-12-30 14:22:01 +04:00
Rustam Zaitov 5e9c4614e1 Merge branch 'common-steps' 2013-12-30 12:42:42 +04:00
Rustam Zaitov 54ae0b6141 Добавил универсальные шаги сборки реализованные Антоном 2013-12-30 12:41:29 +04:00
rzaitov b772326d82 Merge branch 'BS-52' 2013-11-18 15:51:01 +04:00
rzaitov 24b8dbf834 Добился правильной сборки android проекта 2013-11-18 15:50:20 +04:00
rzaitov d364c7cc94 задал шаги для ios сборок 2013-11-15 21:08:54 +04:00
rzaitov 25b58a1548 Нашел ошибку. По каким-то причинам всегда собирается в bin/Debug ??? 2013-11-15 21:00:40 +04:00
rzaitov b87b0b5b37 Исправил ошибку в андроид шагах 2013-11-15 20:40:39 +04:00
rzaitov 3d7a40dd23 Подготовил к сборке 3 конфигураций 2013-11-15 20:38:07 +04:00
rzaitov 7043276c9c Пофиксил ключ по кторому берутся файлы и папки для бэкапа 2013-11-15 20:27:51 +04:00
rzaitov 73cd858826 Добавил возможность определять backup ignore файлы/папки 2013-11-15 20:24:13 +04:00
rzaitov 3f27f5d9ce Merge branch 'BS-51' 2013-11-15 19:15:07 +04:00
rzaitov 4feaa0992d Реализовал команду подписи apk файла 2013-11-15 19:14:34 +04:00
rzaitov 4939004dca Добавил команду подписи apk файла 2013-11-15 19:04:19 +04:00
rzaitov 53edc99ad9 Добавил новую конфигурацию Release для андроида 2013-11-15 18:28:46 +04:00
rzaitov 31dc59ad10 Временно не компилирую проекты с ошибками 2013-11-15 14:56:49 +04:00
rzaitov 9fc5967c1d Merge branch 'BS-47' 2013-11-14 20:52:45 +04:00
rzaitov 95c1f34fc6 подключил патчинг манифеста к движкку 2013-11-14 20:52:17 +04:00
rzaitov 3e66f2a8c2 Merge branch 'BS-47' 2013-11-14 20:29:26 +04:00
rzaitov 65cc154185 поправил предупреждения code inspect 2013-11-14 20:27:25 +04:00
rzaitov 0745de4f20 еще один тест на формирование имени 2013-11-14 20:21:50 +04:00
rzaitov a333991516 Добавил тесты на Manifest патчер 2013-11-14 20:16:36 +04:00
rzaitov b183e05da0 Добавил тест для проверки формирования имен с namespace префиксом 2013-11-14 20:08:44 +04:00
rzaitov cf255b7b1b реализовал патчинг manifest файла 2013-11-14 19:59:12 +04:00
rzaitov f46c5e0c78 Начал реализовывать комманду патчинга андроид манифеста 2013-11-14 17:24:26 +04:00
rzaitov 0c7be54d43 Merge branch 'BS-46' 2013-11-14 16:31:46 +04:00
rzaitov a2b4c18d7f Добавлен манифест для android приложения 2013-11-14 16:31:17 +04:00
rzaitov 6314447f26 Протестировал возможность загрузги дефолтных шагов 2013-11-14 16:30:16 +04:00
rzaitov ed9836fc27 Предоставил возможность пользоваться файлом с дефолтными шагами 2013-11-14 16:26:18 +04:00
rzaitov c2f6338103 Merge branch 'BS-44' 2013-11-14 16:03:39 +04:00
rzaitov 7026f11a73 Протестировал удаление нескольких проектов 2013-11-14 15:54:19 +04:00
rzaitov 2b15ca40fb Добавил андроидный проект 2013-11-14 15:49:52 +04:00
rzaitov 3d47ebcaad Добавил возможность удаления нескольких проектов из sln файла 2013-11-14 15:46:49 +04:00
rzaitov 018d02fc1f Merge branch 'BS-43' 2013-11-14 15:10:09 +04:00
rzaitov e0322fa7e9 протестировал установку профилей обеспечения 2013-11-14 15:09:26 +04:00
rzaitov 35ee02c6d8 Префикс к профилям определяется настройкой project_name 2013-11-14 15:01:50 +04:00
rzaitov 826140a7eb реализовал тесты на получение имени профиля при установке 2013-11-14 14:55:17 +04:00
rzaitov 7c11a708f0 Пофиксил тесты 2013-11-14 14:42:41 +04:00
rzaitov e0e6ed61eb перенес функциональность связанную с построением регулярных выражений из класса LineParser в класс RegexpBuilder 2013-11-14 14:33:05 +04:00
rzaitov 6953034312 Merge branch 'BS-45' 2013-11-14 13:06:34 +04:00
rzaitov aa0b3394ea Добавил тесты на возвращаемые значения shell command 2013-11-14 12:59:16 +04:00
rzaitov a27b3ff8b7 Пофиксил предупреждения code inspect 2013-11-14 12:40:49 +04:00
rzaitov 6d947c7ccd Унаследовал все комманды от базового класса CommandBase 2013-11-14 12:33:12 +04:00
rzaitov ca7f318949 Merge branch 'BS-37' 2013-11-13 19:55:19 +04:00
rzaitov 78c8568855 Реализовал возможность задавать путь к файлу с настройками через параметры к скрипту 2013-11-13 19:54:21 +04:00
rzaitov 00c5f0f03e Merge branch 'BS-42' 2013-11-13 19:30:27 +04:00
rzaitov 609ed72335 Проверил возможность не указывать кавычки в файле настроек 2013-11-13 19:29:39 +04:00
rzaitov f42e2fce3c Добавил возможность не указывать кавычки при указании значений в файле настроек 2013-11-13 19:27:14 +04:00
rzaitov 88b4de94c8 Пофиксил тесты 2013-11-13 19:13:07 +04:00
rzaitov 9fd63b8bfa Merge branch 'BS-38' 2013-11-13 18:35:43 +04:00
rzaitov 8aa91598b5 Пофиксил баг переопределения настроек из коммандной строки 2013-11-13 18:32:25 +04:00
rzaitov d7e11e39f5 Добавил тесты на settingsMerger 2013-11-13 18:08:19 +04:00
rzaitov 890a51af8a Еще тест на мерджинг настроек 2013-11-13 17:31:48 +04:00
rzaitov 2e1ec00ec7 Пофиксил тесты 2013-11-13 17:28:29 +04:00
rzaitov 94aea27f50 Нормализовал обработку комментариев в файле настроек 2013-11-13 16:52:31 +04:00
rzaitov ee6442ecd0 предварительная обработка строк в файле настроек такая же как в файле шагов – обработка комментариев и удаление ведущих пробельных символов 2013-11-13 16:26:37 +04:00
rzaitov 6354c67bc3 Merge branch 'BS-36' 2013-11-13 15:55:27 +04:00
rzaitov 98022322ad Отладил парчинг корневого PropertyGroup 2013-11-13 15:54:40 +04:00
rzaitov 3e048e6d74 начал реализовывать возможность патчинга значений в корневом PropertyGroup sln файла 2013-11-13 15:47:14 +04:00
rzaitov 6c231fa905 Merge branch 'BS-41' 2013-11-13 14:24:27 +04:00
rzaitov 72556cfd8a пофиксил настройки для сборки stagining 2013-11-13 14:22:31 +04:00
rzaitov 1486d80dee исправил название кофига 2013-11-13 14:20:03 +04:00
rzaitov ad05a6980f перед созданием бэкапа старую папку удаляем 2013-11-13 14:16:02 +04:00
rzaitov 7c7f786a76 подключил распознавание нового шага 2013-11-13 14:12:22 +04:00
rzaitov b7317e41b1 Модифицировал стэпы скрипта для замены иконок 2013-11-13 14:02:50 +04:00
rzaitov 895238017e Добавил иконки в приложение, чтобы билдскриптом их можно было заменять 2013-11-13 13:45:37 +04:00
rzaitov 298e0a41bd Реализовал поддержку команд выставления множественных значений в Info.Plist 2013-11-13 13:34:04 +04:00
rzaitov 810ab396d7 Начал реализовывать функционал по замене множественных значений в Info.plist 2013-11-13 13:25:36 +04:00
rzaitov 9d93d6ff49 реализовал тест для парсера InsideSetArrayParser 2013-11-12 20:40:04 +04:00
rzaitov e9ce303a6c Пофиксил тесты 2013-11-12 20:09:33 +04:00
rzaitov bd26508185 Отрефакторил тесты по созданию бэкапов 2013-11-12 20:04:38 +04:00
rzaitov 31e938809d Добавил базовый класс для Inside парсеров и вынес туда значительную часть функциональности 2013-11-12 19:36:13 +04:00
rzaitov 60901c462f Merge branch 'BS-40' 2013-11-12 18:36:28 +04:00
rzaitov 06ad5b4193 при старте и окончании команды вывожу в stdout 2013-11-12 18:35:26 +04:00
rzaitov c37ce3d64c Merge branch 'BS-34' 2013-11-12 16:48:34 +04:00
rzaitov e40ca7a120 Добавил возможности определения предопределенных макросов 2013-11-12 16:47:15 +04:00
rzaitov 4ae8ef30c7 тест инклудов 2013-11-12 16:22:08 +04:00
rzaitov 213e47c8a3 Merge branch 'BS-32' 2013-11-12 16:12:31 +04:00
rzaitov 48da78e423 модифицировал шаги 2013-11-12 16:08:20 +04:00
rzaitov 79aeb84055 бэкапа может не быть 2013-11-12 16:06:56 +04:00
rzaitov bfbc348d11 проверил работоспособность удаления бэкапа 2013-11-12 16:05:32 +04:00
rzaitov 2cf1510af9 Модифицировал комманду удаления бэкапа 2013-11-12 16:04:14 +04:00
rzaitov b736419957 фикс восстановления из бэкапа 2013-11-12 15:54:46 +04:00
rzaitov 5270c5b8d0 дебажная печать 2013-11-12 15:49:26 +04:00
rzaitov e942ce40ec Модифицировал ручные тесты 2013-11-12 15:39:20 +04:00
rzaitov e51aa4990c Модифицировал комманду восстановления из бэкапа 2013-11-12 15:36:58 +04:00
rzaitov b02e7b9733 Модифицировал комманду создания бэкапа 2013-11-12 15:09:46 +04:00
rzaitov 1655b7f47a добавил забытую кодировку файла 2013-11-12 13:05:11 +04:00
rzaitov e2601db9d5 вычисляю пути для бэкапа на этапе создания комманд 2013-11-12 13:00:02 +04:00
rzaitov 42863417cb Реализовал реккурсивную обработку include/macro resolve 2013-11-12 12:41:32 +04:00
rzaitov ab42433c32 Исправил баг в команде создания бэкапа 2013-11-12 12:18:53 +04:00
rzaitov f52c52575b Пофиксил создание бэкапа 2013-11-12 12:08:46 +04:00
rzaitov c1806fdf2f убрал неиспользуемый класс 2013-11-12 11:44:36 +04:00
rzaitov 91fce4f1b6 Протестировал комманды создания/удаления/восстановления из бэкапа 2013-11-11 20:15:54 +04:00
rzaitov 56fe80c45b пофиксил комманды создания/удаления/восстановления бэкапа 2013-11-11 20:08:51 +04:00
rzaitov aba01994b3 Merge branch 'BS-31' 2013-11-11 18:20:13 +04:00
rzaitov 34bbafdae2 Пофиксил тесты 2013-11-11 16:26:17 +04:00
rzaitov 635000b7fc Подключил разрешение макросов в настройках 2013-11-11 16:24:14 +04:00
rzaitov df7e61b816 Реализовал класс для разрешения макросов в настройках 2013-11-11 15:45:51 +04:00
rzaitov f415ff5df5 реализовал класс узла для графа зависимостей. Написал тест разрешения зависимостей для односвязанного графа 2013-11-11 14:21:03 +04:00
rzaitov 5293ab0aab Merge branch 'BS-30' 2013-11-11 12:31:31 +04:00
rzaitov 3b268e953d пофиксил файл с настройками 2013-11-11 12:30:41 +04:00
rzaitov 384ae85d20 Реализовал макросы в инклудах 2013-11-11 12:25:33 +04:00
rzaitov 73182b83c6 Merge branch 'BS-29' 2013-11-08 13:58:27 +04:00
rzaitov 68b988daca Сначала удаляются комментарии, потом происходит удаление ведущих пробельных символов 2013-11-08 13:57:30 +04:00
rzaitov 59592c521c Merge branch 'BS-28' 2013-11-08 13:38:20 +04:00
rzaitov 2b3e4e9768 убрал замечания от CodeInspects 2013-11-08 13:37:46 +04:00
rzaitov 24a90c3cfd Merge branch 'BS-27' 2013-11-08 13:21:36 +04:00
rzaitov de6042379d проверил работоспособность комманды патчинга csproj файлов 2013-11-08 13:20:46 +04:00
rzaitov 5d099a151a Отрефакторил InsideSetParser, чтобы метод isValid повторно не строил регулярное выражение 2013-11-08 13:11:38 +04:00
rzaitov ced2f2f364 модифицировал построитель комманды для патчинга csproj файла 2013-11-08 13:10:20 +04:00
rzaitov 22d3abd817 Добавил парсер для команды патчинга csproj файла 2013-11-08 12:54:21 +04:00
rzaitov 65bc13ac3b избавился от неиспользуемого параметра 2013-11-08 12:53:31 +04:00
rzaitov a7d5c390bb Проверил работоспособность тестов 2013-11-08 12:35:10 +04:00
rzaitov 141ad81616 Merge branch 'BS-26-recover' 2013-11-07 21:19:04 +04:00
rzaitov 529ea75b86 создаю symlink при установке 2013-11-07 20:53:23 +04:00
rzaitov 225c9dea08 переименовал папку backupParser ParserBackup потому что все что начинается с backup попадает в глобальный гит игнор 2013-11-07 19:23:26 +04:00
rzaitov 2ff6cce555 потестил возможность определения post install 2013-11-07 18:48:12 +04:00
rzaitov 6c584b209e сделал попытку подключения symlink 2013-11-07 15:23:48 +04:00
rzaitov a0bdce7cc5 add execute permissions 2013-11-07 13:51:50 +04:00
rzaitov 4cbf3f6550 Добавил файл с шагами (простой вывод в консоль) для тестирования нахождения модулей 2013-11-07 13:46:26 +04:00
rzaitov ba16690838 Поместил все файлы в подпапку TouchinBuild (пакет) – это нужно чтобы при установке не захломлять папку packages 2013-11-07 13:16:21 +04:00
rzaitov 23c1064330 Переименовал пакет из parser в parsers, потому что исходное название вызывало коллизию при установке через pip 2013-11-07 13:03:25 +04:00
259 changed files with 3210 additions and 1041 deletions

View File

@ -7,26 +7,38 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotCompileApp", "NotCompile
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DroidApp", "DroidApp\DroidApp.csproj", "{10AA179F-818F-4E3F-947E-DE1C0C87BB76}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|iPhoneSimulator = Debug|iPhoneSimulator Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|iPhoneSimulator = Release|iPhoneSimulator Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone Debug|iPhone = Debug|iPhone
Release|iPhone = Release|iPhone Release|iPhone = Release|iPhone
Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Debug|iPhone.Build.0 = Debug|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Release|Any CPU.ActiveCfg = Release|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Release|Any CPU.Build.0 = Release|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Release|iPhone.ActiveCfg = Release|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{10AA179F-818F-4E3F-947E-DE1C0C87BB76}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhone.ActiveCfg = Debug|iPhone {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhone.ActiveCfg = Debug|iPhone
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhone.Build.0 = Debug|iPhone {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhone.Build.0 = Debug|iPhone
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhone.ActiveCfg = Release|iPhone {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhone.ActiveCfg = Release|iPhone
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhone.Build.0 = Release|iPhone
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator {3DE4FDFA-1502-44CF-9B73-78B6D730C59F}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhone.ActiveCfg = Debug|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhone.Build.0 = Debug|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhone.Build.0 = Debug|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhone.ActiveCfg = Release|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhone.ActiveCfg = Release|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhone.Build.0 = Release|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhone.Build.0 = Release|Any CPU
{BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU {BD5EC0A1-EDC9-4D90-BACF-AE54F26148C1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,4 +1,4 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0"> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@ -23,7 +23,8 @@
<MtouchLink>None</MtouchLink> <MtouchLink>None</MtouchLink>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<MtouchDebug>true</MtouchDebug> <MtouchDebug>true</MtouchDebug>
<MtouchI18n /> <MtouchI18n>
</MtouchI18n>
<MtouchArch>ARMv7</MtouchArch> <MtouchArch>ARMv7</MtouchArch>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhoneSimulator' ">
@ -34,7 +35,7 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<MtouchLink>None</MtouchLink> <MtouchLink>None</MtouchLink>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<CodesignProvision>MyProvisioningValue</CodesignProvision><CodesignKey>MyCodesignValue</CodesignKey></PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|iPhone' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType> <DebugType>full</DebugType>
@ -46,21 +47,24 @@
<MtouchDebug>true</MtouchDebug> <MtouchDebug>true</MtouchDebug>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<CodesignKey>iPhone Developer</CodesignKey> <CodesignKey>iPhone Developer</CodesignKey>
<IpaPackageName /> <IpaPackageName>
</IpaPackageName>
<CodesignProvision>F82B1481-F3D0-4CB5-AA6E-8B8D8E3A9DC1</CodesignProvision> <CodesignProvision>F82B1481-F3D0-4CB5-AA6E-8B8D8E3A9DC1</CodesignProvision>
<BuildIpa>true</BuildIpa> <BuildIpa>true</BuildIpa>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>true</Optimize> <Optimize>true</Optimize>
<OutputPath>bin\iPhone\Release</OutputPath> <OutputPath>Output</OutputPath>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<CodesignKey>iPhone Developer: Рустам Заитов (CTL85FZX6K)</CodesignKey> <CodesignKey>iPhone Developer: Рустам Заитов (CTL85FZX6K)</CodesignKey>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<CodesignProvision>8F606DAE-F9C9-4A19-8EFF-34B990D76C28</CodesignProvision> <CodesignProvision>8F606DAE-F9C9-4A19-8EFF-34B990D76C28</CodesignProvision>
<IpaPackageName /> <IpaPackageName>
<MtouchI18n /> </IpaPackageName>
<MtouchI18n>
</MtouchI18n>
<MtouchArch>ARMv7</MtouchArch> <MtouchArch>ARMv7</MtouchArch>
<BuildIpa>true</BuildIpa> <BuildIpa>true</BuildIpa>
</PropertyGroup> </PropertyGroup>
@ -70,9 +74,6 @@
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="monotouch" /> <Reference Include="monotouch" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="Info.plist" /> <None Include="Info.plist" />
</ItemGroup> </ItemGroup>
@ -88,4 +89,13 @@
<Name>Domain</Name> <Name>Domain</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Content\" />
</ItemGroup>
<ItemGroup>
<BundleResource Include="Content\Icons\icon-iphone-staging.png" />
<BundleResource Include="Content\Icons\icon-iphone-staging%402x.png" />
<BundleResource Include="Content\Icons\icon-iphone.png" />
<BundleResource Include="Content\Icons\icon-iphone%402x.png" />
</ItemGroup>
</Project> </Project>

View File

@ -16,5 +16,10 @@
<string>com.touchin.buildscript</string> <string>com.touchin.buildscript</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
<string>0.0.0</string> <string>0.0.0</string>
<key>CFBundleIconFiles</key>
<array>
<string>Content/Icons/icon-iphone@2x</string>
<string>Content/Icons/icon-iphone</string>
</array>
</dict> </dict>
</plist> </plist>

View File

@ -0,0 +1,19 @@
Any raw assets you want to be deployed with your application can be placed in
this directory (and child directories) and given a Build Action of "AndroidAsset".
These files will be deployed with your package and will be accessible using Android's
AssetManager, like this:
public class ReadAsset : Activity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
InputStream input = Assets.Open ("my_asset.txt");
}
}
Additionally, some Android functions will automatically load asset files:
Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf");

View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.0</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{10AA179F-818F-4E3F-947E-DE1C0C87BB76}</ProjectGuid>
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<RootNamespace>DroidApp</RootNamespace>
<AndroidApplication>True</AndroidApplication>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<AssemblyName>DroidApp</AssemblyName>
<TargetFrameworkVersion>v4.1</TargetFrameworkVersion>
<AndroidManifest>Properties\AndroidManifest.xml</AndroidManifest>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidLinkMode>None</AndroidLinkMode>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Mono.Android" />
</ItemGroup>
<ItemGroup>
<Compile Include="MainActivity.cs" />
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\AboutResources.txt" />
<None Include="Assets\AboutAssets.txt" />
<None Include="Properties\AndroidManifest.xml" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\layout\Main.axml" />
<AndroidResource Include="Resources\values\Strings.xml" />
<AndroidResource Include="Resources\drawable\Icon.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>

View File

@ -0,0 +1,35 @@
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace DroidApp
{
[Activity(Label = "DroidApp", MainLauncher = true)]
public class MainActivity : Activity
{
int count = 1;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
// Get our button from the layout resource,
// and attach an event to it
Button button = FindViewById<Button>(Resource.Id.myButton);
button.Click += delegate
{
button.Text = string.Format("{0} clicks!", count++);
};
}
}
}

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="DroidApp.DroidApp">
<uses-sdk />
<application android:label="DroidApp">
</application>
</manifest>

View File

@ -0,0 +1,23 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using Android.App;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle("DroidApp")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("rzaitov")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
[assembly: AssemblyVersion("1.0.0")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
//[assembly: AssemblyKeyFile("")]

View File

@ -0,0 +1,44 @@
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.

View File

@ -0,0 +1,112 @@
#pragma warning disable 1591
// ------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Mono Runtime Version: 4.0.30319.17020
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
// ------------------------------------------------------------------------------
[assembly: Android.Runtime.ResourceDesignerAttribute("DroidApp.Resource", IsApplication=true)]
namespace DroidApp
{
[System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Android.Build.Tasks", "1.0.0.0")]
public partial class Resource
{
static Resource()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
public static void UpdateIdValues()
{
}
public partial class Attribute
{
static Attribute()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private Attribute()
{
}
}
public partial class Drawable
{
// aapt resource value: 0x7f020000
public const int Icon = 2130837504;
static Drawable()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private Drawable()
{
}
}
public partial class Id
{
// aapt resource value: 0x7f050000
public const int myButton = 2131034112;
static Id()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private Id()
{
}
}
public partial class Layout
{
// aapt resource value: 0x7f030000
public const int Main = 2130903040;
static Layout()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private Layout()
{
}
}
public partial class String
{
// aapt resource value: 0x7f040001
public const int app_name = 2130968577;
// aapt resource value: 0x7f040000
public const int hello = 2130968576;
static String()
{
global::Android.Runtime.ResourceIdManager.UpdateIdValues();
}
private String()
{
}
}
}
}
#pragma warning restore 1591

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/myButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, Click Me!</string>
<string name="app_name">DroidApp</string>
</resources>

47
readme.txt Normal file
View File

@ -0,0 +1,47 @@
Добавить символьную ссылку на скрипт сборки. Заменить <builder_path> на абсолютный путь к корню репозитория билд скрипта
sudo ln -s <builder_path>/scripts/TouchinBuild/taskRunner.py /usr/local/bin/tibuild
Чтобы работала система сборки необходимо выполнить формальные шаги:
0. [iOS] Убедиться что в собираемом проекте выбор профиля обеспечения и сертификата производится автоматически.
Так следует сделать чтобы любой разработчик мог собрать проект, на билд сервере будут подставлены необоходимы значения автоматически
1. [iOS, Android] Убедиться что в названии проекта нет пробелов.
2. [iOS, Android] В корне репозитория создать папку scripts
mkdir scripts
3. [iOS] Положить в папку scripts профили обеспечения со следующими названиями
development.mobileprovision
distribution.mobileprovision
4. [iOS, Android] В папке scripts создать файл settings.txt
touch scripts/settings.txt
5. [iOS, Android] Скопировать содержимое примера scripts/common/setting.txt в свой файл settings.txt и переопределить все необходимые настройки
Стоит обратить внимание на комментации
# required эти настройки необходимо задать, иначе ничего не будет работать
# dont change это можно менять если есть четкое осознание того что происходит
6. [iOS, Android] вызвать скрипт, заменив параметры
на сервере. <builder_path> скорее всего это /BuildServer/Scripts
tibuild --settings=scripts/settings.txt build=%build.number% builder_path=<builder_path>
локально. path_to_local_direcotry путь к папке вне репозитория проекта (чтобы ничего не потерлось) или добавить папку в настройку backup_ignore
tibuild --settings=scripts/settings.txt build=777 builder_path=<builder_path> publish_path=<path_to_local_direcotry>
Пояснение значения некоторых настроек:
publish_step_type enum(development|distribution) в зависимости от этого значения будет вызван один из следующих шагов
'ios publish development.txt' копирование файла ipa в папку @publish_path/
'ios publish distribution.txt' - создание zip архива (app файла) и копирование его в папку @publish_path/
Это значение было введено чтобы поддерживать сборку с разными профилями обеспечения.
Типичный кейс. У нас 2 профайла:
development.mobileprovision сборка для наших тестировщиков [publish_step_type=development]
distribution.mobileprovision сборка для апстора [publish_step_type=distribution]
Расширенный кейс. У нас 3 профайла
development.mobileprovision сборка для наших тестировщиков [publish_step_type=development]
customer.mobileprovision сборка для тестировщиков заказчиков [publish_step_type=development]
distribution.mobileprovision сборка для апстора [publish_step_type=distribution]
bundle_id BundleId который будет подставлен в Info.Plist файл. Настройка нужна для поддержки сборки с разными профилями обсеспечеиня. Так например в профиле обеспечения предоставляемом заказчиком будет указан другой BunldeId, те не com.touchin.projectname

19
scripts/AndroidSteps.txt Normal file
View File

@ -0,0 +1,19 @@
restore from backup
create backup
inside 'BuildSample/BuildSample.sln' remove 'CoolApp:NotCompileApp:Domain' project
inside 'BuildSample/DroidApp/DroidApp.csproj' set OutputPath to 'Output' for '{@sln_config}'
inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionCode to '17'
inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionName to '1.2.3'
clean 'BuildSample/BuildSample.sln' for '{@sln_config}'
sign android 'BuildSample/BuildSample.sln' for '{@sln_config_build}' project 'DroidApp'
create dirs 'Output/GooglePlay/Artifacts'
sh cp BuildSample/DroidApp/Output/*.apk Output/GooglePlay/Artifacts
sh cp -a BuildSample/DroidApp/Output/ Output/GooglePlay/
restore from backup
delete backup

View File

@ -1,22 +0,0 @@
from commands.CreateBackupCommand import CreateBackupCommand
from parser.BackupParser.CreateBackupParser import CreateBackupParser
class CreateBackupCommandBuilder:
def __init__(self):
pass
def isCreateBackup(self, line):
assert line is not None
parser = CreateBackupParser()
return parser.isValidLine(line)
def getCommandFor(self, line):
assert line is not None
parser = CreateBackupParser()
backupArguments = parser.parseLine(line)
command = CreateBackupCommand(backupArguments)
return command

View File

@ -1,24 +0,0 @@
from commands.DeleteBackupCommand import DeleteBackupCommand
from parser.BackupParser.DeleteBackupParser import DeleteBackupParser
class DeleteBackupCommandBuilder:
def __init__(self):
pass
def isDeleteBackup(self, line):
assert line is not None
parser = DeleteBackupParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = DeleteBackupParser()
parser.parseLine(line)
command = DeleteBackupCommand()
return command

View File

@ -1,21 +0,0 @@
from commands.CopyCommand import CopyCommand
from parser.InstallProfileParser import InstallProfileParser
class InstallProfileCommandBuilder:
def __init__(self):
pass
def isInstallProfile(self, line):
assert line is not None
return line.startswith('install profile')
def getCommandFor(self, line):
assert line is not None
parser = InstallProfileParser()
cpArgs = parser.parseLine(line)
command = CopyCommand(cpArgs)
return command

View File

@ -1,35 +0,0 @@
from commands.PatchCsprojCommand import PatchCsprojCommand
from parser.InsideParser.InsideSetParser import InsideSetParser
class PatchCsprojCommandBuilder:
def __init__(self, config, valueProvider):
assert config is not None
assert valueProvider is not None
self.__config = config
self.__valueProvider = valueProvider
def getCommandFor(self, line):
assert line is not None
parser = InsideSetParser(self.__valueProvider, 'csproj')
result = parser.parseLine(line)
csprojPath = result[0]
key = result[1]
value = self.__valueProvider.getValueFor(result[2])
slnConfig = self.__config['sln_config']
command = PatchCsprojCommand(csprojPath, key, value, slnConfig)
return command
def isPatchCsproj(self, line):
assert line is not None
parser = InsideSetParser(self.__valueProvider, 'csproj')
isValid = parser.isValidLine(line)
return isValid

View File

@ -1,24 +0,0 @@
from commands.RestoreBackupCommand import RestoreBackupCommand
from parser.BackupParser.RestoreBackupParser import RestoreBackupParser
class RestoreBackupCommandBuilder:
def __init__(self):
pass
def isRestoreBackup(self, line):
assert line is not None
parser = RestoreBackupParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = RestoreBackupParser()
parser.parseLine(line)
command = RestoreBackupCommand()
return command

View File

@ -1,9 +0,0 @@
class FileContentProvider:
def __init__(self):
pass
def fetchContent(self, path):
file = open(path)
content = file.read()
return content

View File

@ -1,10 +0,0 @@
class CommentRemover:
def processText(self, line):
assert line is not None
newLine = line
index = line.find('#')
if index >= 0:
newLine = line[:index]
return newLine

View File

@ -1,5 +0,0 @@
class Stripper:
def processText(self, line):
assert line is not None
return line.strip(' \t\n\r')

View File

@ -1,16 +0,0 @@
class TextConveyorPreprocessor:
def __init__(self):
self.processors = []
def addProcessor(self, processor):
assert processor is not None
self.processors.append(processor)
def processText(self, text):
assert text is not None
for processor in self.processors:
text = processor.processText(text)
return text

View File

@ -1,10 +1,16 @@
restore from backup restore from backup # восстанавливаем из бэкапа (исходники от сборки предыдущей конфигурации могут быть модифицированными)
create backup for 'BuildSample' create backup
inside 'BuildSample/BuildSample.sln' remove NotCompileApp project sh echo 'Hello from setup.txt'
inside 'BuildSample/BuildSample.sln' remove 'NotCompileApp:DroidApp' project
inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for '{@sln_config}'
inside 'BuildSample/BuildSample/CoolApp.csproj' set AssemblyName to '{@assembly_name}' for ''
inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output'
inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}' inside 'BuildSample/BuildSample/Info.plist' set CFBundleVersion to '{@version}'
inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'CoolApp' inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to '{@project_name}'
inside 'BuildSample/BuildSample/Info.plist' set CFBundleIconFiles with values '{@icons}'
install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision' install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision'

View File

@ -1,16 +1,13 @@
sh echo hello from '{@author}' <include 'scripts/{@setup_steps}'>
sh echo version: '{@version}'
<include 'scripts/IosSetupSteps.txt'>
clean 'BuildSample/BuildSample.sln' for '{@sln_config}' clean 'BuildSample/BuildSample.sln' for '{@sln_config}'
build 'BuildSample/BuildSample.sln' for '{@sln_config}' build 'BuildSample/BuildSample.sln' for '{@sln_config}'
create dirs 'Output/Appstore/Artifacts' create dirs 'Output/Appstore/Artifacts'
copy 'BuildSample/BuildSample/Output/BuildSample-{@version}.ipa' to 'Output/Appstore/Artifacts' copy 'BuildSample/BuildSample/Output/{@assembly_name}-{@version}.ipa' to 'Output/Appstore/Artifacts'
sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/ sh cp -a BuildSample/BuildSample/Output/ Output/Appstore/
publish 'Output/Appstore/Artifacts/BuildSample-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}' #publish 'Output/Appstore/Artifacts/{@assembly_name}-{@version}.ipa' to testflight notes = 'Hello' api_token = '{@tf_api_token}' team_token = '{@tf_team_token}'
restore from backup restore from backup
delete backup delete backup

View File

@ -1,75 +1,78 @@
# file GENERATED by distutils, do NOT edit # file GENERATED by distutils, do NOT edit
README.txt README.txt
setup.py setup.py
CommandBuilders/CleanBuildCommandBuilder.py TouchinBuild/__init__.py
CommandBuilders/CopyCommandBuilder.py TouchinBuild/taskRunner.py
CommandBuilders/CreateBackupCommandBuilder.py TouchinBuild/CommandBuilders/CleanBuildCommandBuilder.py
CommandBuilders/DeleteBackupCommandBuilder.py TouchinBuild/CommandBuilders/CopyCommandBuilder.py
CommandBuilders/InstallProfileCommandBuilder.py TouchinBuild/CommandBuilders/CreateBackupCommandBuilder.py
CommandBuilders/MakeDirsCommandBuilder.py TouchinBuild/CommandBuilders/DeleteBackupCommandBuilder.py
CommandBuilders/PatchCsprojCommandBuilder.py TouchinBuild/CommandBuilders/InstallProfileCommandBuilder.py
CommandBuilders/PatchInfoplistCommandBuilder.py TouchinBuild/CommandBuilders/MakeDirsCommandBuilder.py
CommandBuilders/RemoveProjectCommandBuilder.py TouchinBuild/CommandBuilders/PatchCsprojCommandBuilder.py
CommandBuilders/RestoreBackupCommandBuilder.py TouchinBuild/CommandBuilders/PatchInfoplistCommandBuilder.py
CommandBuilders/ShCommandBuilder.py TouchinBuild/CommandBuilders/RemoveProjectCommandBuilder.py
CommandBuilders/TestflightCommandBuilder.py TouchinBuild/CommandBuilders/RestoreBackupCommandBuilder.py
CommandBuilders/__init__.py TouchinBuild/CommandBuilders/ShCommandBuilder.py
Core/FileContentProvider.py TouchinBuild/CommandBuilders/TestflightCommandBuilder.py
Core/StepsRunner.py TouchinBuild/CommandBuilders/__init__.py
Core/__init__.py TouchinBuild/Core/FileContentProvider.py
Core/LineConveyor/CommentRemover.py TouchinBuild/Core/StepsRunner.py
Core/LineConveyor/MacroResolver.py TouchinBuild/Core/__init__.py
Core/LineConveyor/Stripper.py TouchinBuild/Core/LineConveyor/CommentRemover.py
Core/LineConveyor/TextConveyorPreprocessor.py TouchinBuild/Core/LineConveyor/MacroResolver.py
Core/LineConveyor/TextInclude.py TouchinBuild/Core/LineConveyor/Stripper.py
Core/LineConveyor/__init__.py TouchinBuild/Core/LineConveyor/TextConveyorPreprocessor.py
commands/CopyCommand.py TouchinBuild/Core/LineConveyor/TextInclude.py
commands/CreateBackupCommand.py TouchinBuild/Core/LineConveyor/__init__.py
commands/DeleteBackupCommand.py TouchinBuild/commands/CopyCommand.py
commands/MakeDirsCommand.py TouchinBuild/commands/CreateBackupCommand.py
commands/PatchCsprojCommand.py TouchinBuild/commands/DeleteBackupCommand.py
commands/PatchInfoPlistCommand.py TouchinBuild/commands/MakeDirsCommand.py
commands/RemoveProjectCommand.py TouchinBuild/commands/PatchCsprojCommand.py
commands/RestoreBackupCommand.py TouchinBuild/commands/PatchInfoPlistCommand.py
commands/ShCommand.py TouchinBuild/commands/RemoveProjectCommand.py
commands/TestflightCommand.py TouchinBuild/commands/RestoreBackupCommand.py
commands/ValueProvider.py TouchinBuild/commands/ShCommand.py
commands/__init__.py TouchinBuild/commands/TestflightCommand.py
commands/CleanBuildCommands/BuildCommand.py TouchinBuild/commands/ValueProvider.py
commands/CleanBuildCommands/CleanBuildCommandBase.py TouchinBuild/commands/__init__.py
commands/CleanBuildCommands/CleanCommand.py TouchinBuild/commands/CleanBuildCommands/BuildCommand.py
commands/CleanBuildCommands/__init__.py TouchinBuild/commands/CleanBuildCommands/CleanBuildCommandBase.py
parser/CleanBuildParser.py TouchinBuild/commands/CleanBuildCommands/CleanCommand.py
parser/InstallProfileParser.py TouchinBuild/commands/CleanBuildCommands/__init__.py
parser/LineParser.py TouchinBuild/parsers/CleanBuildParser.py
parser/MakeDirsParser.py TouchinBuild/parsers/InstallProfileParser.py
parser/ShParser.py TouchinBuild/parsers/LineParser.py
parser/TestflightParser.py TouchinBuild/parsers/MakeDirsParser.py
parser/__init__.py TouchinBuild/parsers/ShParser.py
parser/BackupParser/CreateBackupArguments.py TouchinBuild/parsers/TestflightParser.py
parser/BackupParser/CreateBackupParser.py TouchinBuild/parsers/__init__.py
parser/BackupParser/DeleteBackupParser.py TouchinBuild/parsers/CopyParser/CopyArguments.py
parser/BackupParser/RestoreBackupParser.py TouchinBuild/parsers/CopyParser/CopyLineParser.py
parser/BackupParser/__init__.py TouchinBuild/parsers/CopyParser/__init__.py
parser/CopyParser/CopyArguments.py TouchinBuild/parsers/InsideParser/InsideCsprojSetParser.py
parser/CopyParser/CopyLineParser.py TouchinBuild/parsers/InsideParser/InsideRemoveParser.py
parser/CopyParser/__init__.py TouchinBuild/parsers/InsideParser/InsideSetParser.py
parser/InsideParser/InsideRemoveParser.py TouchinBuild/parsers/InsideParser/__init__.py
parser/InsideParser/InsideSetParser.py TouchinBuild/parsers/ParserBackup/CreateBackupArguments.py
parser/InsideParser/__init__.py TouchinBuild/parsers/ParserBackup/CreateBackupParser.py
parser/SettingsParser/PathParser.py TouchinBuild/parsers/ParserBackup/DeleteBackupParser.py
parser/SettingsParser/SettingsLineParser.py TouchinBuild/parsers/ParserBackup/RestoreBackupParser.py
parser/SettingsParser/SettingsMerger.py TouchinBuild/parsers/ParserBackup/__init__.py
parser/SettingsParser/SettingsParser.py TouchinBuild/parsers/SettingsParser/PathParser.py
parser/SettingsParser/__init__.py TouchinBuild/parsers/SettingsParser/SettingsLineParser.py
utils/BuildConfigProvider.py TouchinBuild/parsers/SettingsParser/SettingsMerger.py
utils/CsprojPatcher.py TouchinBuild/parsers/SettingsParser/SettingsParser.py
utils/IncludeProcessor.py TouchinBuild/parsers/SettingsParser/__init__.py
utils/InfoPlistPatcher.py TouchinBuild/utils/BuildConfigProvider.py
utils/MacroProcessor.py TouchinBuild/utils/CsprojPatcher.py
utils/SlnPatcher.py TouchinBuild/utils/IncludeProcessor.py
utils/TestflightPublisher.py TouchinBuild/utils/InfoPlistPatcher.py
utils/__init__.py TouchinBuild/utils/MacroProcessor.py
utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py TouchinBuild/utils/SlnPatcher.py
utils/SettingsProvider/FromFileSettingsProvider.py TouchinBuild/utils/TestflightPublisher.py
utils/SettingsProvider/__init__.py TouchinBuild/utils/__init__.py
TouchinBuild/utils/SettingsProvider/CmdArgsOverriderSettingsProvider.py
TouchinBuild/utils/SettingsProvider/FromFileSettingsProvider.py
TouchinBuild/utils/SettingsProvider/__init__.py

View File

@ -0,0 +1 @@
sh echo hello from '{@author}'

View File

@ -1,8 +0,0 @@
from CommandBuilders.CreateBackupCommandBuilder import CreateBackupCommandBuilder
line = "create backup for 'BuildSample'"
cmdBuilder = CreateBackupCommandBuilder()
command = cmdBuilder.getCommandFor(line)
command.execute()

View File

@ -1,11 +0,0 @@
from CommandBuilders.PatchCsprojCommandBuilder import PatchCsprojCommandBuilder
from commands.ValueProvider import ValueProvider
config = {'sln_config' : 'Release|iPhone'}
line = "inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output'"
value_provider = ValueProvider(config)
builder = PatchCsprojCommandBuilder(config, value_provider)
command = builder.getCommandFor(line)
command.execute()

View File

@ -1,8 +0,0 @@
from CommandBuilders.DeleteBackupCommandBuilder import DeleteBackupCommandBuilder
line = "delete backup"
cmdBuilder = DeleteBackupCommandBuilder()
command = cmdBuilder.getCommandFor(line)
command.execute()

View File

@ -1,11 +0,0 @@
from CommandBuilders.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder
line = "restore from backup"
builder = RestoreBackupCommandBuilder()
command = builder.getCommandFor(line)
command.execute()

View File

@ -1,7 +0,0 @@
from commands.ShCommand import ShCommand
calendarCommand = ShCommand('cal 12 2013')
calendarCommand.execute()
touchCommand = ShCommand('touch ../tmp.txt')
touchCommand.execute()

View File

@ -1,14 +0,0 @@
import unittest
from parser.InstallProfileParser import InstallProfileParser
class TestInstallProfile(unittest.TestCase):
def setUp(self):
self.parser = InstallProfileParser()
def test_parse(self):
line = "install profile 'Path/To/Profile.mobileprovision'"
copyArgs = self.parser.parseLine(line)
self.assertEqual('Path/To/Profile.mobileprovision', copyArgs.source)
self.assertEqual('~/Library/MobileDevice/Provisioning Profiles/Profile.mobileprovision', copyArgs.target)

View File

@ -1,15 +0,0 @@
# -*- coding: utf-8 -*-
import unittest
from parser.SettingsParser.SettingsLineParser import SettingsLineParser
class TestSettingsLineParser(unittest.TestCase):
def setUp(self):
self.parser = SettingsLineParser()
def test_getPathAndValue(self):
line = "abc.123.some_name = 'crazy value ±~ ../ 123'"
result = self.parser.splitToPathAndValue(line)
self.assertEqual('abc.123.some_name', result[0])
self.assertEqual('crazy value ±~ ../ 123', result[1])

View File

@ -1,5 +0,0 @@
Запуск всех тестов
python -m unittest discover -s Tests/UnitTests/
Запуск части тестов
python -m unittest discover -s Tests/UnitTests/CopyParser/

View File

@ -0,0 +1,12 @@
from parsers.ValuesStriper import ValuesStripper
class BaseBackupCommandBuilder:
def __init__(self, ignoreBackupStr):
if ignoreBackupStr:
splitter = ValuesStripper(',')
values = splitter.strip(ignoreBackupStr)
self.ignoreBackup = values
else:
self.ignoreBackup = []

View File

@ -0,0 +1,23 @@
from CommandBuilders.BuilderBackupCommands.BaseBackupCommandBuilder import BaseBackupCommandBuilder
from commands.BaseBackupCommand.CreateBackupCommand import CreateBackupCommand
from parsers.ParserBackup.CreateBackupParser import CreateBackupParser
class CreateBackupCommandBuilder(BaseBackupCommandBuilder):
def __init__(self, ignoreBackupStr):
BaseBackupCommandBuilder.__init__(self, ignoreBackupStr)
def isCreateBackup(self, line):
assert line is not None
parser = CreateBackupParser()
return parser.isValidLine(line)
def getCommandFor(self, line):
assert line is not None
parser = CreateBackupParser()
parser.parseLine(line)
command = CreateBackupCommand(self.ignoreBackup)
return command

View File

@ -0,0 +1,25 @@
from CommandBuilders.BuilderBackupCommands.BaseBackupCommandBuilder import BaseBackupCommandBuilder
from commands.BaseBackupCommand.DeleteBackupCommand import DeleteBackupCommand
from parsers.ParserBackup.DeleteBackupParser import DeleteBackupParser
class DeleteBackupCommandBuilder(BaseBackupCommandBuilder):
def __init__(self, ignoreBackupStr):
BaseBackupCommandBuilder.__init__(self, ignoreBackupStr)
def isDeleteBackup(self, line):
assert line is not None
parser = DeleteBackupParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = DeleteBackupParser()
parser.parseLine(line)
command = DeleteBackupCommand(self.ignoreBackup)
return command

View File

@ -0,0 +1,25 @@
from CommandBuilders.BuilderBackupCommands.BaseBackupCommandBuilder import BaseBackupCommandBuilder
from commands.BaseBackupCommand.RestoreBackupCommand import RestoreBackupCommand
from parsers.ParserBackup.RestoreBackupParser import RestoreBackupParser
class RestoreBackupCommandBuilder(BaseBackupCommandBuilder):
def __init__(self, ignoreBackupStr):
BaseBackupCommandBuilder.__init__(self, ignoreBackupStr)
def isRestoreBackup(self, line):
assert line is not None
parser = RestoreBackupParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = RestoreBackupParser()
parser.parseLine(line)
command = RestoreBackupCommand(self.ignoreBackup)
return command

View File

@ -1,6 +1,6 @@
from commands.CleanBuildCommands.BuildCommand import BuildCommand from commands.CleanBuildCommands.BuildCommand import BuildCommand
from commands.CleanBuildCommands.CleanCommand import CleanCommand from commands.CleanBuildCommands.CleanCommand import CleanCommand
from parser.CleanBuildParser import CleanBuildParser from parsers.CleanBuildParser import CleanBuildParser
class CleanBuildCommandBuilder: class CleanBuildCommandBuilder:

View File

@ -1,5 +1,5 @@
from commands.CopyCommand import CopyCommand from commands.CopyCommand import CopyCommand
from parser.CopyParser.CopyLineParser import CopyLineParser from parsers.CopyParser.CopyLineParser import CopyLineParser
class CopyCommandBuilder: class CopyCommandBuilder:

View File

@ -0,0 +1,46 @@
import os
from commands.CopyCommand import CopyCommand
from parsers.CopyParser.CopyArguments import CopyArguments
from parsers.InstallProfileParser import InstallProfileParser
class InstallProfileCommandBuilder:
def __init__(self, profileFilePrefix):
assert profileFilePrefix is not None
self.profileFilePrefix = profileFilePrefix
self.profileStorageDir = '~/Library/MobileDevice/Provisioning Profiles/'
def isInstallProfile(self, line):
assert line is not None
parser = InstallProfileParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = InstallProfileParser()
srcPath = parser.parseLine(line)
dstPath = self.getDestinationPath(srcPath)
cpArgs = CopyArguments()
cpArgs.setArguments(srcPath, dstPath)
command = CopyCommand(cpArgs)
return command
def getDestinationPath(self, sourcePath):
dstProfileFileName = self.fetchDstFileName(sourcePath)
dstProfilePath = os.path.join(self.profileStorageDir, dstProfileFileName)
return dstProfilePath
def fetchDstFileName(self, srcFilePath):
profileFileName = os.path.basename(srcFilePath)
profileFileName = '{0}.{1}'.format(self.profileFilePrefix, profileFileName)
return profileFileName

View File

@ -1,5 +1,5 @@
from commands.MakeDirsCommand import MakeDirsCommand from commands.MakeDirsCommand import MakeDirsCommand
from parser.MakeDirsParser import MakeDirsParser from parsers.MakeDirsParser import MakeDirsParser
class MakeDirsCommandBuilder: class MakeDirsCommandBuilder:

View File

@ -0,0 +1,32 @@
from commands.PatchCsprojCommand import PatchCsprojCommand
from parsers.InsideParser.InsideCsprojSetParser import InsideCsprojSetParser
class PatchCsprojCommandBuilder:
def __init__(self):
pass
def getCommandFor(self, line):
assert line is not None
parser = self.getParser()
result = parser.parseLine(line)
csprojPath = result[0]
key = result[1]
value = result[2]
slnConfig = result[3]
command = PatchCsprojCommand(csprojPath, key, value, slnConfig)
return command
def isPatchCsproj(self, line):
assert line is not None
parser = self.getParser()
isValid = parser.isValidLine(line)
return isValid
def getParser(self):
return InsideCsprojSetParser('csproj')

View File

@ -0,0 +1,31 @@
from commands.PatchInfoPlistCommand import PatchInfoPlistCommand
from parsers.InsideParser.InsideSetArrayParser import InsideSetArrayParser
class PatchInfoPlistArrayCommandBuilder:
def __init__(self):
pass
def isPatchInfoPlist(self, line):
assert line is not None
parser = self.createParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
parser = self.createParser()
result = parser.parseLine(line)
path = result[0]
key = result[1]
value = parser.values
command = PatchInfoPlistCommand(path, key, value)
return command
def createParser(self):
parser = InsideSetArrayParser('plist')
return parser

View File

@ -1,5 +1,5 @@
from commands.PatchInfoPlistCommand import PatchInfoPlistCommand from commands.PatchInfoPlistCommand import PatchInfoPlistCommand
from parser.InsideParser.InsideSetParser import InsideSetParser from parsers.InsideParser.InsideSetParser import InsideSetParser
class PatchInfoplistCommandBuilder: class PatchInfoplistCommandBuilder:
@ -11,13 +11,13 @@ class PatchInfoplistCommandBuilder:
def isPatchInfoPlist(self, line): def isPatchInfoPlist(self, line):
assert line is not None assert line is not None
parser = self.__createParser() parser = self.createParser()
isValid = parser.isValidLine(line) isValid = parser.isValidLine(line)
return isValid return isValid
def getCommandFor(self, line): def getCommandFor(self, line):
parser = self.__createParser() parser = self.createParser()
result = parser.parseLine(line) result = parser.parseLine(line)
path = result[0] path = result[0]
@ -27,7 +27,7 @@ class PatchInfoplistCommandBuilder:
command = PatchInfoPlistCommand(path, key, value) command = PatchInfoPlistCommand(path, key, value)
return command return command
def __createParser(self): def createParser(self):
parser = InsideSetParser(self.__valueProvider, 'plist') parser = InsideSetParser('plist')
return parser return parser

View File

@ -0,0 +1,24 @@
from commands.PatchManifestCommand import PatchManifestCommand
from parsers.InsideParser.InsideSetParser import InsideSetParser
class PatchManifestCommandBuilder:
def __init__(self):
pass
def isManifestCommand(self, line):
assert line is not None
parser = InsideSetParser('xml')
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = InsideSetParser('xml')
result = parser.parseLine(line)
command = PatchManifestCommand(result[0], result[1], result[2])
return command

View File

@ -1,5 +1,5 @@
from commands.RemoveProjectCommand import RemoveProjectCommand from commands.RemoveProjectCommand import RemoveProjectCommand
from parser.InsideParser.InsideRemoveParser import InsideRemoveParser from parsers.InsideParser.InsideRemoveParser import InsideRemoveParser
class RemoveProjectCommandBuilder: class RemoveProjectCommandBuilder:
@ -20,8 +20,8 @@ class RemoveProjectCommandBuilder:
parser = InsideRemoveParser('sln') parser = InsideRemoveParser('sln')
result = parser.parseLine(line) result = parser.parseLine(line)
slnPath = result[0] slnPath = result['file_path']
projectName = result[1] projectNames = result['names']
command = RemoveProjectCommand(slnPath, projectName) command = RemoveProjectCommand(slnPath, projectNames)
return command return command

View File

@ -1,5 +1,5 @@
from commands.ShCommand import ShCommand from commands.ShTextCommand import ShTextCommand
from parser.ShParser import ShParser from parsers.ShParser import ShParser
class ShCommandBuilder: class ShCommandBuilder:
@ -19,5 +19,5 @@ class ShCommandBuilder:
cmdText = parser.parseLine(line) cmdText = parser.parseLine(line)
command = ShCommand(cmdText) command = ShTextCommand(cmdText)
return command return command

View File

@ -0,0 +1,30 @@
from commands.CleanBuildCommands.SignApkCommand import SignApkCommand
from parsers.SignApkParser import SignApkParser
class SignApkCommandBuilder:
def __init__(self, pathToBuildUtil):
assert pathToBuildUtil is not None
self.pathToBuildUtil = pathToBuildUtil
def isSignApk(self, line):
assert line is not None
parser = SignApkParser()
isValid = parser.isValidLine(line)
return isValid
def getCommandFor(self, line):
assert line is not None
parser = SignApkParser()
result = parser.parseLine(line)
slnPath = result[0]
slnConfig = result[1]
projectName = result[2]
command = SignApkCommand(self.pathToBuildUtil, slnPath, slnConfig, projectName)
return command

View File

@ -1,5 +1,5 @@
from commands.TestflightCommand import TestflightCommand from commands.TestflightCommand import TestflightCommand
from parser.TestflightParser import TestflightParser from parsers.TestflightParser import TestflightParser
class TestflightCommandBuilder: class TestflightCommandBuilder:

View File

@ -0,0 +1,6 @@
class BuildConfigProviderBase:
def __init__(self):
pass
def getConfigs(self, rootConfig):
pass

View File

@ -0,0 +1,7 @@
class ContentProviderBase:
def __init__(self):
pass
def fetchContent(self, key):
pass

View File

@ -0,0 +1,38 @@
class DependencyResolver:
def __init__(self):
pass
def resolve(self, unresolved):
assert unresolved is not None
resolved = []
while len(unresolved) > 0:
node = unresolved[0]
self.resolveNode(node, resolved, unresolved, [])
return resolved
def resolveNode(self, node, resolved, unresolved, seen):
assert node is not None
assert resolved is not None
assert seen is not None
seen.append(node)
for dependency in node.edges:
if dependency not in resolved:
self.guardNotCircularReference(node, dependency, seen)
self.resolveNode(dependency, resolved, unresolved, seen)
resolved.append(node)
unresolved.remove(node)
seen.remove(node)
def guardNotCircularReference(self, start, dependency, seen):
assert start is not None
assert dependency is not None
assert seen is not None
if dependency in seen:
raise Exception('Circular reference detected: {0} -> {1}'.format(start.name, dependency.name))

View File

@ -0,0 +1,12 @@
class Node:
def __init__(self, name):
assert name is not None
self.name = name
self.edges = []
def addEdge(self, node):
assert node is not None
assert node not in self.edges
self.edges.append(node)

View File

@ -0,0 +1,60 @@
from Core.DependencyResolver.DependencyResolver import DependencyResolver
from Core.DependencyResolver.Node import Node
from Core.LineConveyor.MacroResolver import MacroResolver
from commands.ValueProvider import ValueProvider
from utils.MacroProcessor import MacroProcessor
class SettingsResolver:
def __init__(self, settingsDictionary):
assert settingsDictionary is not None
self.settings = settingsDictionary.copy()
self.nodeStorage = {}
self.macroProcessor = MacroProcessor()
self.valueProvider = ValueProvider()
self.valueProvider.setConfig(self.settings)
def resolveSettings(self):
self.fillNodesStorage()
unresolved = self.nodeStorage.values()
dependencyResolver = DependencyResolver()
resolved = dependencyResolver.resolve(unresolved)
self.resolveSettingValues(resolved)
return self.settings
def fillNodesStorage(self):
for key in self.settings:
node = self.fetchNodeByKey(key)
value = self.settings[key]
macroNames = self.macroProcessor.getSymbols(value)
for symbol in macroNames:
name = self.macroProcessor.getNameByMacroName(symbol)
dependency = self.fetchNodeByKey(name)
node.addEdge(dependency)
def fetchNodeByKey(self, key):
assert key is not Node
node = self.nodeStorage.get(key, Node(key))
self.nodeStorage[key] = node
return node
def resolveSettingValues(self, resolvedDependencies):
macroResolver = MacroResolver(self.macroProcessor, self.valueProvider)
for node in resolvedDependencies:
unresolvedSettingValue = self.settings[node.name]
resolvedSettingValue = macroResolver.processText(unresolvedSettingValue, None)
self.settings[node.name] = resolvedSettingValue

View File

@ -0,0 +1,12 @@
from Core.ContentProviderBase import ContentProviderBase
class FileContentProvider(ContentProviderBase):
def __init__(self):
ContentProviderBase.__init__(self)
def fetchContent(self, path):
f = open(path)
content = f.read()
return content

View File

@ -0,0 +1,16 @@
from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class CommentRemover(PreprocessorBase):
def __init__(self):
PreprocessorBase.__init__(self)
def processText(self, line, conveyorProcessor):
assert line is not None
newLine = line
index = line.find('#')
if index >= 0:
newLine = line[:index]
return newLine

View File

@ -1,12 +1,17 @@
class MacroResolver: from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class MacroResolver(PreprocessorBase):
def __init__(self, macroProcessor, valueProvider): def __init__(self, macroProcessor, valueProvider):
PreprocessorBase.__init__(self)
assert macroProcessor is not None assert macroProcessor is not None
assert valueProvider is not None assert valueProvider is not None
self.macroProcessor = macroProcessor self.macroProcessor = macroProcessor
self.valueProvider = valueProvider self.valueProvider = valueProvider
def processText(self, line): def processText(self, line, conveyorProcessor):
assert line is not None assert line is not None
symbols = self.macroProcessor.getSymbols(line) symbols = self.macroProcessor.getSymbols(line)

View File

@ -0,0 +1,9 @@
from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class NullPreprocessor(PreprocessorBase):
def __init__(self):
PreprocessorBase.__init__(self)
def processText(self, text, conveyorProcessor):
return text

View File

@ -0,0 +1,12 @@
import abc
class PreprocessorBase(object):
__metaclass__ = abc.ABCMeta
def __init__(self):
pass
@abc.abstractmethod
def processText(self, line, conveyorProcessor):
pass

View File

@ -0,0 +1,11 @@
from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class Stripper(PreprocessorBase):
def __init__(self):
PreprocessorBase.__init__(self)
def processText(self, line, conveyorProcessor):
assert line is not None
return line.strip(' \t\n\r')

View File

@ -0,0 +1,20 @@
from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class TextConveyorPreprocessor(PreprocessorBase):
def __init__(self):
PreprocessorBase.__init__(self)
self.processors = []
def addProcessor(self, processor):
assert processor is not None
self.processors.append(processor)
def processText(self, text, conveyorProcessor):
assert text is not None
for processor in self.processors:
text = processor.processText(text, conveyorProcessor)
return text

View File

@ -1,12 +1,17 @@
class TextInclude: from Core.LineConveyor.PreprocessorBase import PreprocessorBase
class TextInclude(PreprocessorBase):
def __init__(self, includeProcessor, contentProvider): def __init__(self, includeProcessor, contentProvider):
PreprocessorBase.__init__(self)
assert includeProcessor is not None assert includeProcessor is not None
assert contentProvider is not None assert contentProvider is not None
self.includeProcessor = includeProcessor self.includeProcessor = includeProcessor
self.contentProvider = contentProvider self.contentProvider = contentProvider
def processText(self, text): def processText(self, text, conveyorProcessor):
assert text is not None assert text is not None
includesInfo = self.includeProcessor.getIncludesInfo(text) includesInfo = self.includeProcessor.getIncludesInfo(text)
@ -15,6 +20,8 @@ class TextInclude:
path = info[1] path = info[1]
content = self.contentProvider.fetchContent(path) content = self.contentProvider.fetchContent(path)
content = conveyorProcessor.processText(content, conveyorProcessor)
text = text.replace(includeStatement, content) text = text.replace(includeStatement, content)
return text return text

View File

@ -0,0 +1,6 @@
class SettingsProviderBase:
def __init__(self):
pass
def fetchSettings(self):
pass

View File

@ -1,14 +1,18 @@
from CommandBuilders.BuilderBackupCommands.CreateBackupCommandBuilder import CreateBackupCommandBuilder
from CommandBuilders.BuilderBackupCommands.DeleteBackupCommandBuilder import DeleteBackupCommandBuilder
from CommandBuilders.BuilderBackupCommands.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder
from CommandBuilders.CleanBuildCommandBuilder import CleanBuildCommandBuilder from CommandBuilders.CleanBuildCommandBuilder import CleanBuildCommandBuilder
from CommandBuilders.CopyCommandBuilder import CopyCommandBuilder from CommandBuilders.CopyCommandBuilder import CopyCommandBuilder
from CommandBuilders.CreateBackupCommandBuilder import CreateBackupCommandBuilder
from CommandBuilders.DeleteBackupCommandBuilder import DeleteBackupCommandBuilder
from CommandBuilders.InstallProfileCommandBuilder import InstallProfileCommandBuilder from CommandBuilders.InstallProfileCommandBuilder import InstallProfileCommandBuilder
from CommandBuilders.MakeDirsCommandBuilder import MakeDirsCommandBuilder from CommandBuilders.MakeDirsCommandBuilder import MakeDirsCommandBuilder
from CommandBuilders.PatchCsprojCommandBuilder import PatchCsprojCommandBuilder from CommandBuilders.PatchCsprojCommandBuilder import PatchCsprojCommandBuilder
from CommandBuilders.PatchInfoPlistArrayCommandBuilder import PatchInfoPlistArrayCommandBuilder
from CommandBuilders.PatchInfoplistCommandBuilder import PatchInfoplistCommandBuilder from CommandBuilders.PatchInfoplistCommandBuilder import PatchInfoplistCommandBuilder
from CommandBuilders.PatchManifestCommandBuilder import PatchManifestCommandBuilder
from CommandBuilders.RemoveProjectCommandBuilder import RemoveProjectCommandBuilder from CommandBuilders.RemoveProjectCommandBuilder import RemoveProjectCommandBuilder
from CommandBuilders.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder
from CommandBuilders.ShCommandBuilder import ShCommandBuilder from CommandBuilders.ShCommandBuilder import ShCommandBuilder
from CommandBuilders.SignApkBuilder import SignApkCommandBuilder
from CommandBuilders.TestflightCommandBuilder import TestflightCommandBuilder from CommandBuilders.TestflightCommandBuilder import TestflightCommandBuilder
@ -23,26 +27,34 @@ class StepsRunner:
self.shCommandBuilder = ShCommandBuilder() self.shCommandBuilder = ShCommandBuilder()
self.removeProjectBuilder = RemoveProjectCommandBuilder() self.removeProjectBuilder = RemoveProjectCommandBuilder()
self.createBackupBuilder = CreateBackupCommandBuilder()
self.restoreFromBackupBuilder = RestoreBackupCommandBuilder()
self.deleteBackupBuilder = DeleteBackupCommandBuilder()
self.createDirs = MakeDirsCommandBuilder() self.createDirs = MakeDirsCommandBuilder()
self.patchCsproj = PatchCsprojCommandBuilder(config, self.valueProvider) self.patchCsproj = PatchCsprojCommandBuilder()
self.patchInfoPlist = PatchInfoplistCommandBuilder(self.valueProvider) self.patchInfoPlist = PatchInfoplistCommandBuilder(self.valueProvider)
self.patchInfoPlistArray = PatchInfoPlistArrayCommandBuilder()
self.patchManifest = PatchManifestCommandBuilder()
self.copyBuilder = CopyCommandBuilder() self.copyBuilder = CopyCommandBuilder()
self.testflightBuilder = TestflightCommandBuilder() self.testflightBuilder = TestflightCommandBuilder()
self.installProfileBuilder = InstallProfileCommandBuilder()
ignoreBackup = config.get('backup_ignore', None)
self.createBackupBuilder = CreateBackupCommandBuilder(ignoreBackup)
self.restoreFromBackupBuilder = RestoreBackupCommandBuilder(ignoreBackup)
self.deleteBackupBuilder = DeleteBackupCommandBuilder(ignoreBackup)
profilePrefix = config['project_name']
self.installProfileBuilder = InstallProfileCommandBuilder(profilePrefix)
buildUtilPath = config['build_tool'] buildUtilPath = config['build_tool']
self.cleanBuilder = CleanBuildCommandBuilder(buildUtilPath, 'clean') self.cleanBuilder = CleanBuildCommandBuilder(buildUtilPath, 'clean')
self.buildBuilder = CleanBuildCommandBuilder(buildUtilPath, 'build') self.buildBuilder = CleanBuildCommandBuilder(buildUtilPath, 'build')
self.signAndroid = SignApkCommandBuilder(buildUtilPath)
def run(self, content): def run(self, content):
assert content is not None assert content is not None
lines = content.splitlines() lines = content.splitlines()
for line in lines: for line in lines:
processedLine = self.lineConveyor.processText(line) processedLine = self.lineConveyor.processText(line, self.lineConveyor)
if len(processedLine) == 0: if len(processedLine) == 0:
continue continue
@ -58,6 +70,8 @@ class StepsRunner:
cmd = self.cleanBuilder.getCommandFor(line) cmd = self.cleanBuilder.getCommandFor(line)
elif self.buildBuilder.isCleanBuild(line): elif self.buildBuilder.isCleanBuild(line):
cmd = self.buildBuilder.getCommandFor(line) cmd = self.buildBuilder.getCommandFor(line)
elif self.signAndroid.isSignApk(line):
cmd = self.signAndroid.getCommandFor(line)
elif self.createBackupBuilder.isCreateBackup(line): elif self.createBackupBuilder.isCreateBackup(line):
cmd = self.createBackupBuilder.getCommandFor(line) cmd = self.createBackupBuilder.getCommandFor(line)
elif self.createDirs.isMakeDirsCommand(line): elif self.createDirs.isMakeDirsCommand(line):
@ -66,6 +80,10 @@ class StepsRunner:
cmd = self.patchCsproj.getCommandFor(line) cmd = self.patchCsproj.getCommandFor(line)
elif self.patchInfoPlist.isPatchInfoPlist(line): elif self.patchInfoPlist.isPatchInfoPlist(line):
cmd = self.patchInfoPlist.getCommandFor(line) cmd = self.patchInfoPlist.getCommandFor(line)
elif self.patchInfoPlistArray.isPatchInfoPlist(line):
cmd = self.patchInfoPlistArray.getCommandFor(line)
elif self.patchManifest.isManifestCommand(line):
cmd = self.patchManifest.getCommandFor(line)
elif self.copyBuilder.isCopy(line): elif self.copyBuilder.isCopy(line):
cmd =self.copyBuilder.getCommandFor(line) cmd =self.copyBuilder.getCommandFor(line)
elif self.restoreFromBackupBuilder.isRestoreBackup(line): elif self.restoreFromBackupBuilder.isRestoreBackup(line):
@ -80,4 +98,6 @@ class StepsRunner:
msg = "unrecognised step. Line: '{0}'".format(line) msg = "unrecognised step. Line: '{0}'".format(line)
raise Exception(msg) raise Exception(msg)
print 'start: {0}'.format(line)
cmd.execute() cmd.execute()
print 'finish: {0}'.format(line)

View File

@ -0,0 +1,19 @@
from Core.LineConveyor.NullPreprocessor import NullPreprocessor
from Core.SettingsProviderBase import SettingsProviderBase
from parsers.SettingsParser.SettingsParser import SettingsParser
class SettingsProviderStub(SettingsProviderBase):
def __init__(self, settingsText):
assert settingsText is not None
SettingsProviderBase.__init__(self)
self.settingsText = settingsText
def fetchSettings(self):
preprocessor = NullPreprocessor()
parser = SettingsParser(preprocessor, None)
parser.parse(self.settingsText)
return parser.settings

View File

@ -0,0 +1,8 @@
from CommandBuilders.BuilderBackupCommands.CreateBackupCommandBuilder import CreateBackupCommandBuilder
line = "create backup"
cmdBuilder = CreateBackupCommandBuilder(None)
command = cmdBuilder.getCommandFor(line)
command.execute()

View File

@ -0,0 +1,7 @@
from CommandBuilders.PatchCsprojCommandBuilder import PatchCsprojCommandBuilder
line = "inside 'BuildSample/BuildSample/CoolApp.csproj' set OutputPath to 'Output' for 'Release|iPhone'"
builder = PatchCsprojCommandBuilder()
command = builder.getCommandFor(line)
command.execute()

View File

@ -0,0 +1,8 @@
from CommandBuilders.BuilderBackupCommands.DeleteBackupCommandBuilder import DeleteBackupCommandBuilder
line = "delete backup"
cmdBuilder = DeleteBackupCommandBuilder(None)
command = cmdBuilder.getCommandFor(line)
command.execute()

View File

@ -0,0 +1,8 @@
from CommandBuilders.PatchInfoPlistArrayCommandBuilder import PatchInfoPlistArrayCommandBuilder
line = "inside 'BuildSample/BuildSample/Info.plist' set UISupportedInterfaceOrientations with values 'value1:value2:value3'"
cmdBuilder = PatchInfoPlistArrayCommandBuilder()
command = cmdBuilder.getCommandFor(line)
command.execute()

View File

@ -12,7 +12,8 @@ config = {
} }
line = "inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'MyCoolApp'" line = "inside 'BuildSample/BuildSample/Info.plist' set CFBundleDisplayName to 'MyCoolApp'"
value_provider = ValueProvider(config) value_provider = ValueProvider()
value_provider.setConfig(config)
builder = PatchInfoplistCommandBuilder(value_provider) builder = PatchInfoplistCommandBuilder(value_provider)
command = builder.getCommandFor(line) command = builder.getCommandFor(line)

View File

@ -2,7 +2,7 @@ from CommandBuilders.InstallProfileCommandBuilder import InstallProfileCommandBu
line = "install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision'" line = "install profile 'BuildSample/BuildSample/Profiles/8F606DAE-F9C9-4A19-8EFF-34B990D76C28.mobileprovision'"
builder = InstallProfileCommandBuilder() builder = InstallProfileCommandBuilder('BsProject')
command = builder.getCommandFor(line) command = builder.getCommandFor(line)
command.execute() command.execute()

View File

@ -0,0 +1,52 @@
from Core.ContentProviderBase import ContentProviderBase
from Core.LineConveyor.NullPreprocessor import NullPreprocessor
from Tests.Common.SettingsProviderStub import SettingsProviderStub
from taskRunner import TaskRunner
from utils.BuildConfigProvider.BuildConfigProvider import BuildConfigProvider
settingsText = """
build_tool = '/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool'
version = '0.0.0'
configs = 'config1, config2'
steps = 'main_steps'
config1.sub_steps = 'sub_steps1'
config2.sub_steps = 'sub_steps2'
"""
stepsFileContent = """
<include '{@sub_steps}'>
"""
subSteps1Content = """
sh echo One
"""
subSteps2Content = """
sh echo Two
"""
class ContentProviderMock(ContentProviderBase):
def __init__(self):
ContentProviderBase.__init__(self)
def fetchContent(self, key):
if key == 'sub_steps1':
return subSteps1Content
elif key == 'sub_steps2':
return subSteps2Content
elif key == 'main_steps':
return stepsFileContent
else:
raise Exception(key)
settingsProvider = SettingsProviderStub(settingsText)
contentProvider = ContentProviderMock()
buildConfigProvider = BuildConfigProvider()
preprocessor = NullPreprocessor()
taskRunner = TaskRunner(settingsProvider, contentProvider, buildConfigProvider, preprocessor, {})
taskRunner.run()

View File

@ -0,0 +1,8 @@
from CommandBuilders.PatchManifestCommandBuilder import PatchManifestCommandBuilder
line = "inside 'BuildSample/DroidApp/Properties/AndroidManifest.xml' set android:versionCode to '7.7.7'"
builder = PatchManifestCommandBuilder()
command = builder.getCommandFor(line)
command.execute()

View File

@ -0,0 +1,46 @@
from Core.ContentProviderBase import ContentProviderBase
from Core.LineConveyor.NullPreprocessor import NullPreprocessor
from Tests.Common.SettingsProviderStub import SettingsProviderStub
from taskRunner import TaskRunner
from utils.BuildConfigProvider.BuildConfigProvider import BuildConfigProvider
from utils.BuildConfigProvider.ResolvedBuildConfigProvider import ResolvedBuildConfigProvider
settingsText = """
build_tool = '/Applications/Xamarin\ Studio.app/Contents/MacOS/mdtool'
major_minor = '1.2'
build = '345'
configs = 'config1, config2'
steps = 'main_steps'
config1.version = '{@major_minor}'
config2.version = '{@major_minor}.{@build}'
"""
stepsFileContent = """
sh echo {@version}
"""
class ContentProviderMock(ContentProviderBase):
def __init__(self):
ContentProviderBase.__init__(self)
def fetchContent(self, key):
if key == 'main_steps':
return stepsFileContent
else:
raise Exception(key)
settingsProvider = SettingsProviderStub(settingsText)
buildConfigProvider = BuildConfigProvider()
resolvedBuildConfigProvider = ResolvedBuildConfigProvider(buildConfigProvider)
contentProvider = ContentProviderMock()
preprocessor = NullPreprocessor()
taskRunner = TaskRunner(settingsProvider, contentProvider, resolvedBuildConfigProvider, preprocessor, {})
taskRunner.run()

View File

@ -0,0 +1,11 @@
from CommandBuilders.BuilderBackupCommands.RestoreBackupCommandBuilder import RestoreBackupCommandBuilder
line = "restore from backup"
builder = RestoreBackupCommandBuilder(None)
command = builder.getCommandFor(line)
command.execute()

View File

@ -0,0 +1,7 @@
from commands.ShTextCommand import ShTextCommand
calendarCommand = ShTextCommand('cal 12 2013')
calendarCommand.execute()
touchCommand = ShTextCommand('touch ../tmp.txt')
touchCommand.execute()

View File

@ -1,5 +1,5 @@
import unittest import unittest
from utils.BuildConfigProvider import BuildConfigProvider from utils.BuildConfigProvider.BuildConfigProvider import BuildConfigProvider
class TestBuildConfigProvider(unittest.TestCase): class TestBuildConfigProvider(unittest.TestCase):

Some files were not shown because too many files have changed in this diff Show More