« Carbon と Cocoa のファイル保存時の挙動のちがい | トップページ | lftp のミラーで .svn など特定のディレクトリを無視する »

2007.04.16

MacPortsWiki-JP に inplace を登録

 % cat foo > foo

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

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

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

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

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

 #!/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 名 + バージョンになる。

|

« Carbon と Cocoa のファイル保存時の挙動のちがい | トップページ | lftp のミラーで .svn など特定のディレクトリを無視する »