Skip to content

Instantly share code, notes, and snippets.

@TakesxiSximada
Last active October 12, 2016 10:59
Show Gist options
  • Save TakesxiSximada/c8e347c7f713b8e441da95605aa3822c to your computer and use it in GitHub Desktop.
Save TakesxiSximada/c8e347c7f713b8e441da95605aa3822c to your computer and use it in GitHub Desktop.
gistコマンドで不満なところをなんとかする

gistコマンドで不満なところをなんとかする

不満なところ

  1. descriptionはREADMEに書いてあるのにupload時のコマンドのオプションに指定してあげないといけない
  2. 前回uploadしたURLをどこにも保持していないのでファイルを更新して再度uploadする時にURLを指定しないといけない
  3. ファイル指定しないといけない (そのディレクトリにあるファイル全てをuploadする時に ワイルドカードをいちいち指定しないといけない)

修正案

  1. descriptionはREADMEに書いてあるのにupload時のコマンドのオプションに指定してあげないといけない
  • README.?(md|rst)の一行目をdescriptionに使う
  • Markdownの場合、行先頭の # 文字が邪魔になるので lstripする
  • 左右の空白文字は基本いらないものなのでstripする
  1. 前回uploadしたURLをどこにも保持していないのでファイルを更新して再度uploadする時にURLを指定しないといけない
  • gistをpostした後URLが標準出力に出力されるのでそれを.gistに保持する
  • gistのpost時に.gistファイルがあった場合、その中に記述されているURLを更新対象のURLとして使う
  1. ファイル指定しないといけない (そのディレクトリにあるファイル全てをuploadする時に ワイルドカードをいちいち指定しないといけない)
  • 指定対象がディレクトリならそのディレクトリ配下が対象と考えてそのディレクトリ配下のファイルを対象に処理していく
  • 引数がなければワイルドカード指定として処理する
  • dot fileはクレデンシャルなどが入っていることがおおいのでupload対象にはしない

shell関数でwrapした

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 )" ]

gitに登録していないファイルはuploadしない

.gitignoreに記載していてもgistingは無視してuploadしてしまいます。 Gemfile.lockなどuploadされてもちょっと困るので git log でgitに登録されているものだけを登録します。

と思ったのですが、もう面倒だったので git ls-files で取得したものをuploadするようにしました。

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 `git ls-files $_GIST_SYNC_TARGET_DIR | grep -v .gitignore`
do
if [ "$(git diff $_GIST_SYNC_TARGET_FILE )" ]
then
gist -u $_GIST_SYNC_URL -d $_GIST_SYNC_DESCRIPTION -f `basename $_GIST_SYNC_TARGET_FILE` $_GIST_SYNC_TARGET_FILE | tee $_GIST_SYNC_TARGET_DIR/.gist_url
git commit -m "update gist" $_GIST_SYNC_TARGET_FILE
else
echo "No updated:" $_GIST_SYNC_TARGET_FILE
fi
done
else # 登録
echo gist -d "$_GIST_SYNC_DESCRIPTION" $_GIST_SYNC_TARGET_DIR/*
git add $_GIST_SYNC_TARGET_DIR
git commit $_GIST_SYNC_TARGET_DIR -m "updated gist"
gist -d $_GIST_SYNC_DESCRIPTION `git ls-files $_GIST_SYNC_TARGET_DIR | grep -v .gitignore` | tee $_GIST_SYNC_TARGET_DIR/.gist_url
fi
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment