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-markdown_14bd207bd7_mini-thumbnail

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

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

記事を読む

icatch-_9692711856-resized

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

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

記事を読む

icatch_5623339500-resized

Bundler を使ってプロジェクト用の Gem をインストールして Gemfile をバージョン管理ツールに登録するまでの流れ

Bundler を使い始める人向けにまとめた次の記事を書きました。 CentOSにRubyのBu

記事を読む

icatch_3304032405-resized

CentOS に yum-plugin-priorities プラグインをインストールする

yum を使ってあるパッケージをインストールしようと調べていたところ、yum-plugin-prio

記事を読む

icatch-medium_4301351732-resized

mp3splt を実行して “undefined symbol: mp3splt_u_check_if_directory” と出力されたときの対処法

mp3 ファイルを分割してくれる mp3splt というライブラリがあります。 mp3 ファイルを

記事を読む

no image

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

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

記事を読む

no image

IE9 のキャッシュ対策

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

記事を読む

icatch_442682895-resized

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

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

記事を読む

icatch-8785445626_587fdac14d_z-resized

検証用の CentOS をインストールした直後に行う初期設定手順

職場でも自宅でも Linux で検証したい作業があったので VMware に 64 ビット版の Ce

記事を読む

no image

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


× 7 = 四十 二

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