Python3でSubversionの情報を取得しCSV形式で保存する

スポンサーリンク
Python
スポンサーリンク
スポンサーリンク

発端

私が勤務している会社の所属部署ではソースコード等のバージョン管理システムとしてSubversionを使用しています。少し前からこの管理をするようになっていたのですが、とあるプロジェクトからの依頼でSubversionにコミットされているすべてのファイルのパス、ファイル名、リビジョン、コミット者、コミット時のコメントを一覧で見たいとの依頼がありました。

こういう時はコマンドラインでしょと思い色々とsvnコマンドを調べてみましたが、「svn ls -Rv」が一番近いものの微妙に要件を満たしていなかったので自分で作ることにしました。

環境

今回は会社のPCで使うことを想定しているので、環境は以下のとおりです。

  • windows 7 32bit
  • 環境:cygwin
  • python 3.6.1

使うモジュール

  • svnモジュール

    PySvn – GitHub

    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プラグインの公開されているリポジトリを使って動作結果を見てみます。

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に貼り付けて何らかのレポートにしている見たいです。

コメント