CVS でタグ間で変更があったファイルを抽出するスクリプト

公開日: : 最終更新日:2013/12/29 プログラム

今どきバージョン管理ツールに CVS を使っているところは珍しいと思うし、あまり需要はないだろうけど、自分的にはとても助かっているスクリプトを作成したのでメモとして残しておく。

背景

開発プロジェクトの区切りで「タグ」を付けるようにしている。例えば、フェーズの区切りやリリースのタイミングでタグを付けている。

今の案件ではこれらの区切りで、ウチが担当したソースコード一式をお客さんへリリースするようになっている。前回リリース後に修正・追加したソースコード一式を差分で送ることになっているのだ。

面倒だからリポジトリを共有させてくれ、とお願いしたのだが、「万が一、エラーがあるファイルをコミットしてしまって、そちら(ウチ)の開発に影響があると困る」とかの理由で断られてしまった。マージするほうがよっぽど面倒だと思うのだが、これ以上お願いをしてもムダだと悟ったので諦めて作ったのがこのスクリプト。

どんなスクリプトなのか

上にも書いたが「前回リリース後に修正・追加したソースコード一式を差分」で送る手間を省く、というスクリプトを作成した。具体的には、指定した2つのタグ間(開始タグと終了タグ)で変更があったファイルを抽出する、というもの。

ソースコードは Gist にも登録済み。

#!/bin/sh
IFS="
"
 
WORK_DIR='./diff'
[ -d ${WORK_DIR} ] && rm -fr ${WORK_DIR}
mkdir ${WORK_DIR}
 
DIFF_TXT='diff.txt'
cvs -d USER_NAME@HOST:/path/to/repo rdiff -kk -s -u -r BEGIN_TAG -r END_TAG PROJECT_NAME > ${DIFF_TXT}
 
UPDATE_TXT='diff-update.txt'
PROJECT_HOME=`dirname '/path/to/project'`
grep -e "new;" -e "changed" ${DIFF_TXT} > ${UPDATE_TXT}
for LINE in `cat ${UPDATE_TXT}`
do
    FILE=`echo $LINE | awk '{print $2}'`
    DIR=`echo ${FILE} | sed -e 's#\(.*/\)\(.*\)#\1#g'`
    
    mkdir -p ${WORK_DIR}/${DIR}
    cp -a ${PROJECT_HOME}/${FILE} $WORK_DIR/${DIR}
done
 
DELETE_TXT='diff-delete.txt'
grep -e "removed" ${DIFF_TXT} > ${DELETE_TXT}

使い方

本来ならば、ユーザ名やタグ名は引数で指定するべきなんだろけど、、、

  • 自分しか使わないからユーザ名やホストは直書き
  • 前回指定したタグが残っていると便利なのでタグ名も直書き

になっている。

$ sh cvs-diff.sh

と実行すると、カレントディレクトリに次が作成される。

  • diff.txt
    • 開始タグ以降に変更があったファイルの一覧が出力される
  • diff-update.txt
    • 開始タグ以降に新規作成したファイル、編集したファイルの一覧が出力される
  • diff-delete.txt
    • 開始タグ以降に削除したファイルの一覧が出力される
  • diff ディレクトリ
    • diff-update.txt にあるファイルが元のディレクトリ構成を維持した状態でコピーされる

差分ファイルは diff ディレクトリにコピーされる。
なので、diff ディレクトリを zip などに圧縮して、diff-update.txt と diff-delete.txt と一緒に「これが今回の差分ファイル一式です」とお客さんに送る。非常に便利なスクリプト。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

icatch_8626992930-resized

シェルスクリプトでcdしたいパスにスペースが入っている場合の対処法

cd したいパスにスペースが入っていると、パスの先頭からスペースまでを「移動したいパス」と解釈されて

記事を読む

icatch-vagrant_box_customize

VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を構築することが多くなってきた。

記事を読む

icatch_8617990318-resized

yum が参照するミラーサイトの baseurl を変更して日本国内のものに設定する

yum が参照するリポジトリのミラーサイトは変更することができます。 このミラーサイトを日本国内のも

記事を読む

no image

no space left と表示されたときの対処法

タイトルの "no space left" とは「書き込みたいけど、ディスクの飽

記事を読む

icatch-markdown_6281167385_mini-thumbnail

Sublime Text3 で Markdown のシンタックスハイライトを有効にする手順

IT 関連の職場であれば、部署やチーム単位に Redmine とか Backlog を使って TOD

記事を読む

no image

GoogleGuavaのRangeを使って範囲判定を簡潔に書く

次のような判定処理を if 文で書くことがよくある。 もし 100 よりも大きければ(=大小判定

記事を読む

icatch-2015-003-1

Vagrantで起動したCentOS上のMySQLにホストOSからログインする設定

マシンを新しくしたこともあり、検証と称してソフトウェアをやみくもにインストールすることに抵抗が出てき

記事を読む

icatch-sublimetext_9222613858_mini-thumbnail

Sublime Text3 のインストール直後に行った設定メモ

突発的に自宅のマシンにインストールしてあった Sublime Text2 を 3 にアップデートしま

記事を読む

icatch_4365495446-resized

CentOS6.5にGitをソースコードからインストールする

CentOS 6.5 の64ビット版を "Minimal" でインストールした環境で、git sta

記事を読む

icatch-back-scratcher_3553512020_mini-thumbnail

Sublime Text3 で JavaScript を書くために設定したプラグインとキーバインド

プロフィール にもあるように、ボクは Java をメインとしたプログラマです。 IDE には Ecl

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


五 × = 5

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑