やってみる

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

GitHubアップローダにサイトのContributions自動バックアップ機能を追加した。

思わぬ問題が。

成果物

GitHubGitHub.Uploader.AddFunction.Contributions.201705141424

前回まで

Git活動を記録して可視化したい。GitLabなら楽できそうと思ったがPCが低スペックのため断念。

どう実装するか

どうやって実装するかを考えた。スキル不足ゆえに妥協した。

いつ実行するか

Contributions自動バックアップをいつ実行するか。

  1. リモートリポジトリ作成時、コミット時
  2. アップローダ起動時

正しいタイミングはA。しかし今の実装では以下の点がある。

  • コードが汚くなる
    • せっかく分離した機能の中に本来とは異なる処理が入り込むことになる

本来はリポジトリ操作するごとに操作内容とその日時を記録したい。しかしそれは大掛かりになってしまう。詳細は実装方法参照。

ただ、Bの場合、今回アップロードした最新データについてバックアップされない事になってしまう。

どのユーザに対して実行するか

  • 全ユーザに対して(DBで管理している内の)
  • 起動引数で指定したユーザに対して

全ユーザに対して実行するのは無駄かもしれない。毎回実行するのは「起動引数で指定したユーザ」だけで十分か。

しかしデータ消失の恐れがある。サーバ上にあるContributionsは最近1年間だけしか保持されない。もし1年間以上そのユーザ名でアップローダを起動しなければContributionsはバックアップされずデータ消失してしまう。たとえば複数アカウントをプロジェクトごとに使い分けており、1.5年間別のプロジェクトをしていて再開したとき、0.5年間分のデータが消失してしまっている。

ユーザ契機でなく日時契機にするのが最善か。

  • 起動日時とDBの日付をみてDBの最新日が当日より古ければ更新する

アップローダとは別にする?

  • cronで自動化して1日1回実行する

問題

実装方法

実装を根本的に変更せねばならないと思う。

リモートリポジトリ作成時、コミット時など任意のメソッド実行時にContributionsを保存するコードをスマートに追加するためには。

これじゃだめ

現状では私のスキル不足でスマートに書けない。リポジトリ生成やコミットなど各コマンドのメソッド内に直接Contributions取得呼出を書く方法でしか実装できない。すると以下の問題が起こる。

  • コードが汚くなる。せっかく各コマンドを機能分離して書いたのにごった煮になってしまう
  • 変更時の修正コストも増えそう

こうしたい

  1. アップローダの全コマンドのうち、Contributionsとして記録するコマンドとそうでないものを分離する
  2. 「Contributionsを記録するコマンド」として継承したメソッドは、処理の最後にDBへ記録する処理が走るようにする

どうすれば?

おそらくPythonのデコレータやら何かしらのデザインパターンを駆使すればスマートに実装できる。ただ、今の私にその技術がない。どう書けばいいのか具体的にわからない。学習サイトを作ってPythonの学習をするのが先か。

妥協案

これが最も現実的。

  • 今の私にも書けそう
    • 不格好なコードを書いて崩壊させずに済む
      • 後戻り作業せずに済む
  • 更新し忘れしてContributionsデータ消失せずに済む

このせいで残念なことが1点ある。

  • 起動したときにアップロードしたContributionsデータは記録されない。次回起動した時に取得する

所感

妥協案がマシな選択と思いたい。