やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

GitHubアップローダにライセンス更新機能を追加した

前回できなかったライセンス更新ができるようになった。

成果物

GitHubGitHub.Upload.ByPython.License.Insert.201703161736

開発環境

前回まで

http://ytyaru.hatenablog.com/entry/2017/08/07/000000
http://ytyaru.hatenablog.com/entry/2017/09/01/000000

今回

  • LICENSEを更新できない
    • 初回コミット時にLICENSEファイルを入れなかったら、DB上ではずっとライセンス無しの扱いになる

前回の問題を解決した。git add時にライセンスファイルがあるとき、ライセンス情報を取得しなおして更新する。

git addファイル一覧を取得する

git add -n .の結果をファイル一覧として配列型で受け取りたい。

Pythonでコマンド実行し、標準出力をstrとして受け取る。

subprocess.Popen().communicate()を使う。

http://qiita.com/mokemokechicken/items/a84b0aa96b94d1931f08

p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stdout=subprocess.PIPE)
stdout_data, stderr_data = p.communicate()

改行

# 改行コードを'\n'に統一する
stdout_data = stdout_data.replace('\r\n', '\n')
stdout_data = stdout_data.replace('\r', '\n')
# 最終文字の'\n'を削除する
stdout_data = stdout_data[:-1]

OSごとに異なる改行コードを\nに統一して扱う。

配列にする

files = []
for line in stdout_data.split('\n'):
    if 0 < len(line):
        files.append("./" + line.replace("add '", "")[:-1])

\nで分割する。

また、パスにするため以下のように文字列操作する。

  • git addコマンド出力はadd 'FilePath'の書式で出力されるので、余分な文字を削除する
  • ルートディレクトリの相対パスとするため"./“を付与する

更新ルート

リポジトリのライセンスを挿入&更新するルートは3通りある。

  • 該当リポジトリのライセンスレコード
    • 存在しない:
    • 存在する:
      • git add一覧にライセンスファイル
        • 含まれている:
        • 含まれていない: <なにもしない>

補足

  • リポジトリにライセンスがないときはDBにNULLをセットする。
  • ライセンスのマスターDBに該当ライセンスが存在しない場合、APIで問い合わせてマスターDBに挿入する

addファイルが1つもないとき

add,commit,pushするファイルがありません。

上記のメッセージを表示し、何もしない。

これまではadd,commit,pushコマンドは結果的に何もしなかった。しかし、プログラミング言語とサイズのAPI問い合わせが実行されてしまっていた。無駄なので何もしないよう変更した。

気づいたこと

  • git renameしないとリネームしたらgitで管理できなくなる(別ファイル扱いになる)
  • LICENSELICENSE.txtではGitHubサイト上での表示が異なる(LICENSEのほうがリッチ)

所感

思いの外、大変だった。