Слияние версий

DevBookmark_Merge_ Изначально дерево версий метаданные системы Ultima Businessware® имеет единственную ветвь, помеченную branch-тегом Default. Механизм слияния версий актуален в случаях, когда дерево версий имеет несколько ветвей. Такая ситуация типична для компании со штатом из более чем одного прикладного разработчика. В этом случае каждый разработчик ведет разработку в своей ветке, помеченной собственным branch-тегом, а механизм слияния версий используется для загрузки изменений из основной ветки Default или проталкивания своих изменений в нее.

Функционал формы слияния версий позволяет сравнить версию метаданных текущей ветки с веткой Default (или при необходимости с любой другой веткой) и загрузить все изменения, сделанные с момента их разветвления (или с момента последнего слияния), в одну из них:

Versions6_Merge

Destination branch – ветка конфигурации, в которую затягиваются изменения из ветви Default (заголовок меняется на Source branch, если изменения не затягиваются в выбранную ветку, а проталкиваются из нее в ветвь Default);

Pull from Default – по нажатию на кнопку будут загружены изменения из ветви Default, в выбранную ветку. Информация о процессе загрузки отображается во вплывающем окне;

Push to Default – по нажатию на кнопку будут загружены изменения из выбранной ветки в ветку Default. Информация о процессе загрузки отображается во всплывающем окне;

Versions6_Merge_Loading

Comment – комментарий, которым будет помечена зафиксированная версия. При нажатии на кнопки Pull from Default или Push to Default автоматически подставляется соответствующий выбранному действию комментарий, который можно изменить. Операция слияния не будет произведена, если не ввести комментарий;

Compile metadata on merge – флаг, указывающий на необходимость скомпилировать метаданные перед их фиксацией:

Auto – при установленном флаге необходимость компиляции метаданных определяется автоматически. В этом случае компиляция будет запущена только при проталкивании изменений на ветку Default, если среди загружаемых объектов есть метаданные или интерфейсы (в том числе мобильные). При этом версия, в которой изменений в метаданных нет, не компилируется, но считается скомпилированной. Это позволяет загружать изменения в скриптах, не вынуждая заодно перегружать сборку метаданных;

Always – при установленном флаге запускается компиляция метаданных;

Never – при установленном флаге компиляция метаданных не запускается;

Компиляция метаданных может потребовать дополнительного времени. При проталкивании изменений в ветвь Default рекомендуется при необходимости компилировать метаданные (устанавливать флаг Auto);

Merge changes по нажатию на кнопку осуществляется операции слияния, а затем фиксации версии ветви, в которую затягиваются изменения. Операцию слияния не будет произведена при наличии конфликтов не помеченных как разрешенные (Resolved). Информация о процессе выполнения операции слияния отображается во всплывающем окне;

Versions6_Merge_Saving

Cancelнажатие на кнопку закрывает форму слияния версий;

информация об загружаемых изменениях сгруппирована по закладкам «Changesets», «Differences» и «Conflicts».

bookmark На закладке «Changesets» приведен список всех коммитов, изменения из которых были загружены, в скобках указано количество коммитов:

Changeset  – номер коммита;

Commit date – дата фиксации;

Comments – комментарии, введенные при фиксации версии;

Creator identity – идентификатор пользователя, зафиксировавшего эту версию;

Creator login  – имя пользователя, зафиксировавшего версию.

bookmark На закладке «Differences» приведен список всех изменений, которые были загружены, в скобках указано количество изменений. Список разделен на две части: слева перечислены объекты метаданных, подвергшиеся изменениям, справа – свойства выбранных слева объектов с подробной информацией об изменениях. Реализация списка изменений и его функционал идентичны списку изменений в форме фиксации изменений:

Versions7_Merge_Changes

bookmark На закладке «Conflicts» приведен список всех возникших конфликтов, которые система не в состоянии уладить автоматически. В скобках указано количество конфликтов:

Versions7_Merge_Conflicts

Конфликтами являются пересекающиеся и при этом отличающиеся изменения одних и тех же объектов в сливаемых ветках, например:

редактирование объекта метаданных в одной из сливаемых веток и удаление его в другой;

отличающиеся друг от друга правки объекта метаданных, например, кода скрипта;

создание объекта метаданных одного и того же типа, например, пользовательской команды, с одинаковым названием, но различными свойствами/параметрами.

Конфликтом не будет, например:

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

удаление одного и того же объекта метаданных.

одинаковое изменение объекта на обеих ветках, например, переименование поля справочника.

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

Закладка списка конфликтов разделена на две части: слева перечислены объекты метаданных, изменения которых в сливаемых версиях пересекаются между собой, справа – подробное описание пересекающихся изменений выбранных слева объектов.

Список объектов метаданных, изменения которых конфликтуют между собой, содержит следующую информацию:

Object name – название объекта метаданных. Названия сгруппированы согласно их принадлежности: свойства справочника вложены в справочник, подтипы документа в тип документа и т.д.;

Object type – тип объекта метаданных;

Object identity – идентификатор объекта метаданных.

Destination operation – операция, которой подвергся объект метаданных в версии, откуда изменения были загружены (отмечена выбранным в элементе Destination тегом):

Dictionaries_Button_1 Created – объект был создан;

Dictionaries_Button_4 Deleted – объект был удален;

Dictionaries_Button_3 Modified – объект был изменен;

операция может отсутствовать, если объект метаданных не был изменен непосредственно, но был изменен "дочерний" объект связанный с ним;

Source operation – операция, которой подвергся объект метаданных в версии, в которую изменения загружаются (отмечена выбранным в элементе Source тегом);

Merged operation – одна из двух операций Destination operation или Source operation, которая попадет в сливаемую версию. В открывающемся по клику левой кнопкой мыши на операции выпадающем списке можно выбрать операцию какой из версий следует оставить в результате слияния:

Versions8_MergeConflicts_Resolve1

Resolved – флаг, которым отмечаются разрешенные конфликты. Если хотя бы один конфликт не отмечен этим флагом, операцию слияния завершить не удастся;

Resolve all conflicts – ссылки, позволяющие совершить выбор всех конфликтующих операций, которые попадут в сливаемую версию:

using source version – в сливаемую версию попадут конфликтующие изменения из версии, отмеченной выбранным в элементе Source тегом;

using destination version – в сливаемую версию попадут конфликтующие изменения из версии, отмеченной выбранным в элементе Destination тегом.

При нажатии на любую из ссылку все конфликты будут помечены флагом Resolved как разрешенные.

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

Property name – название свойства подвергшегося изменениям объекта метаданных;

Destination – значение свойства в версии, отмеченной выбранным в элементе From тегом;

Source – значения свойства в версии, отмеченной выбранным в элементе To тегом;

Merged – одно из двух изменений, которое попадет в сливаемую версию. Его значение предваряется текстом «Source:» или «Destination:» в зависимости от того, какое из них выбрано. В открывающемся по клику левой кнопкой мыши на изменении выпадающем списке можно выбрать значение какой из версий следует оставить в результате слияния:

Versions8_MergeConflicts_Resolve2

Конфликтующие текстовые значения измененных свойств можно сравнить в отдельной форме, открывающейся по нажатию на кнопку PrintForms_scr_DictEditForm1_But3:

Versions8_MergeConflicts_Resolve3

В левой части формы сравнения текстов конфликтующих свойств представлено значение свойства destination (версии, отмеченной выбранным в элементе Destination тегом), в правой части формы – значение свойства source (версии, отмеченной выбранным в элементе Source тегом). Сравнение текстов производится таким образом, как если бы текст source был получен путем изменения текста destination:

зеленым выделен измененный текст;

розовым выделен удаленный текст;

голубым выделен добавленный текст.

В нижней части формы приведены для сравнения обе версии строки, на которой установлен курсор;

Resolve all conflicts – ссылки, позволяющие совершить выбор всех значений конфликтующих изменений, которые попадут в сливаемую версию:

source version – в сливаемую версию попадут значения конфликтующих изменений из версии, отмеченной выбранным в элементе Source тегом;

destination version – в сливаемую версию попадут значения конфликтующих изменений из версии, отмеченной выбранным в элементе Destination тегом.

bookmark После завершения операции слияния производится проверка метаданных на ошибки. Будучи найденными, такие ошибки отображаются на закладке «Validation Errors». В скобках указано количество ошибок валидации:

Versions10_Merge_ValidateErrors

Версию метаданных, содержащую ошибки валидации, нельзя будет скомпилировать. Соответственно, если при слиянии бы установлен флаг компиляции метаданных Compile metadata before committing changes, слияние завершено не будет. Исправить ошибки валидации придется, как и конфликты, вручную.

Список ошибок валидации содержит следующую информацию:

Object ID – идентификатор объекта;

Name – название объекта, проверка которого выявила ошибку;

Object Type – тип объекта;

Message – текст сообщения об ошибке.

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

35_example

Рассмотрим последовательность действий для наиболее распространенной ситуации слияния версий, когда разработчику необходимо протолкнуть внесенные в метаданные изменения из своей ветки в ветвь Default:

1.Сперва необходимо зафиксировать изменения, сделанные в последней версии своей ветви. Во-первых, незафиксированные изменения нельзя протолкнуть в другую ветку. Слияние будет выполнено только для предыдущей – последней зафиксированной версии в ветви. Во-вторых, в незафиксированную версию нельзя затянуть изменения из другой ветви.

2.Затем следует затянуть изменения из ветки Default. Это необходимо сделать по причине того, что в ветвь Default с момента прошлого проталкивания изменений из текущей ветки уже могли быть внесены изменения другими прикладными разработчиками:

если сразу проталкивать изменения своей версии в ветку Default, не получится уладить потенциально возможные конфликты, так как сделать это можно только в текущей версии, с которой запущен сервер приложений;

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

В случае появления предупреждения о том, что в ветви Default присутствуют незафиксированные изменения ситуация маловероятная, но возможная  следует сначала их зафиксировать. Далее необходимо уладить конфликты и слить затянутые изменения с метаданными своей ветви. При этом версия метаданных, в которую были затянуты изменения, фиксируется. Теперь метаданные текущей ветки отличается от метаданных ветви Default только внесенными прикладным разработчиком изменениями.

3.И, наконец, необходимо протолкнуть изменения со своей ветки в ветвь Default. Если другой прикладной разработчик не успел с момента загрузки на этапе 2 изменений ветви Default протолкнуть туда свои изменения – конфликтов не будет (если успел, придется повторить действия второго этапа). Для завершения операции остается только выполнить слияние. При этом версия метаданных, в которую проталкивались изменения, фиксируется.

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