Skip to main content
Seiichi Yonezawa V5

Gitea Archiver

·1 min

gitea-archiver

あるチュートリアルを試したり、なんらかのプロトタイプで作成するなど日々さまざまなGitリポジトリが作られています。私はそういったリポジトリのコードを再利用するためプライベートなGiteaにコードをプッシュしていました。

ただしプロジェクト名が重複してしまうこともしばしばあり、その場限りでつけたリポジトリ名が散らかってしまい整合性もありません。例えばある日はpurplerain-2という名前でプッシュしているかもしれないし、またある日はpurplerain-210212かもしれないし、purplerain-0212かもしれません。

そんなリポジトリがGitea上に100以上はあったのでGiteaのAPIを利用してリネームと、archiverというアカウントを作成し必要になったらそのアカウントを経由してコードを探せばよいと思いました。

コードを書いてみて気づいたこと #

普段は用途すら決まっていないのにWebアプリケーションで作り始めるのですが、今回は書き捨て用途のスクリプトのつもりでJavaScriptで書き始めているうちにGiteaのレスポンスを型として扱いたくて途中からTypeScriptに変換しました。

今回の収穫としてはESMで書かれたNPMパッケージはTypeScriptでそのまま使えないことと、InterfaceでHTTPレスポンスを書くときはすべてを書かなくてもよいこと、そしてなにより関数にJSDocを書くように心がけたほうがよいと思えたことです。

ESMのパッケージについて #

この問題は今に始まったわけではないのですが、JavaScriptで書かれたプログラムはWebブラウザ向けか、あるいはNode.js向けか、あるいはその両方か。そして同じJavaScriptでもES5やらES2017など複数存在していてそういうバージョンを意識してプログラムを書くのは面倒なのでWebpackのようにTypeScriptならまるごと吸収してくれるのかなと思いきやそういうわけでもないというわけ。

これは単純に調査不足に過ぎないのですが、今回の目的はTS/JSの造詣を深めるのではなくGiteaのリポジトリを整理したかったので別の機会にしようと思いました。

Interfaceについて #

一時期Javaを勉強したことがあったのですが、JavaのIntefaceとTypeScriptのInterfaceの違いはそこまでわかっていません。ただ当時Interfaceという概念はUSBのように共通の規格で異なる機械をつなぎ合わせることができるものだと理解しました。

InterfaceでサーバーのHTTPレスポンスをすべてなぞるとエディタの補完機能にも表示されるし、なんだかやってる感が出ていいなと思ってだいたい頑張ろうとするんですが、Giteaのレスポンスってそんなに単純なものでもないのでTypeScriptを表現する練習にはなるのかもしれませんがあとで型ファイルを見返そうとは思いません。

namespace Gitea {
  export interface User {
    login: string
  }

  export interface Repo {
    cloneUrl: string
    name: string
    owner: User
  }

  export interface CommitUser {
    name: string
    email: string
    date: string
  }

  export interface Commit {
    sha: string
    commit: {
      author: CommitUser
      committer: CommitUser
    }
  }
}

GiteaのレスポンスはSwaggerでドキュメント化されているので、その情報をもとに作成したファイルが100行近くありました。でも結局今回の関心はリポジトリをリネームするのに必要な日時とかくらいでしかなかったので、最終的には30行未満に収まりました。こうしてブログに貼り付けても自然な量です。

つまりIntefaceはTypeScriptのコンパイラを動かすのに必要最低限だけで十分だと思うわけです。

JSDocを書くように意識する #

書き捨てのつもりから育ったプログラムで、いくつかの手続き的な関数を書いていくうちにTypeScriptだからこそ引数と返り値の型を明示していくうちにコメントを書いていったほうがよいなとなりました。

もともとプログラムにコメントやドキュメントを全く書かず、書くとしてもTODOコメントくらいが関の山でした。でも別に誰に見せるわけでもないし、自分で書く英語もなんとなく自信がないから書かなくてもよいかと思っていました。

そこでJSDocのコメントを各関数に最低限の概要と引数と返り値だけ書くことで案外プログラミングを最初にガッと書き続けてきた頭を整理にすることに有効なのではと思いました。

特にドキュメントとして書き出す予定はありませんが、テスト駆動のように普段書いていないものはなかなかいざ必要なときに実践するのも大変なのでできれば趣味であってもドキュメントに残していくことを意識していこうかなと思いました。

動かしてみて気づいたこと #

一連の処理はJSONファイルに保存しながら確認していったのでプログラムが途中で失敗するケースは今回ありませんでした。

しかし、動作させてみてもともとタイムスタンプを含んでいたリポジトリのリネームが重複してしまうケースがありました(例: purplerain-20200212purplerain-20200212-20200212になる)。これはもともとリネームしたプロパティを参照する際にもとのネームを参照していたのが原因だったのですが、実際に動いているサーバーを相手にするわけなので今回は単純にあとからリネームするだけで解決しましたが、ファイルの操作が絡むプログラムは大変だなと思いました。

今回の作業に要した時間はおよそまる一日で、こうしたブログやREADMEのアウトプットは翌日というところです。当初やりたかった目的は達成しましたが、これを改めて公開したところでという気持ちはあるものの、ひとつの成果物としてはありかなと思いました。