厄介なオープンソースリポジトリを整理整頓するためのコマンドライン活用術
効果的なコラボレーション、とりわけオープンソースソフトウェア開発においては、何よりもまず「整理」から始まります。何一つ見落とさないために、「1つのIssueに1つのプルリクエスト」という原則は、実践しやすい優れた経験則です。
「ドキュメント内の壊れたリンクをすべて修正する」のような範囲の広いIssueを1つ立てるよりも、小さくて管理しやすい複数のIssueに分割した方が、オープンソースプロジェクトにはより多くのコントリビューターが集まりやすくなります。
先ほどの例で言えば、壊れたリンクをセクション単位やページ単位で区切ることができます。そうすることで、大規模で退屈な作業を1人に押し付けるのではなく、多くのコントリビューターが合間の時間を使って気軽に参加できるようになります。
さらに、スコープを絞ったIssueは、プロジェクトメンテナーがどこまで作業が完了していて、どこが未着手なのかを把握するのにも役立ちます。その結果、作業の一部が見落とされたり、完了したと思い込んだりして、後になってバグやセキュリティ脆弱性につながるリスクを減らせます。
ここまでは順調です。しかし、すでに巨大なスコープのIssueをいくつも立ててしまい、一部のPRは提出・マージ済みで、作業がどこから始まりどこで止まっているのか分からなくなっていたらどうでしょうか?
プロジェクトの状態を取り戻すには、多少の整理が必要です。幸い、散らかったリポジトリをスキャン、ソート、分析するのに役立つコマンドラインツールは数多く存在します。ここでは、私が実際に使っているものをいくつか紹介します。
Vimで対話的に検索・置換する
Vimでファイルを開き、次のコマンドで対話的に検索・置換ができます。
:%s/\<word\>/newword/gc
% は現在のファイルの全行を対象にすることを示し、s は置換(substitute)、\<word\> は単語全体へのマッチ、g(global)はすべての出現箇所を意味します。末尾の c を付けると、変更を確定する前に1件ずつ確認できます。c を外せば自動的かつ高速に実行できますが、パターンの指定ミスがあると事態を複雑にする恐れがあるため注意が必要です。
NodeモジュールでMarkdownファイルのデッドリンクを検出する
markdown-link-check ノードモジュールには、強力なCLIが付属しています。
私は使用頻度が高いため、Bashのエイリアス関数に登録しています。同様に設定するには、.bashrc に以下を追加します。
# フォルダ内のMarkdownリンクを再帰的にチェック
function mlc () {
find $1 -name \*.md -exec markdown-link-check -p {} \;
}
あとは mlc <ファイル名> で実行するだけです。
findでGitリポジトリの有無別にサブディレクトリを一覧表示する
Gitリポジトリである(つまり .git を含む)すべてのサブディレクトリを表示するには、次を実行します。
find . -maxdepth 1 -type d -exec test -e '{}/.git' ';' -printf "is git repo: %p\n"
逆に、Gitリポジトリではないサブディレクトリを表示するには、! で条件を否定します。
find . -maxdepth 1 -type d -exec test '!' -e '{}/.git' ';' -printf "not git repo: %p\n"
xargsでリストから複数のGitリポジトリをまとめてクローンする
私は当初、BashスクリプトでノートPCの環境を自動再構築するためにこの方法を使っていましたが、クラウドインスタンスやDockerfileを扱う際にも非常に便利です。
各行にリポジトリのSSHリンクが記載された repos.txt を用意し(SSH鍵の設定は済ませておきます)、次を実行します。
xargs -n1 git clone < repos.txt
多数のリポジトリをまとめてpull / pushしたい場合は、Bashのワンライナーでリポジトリを管理する方法について過去に記事を書いているので、そちらも参考にしてください。
jotでIssue番号を一括生成する
私はOWASP Web Security Testing Guideリポジトリの共著者兼メンテナーですが、最近、1つの大きなIssue(そう、例の「ドキュメント内の壊れたリンクをすべて修正する」です。お分かりでしたか?)を、より小さく管理しやすい複数のIssueへ分割しました。なんと37個にもなりました。
元のIssueから派生したすべてのIssue番号を列挙したかったのですが、37個分のIssue番号(#275〜#312)を手打ちするのは非常に面倒で時間がかかりそうです。そこでプログラマーらしく、手打ちにかかるのと同じ時間をかけて、自動化する仕組みを作ることにしました。
jot ユーティリティ(apt install athena-jot)は、連番を出力したいときに大いに役立つ小さなツールです。必要な個数と、開始値・終了値を指定するだけです。
# jot [ reps [ begin [ end ] ] ]
jot 37 275 312
これで275から312までの各数字が1行ずつ出力されます。GitHubをはじめ多くのプラットフォームが自動的に認識してリンク化するIssue番号表記に変換するには、出力を awk にパイプします。
jot 37 275 312 | awk '{printf "#"$0", "}'
#275, #276, #277, #278, #279, #280, #281, #282, #283, #284, #285, #286, #287, #288, #289, #290, #291, #292, #293, #295, #296, #297, #298, #299, #300, #301, #302, #303, #304, #305, #306, #307, #308, #309, #310, #311, #312
なお jot は、ランダムデータや反復データの生成にも利用できます。主に開発やテストの用途で便利です。
CLIで実現するオープンソースの整理整頓
よく整理されたオープンソースリポジトリこそが、きちんとメンテナンスされたオープンソースプロジェクトの証です。この記事をブックマークして、新しく手に入れたCLIスーパーパワーを善のために活用しましょう!?
-
Windows 10コマンドプロンプト活用術14選|PCをより細かく制御する方法
Windows 10には洗練されたグラフィカルユーザーインターフェース(GUI)が搭載されており、日常的な作業であれば、マウス操作だけでも十分にこなせます。 しかし、「もっとPCを自由に操りたい」と感じたら、ぜひコマンドラインの世界に足を踏み入れてみてください。 コマンドプロンプトを使えば、GUIではアクセスできない機能を利用でき、Windows 10のOSと直接対話できるようになります。 この記事では、PC操作が一気に上級者になった気分を味わえて、友人にもきっと驚かれる、コマンドプロンプトの便利な技を14個紹介します。 なお、コマンドプロンプトで実行したコマンドによっては、PCに恒久的な影響
-
Androidで遊べるおすすめオープンソースゲーム ベスト5
子供の頃、誰もが一度は自分だけの帝国や王国を築くことに憧れたことがあるのではないでしょうか。そんな幼い頃の夢を叶えてくれたのが、数々のクラシックゲームと、その後登場したスピンオフ作品でした。ファンタジーとストラテジー(戦略)が融合したビデオゲームは、まさに子供の頃の空想をデジタルの世界へと引き込んでくれました。本記事では、Androidで遊べるオープンソースゲームの中から、特におすすめの5本をご紹介します。オープンソースとはソースコードが公開されているゲームのことで、開発者なら誰でも自由に新機能を追加したり、ゼロからまったく新しいゲーム体験を作り出すことも可能です。Android向けオープンソ