Subversion で svn:externals (外部参照) を設定する

Subversion は、シンボリックリンクをサポートしています。例えば、あるユーティリティモジュールがあり、それを複数のプログラムから使いたい場合、シンボリックリンクを使うと便利です。

シンボリックリンクの作成

試してみましょう。テスト用のリポジトリを作成して Subversion サーバーを起動します。

$ svnadmin create svn-repos
$ vi svn-repos/conf/svnserve.conf 
[general]
anon-access = write  # 匿名書き込みアクセスを許可する
$ svnserve --daemon --foreground --root svn-repos/

サーバーが起動しました。クライアントからチェックアウトします。

$ svn co svn://localhost/ ./myrepo
リビジョン 0 をチェックアウトしました。

$ # 初期ディレクトリとシンボリックリンクを作成
$ cd myrepo
$ mkdir utils tool1 tool2
$ vi utils/myfunc.py
print "do something"
$ (cd tool1; ln -s ../utils/myfunc.py)
$ (cd tool2; ln -s ../utils/myfunc.py)
$ ls -l tool1 tool2
tool1:
lrwxrwxrwx 1 t2y t2y 18  98 12:00 myfunc.py -> ../utils/myfunc.py
tool2:
lrwxrwxrwx 1 t2y t2y 18  98 12:00 myfunc.py -> ../utils/myfunc.py

$ svn add utils tool1 tool2
A         utils
A         utils/myfunc.py
A         tool1
A         tool1/myfunc.py
A         tool2
A         tool2/myfunc.py

$ svn commit -m "added"
追加しています              tool1
追加しています              tool1/myfunc.py
追加しています              tool2
追加しています              tool2/myfunc.py
追加しています              utils
追加しています              utils/myfunc.py
ファイルのデータを送信しています ...
Committed revision 1.

# リポジトリの属性を調べる
$ svn proplist -R .
'tool1/myfunc.py' の属性:
  svn:special
'tool2/myfunc.py' の属性:
  svn:special

シンボリックリンクを作成すると、svn:special という属性が設定されます。

別のクライアントからチェックアウトしてみましょう。

$ svn co svn://172.16.55.131/ ./myrepo2
A    myrepo2/tool2
A    myrepo2/tool2/myfunc.py
A    myrepo2/utils
A    myrepo2/utils/myfunc.py
A    myrepo2/tool1
A    myrepo2/tool1/myfunc.py
リビジョン 1 をチェックアウトしました。

$ cd myrepo2/
$ ls -l tool1 tool2
tool1:
lrwxrwxrwx 1 t2y t2y 18  98 12:09 myfunc.py -> ../utils/myfunc.py
tool2:
lrwxrwxrwx 1 t2y t2y 18  98 12:09 myfunc.py -> ../utils/myfunc.py
$ cat tool1/myfunc.py 
print "do something"

ちゃんとシンボリックリンクが有効になっていますね。

svn:externals (外部参照) 属性の設定

Unix 系 OS であれば、これで大丈夫ですが、Windows ユーザーも使いたいときに課題があります。

But that doesn't in any way limit the usability of working copies on systems such as Windows that do not support symlinks. On such systems, Subversion simply creates a regular text file whose contents are the path to which the original symlink pointed. While that file can't be used as a symlink on a Windows system, it also won't prevent Windows users from performing their other Subversion-related activities.

シンボリックリンクのバージョン管理

Windowsシンボリックリンクをサポートしていないため、リンク先を指すテキストファイルを作成して、ユーザーの Subversion 操作においては邪魔しないとあります。

実際に Windows 環境でチェックアウトしてみましょう。

チェックアウト結果をみると、ファイルをコピーして作成してくれているように見えますが、ファイルの中身は "link ../utils/myfunc.py" です。ドキュメント等であれば良いですが、ユーティリティモジュールなどでは使えないですね。

そんなとき、Windows 環境でもシンボリックリンクのように扱える仕組みが svn:externals 属性です。

Fortunately, Subversion provides support for externals definitions. An externals definition is a mapping of a local directory to the URL―and ideally a particular revision―of a versioned directory. In Subversion, you declare externals definitions in groups using the svn:externals property. You can create or modify this property using svn propset or svn propedit (see the section called “Manipulating Properties”). It can be set on any versioned directory, and its value describes both the external repository location and the client-side directory to which that location should be checked out.

svn:externals 属性のドキュメント

svn:externals のドキュメントによると、リポジトリ内に外部リポジトリの URL を指定したり、そのリポジトリ特定バージョンを取得するように設定できるとあります。もともとは外部のリポジトリを取り組むための機能のようですが、同じリポジトリ内においても利用できます。そして、svn propsetsvn propedit で設定できると記述されていますが、残念ながら実際の設定コマンドのサンプルがここでは記述されていません。そのため、どうコマンドを実行して良いか全く分かりません (> <)

svn:externals の設定は直感的に分かりにくいので備忘録としてまとめておきます。また、Suversion 1.4 でディレクトリ単位、1.6 からファイル単位の外部参照ができるようになったので svn クライアントのバージョンにも注意してください。

$ mkdir tool3
$ svn add tool3
A         tool3

$ cd tool3
$ svn propset svn:externals "../utils/myfunc.py linked_myfunc.py" .
属性 'svn:externals''.' に設定しました

$ svn update
Updating '.':
Fetching external item into 'linked_myfunc.py':
A    linked_myfunc.py
外部項目をリビジョン 5 に更新しました。
リビジョン 5 です。

$ cat linked_myfunc.py 
print "do something"

$ svn commit -m "set svn:externals"
送信しています              .
Committed revision 6.

svn propset svn:externals の引数が覚えられないです (> <)
1つのやり方としては、以下のように相対パスで指定します。

$ svn propset svn:externals "カレントディレクトリからの相対パス  取得後のファイル名" 属性設定したいディレクトリ

svn:externals 属性は、ディレクトリに対して設定されます。

$ svn proplist tool3/linked_myfunc.py 
$ svn proplist tool3
'tool3' の属性:
  svn:externals

別のやり方として、リポジトリのルートパスからの相対パスを指定する方法もあります。今度は同じファイル名 myfunc.py で取得しています。

$ svn propset svn:externals "^/utils/myfunc.py myfunc.py" tool4
属性 'svn:externals''tool4' に設定しました
$ svn update tool4/
Updating 'tool4':
Fetching external item into 'tool4/myfunc.py':
リビジョン 7 の外部項目です。

リビジョン 7 です。
$ svn commit -m "set svn:externals"
送信しています              tool4
Committed revision 8.

Windows 環境でもチェックアウトしてみます。

Unix 系 OS 環境と同様にファイル本体がチェックアウトできました!

外部リポジトリ特定ディレクトリを取得したいときは URL を指定します。こういうときは取得した後のディレクトリ名を変更できると便利です。

$ mkdir svn
$ svn add svn/
A         svn
$ svn propset svn:externals "http://svn.apache.org/repos/asf/subversion/trunk/tools/examples/ tool-example" svn/
属性 'svn:externals''svn' に設定しました

$ svn update
Updating '.':

Fetching external item into 'tool3/linked_myfunc.py':
リビジョン 10 の外部項目です。

Fetching external item into 'tool4/myfunc.py':
A    tool4/myfunc.py
外部項目をリビジョン 10 に更新しました。

Fetching external item into 'svn/tool-example':
A    svn/tool-example/svnserve-sgid.c
A    svn/tool-example/svnput.c
A    svn/tool-example/dumpprops.py
A    svn/tool-example/svnlog2html.rb
A    svn/tool-example/check-modified.py
A    svn/tool-example/svnlook.py
A    svn/tool-example/svnshell.py
A    svn/tool-example/geturl.py
A    svn/tool-example/getlocks_test.c
A    svn/tool-example/info.rb
A    svn/tool-example/svnlook.rb
A    svn/tool-example/get-location-segments.py
A    svn/tool-example/headrev.c
A    svn/tool-example/putfile.py
A    svn/tool-example/revplist.py
A    svn/tool-example/svnshell.rb
A    svn/tool-example/minimal_client.c
A    svn/tool-example/getfile.py
A    svn/tool-example/blame.py
A    svn/tool-example/SvnCLBrowse
A    svn/tool-example/testwrite.c
外部項目をリビジョン 1382235 に更新しました。

リビジョン 10 です。

svn update を実行する度に fetch 処理が実行されます。仕方ないですが、外部リポジトリを参照すると実行に時間がかかるので、更新をチェックしたくないときは "--ignore-externals" オプションを指定します。

$ svn update
Updating '.':
Fetching external item into 'tool3/linked_myfunc.py':
リビジョン 11 の外部項目です。
Fetching external item into 'tool4/myfunc.py':
リビジョン 11 の外部項目です。
Fetching external item into 'svn/tool-example':
リビジョン 1382235 の外部項目です。

リビジョン 11 です。

$ svn update --ignore-externals
Updating '.':
リビジョン 11 です。

あまり頻繁に使う機能ではありませんが、使いたいときに実際の設定コマンドのサンプルを見つけられなくて苦労しました。

ちなみに Subversion もいまや Apache プロジェクトのトップレベルプロジェクトなんですね。ホームページも刷新されていて驚きました。

2012/9/10 追記

同じディレクトリに複数ファイルの svn:externals 属性を設定するには、svn propedit を使わないと設定できないようです。

$ svn propedit svn:externals tool5 --editor-cmd=vim  # vim エディタで複数ファイルを設定
^/utils/myfunc.py myfunc.py
^/utils/myfunc2.py myfunc2.py

属性 'svn:externals' の新しい値を 'tool5' に設定しました

virtualenvwrapper のドキュメント (和訳) を更新しました

2010-12-31 に virtualenvwrapper のドキュメントを翻訳したときのバージョンは 2.6.1 でした。

現時点の最新バージョンは 3.2 です。その後も着々と機能拡張、バージョンアップが行われているようです。

ドキュメント (和訳) の更新内容

その他の主なドキュメントの更新内容を紹介します。

インストール

最もドキュメントの追加が多かったのがインストールに関する内容でした。

MSYS 環境や拡張プラグインによる PowerShell 環境のサポート、さらに mkproject コマンドによるプロジェクト管理機能が追加され、全般的な設定 にそういった説明も加わっています。

まとめ

開発者の Doug Hellmann は、積極的にユーザーからの要求に対応したり、バグ修正を行っています。またドキュメントもきちんと更新しています。

更新した和訳ドキュメントの Pull リクエスト を送ったところ、数時間でマージして、Web サイトも更新してくれました。virtualenvwrapper のような、多くのユーザーに使われるパッケージを保守するのは大変かもしれませんが、開発が活発で楽しんでいるのかもしれませんね。

Mac OS X で プロキシサーバーを使う

という要望を聞いたので調べてみました。

まずはデバッグのためにローカルの開発環境にプロキシサーバーを構築します。

ちょっとしたテストに squid : Optimising Web Delivery をインストールするのも面倒なので名前から軽量な印象を受ける Tinyproxy - A light-weight HTTP/HTTPS proxy をインストールします。

$ # MacPorts からインストールします
$ sudo port install tinyproxy

正常にインストールしたら設定を行います。デフォルトのままでも HTTP/HTTPS 共に有効になります。

$ # デフォルトの設定ファイルをそのままコピーします
$ cd /opt/local/etc/
$ cp -p tinyproxy.conf.default tinyproxy.conf

$ # 設定内容は man で調べます
$ man tinyproxy.conf

$ # log/run ディレクトリを作成して、環境にあわせて適切なパーミッションを設定してください
$ sudo mkdir /opt/local/var/log/tinyproxy
$ sudo chmod 775 /opt/local/var/log/tinyproxy
$ sudo mkdir /opt/local/var/run/tinyproxy
$ sudo chmod 775 /opt/local/var/run/tinyproxy

設定が完了したらプロキシサーバーを起動してみましょう。

最初は "-d" オプションを付けてフォアグランドで実行すると良いです。設定不備等でエラーがあると、そのメッセージがコンソールに出力されるからです。

$ # -d オプションで何もメッセージが出力されなかったら正常起動
$ tinyproxy -d

ログを確認してみましょう。

root で実行していないのですが、root で実行しないようにと WARNING が出てますね、、、ここでは気にしないことにします。

$ cat /opt/local/var/log/tinyproxy/tinyproxy.log
INFO      Sep 25 20:08:49 [48275]: Initializing tinyproxy ...
INFO      Sep 25 20:08:49 [48275]: Reloading config file
INFO      Sep 25 20:08:49 [48275]: Setting "Via" header to 'tinyproxy'
INFO      Sep 25 20:08:49 [48275]: Adding Port [443] to the list allowed by CONNECT
INFO      Sep 25 20:08:49 [48275]: Adding Port [563] to the list allowed by CONNECT
WARNING   Sep 25 20:08:49 [48275]: Not running as root, so not changing UID/GID.
...

動作を確認してみましょう。デフォルトでは tinyproxy はポート番号 8888 を使います。

$ python
Python 2.7.2 (default, Aug 22 2011, 13:53:27) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ["http_proxy"] = "localhost:8888"
>>> import urllib2
>>> r = urllib2.urlopen("http://www.python.org")
>>> r.headers.headers
['Via: 1.1 tinyproxy (tinyproxy/1.8.3)\r\n', ...]

以下のようなログが出力されます。

$ tail -f /opt/local/var/log/tinyproxy/tinyproxy.log
CONNECT   Sep 25 20:24:40 [48403]: Connect (file descriptor 9): localhost [127.0.0.1]
CONNECT   Sep 25 20:24:40 [48403]: Request (file descriptor 9): GET http://www.python.org HTTP/1.1
INFO      Sep 25 20:24:40 [48403]: No upstream proxy for www.python.org
CONNECT   Sep 25 20:24:40 [48403]: Established connection to host "www.python.org" using file descriptor 10.
INFO      Sep 25 20:24:41 [48403]: Closed connection between local client (fd:9) and remote client (fd:10)

ikazuchi のプロキシサーバー対応

開発のためのデバッグ環境は構築できました。

さて、本題の ikazuchi のプロキシサーバー対応です。結論から言って、先の Python の対話シェルで設定したように、環境変数の HTTP_PROXY と HTTPS_PROXY に設定しておくと、urllib2 モジュール内部でプロキシ設定をデフォルトで行ってくれます。そのため、従来のバージョンでも環境変数に設定することでプロキシサーバーに対応しています。

また、以下のように明示的に ProxyHandler の設定もできます *1

>>> import urllib2
>>> proxy = urllib2.ProxyHandler({"http": "localhost:8888"})
>>> opener = urllib2.build_opener(proxy)
>>> urllib2.install_opener(opener)
>>> r = urllib2.urlopen("http://www.python.org")
>>> r.headers.headers
['Via: 1.1 tinyproxy (tinyproxy/1.8.3)\r\n', ...]

とはいえ、せっかく調べたので ikazuchi.conf で明示的に http_proxy と https_proxy を設定できるように修正した ikazuchi 0.5.3 をリリースしました *2

virtualenvwrapper のドキュメントを翻訳しました

モダンな Python の開発環境で virtualenv/virtualenvwrapper は必須らしいです。

!!!

どこを見ても virtualenv/virtualenvwrapper の話題で持ち切りです(> <)

これまではディストリビューションに付属している Python のバージョンや標準/拡張リポジトリで提供されている(比較的、人気のある)ライブラリで満足していました。少しずつ Python のバージョン間の違いが分かってきたり、マイナーなライブラリを使ってみたり、最新のバージョンを追いかけたりしているうちに縦横無尽に色んな環境を構築してやりたいという思いが募ってきました。

しかし、ここで大きな壁が。

virtualenv/virtualenvwrapper の使い方、教えて

とか、いまさら聞けない感がしてなりません(> <)

こうなったらやることは1つしかありません。

virtualenvwrapper のドキュメントを翻訳しました!

これでみんなと同じようにモダンな Python の開発環境の話題に仲間入りしてやるんだ!!!

そもそも virtualenvwrapper って何?

はい。冷静さを取り戻しました。virtualenvwrapper は PyMOTW を連載している Doug Hellmann が開発した Python に特化した仮想環境を構築する virtualenv をさらに拡張するツールです。複数の仮想環境を切り替えるために便利な仕組みを提供したり、仮想環境そのものを扱う際にフック処理を埋め込んだり、何かと便利なようです。

ドキュメントのこの辺を読むと良さそうです。

ちょっと使いたい人は
もっと深めたい人は

さー、やるぞー。使い方を学ぶのはこれから(^ ^;;

Shift_JIS なファイル名を含む Zip ファイルを解凍する unzip パッケージの作り方

ネタ元: Shift_JISなファイル名を含むZipファイルを解凍する

try:
    out.write(f.read(member))
finally:
    out.close()

1行でファイルを read して write しつつ、諸々は例外で引っ掛ければ良いでしょ、と言うコードがおもしろいです(^ ^;;

また、本文を読んでいると、unzip-ja なるパッケージがあるそうなので、探してみました。

Re: [opensuse-ja] Re: [opensuse-ja] unzipの 文字化け

ここで紹介されているパッチを適用して、CentOS 5.3 で unzip-ja なるパッケージを作ってみます。個人的な意見なのですが、パッケージ名を unzip-ja とするのはあまりよろしくありません。というのは、別パッケージ扱いになるので、ソースを完全に別管理にする意図も含めてしまいます(メンテナンスのことを考えた場合のお話ですが)。もしくは、コマンド名を unzip-ja に変更して、全く別コマンドとして扱いたいのであれば、パッケージ名を変更するのも理解できます。
しかしながら、紹介されているパッチがどのようなものか全く見ていませんが、本来は、オリジナルの動作に影響を与えない(互換性を確保した)パッチを作成して、unzip の別リリースバージョンとして提供するのが理想的です。そして、良いものであれば upstream にマージするように働きかければ良いと思います。

閑話休題。従って、正しくは CentOS 5.3 の unzip-ja でなく、unzip の ja リリースの作成方法です。

# lsb_release -a
LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.3 (Final)
Release:        5.3
Codename:       Final

ソースとパッチをダウンロードします
# wget http://mirror.centos.org/centos/5/os/SRPMS/unzip-5.52-3.el5.src.rpm
# wget 'http://ebuild.gentoo.gr.jp/open.php?mode=download&type=files&cat=app-arch&app=unzip&arg=unzip-5.52-ubuntuja.patch&visible=' -O unzip-5.52-sjis.patch
# ls
unzip-5.52-3.el5.src.rpm  unzip-5.52-sjis.patch

ビルドするために、環境を整えます
# rpm -ivh unzip-5.52-3.el5.src.rpm                     
# cp -p unzip-5.52-sjis.patch /usr/src/redhat/SOURCES/
# cd /usr/src/redhat/SPECS/   
# cp -p unzip.spec unzip.spec.orig
# vi unzip.spec
# diff -ur unzip.spec.orig unzip.spec
--- unzip.spec.orig     2009-06-28 10:27:48.000000000 +0900
+++ unzip.spec  2009-06-28 10:32:00.000000000 +0900
@@ -1,7 +1,7 @@
 Summary: A utility for unpacking zip files.
 Name: unzip
 Version: 5.52
-Release: 3%{?dist}
+Release: 3%{?dist}.1ja
 License: BSD
 Group: Applications/Archiving
 Source: ftp://ftp.info-zip.org/pub/infozip/src/unzip552.tar.gz
@@ -14,6 +14,7 @@
 Patch9: unzip-5.52-long-filename.patch
 Patch10: unzip-5.52-open.patch
 Patch11: unzip-5.52-ret.patch
+Patch12: unzip-5.52-sjis.patch
 URL: http://www.info-zip.org/pub/infozip/UnZip.html
 BuildRoot: %{_tmppath}/%{name}-%{version}-root

@@ -39,6 +40,7 @@
 %patch9 -p1 -b .lfn
 %patch10 -p1 -b .open
 %patch11 -p1 -b .ret
+%patch12 -p1 -b .sjis
 ln -s unix/Makefile Makefile

 %build
@@ -59,6 +61,9 @@
 %{_mandir}/*/*

# rpmbuild -ba unzip.spec
# rpm -q unzip
unzip-5.52-3.el5
# rpm -Uvh ../RPMS/i386/unzip-5.52-3.1ja.i386.rpm
準備中...                ########################################### [100%]
   1:unzip                  ########################################### [100%]
# rpm -q unzip
unzip-5.52-3.1ja

ここで作成した src.rpm は以下になります。

unzip-5.52-3.1ja.src.rpm

動作検証をしてみます。Windows7 RC で日本語のディレクトリに日本語のファイルを作成し、Windows の圧縮機能を使って Zip ファイルを作成します。それから、その Zip ファイルを unzip コマンドで解凍してみます。

Shift_JIS パッチの適用前。

# unzip SJISエンコードされたアーカイブ.zip
Archive:  SJISエンコードされたアーカイブ.zip
 extracting: SJIS�+�G���R�[�h�������f�B���N�g��/SJIS�+�G���R�[�h�������t�@�C���+.txt
# ls -lR
.:
合計 8
 drwxr-xr-x 2 root root 4096 2009-06-28 11:38 SJIS?+?G???R?[?h???????f?B???N?g??
 -rwxr--r-- 1 root root  240 2009-06-28 10:39 SJISエンコードされたアーカイブ.zip

./SJIS?+?G???R?[?h???????f?B???N?g??:
合計 0
 -rw-r--r-- 1 root root 0 2009-06-28 10:35 SJIS?+?G???R?[?h???????t?@?C???+.txt

Shift_JIS パッチ適用後。

# unzip SJISエンコードされたアーカイブ.zip
Archive:  SJISエンコードされたアーカイブ.zip
 extracting: SJISエンコードされたディレクトリ/SJISエンコードされたファイル名.txt
# ls -lR
.:
合計 8
 -rwxr--r-- 1 root root  240  6月 28 11:40 SJISエンコードされたアーカイブ.zip
 drwxr-xr-x 2 root root 4096  6月 28 11:40 SJISエンコードされたディレクトリ

./SJISエンコードされたディレクトリ:
合計 0
 -rw-r--r-- 1 root root 0  6月 28 10:35 SJISエンコードされたファイル名.txt

MS Office 2007 の Excel でセルとオブジェクトの選択を切り替えるボタンの追加方法

資料を作成する際、図形を範囲指定でまとめて選択して移動させたり、削除したりするときに使用します。

確か Office XP の Excel を使っていた頃は、デフォルトでツールバーに表示されていたと思います。しかし、Office 2007 になって、デフォルトでは表示されなくなりなりました。そのボタンをどうすれば追加できるかを調べてみました。ちなみに以前に1度調べて、現在、また忘れてしまっていたので、備忘録として書いておきます。

MS Office 2007 では、最上部にクイックツールアクセスバーがあります。そこに「オブジェクトの選択」ボタンを追加します。

「その他のコマンド」を選択するとオプションのユーザ設定画面が表示されます。「コマンドの選択」から[インクツール][ペン]タブを選択します。「オブジェクトの選択」ボタンが表示されるので選択して追加します。

この矢印があると資料作成時にホッとします。

Python のソースを読むのにタグジャンプ機能を利用する

vi(vim) で Python のソースを読むのに ctags を使ってみました。調べていると、別途、ptags.py と言うものもあり、それを用いてもタグファイルを作成してくれるようです。
basic Tip #1188: Use ptags.py to generate tags file for python によると、Python 2.3 以上で使用できます。ptags.py は python-tools パッケージに含まれています。

yum を使って python-tools と ctags をインストールします。

$ sudo yum install python-tools ctags
~~~ snip ~~~
Running Transaction
  Installing     : python-tools                                      [1/2]
  Installing     : ctags   

以下のように ptags.py の引数にファイル名を指定すると tags ファイルが作成されます。おそらく ptags.py は ctags が Python に対応していなかった過去の名残りかな?と思います。現在は ctags でもタグファイルを作成することができます。

$ /usr/lib/python2.5/Tools/scripts/ptags.py *.py
又は、
$ ctags *.py

ptags.py と ctags で作成した tags ファイルを比較してみました。ctags の tags ファイルの方がサイズが大きいです。

$ ls -l tags*
-rw-rw-r-- 1 xxx xxx 33543 2008-09-03 18:31 tags.ctags
-rw-rw-r-- 1 xxx xxx 18708 2008-09-03 18:32 tags.ptags

$ head tags.ptags tags.ctags
==> tags.ptags <==
CacheProgressCallback   output.py       /^class CacheProgressCallback:/
CheckFailedSignal       yum-updatesd.py /^    def CheckFailedSignal(/
CheckNow        yum-updatesd.py /^    def CheckNow(/
CheckUpdateCommand      yumcommands.py  /^class CheckUpdateCommand(/
CleanCommand    yumcommands.py  /^class CleanCommand(/
CliError        cli.py  /^class CliError(/
DbusUpdateEmitter       yum-updatesd.py /^class DbusUpdateEmitter(/
DepListCommand  yumcommands.py  /^class DepListCommand(/
DepSolveProgressCallBack        output.py       /^class DepSolveProgressCallBack:/
EmailUpdateEmitter      yum-updatesd.py /^class EmailUpdateEmitter(/

==> tags.ctags <==
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.6     //
CacheProgressCallback   output.py       /^class CacheProgressCallback:$/;"      c
CheckFailedSignal       yum-updatesd.py /^    def CheckFailedSignal(self, message):$/;" m       class:YumDbusInterface
CheckNow        yum-updatesd.py /^    def CheckNow(self):$/;"   m       class:YumDbusListener
CheckUpdateCommand      yumcommands.py  /^class CheckUpdateCommand(YumCommand):$/;"     c

どちらが良いとか、何が違うとかがよく分からないので、取り合えず ctags を使用することにします(^ ^;;

カレントディレクトリ配下(サブディレクトリも含む)の
全ての .py ファイルからタグファイルを作成する
$ find . -type f -name "*.py" -exec ctags -a {} \;

上記に加えて、特定ライブラリも対象に含めてタグファイルを作成する
$ find . /usr/lib/python2.5/site-packages/rpm* -type f -name "*.py" -exec ctags -a {} \;

vi(vim) エディタ上での基本操作は以下の通りです。詳細は Tip #94: Questions & Answers about using tags with Vim からリンクを辿ればありそうです。まぁ、ぼちぼちと(- -#

:ta tag タグを検索する
Ctrl-] カーソル下のタグを検索する(ヒットすればジャンプ)
Ctrl-T タグジャンプする前の位置へ戻る

さらに taglist.vim : Source code browser (supports C/C++, java, perl, python, tcl, sql, php, etc) に taglist.vim というプラグインがあります。せっかくなのでこれもインストールして使ってみます。

インストール方法:
1. taglist_45.zip をダウンロード

2. vim の環境設定
$ vi ~/.vimrc
filetype on を追加
$ cd ~/.vim
$ unzip /tmp/taglist_45.zip
plugin/taglist.vim - プラグインの本体
doc/taglist.txt    - ドキュメント(ヘルプ)ファイル

3. 基本操作
:TlistToggle
左側にタグリストメニューが表示され F1 でヘルプが見れます

以下のようなイメージです。


リファレンス:
Vim Taglist Plugin 本家サイト