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_442682895-resized

scp コマンドを yum を使って CentOS にインストールする

小ネタです。 yum install scp ではなかったのでメモしておきます。 photo

記事を読む

no image

IE9 のキャッシュ対策

どのようなバグだったのか POST で送信した内容を確認する画面で、最新の内容が表示されないという

記事を読む

icatch-vagrant_box_customize

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

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

記事を読む

icatch-pray_c916c87577_mini-thumbnail

Eclipse がエラーメッセージを出力して起動しなくなった場合の対処法

Eclipse の exe ファイルをクリックすると(または、実行すると)、 Eclipse のスプ

記事を読む

no image

VPS に Redmine を設置したときに対処したトラブル

Redmine のインストール自体は Redmine 2.3をCentOS 6.4にインストールする

記事を読む

icatch-markdown_6281167385_mini-thumbnail

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

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

記事を読む

icatch-_9692711856-resized

シェルスクリプトでメールを送信する

このブログを運用している Linux サーバの監視スクリプトを作成した記事を書きました。 ロード

記事を読む

icatch-2015-003-1

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

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

記事を読む

icatch-markdown_14bd207bd7_mini-thumbnail

Markdown記法のテキストに書いたソースコードをシンタックスハイライトするプラグイン

SublimeText3 で拡張子が md のファイルを開いたときに、文章中に書かれたプログラムのソ

記事を読む

icatch_8626992930-resized

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


一 + 3 =

次の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 ↑