По договоренности с Владимиром Кочетковым я занялся изучением миграции с мантиса на google code Issue Tracker.
Пока остановились на следующей схеме:
1. Экспортируем баги из мантиса в xml файл (у мантиса для этого есть штатный плагин). Пример файла приведен в конце этого сообщения.
2. Заливаем баги в гугл с помощью Google Code Issue Tracker Data API, к которому есть .Net обертка (
http://code.google.com/p/google-code-issue-tracker/)
API имеет ограничение — автор и дата создания бага всегда берутся текущие, т.е. перенести эту информацию из мантиса "один к одному" не удастся. Придется хранить ее в теле описания бага в каком то формате. Думаю в теле же стоит сохранить идентификатор оригинального бага — эти идентификаторы уже много где засветились (например в комментариях к коммитам), поэтому терять идентификаторы нельзя. Структура бага в гугле намного проще, чем в мантисе, многие атрибуты предлагается хранить в виде лейблов (приоритет, важность, компонент) или прямо в основном описании (шаги для воспроизведения, доп. информация).
Вот список всех атрибутов мантиса и описание того, как я собираюсь сохранить их в гугловом трекере:
В виде лейблов (в мантисе эти атрибуты имеют небольшой список предопределенных значений):
<priority>
<reproducibility>
<resolution>
<severity>
<category>
В атрибуте "Status" (под статус в гугле заведен отдельный атрибут):
<status>
В заголовке:
<summary>
В основном описании:
<description>
<additional_information>
<steps_to_reproduce>
В основном описании, в виде дополнительных тэгов:
<id>
<date_submitted>
<duplicate_id>
<last_updated>
Также в виде тегов в основном описании. Значения этих атрибутов имеют случайный характер, а сами атрибуты были использованы очень редко, поэтому заводить под них лейблы думаю не стоит:
<build>
<os>
<os_build>
<platform>
Вот _полный_ список использования этих атрибутов:
build: 1132
os: Windows XP
os_build: 69
platform: CygWin
build: r6488
os: WinXP
os_build: SP2
platform: MS.NET 2.0
build: 6552
build: 6552
build: 0.9.3
os: ALTLinux
os_build: 3.0
platform: i686
profile_id: 2
build: May 2008 CTP build 0.9.4.8036
os: Windows XP SP 2
build: -r8391
Планирую игнорировать, как неиспользуемые в нашем мантисе:
<eta>
<fixed_in_version>
<profile_id>
<project_description>
<project_id>
<project_name>
<projection>
<sponsorship_total>
<sticky>
<version>
<view_state>
Всех пользователей из мантиса планирую завести как участников проекта — без этого назначить на них баги не получается. Как я уже написал выше, автором всех багов в гугловом трекере станет один аккаунт — тот, от чьего имени будет выполняться импорт багов. Думаю, что затем можно попробовать переназначить баг на истинного автора, а потом — на текущего овнера (если такой указан в мантисе).
Пример экспортированного xml:
| Скрытый текст |
| <bug>
<additional_information>My additional findings on this issue.
1-) The types even can't be get from C#. Assembly.GetTypes(<above_assembly>) results in same exception for C#
2-) It doesn't happen if Method's accessor is public
3-) It doesn't happen if Derived takes only 1 generic parameter
4-) It emits such a code for derived class:
.override method instance void class ClassLibrary1.Base`1<!T>::Method()
C# won't emit above. And removing above IL code fixes the issue. So it look like an emitting problem to me.</additional_information>
<handler_email></handler_email>
<handler_id></handler_id>
<handler_realname></handler_realname>
<handler_username></handler_username>
<build></build>
<category>Compiler</category>
<date_submitted>05-11-10 17:08</date_submitted>
<description>The below code compiles fine. But you cannot reference it from another assembly.
public class Base[U]
{
protected virtual Method() :void
{
}
}
public class Derived[K,T]: Base[T]
{
protected override Method() : void
{
}
}
When you try you get error as :
Error: Method override 'Method' on type 'ClassLibrary1.Derived'2' from assembly 'ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' cannot find a method to replace..</description>
<duplicate_id>0</duplicate_id>
<eta>none</eta>
<fixed_in_version></fixed_in_version>
<id>1223</id>
<last_updated>05-11-10 17:10</last_updated>
<bugnotes>
<bugnote>
<id>2307</id>
<reporter_id>168</reporter_id>
<note>Assembly.GetTypes(<above_assembly>) will be => ref_to_above_assembly.GetTypes();</note>
<view_state>10</view_state>
<date_submitted>05-14-10 17:59</date_submitted>
<last_modified>05-14-10 17:59</last_modified>
</bugnote>
</bugnotes>
<os></os>
<os_build></os_build>
<platform></platform>
<priority>normal</priority>
<profile_id>0</profile_id>
<project_description></project_description>
<project_id>1</project_id>
<project_name>Nemerle</project_name>
<projection>none</projection>
<reporter_email>emperon@nospam.nospam</reporter_email>
<reporter_id>168</reporter_id>
<reporter_realname></reporter_realname>
<reporter_username>reverseblade</reporter_username>
<reproducibility>always</reproducibility>
<resolution>open</resolution>
<severity>major</severity>
<sponsorship_total>0</sponsorship_total>
<status>new</status>
<steps_to_reproduce></steps_to_reproduce>
<sticky>0</sticky>
<summary>Generic parameter and virtual/override</summary>
<version></version>
<view_state>public</view_state>
</bug>
|
| |