Restream/redmine_undev_git

View on GitHub
README.ru.md

Summary

Maintainability
Test Coverage
# RedmineUndevGit

[![Build Status](https://travis-ci.org/Restream/redmine_undev_git.png)](https://travis-ci.org/Restream/redmine_undev_git)
[![Code Climate](https://codeclimate.com/github/Restream/redmine_undev_git.png)](https://codeclimate.com/github/Restream/redmine_undev_git)

## Описание

Плагин UndevGit добавляет в redmine новый тип репозитория UndevGit.
UndevGit умеет делать все то, что делает Git репозиторий, но вдобавок он
добавляет возможность работы с удаленными репозиториями и добавляет
хуки для репозиториев UndevGit.

В процессе чтения репозитория UndevGit клонирует удаленный или локальный
репозиторий и в дальнейшем работает с созданной копией.

## Установка и настройка

### Установка

 1. Скопировать каталог с плагином в plugins
 2. bundle exec rake redmine:plugins:migrate
 3. bundle install в корне редмайна
 4. Перезапустить redmine

### Настройка

В административном меню на вкладке *Repositories* в группе *Enabled SCM*
необходимо включить UndevGit.

В настройках плагина можно указать максимальное количество веток отображаемых
на странице тикета в разделе связанных ревизий (*Associated Revisions*).
Пустое значение или 0 означает отуствие ограничений.
Настройка хуков описывается ниже.

В настройках инсталяции редмайна, в файле `config/configuration.yml` можно указать
папку для хранения локальных копий репозиториев,
указав значение для ключа `scm_repo_storage_dir` . По умолчанию это папка `repos`
в корне редмайна.
Локальные копии репозиториев складываются в папку `repos\[projectidentifier]\[repository_id]`
После удаления репозитория папки удаляются.

## Хуки

Назначение хуков - гибко настраивать как и в каких случаях изменять тикет.
Можно настроить выполнение хуков для определенных веток, проекта и даже отдельного репозитория.
Таким образом появляются глобальные хуки которые срабатывают для всех репозиториев,
хуки проекта - которые срабатывают для всех репозиториев проекта и хуки репозитория.

Если в хуке стоит ветка "*" - то хук применяется один раз при попадании коммита в репозиторий,
а если указаны ветки, то при каждом попадании коммита в ветку (один раз для одной ветки).

### Настройка

Хуки заменяют функционал редмайна, который позволяет закрывать тикеты
используя специальные ключевые слова. Соответственно ключевые слова указанные
в настройках редмайна на вкладке на вкладке *Repository*, (атрибут *Fixing keywords*)
не используются. Для каждого хука нужно определять собственный набор ключевых слов.

Хуки настраиваются в двух местах. Глобальные хуки управляются в настройках редмайна
(пункт меню *Global hooks* над *Plugins*).
Хуки проекта и хуки репозитория доступны в меню настроек проекта на вкладке *Hooks*.

TODO: Настройка чтения реп при обращении (почему лучше ее отключать)

### Приоритеты хуков

Приоритеты хуков определяются так: наивысший приоритет имеют хуки репозитория,
затем хуки проекта и наменьший приоритет у глобальных хуков.
Внутри типов хуки также имееют приоритет, который можно при необходимости изменить.
В случае если для коммита найдено несколько хуков,
выполнен будет только один - с наивысшим приоритетом.

Отдельно стоит отметить что хуки применяемые для всех веток имееют более низкий
приоритет, чем хуки в которых явно перечислены ветки.

### Изменения в журнале

Изменения тикета отражаются в журнале тикета. В случае отсутствия фактических
изменений запись в журнале тикета не появляется.

### Примеры

#### Пример 1

Например: в репозиторий пушится коммит который виден из двух веток (feature, develop)
Есть настроенные хуки:
Хук1 ветки: '*'
Хук2 ветки: 'feature'
В этом случае выполнится только хук2.

#### Пример 2

Допустим есть коммит A с текстом 'fix #1' и есть хуки:
Хук1 глобальный, ветки: '*'
Хук2 глобальный, ветки: 'master'
Хук3 проектный, ветки: 'develop,staging'
Хук4 для репы, ветки: 'staging'
Хук5 для репы, ветки: 'feature'

1-ый пуш: коммит A в ветке feature: выполняется Хук5
2-ой пуш: мержим ветку feature в staging: выполняется Хук4
3-ий пуш: мержим feature в develop: выполняется Хук3
3-ий пуш: мержим feature в master: выполняется Хук2

Хук1 сработает если например запушим коммит B в ветке featureX

## Прикрепление коммитов к тикету

Для того чтобы привязать коммит к тикету, достаточно указать ключевое слово и
номер тикета с решеткой, например так: `refs #124`.
Ключевые слова задаются в настройках редмайна на вкладке *Repository*,
(атрибут *Referencing keywords*).
Если указать '*' в качестве ключевого слова, то достаточно просто указать номер
тикета с решеткой чтобы привязать коммит к тикету.

## Перемещение коммитов (rebase)

UndevGit позволяет определить коммиты которые были перемещены с помощью `git rebase`.
"Старые" коммиты не удаляются из списка чейнджсетов, но помечаются специальной
иконкой со ссылкой на "новый" коммит. Аналогично и "новые" коммиты помечаются иконкой
со ссылкой на "старый" коммит.
Метка видна при просмотре списка коммитов и при просмотре отдельного коммита.
Изменения тикетов повторно не выполняются, но ссылки в Associated Revisions меняются.
Также не учитываются повторно и таймлоги.

## Обновление репозитория по веб хуку

TODO

### Глобальная настройка

### Настройка отдельной репы

### Запуск обновления из крона

Repository.fetch_changeset пропускает репы обновляемые по веб-хуку

## Тестирование

Распаковать тестовые репозитории
    rake test:scm:setup:undev_git

Подготовить БД
    rake RAILS_ENV=test db:drop db:create db:migrate redmine:plugins:migrate

Запустить тесты плагина redmine_undev_plugin
    rake RAILS_ENV=test NAME=redmine_undev_git redmine:plugins:test

## TODO:

Рейк таски: перенос репозиториев Git в UndevGit
Дополнительные поля в чейнджсет
Последовательность чтения (подбробно)
Особенности первого чтения больших реп (настройка chunk_size)