この記事は、ZOZOテクノロジーズ #4 AdventCalendar2019の記事です。
昨日は@satto_sannさんの「FastAPIの負荷実験環境を作ってみる」でした。
さて、あるコードが、どういった背景や意図で変更されたのかを知りたいことは、よくあることだと思います。そういった場合にgit-blame-pr.plを使うと、そのコードがどのプルリクエストで変更されたかを簡単に知ることができます。
これはCLIでそのまま使うだけでも十分便利です。
ただ使用頻度が高いこともあり、ユースケースに沿ったGUIが欲しくなりました。
そこで、git-blame-pr.plが出力した結果の行をクリックするだけで、該当のWebページに遷移できるMacアプリを作ってみました。
出来上がったものは下記のリポジトリで公開しています。
https://github.com/maoyama/GitBlamePR
GitHubのリリースから最新のGitBlamePR.app.zipをダウンロード、解凍するだけで使えます。ぜひ試してみてください。
※macOS Catalinaが必要です。
実装内容の紹介
UIはAppKitではなくSwiftUIで実装しています。
以下のコードがUIにおいては全てです。SwiftUIを使っているので、Storyboardやxibファイルもありません。
struct GitBlamePRView: View {
var model: GitBlamePRViewModel
var textOnCommit: (String) -> Void
@State private(set) var fullPath: String = ""
var body: some View {
VStack(alignment: .leading, spacing: 0) {
TextField(
"Enter full path",
text: $fullPath,
onEditingChanged: {_ in },
onCommit: {
self.textOnCommit(self.fullPath)
}
).lineLimit(1)
.textFieldStyle(RoundedBorderTextFieldStyle())
.padding()
Divider()
ScrollView(.vertical, showsIndicators: true) {
VStack(alignment: .leading) {
if !model.error.isEmpty {
Text(model.error)
}
ForEach(model.lines, id: \.id) { line in
HStack(alignment: .top, spacing: 12) {
Text(line.message)
.font(Font.system(.caption, design: .monospaced))
.foregroundColor(.accentColor)
.frame(width: 80, height: nil, alignment: .trailing)
.onTapGesture {
NSWorkspace.shared.open(line.url)
}
Text(line.code)
.font(Font.system(.caption, design: .monospaced))
.frame(width: nil, height: nil, alignment: .leading)
}
}
HStack {
Spacer()
EmptyView()
}
}.padding()
}.background(Color(NSColor.textBackgroundColor))
}
}
}
「Better apps. Less code.」とAppleが謳っている通り、とても少ないコードで実現できています。
またSwiftUIは、全てのAppleプラットフォームで使えます。そのため、僕のような普段はiOSアプリの開発をしているプログラマでも、macOSで動くアプリを作る敷居がとても低くなりました。
この記事は以上です。
明日は@alpha_gotoさんです。お楽しみに!