hg convert phabricator でのエラー回避

92 views
Skip to first unread message

shin ohira

unread,
Jun 25, 2014, 5:36:43 AM6/25/14
to mercur...@googlegroups.com
いつもお世話になっております。おおひらです。

mercurialと連携してphabricatorを使おうとしています。

ターゲットマシンでgitを使いにくい状況のため、前準備として他のマシンで
phabricatorのソースコードをgitからhgにコンバートしようとしたところ
エラーが発生して途中で変換が止まってしまいます。

このような場合何か回避策はありますでしょうか?

実行したコマンド
git clone https://github.com/phacility/phabricator.git
hg convert phabricator

 表示されたメッセージ
4061 Remove legacy support for 'phd repository-launch' and 'phd repository-launch-readonly'
4060 Revert D4359 and apply a better fix                                        
4059 Fix performance problem for large task queues                              
4058 Use direct inclusion, not submodules, to bring Javelin into Phabricator    
converting [======================>                           ] 3692/7751 5m44sfatal: Path '.gitmodules' does not exist in '07767fda00ab4437127ce95aae451632b2b55798'
abort: cannot read submodules config file in 07767fda00ab4437127ce95aae451632b2b55798
[shin@faith] ~/tmp% 

phabricatorのインストール手順
 

Katsunori Fujiwara

unread,
Jun 25, 2014, 7:32:57 AM6/25/14
to mercurial-ja
藤原です。

2014年6月25日 18:36 shin ohira <shin....@gmail.com>:

> mercurialと連携してphabricatorを使おうとしています。
>
> ターゲットマシンでgitを使いにくい状況のため、前準備として他のマシンで
> phabricatorのソースコードをgitからhgにコンバートしようとしたところ
> エラーが発生して途中で変換が止まってしまいます。
>
> このような場合何か回避策はありますでしょうか?
>
> 実行したコマンド
>>
>> git clone https://github.com/phacility/phabricator.git
>>
>> hg convert phabricator
>
>
> 表示されたメッセージ
>>
>> 4061 Remove legacy support for 'phd repository-launch' and 'phd repository-launch-readonly'
>> 4060 Revert D4359 and apply a better fix
>> 4059 Fix performance problem for large task queues
>> 4058 Use direct inclusion, not submodules, to bring Javelin into Phabricator
>> converting [======================> ] 3692/7751
>> 5m44sfatal: Path '.gitmodules' does not exist in
>> '07767fda00ab4437127ce95aae451632b2b55798'
>>
>> abort: cannot read submodules config file in
>> 07767fda00ab4437127ce95aae451632b2b55798

変換に失敗しているリビジョン 07767fda00ab.... は、.gitmodules によ
る複数リポジトリ連携を廃止して、対象リポジトリを内部に取り込んでい
る模様です。

https://github.com/phacility/phabricator/commit/07767fda00ab4437127ce95aae451632b2b55798

その一方で、hg convert は:

- 親リビジョンとの差分に .gitmodules の差分が含まれる場合、複
数リポジトリ構成があるものと判定

http://selenic.com/repo/hg/file/becb61de90a1/hgext/convert/git.py#l201

- 対象リビジョンから .gitmodules ファイルが取得できない場合は、
問答無用でエラー扱い

http://selenic.com/repo/hg/file/becb61de90a1/hgext/convert/git.py#l168

という処理になっているため、現状では「.gitmodules ファイルの破棄」
には対応していないように思われます。

以上のことから、設定等で云々という回避方法は無いので、当面は暫定的
なソース変更で乗り切るしかないですね(修正提案を別途投げておきま
す)。

hgext/convert/git.py に以下のパッチをあてたものを使用してみてくだ
さい。一応、Mercurial 3.0.1 ベースのソースに適用して、phabricator
からの変換が成功することを確認済みです。

================
diff -r b2dc026a9bd2 hgext/convert/git.py
--- a/hgext/convert/git.py Wed Jun 18 19:46:18 2014 -0500
+++ b/hgext/convert/git.py Wed Jun 25 20:31:20 2014 +0900
@@ -139,8 +139,9 @@ class convert_git(converter_source):
def retrievegitmodules(self, version):
modules, ret = self.gitread("git show %s:%s" % (version,
'.gitmodules'))
if ret:
- raise util.Abort(_('cannot read submodules config file in %s') %
- version)
+ self.ui.warn(_('warning: cannot read submodules config file in %s '
+ '(treat as deleted)\n') % version)
+ modules = ''
self.parsegitmodules(modules)
for m in self.submodules:
node, ret = self.gitread("git rev-parse %s:%s" % (version, m.path))
================

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

Takumi IINO

unread,
Jun 25, 2014, 8:55:08 AM6/25/14
to mercur...@googlegroups.com
飯野(@troter)です。

2014年6月25日水曜日 20時32分57秒 UTC+9 FUJIWARA Katsunori:
FUJIWARA Katsunori(flying.foozy@gmail.com)

hg convertを使わない別解ですが。。
もしhggitが利用できる環境であれば、それを利用するという方法もあります。
hggitの場合は次のコマンドでcloneできます。


mercurial-3.0.1、hggit-0.6、dulwitch-0.9.6で変換できる事を確認しています。 

shin ohira

unread,
Jun 26, 2014, 5:38:41 AM6/26/14
to mercur...@googlegroups.com
おおひらです。

回答ありがとうございます。

頂いた修正パッチを適応してみました。

MQではうまくパッチが当たらず、patchコマンドで実施しました。
(MQの使い方が良くわかっていないため)

patchでのパッチはあたったような感じなのですが、コンバートではエラーが発生してしまいました。


2014年6月25日水曜日 20時32分57秒 UTC+9 FUJIWARA Katsunori:
藤原です。

shin ohira

unread,
Jun 26, 2014, 5:40:50 AM6/26/14
to mercur...@googlegroups.com
大平です。

回答いただいたやり方で、コンバートが正常でにできました。
ありがとうございます。

こちらの環境
FreeBSD 10.0-RELEASE-p12
Mercurial Distributed SCM (version 3.0)
hg-git0.6
dulwich-0.9.7

2014年6月25日水曜日 21時55分08秒 UTC+9 Takumi IINO:
飯野(@troter)です。
FUJIWARA Katsunori(flying...@gmail.com)

Katsunori Fujiwara

unread,
Jun 26, 2014, 8:13:31 AM6/26/14
to mercurial-ja
藤原です。

2014年6月26日 18:38 shin ohira <shin....@gmail.com>:

> 頂いた修正パッチを適応してみました。
>
> MQではうまくパッチが当たらず、patchコマンドで実施しました。
> (MQの使い方が良くわかっていないため)
>
> patchでのパッチはあたったような感じなのですが、コンバートではエラーが発生してしまいました。

あらら。コンバート実施の際のエラー出力は、パッチ適用前と同じでしょうか?

もしも、パッチ適用前後でエラー発生状況が変わらないのであれば、パッ
チを当てたものではない convrt エクステンションが読み込まれているの
かもしれません。

通常使用しているものに直接パッチを適用してますか?それとも、別途用
意したソースツリーに対して適用してます?

後者の場合なら、以下の手順で問題なく変換できる筈なのですが……

1. パッチ適用

2. ソースツリーのルートで "make local" 実施
(C 実装のモジュール等のビルドのため)

3. ソースツリー直下の hg コマンドを明示的に起動


> 2014年6月25日水曜日 20時32分57秒 UTC+9 FUJIWARA Katsunori:

>> ================
>> diff -r b2dc026a9bd2 hgext/convert/git.py
>> --- a/hgext/convert/git.py Wed Jun 18 19:46:18 2014 -0500
>> +++ b/hgext/convert/git.py Wed Jun 25 20:31:20 2014 +0900
>> @@ -139,8 +139,9 @@ class convert_git(converter_source):
>> def retrievegitmodules(self, version):
>> modules, ret = self.gitread("git show %s:%s" % (version,
>> '.gitmodules'))

今になって気づきましたが、本来1行になるべきパッチ中の上記行が、私
の返信では行分割されてますね。私の Gmail の行折り返し設定の問題な
のかな?

そちらでは、問題なく読めてますでしょうか?

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

Katsunori Fujiwara

unread,
Jun 26, 2014, 8:30:18 AM6/26/14
to mercurial-ja
藤原です。

本筋の話からは脱線しますが……


2014年6月26日 18:38 shin ohira <shin....@gmail.com>:

> 頂いた修正パッチを適応してみました。
>
> MQではうまくパッチが当たらず、patchコマンドで実施しました。
> (MQの使い方が良くわかっていないため)

Mercurial 管理下にある成果物に、外部から入手した差分を適用する場合、
特にリビジョンを追加する必要が無い(= 試験的な適用)のであれば:

$ hg import --no-commit DIFF_FILE

あるいは:

$ 差分内容を生成するコマンド | hg import --no-commit -

あたりを使用するのが妥当かと。

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)

shin ohira

unread,
Jun 26, 2014, 9:22:19 PM6/26/14
to mercur...@googlegroups.com
大平です。

インポートコマンドで簡単にパッチが取り込めるのですね。
知りませんでした ^_^;;;;

こちらでもパッチファイルは読めているのですが、うまくあたりません。

インポートコマンドでパッチを試した場合
[shin@faith] ~/repos/selenic.com% rm -rf hg
[shin@faith] ~/repos/selenic.com% hg clone http://selenic.com/repo/hg
destination directory: hg
requesting all changes
adding changesets
adding manifests                                                                
adding file changes                                                             
added 21805 changesets with 41351 changes to 2239 files                         
updating to bookmark @
1032 files updated, 0 files merged, 0 files removed, 0 files unresolved         
[shin@faith] ~/repos/selenic.com% cd hg
[shin@faith] ~/repos/selenic.com/hg% hg diff
diff -r becb61de90a1 mercurial/byterange.py
--- a/mercurial/byterange.py    Sat Jun 21 14:49:49 2014 +0530
+++ b/mercurial/byterange.py    Fri Jun 27 10:04:09 2014 +0900
@@ -15,7 +15,7 @@
 # This file is part of urlgrabber, a high-level cross-protocol url-grabber
 # Copyright 2002-2004 Michael D. Stenner, Ryan Tomayko
 
-# $Id: byterange.py,v 1.9 2005/02/14 21:55:07 mstenner Exp $
+# $Id$
 
 import os
 import stat
[shin@faith] ~/repos/selenic.com/hg% hg stat
M mercurial/byterange.py
[shin@faith] ~/repos/selenic.com/hg% hg ci -m clean
[shin@faith] ~/repos/selenic.com/hg% hg diff
[shin@faith] ~/repos/selenic.com/hg% hg stat
[shin@faith] ~/repos/selenic.com/hg% hg import --no-commit ~/tmp/aaa
applying /usr/home/shin/tmp/aaa
patching file hgext/convert/git.py
Hunk #1 FAILED at 138
1 out of 1 hunks FAILED -- saving rejects to file hgext/convert/git.py.rej
abort: patch failed to apply
[shin@faith] ~/repos/selenic.com/hg% hg diff
[shin@faith] ~/repos/selenic.com/hg% hg stat
[shin@faith] ~/repos/selenic.com/hg% cat ~/tmp/aaa
diff -r b2dc026a9bd2 hgext/convert/git.py 
--- a/hgext/convert/git.py      Wed Jun 18 19:46:18 2014 -0500 
+++ b/hgext/convert/git.py      Wed Jun 25 20:31:20 2014 +0900 
@@ -139,8 +139,9 @@ class convert_git(converter_source): 
     def retrievegitmodules(self, version): 
         modules, ret = self.gitread("git show %s:%s" % (version, 
'.gitmodules')) 
         if ret: 
-            raise util.Abort(_('cannot read submodules config file in %s') % 
-                             version) 
+            self.ui.warn(_('warning: cannot read submodules config file in %s ' 
+                           '(treat as deleted)\n') % version) 
+            modules = '' 
         self.parsegitmodules(modules) 
         for m in self.submodules: 
             node, ret = self.gitread("git rev-parse %s:%s" % (version, m.path)) 
[shin@faith] ~/repos/selenic.com/hg%

MQでやった場合
[shin@faith] ~/repos/selenic.com/hg% hg qpush -v
applying aaa
patching file hgext/convert/git.py
Hunk #1 FAILED at 138
1 out of 1 hunks FAILED -- saving rejects to file hgext/convert/git.py.rej
patch failed to apply
patch failed, rejects left in working dir
errors during apply, please fix and refresh aaa



2014年6月26日木曜日 21時30分18秒 UTC+9 FUJIWARA Katsunori:

Katsunori Fujiwara

unread,
Jun 27, 2014, 2:56:18 AM6/27/14
to mercurial-ja
藤原です。

2014年6月27日 10:22 shin ohira <shin....@gmail.com>:

> インポートコマンドで簡単にパッチが取り込めるのですね。
> 知りませんでした ^_^;;;;
>
> こちらでもパッチファイルは読めているのですが、うまくあたりません。
>
> インポートコマンドでパッチを試した場合

>>> [shin@faith] ~/repos/selenic.com/hg% hg import --no-commit ~/tmp/aaa
>>> applying /usr/home/shin/tmp/aaa
>>> patching file hgext/convert/git.py
>>> Hunk #1 FAILED at 138
>>> 1 out of 1 hunks FAILED -- saving rejects to file
>>> hgext/convert/git.py.rej
>>> abort: patch failed to apply

>>> [shin@faith] ~/repos/selenic.com/hg% cat ~/tmp/aaa
>>> diff -r b2dc026a9bd2 hgext/convert/git.py
>>> --- a/hgext/convert/git.py Wed Jun 18 19:46:18 2014 -0500
>>> +++ b/hgext/convert/git.py Wed Jun 25 20:31:20 2014 +0900
>>> @@ -139,8 +139,9 @@ class convert_git(converter_source):
>>> def retrievegitmodules(self, version):
>>> modules, ret = self.gitread("git show %s:%s" % (version,
>>> '.gitmodules'))

先のメールでも書きましたが、上記の行は本来、以下のように一行になっ
ているべきものです(Gmail が勝手に折り返す模様……orz)

>>> modules, ret = self.gitread("git show %s:%s" % (version, '.gitmodules'))

勝手に改行されないように、添付ファイルとして再送しますので、もう一
度試してみてください。


>>> if ret:
>>> - raise util.Abort(_('cannot read submodules config file in %s') %
>>> - version)
>>> + self.ui.warn(_('warning: cannot read submodules config file in %s '
>>> + '(treat as deleted)\n') % version)
>>> + modules = ''
>>> self.parsegitmodules(modules)
>>> for m in self.submodules:
>>> node, ret = self.gitread("git rev-parse %s:%s" % (version, m.path))


--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
ignore-missing-gitmodule.patch

shin ohira

unread,
Jun 27, 2014, 3:44:53 AM6/27/14
to mercur...@googlegroups.com
おおひらです。
ありがとうございます。

添付でいただいたファイルで再度パッチしたところコンバートが正常に完了しました。

パッチのログ
 hg qimport ~/Downloads/ignore-missing-gitmodule.patch
 hg qpush
 gmake all
 sudo gmake install

テスト内容
git clone https://github.com/phacility/phabricator.git
hg convert phabricator

テスト結果                                                     
1 Continue on bad daemon pid data                                               
0 Use slim tags in ObjectList                                                   
updating bookmarks

 テストした環境
FreeBSD 10.0-RELEASE-p12
Python 2.7.6
Mercurial Distributed SCM (version 3.0.1+90-d7fd02a3b24d)
 

2014年6月27日金曜日 15時56分18秒 UTC+9 FUJIWARA Katsunori:

Katsunori Fujiwara

unread,
Jun 27, 2014, 7:32:28 AM6/27/14
to mercurial-ja
藤原です。

2014年6月27日 16:44 shin ohira <shin....@gmail.com>:

> 添付でいただいたファイルで再度パッチしたところコンバートが正常に
> 完了しました。

無事に変換できたようでなによりです。

なお先の修正は、「とりあえず変換を無事に通す」ことを優先したため、
git 側での「.gitmodules ファイルの破棄」に相当する操作が、本来は:

.hgsub および .hgsubstate の破棄

となるべきところを:

.hgsub および .hgsubstate を空にする変更

という形で変換されてしまいます。

不要な .hgsub および .hgsubstate が気になる場合は、本メールに添付
したパッチを Mercurial に適用しなおしてから、再度 hg convert で変
換しなおしてください。


ちなみに、変換先リポジトリには、変換元・先リビジョンの対応関係を記
録した .hg/shamap ファイルが保存されています。

変換先リポジトリで特定のリビジョン以降を strip しても、shamap ファ
イルがそのままであれば、hg convert を再実施しても、strip で破棄さ
れたリビジョン以降の変換は実施されませんから注意してください。

今回のケースであれば、以下のような手順で再変換すれば、変換処理は最
小限で済むはずです。

(1) 問題リビジョンの変換先リビジョンのハッシュ値 XXXXXX を取得

$ hg log -r "desc('Use direct inclusion, not submodules')"

(2) XXXXXX とそれ以降のリビジョンを破棄

$ hg strip XXXXXX

(3) .hg/shamap から、 XXXXXX との対応が書かれた行以降を削除

(4) hg convert による再変換(= XXXXXX 以降のみの追加取り込み)


まぁ、手間を考えると、最初から変換しなおした方が楽、という話もあり
ますが(笑)

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
convert-git-gitmodule-removal-fix.patch

Katsunori Fujiwara

unread,
Jul 15, 2014, 12:36:13 AM7/15/14
to mercurial-ja
藤原です。

2014年6月25日 18:36 shin ohira <shin....@gmail.com>:
> いつもお世話になっております。おおひらです。
>
> mercurialと連携してphabricatorを使おうとしています。
>
> ターゲットマシンでgitを使いにくい状況のため、前準備として他のマシンで
> phabricatorのソースコードをgitからhgにコンバートしようとしたところ
> エラーが発生して途中で変換が止まってしまいます。
>
> このような場合何か回避策はありますでしょうか?

上記の問題に対処するための修正が取り込まれました。

http://selenic.com/repo/hg/rev/3420346174b1

次回リリースの 3.1 版から問題なく変換できる筈です。

情報提供ありがとうございました!

--
----------------------------------------------------------------------
FUJIWARA Katsunori(flying...@gmail.com)
Reply all
Reply to author
Forward
0 new messages