発端
私が勤務している会社の所属部署ではソースコード等のバージョン管理システムとしてSubversionを使用しています。少し前からこの管理をするようになっていたのですが、とあるプロジェクトからの依頼でSubversionにコミットされているすべてのファイルのパス、ファイル名、リビジョン、コミット者、コミット時のコメントを一覧で見たいとの依頼がありました。
こういう時はコマンドラインでしょと思い色々とsvnコマンドを調べてみましたが、「svn ls -Rv」が一番近いものの微妙に要件を満たしていなかったので自分で作ることにしました。
環境
今回は会社のPCで使うことを想定しているので、環境は以下のとおりです。
- windows 7 32bit
- 環境:cygwin
- python 3.6.1
使うモジュール
- svnモジュール
GitHubにも書かれていますが、上記のモジュールはsvnコマンドラインクライアントをwrapしているだけなので、あらかじめsubversionもインストールしておく必要があります。
cygwinにsubversionをインストールするには、setup.exeでDevelカテゴリからSubversionを選択してインストールするか、apt-cygを導入済みであれば以下のコマンドでインストールできます。
$ apt-cyg install subversion
インストール
以下のコマンドでインストールします。
$ apt-get install svn svn(0.3.45)
プログラム
#! python3
# -*- coding: utf-8 -*-
import svn.remote,csv,datetime,time
# ワーキングコピーを対象にする場合はsvn.remoteの代わりにsvn.localをインポートする
REPOSITORYPATH = "リポジトリのパス"
time = datetime.datetime.today().strftime("%Y%m%d%H%M%S")
def writecsv(csvdata):
f = open('log'+time+'.csv','a',encoding='shift_jis') # Excelで開けるようにShift JISを使う(こうしないとExcelで文字化けした。cygwinだから?)
writer = csv.writer(f, lineterminator='\n')
writer.writerow(csvdata)
f.close()
# リポジトリを取得
repos = svn.remote.RemoteClient(REPOSITORYPATH)
l = repos.list_recursive()
# ワーキングコピーを対象にする場合はsvn.remote.RemoteClientの代わりにsvn.local.Localclientを使用する
# ファイルを取得
for entries in l:
# entries[0] -> 相対パス, entries[1] -> 対象ファイルの情報
relpath = entries[0] #起点からの相対パス
filename = entries[1]["name"] #ファイル名
rev = entries[1]["commit_revision"] #リビジョン
date = entries[1]["date"].strftime("%Y/%m/%d %H:%M:%S") #コミット日時
author = entries[1]["author"] #author
# CSVの1レコード作成
csvlist = []
csvlist.append(relpath)
csvlist.append(filename)
csvlist.append(rev)
csvlist.append(date)
csvlist.append(author)
# リビジョンに対応するコミットメッセージの取得(ごり押し)
for e in repos.log_default(revision_from =rev,revision_to =rev):
# '\uff5e'を直接Utf-8→Shift_JISに変換できないので、一度CP932に変換してからShift_JISにする
# [参考]http://tanakahisateru.hatenablog.jp/entry/20080728/1217216409
csvlist.append(e.msg.encode('CP932').decode('SJIS'))
# csvファイルに書き込み
writecsv(csvlist)
動作結果
自社のリポジトリを公開するわけにもいかないので、過去記事で紹介したRedmineのSCM-Creatorプラグインの公開されているリポジトリを使って動作結果を見てみます。
取得結果は以下のとおり。
,CREDITS,139,2014/05/20 15:57:01,s-andy,Added Elektritter Messinger to CREDITS ,LICENSE,2,2011/03/25 17:43:32,s-andy,Added LICENSE and url ,init.rb,141,2014/12/14 22:09:25,s-andy,Fixes for Redmine 3.x: regexp fix and observer removal config,scm.yml,135,2014/05/10 21:10:49,s-andy,Hook registration and auto-creation fixes (#1950) lib,scm_config.rb,88,2012/05/31 09:43:09,s-andy,Refactoring a little + debugs for #2017 lib,scm_hook.rb,147,2016/12/22 19:09:01,s-andy,Added URL to repository view (fixes #2122 and #2390) lib,scm_project_patch.rb,146,2016/12/22 12:17:13,s-andy,Another clean up of obsolete code
こんな感じで出てきます。
これをExcelに貼り付けて何らかのレポートにしている見たいです。


コメント