きりかノート 3冊め

おあそびプログラミング

MacPortsWiki-JP に inplace を登録

 % cat foo > foo

でファイルの内容がなくなってしまうわけだけど、意図としてこういう処理をしたいときってけっこうある。しかも対象が複数あると、しかたなく for をまわしたりする。

で、そんなとき便利なのが inplace(1) というコマンド。探しものをしていて、はてなの似たような質問 がひっかかった。

単純に使っても便利なのだけど、sed のように -e オプションで複数の処理を指定できるのがナイス。こっそり ruby で書かれていたりもする。

で、当然のようにローカルで Portfile を書いてインストール。ついでに MacPortsWiki-JP にも登録 しておいた。

手元の野良 portssubversion で管理しているのだけれど、これからアップロード用のファイルをつくるには余計なものが入らないようになど、意外と気を使うことが多い。勢いでてきとうなシェルスクリプトをでっちあげ。とりあえず動く。

 #!/bin/sh
#
# make port
#

svnroot=file:///Users/kimuraw/Library/svn-repos/dports/trunk
targets=${*}
workdir=`mktemp -d /tmp/portXXXX`

if [ "x$*" == "x" ]; then
echo "[usage] port-arch port1 port2 ..." 1>&2
exit 1
fi

port_version=`port -q info --version ${1} `
if [ "${port_version}" == "No port foo found." ]; then
echo "error: port \"${1}\" not found" 1>&2
exit 1
fi
archname=${1}-${port_version}

for target in ${targets}
do
portinfo=`port -q info ${target} | head -1`
echo ${portinfo}
path=`echo ${portinfo} | cut -d\, -f2 | tr -d \ `
tmp_target="${workdir}/${path}"
mkdir -p `dirname ${tmp_target}`
svn export "${svnroot}/${path}" "${tmp_target}" >/dev/null
done

tar cvjf ${archname}.tbz2 -C "${workdir}" .
rm -rf "${workdir}" 2>/dev/null

先頭の svnroot の値を書きかえれば、他の環境でも動くはず。複数 port を指定もいちおう可能。できあがる .tbz2 ファイルの名前は引数の先頭の port 名 + バージョンになる。