- descriptionはREADMEに書いてあるのにupload時のコマンドのオプションに指定してあげないといけない
- 前回uploadしたURLをどこにも保持していないのでファイルを更新して再度uploadする時にURLを指定しないといけない
- ファイル指定しないといけない (そのディレクトリにあるファイル全てをuploadする時に ワイルドカードをいちいち指定しないといけない)
- descriptionはREADMEに書いてあるのにupload時のコマンドのオプションに指定してあげないといけない
- README.?(md|rst)の一行目をdescriptionに使う
- Markdownの場合、行先頭の
#
文字が邪魔になるので lstripする - 左右の空白文字は基本いらないものなのでstripする
- 前回uploadしたURLをどこにも保持していないのでファイルを更新して再度uploadする時にURLを指定しないといけない
- gistをpostした後URLが標準出力に出力されるのでそれを.gistに保持する
- gistのpost時に.gistファイルがあった場合、その中に記述されているURLを更新対象のURLとして使う
- ファイル指定しないといけない (そのディレクトリにあるファイル全てをuploadする時に ワイルドカードをいちいち指定しないといけない)
- 指定対象がディレクトリならそのディレクトリ配下が対象と考えてそのディレクトリ配下のファイルを対象に処理していく
- 引数がなければワイルドカード指定として処理する
- dot fileはクレデンシャルなどが入っていることがおおいのでupload対象にはしない
gist-sync () {
gist -u $(head -n 1 $1/.gist_url) -d $(head -n 1 $1/README* | awk 'sub(/^#[ ]*/, ""); sub(/[\t]/, "");') $1/* > $1/.gist_url
}
- .gist_urlがない場合も-uをつけてしまう
- READMEがない場合も-dをつけちゃう
- エラー出力まで.gist_urlに出力されてしまう
- 第一引数がない場合にカレントディレクトリが対象にならない
- .gist_urlがない場合も-uをつけてしまう
- 事前に.gist_urlが存在するかどうかを確認する
- なければ-uはつけない
- READMEがない場合も-dをつけちゃう
README*がない場合は-dを付加しない
- エラー出力まで.gist_urlに出力されてしまう
標準出力のみ.gist_urlに出力する
- 第一引数がない場合にカレントディレクトリが対象にならない
第一引数が省略された場合はカレントディレクトリを対象にする
gisting() {
_GIST_SYNC_TARGET_DIR=$1
_GIST_SYNC_URL=
_GIST_SYNC_DESCRIPTION="NO TITLE"
if [ ! "$_GIST_SYNC_TARGET_DIR" ]
then
_GIST_SYNC_TARGET_DIR=$(pwd)
fi
if [ -e "$_GIST_SYNC_TARGET_DIR/.gist_url" ]
then
_GIST_SYNC_URL=$(head -n 1 $_GIST_SYNC_TARGET_DIR/.gist_url | cut -d "/" -f4)
fi
if [ -e $_GIST_SYNC_TARGET_DIR/README* ]
then
_GIST_SYNC_DESCRIPTION=$(head -n 1 $_GIST_SYNC_TARGET_DIR/README* | awk 'sub(/^#[ ]*/, ""); sub(/[\t]/, "");')
fi
if [ "$_GIST_SYNC_URL" ]
then # 更新
for _GIST_SYNC_TARGET_FILE in `ls $_GIST_SYNC_TARGET_DIR`
do
if [ "$(git diff $_GIST_SYNC_TARGET_DIR/$_GIST_SYNC_TARGET_FILE )" ]
then
gist -u $_GIST_SYNC_URL -d $_GIST_SYNC_DESCRIPTION $_GIST_SYNC_TARGET_DIR/$_GIST_SYNC_TARGET_FILE | tee $_GIST_SYNC_TARGET_DIR/.gist_url
break
else
echo "No updated:" $_GIST_SYNC_TARGET_DIR/$_GIST_SYNC_TARGET_FILE
fi
done
else # 登録
echo gist -d "$_GIST_SYNC_DESCRIPTION" $_GIST_SYNC_TARGET_DIR/*
gist -d $_GIST_SYNC_DESCRIPTION $_GIST_SYNC_TARGET_DIR/* | tee $_GIST_SYNC_TARGET_DIR/.gist_url
git add $_GIST_SYNC_TARGET_DIR
git commit $_GIST_SYNC_TARGET_DIR -m "updated gist"
fi
}
- 更新確認はgist idを取得できなそうであったため、gitリポジトリを前提にしてそれとのdiffから取得するようにした。 (--readで指定するのはURLではなくGistID)
- 1つでも更新があった場合は全てuploadし直すようにした (更新ファイルのみでもいいかもしれない)
- 後はng設定時に読み込み用の設定ファイルを生成するようにして終了
このshell scriptは https://github.com/TakesxiSximada/ng/blob/master/templates/gisting.sh に登録した。
上記のコードで ls $_GIST_SYNC_TARGET_DIR
していますが、ディレクトリも全て入ってきてしまいます。
if [ "$_GIST_SYNC_URL" ]
then # 更新
for _GIST_SYNC_TARGET_FILE in `ls $_GIST_SYNC_TARGET_DIR`
do
if [ "$(git diff $_GIST_SYNC_TARGET_DIR/$_GIST_SYNC_TARGET_FILE )" ]
gistコマンドでディレクトリを指定するとエラーするので、find -maxdepth 1 -type f
でその場にあるファイルのみを対象にします。
if [ "$_GIST_SYNC_URL" ]
then # 更新
for _GIST_SYNC_TARGET_FILE in `find $_GIST_SYNC_TARGET_DIR -maxdepth 1 -type f`
do
if [ "$(git diff $_GIST_SYNC_TARGET_FILE )" ]
.gitignoreに記載していてもgistingは無視してuploadしてしまいます。
Gemfile.lockなどuploadされてもちょっと困るので git log
でgitに登録されているものだけを登録します。
と思ったのですが、もう面倒だったので git ls-files
で取得したものをuploadするようにしました。