at_yasu's blog

ロード的なことを

svnからbazaarに移行した事

svnを使っているうちに、だんだんとtagが打てないとか気分的に使い辛くなってきたので、分散型CSMのBazaarに移行。

インストールとか

Macだとパッケージが出てるから、それをインストール。なぜか10.5では一つ古いバージョンしかでてないけど、特に困らず。FreeBSDでは、devel/bazaar-ngをインストール。

svnのリポジトリをbazaarに移行する方法がいまいちわからなかったので、svn2bzrをcheckoutして取ってきて、移行。

でも、なぜか上手く動かなかった*1ので、以下のパッチを作成して移行。

--- svn2bzr.py	2008-04-07 01:02:43 +0000
+++ svn2bzr.py	2009-02-19 16:15:15 +0000
@@ -650,6 +650,11 @@
 
         self._tree_cache_filename = tempfile.mktemp('-saved-trees')
         self._tree_cache = anydbm.open(self._tree_cache_filename, "c")
+        _tcf = self._tree_cache_filename
+        if not os.path.exists(_tcf):
+            if os.path.exists("%s.db"%(_tcf)):
+                self._tree_cache_filename = "%s.db" % (_tcf)
+        self._tree_cache_itel = []
         self._tree_cache_mem = {}
         self._tree_cache_mem_order = []
 
@@ -666,6 +671,8 @@
 
     def _save_tree(self, revno, tree):
         self._log.debug("Saving revision %d in disk cache" % revno)
+        print "Saving revision %d" % (revno)
+        self._tree_cache_itel.append(str(revno))
         self._tree_cache[str(revno)] = bz2.compress(marshal.dumps(tree, 2))
 
     def _load_tree(self, revno):
@@ -680,10 +687,21 @@
         if revno in self._tree_cache_mem:
             self._log.debug("Found revision %d in memory cache" % revno)
             return self._tree_cache_mem[revno]
-        if str(revno) in self._tree_cache:
-            return self._load_tree(revno)
+        try:
+            if str(revno) in self._tree_cache:
+                return self._load_tree(revno)
+        except:
+            pass
+        try:
+            if self._tree_cache[str(revno)]:
+                return self._load_tree(revno)
+        except:
+            pass
+
         tree_revno = -1
-        for cached_revno_s in self._tree_cache:
+        for cached_revno_s_no in self._tree_cache_itel:
+            #cached_revno_s = self._tree_cache[cached_revno_s_no]
+            cached_revno_s = cached_revno_s_no
             cached_revno = int(cached_revno_s)
             if tree_revno < cached_revno < revno:
                 tree_revno = cached_revno

挙動とか

commitしても、他のリポジトリには反映されず、その場所しかリビジョンは上がっていかない。どうもcheckoutとbranchは同じみたいで、まだその二つの明確な違いがわからね。大本に反映させるにはpushしたりする必要があるけど、pushする前にpull(取得)してmergeやupdateをする必要がある。他のリポジトリと同期を取るのが面倒だけど、一元集中みたいなことをしておけば楽かと。


$HOME/.bazaar/ 以下に設定ファイルがある。以下一覧

  • bazaar.conf : bazaarの共通の設定ファイルみたい。こんな感じに設定いくようで。
  • ignore : 無視するファイル一覧。*.py[co]とかそう言った記述で書く。とりあえず私は、.DS_Storeを追加。*2

コマンドとか

  • ほとんどsvnと同じ。寧ろ、bzr mvが出来て*3うれしかったりする。今のところ、sftp経由で使ってるけど、後々はwebdavあたりに行きたいなぁ・・・
  • svnと決定的に違う所
    • push : 自分の変更を相手に押しつける。引数にリポジトリーのパスがない場合、そのリポジトリの親元に押しつけることになる。
    • pull : 相手の変更を自分のリポジトリに持って来る。引数にリポジトリーのパスがない場合、そのリポジトリの親元の情報を引っ張ってくる。

Double-Booking したら

bzr merge したらダブルブッキングする時がある。その時は、ダブルブッキングしたファイルは「ファイル名.ORGIN」とか「ファイル名.NEW」とかになっているから、一番最善の状態に変更させて、bzr revertしてcommitかしら。そこはsvnと同じかも。

疑問とか

  • hookはどうやるの?
  • $Id:$とかのキーワードはどうやるのかしら

*1:dbm.dbmの使い方間違ってるっぽい

*2::2e*もあればよさげ

*3:svn mvは裏でadd/removeしてて不細工