rebarのdepsを更新するスクリプト
単純な場合はrebar update-deps
とかで更新できる. だが, rebarはそこまで賢くないので上手くいかない場合もある.
update-depsがうまくいかない場合
- App A
- App B
- App C (version 2)
- App C (version 1)
といった, 親と子で同じアプリケーションを使用する場合に上手くいかない.
なので, git限定で最新のものを参照するスクリプトを書いた
スクリプト
update-deps
# !/bin/bash
# rebarのパスを設定
REBAR=./rebar
# for inで改行単位でループを回す
IFS=$'\n'
APP=""
COMMIT=""
git_check() {
cd deps/$1
# commit時刻を比較して新しい方を取る
if [ `git show $2 --quiet --pretty=format:%at | tail -n 1` -ge `git show $3 --quiet --pretty=format:%at | tail -n 1` ]; then
COMMIT=$2
else
COMMIT=$3
fi
cd ../../
}
# 依存ライブラリの一覧をソートして同じライブラリの参照が連続するようにする.
# 最後に余分に1回ループを回す為に" "をつけている.
for l in `$REBAR list-deps | grep -v "==>" | sort` " "
do
# Application名 TAG バージョンタグ git://.... のようになっているので, その1番目と3番目を取得
APP2=`echo $l | cut -d " " -f 1`
COMMIT2=`echo $l | cut -d " " -f 3`
# 前回と同じであればどちらが新しいかを比較
if [ "$APP" == "$APP2" ]; then
git_check $APP $COMMIT $COMMIT2
else
# 前回と違うアプリケーションになったら, その前のアプリケーションのバージョンは確定するので, checkout
if [ "$COMMIT" != "" ]; then
cd deps/$APP
git checkout $COMMIT
cd ../../
fi
cd deps/$APP2
git fetch
cd ../../
APP=$APP2
COMMIT=$COMMIT2
fi
done
まぁ, 大分汚いですが勘弁してください^^;
使用しているコマンド
rebar.configに記載されている依存ライブラリとそのバージョンの一覧を取得する.
依存ライブラリの依存ライブラリも取得できます.
但し, 不要な情報も存在する為, 上記スクリプトではgrep
でそれを取り除いています.
$ rebar list-deps
gitの指定したコミットのコミット時間を取得する
signatureが入っているcommitやtagに関しては他の情報も出力される為, 最後の1行だけを取っています
(よいやり方があれば...)
$ git show $2 --quiet --pretty=format:%at | tail -n 1
注意点
- commitの新しさはcommit時刻を参照するので, 必ずしも正しくならない場合があります
- deps以下に依存ライブラリを配置している前提でのスクリプトです. 状況に応じて好きに修正してください
rebarがもう少し賢ければなぁ...