Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHPのファイルに差分があるかを(astを使って)調べる君
Search
hideki kinjyo
PRO
November 29, 2023
Programming
0
620
PHPのファイルに差分があるかを(astを使って)調べる君
第157回 PHP勉強会@東京での発表資料です。
https://daisuki.nichiyoubi.land/entry/2023/08/15/235930
をベースにしたLTをしてきました
hideki kinjyo
PRO
November 29, 2023
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
SPLから始める「データ構造」入門
o0h
PRO
6
1.2k
PHPUnit11の新しい仲間たち
o0h
PRO
3
180
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
29
9.3k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
110
phpunit/php-code-coverageって何をしてるんだ #phperkaigi
o0h
PRO
3
790
Composerを便利に使うために私がやっていること #phperkaigi
o0h
PRO
1
1.8k
OpCode目線で眺める PHPコードのカバレッジ
o0h
PRO
3
700
アプリケーションエンジニアこそ「監視」だよね!と私が考える訳 #phpkansai
o0h
PRO
21
9.6k
#phpcondo 新しくEMやってみる人にオススメしたい本を5分で25冊紹介する
o0h
PRO
25
8.3k
Other Decks in Programming
See All in Programming
大規模マルチテナントを解決するYugabyteDBという選択肢
nnaka2992
1
250
最近追加した型の紹介とその振り返り
aki19035vc
0
180
SDCon2024: Enabling DevOps and Team Topologies thru architecture: architecting for fast flow
cer
PRO
0
780
CSC307 Lecture 10
javiergs
PRO
0
310
APIのない大学ログインWebサービスをWKWebViewとJavaScriptでアプリ化した話
akidon0000
1
330
CSC307 Lecture 07
javiergs
PRO
0
220
Architectures with Lightweight Stores: New Rules and Options
manfredsteyer
PRO
0
100
SRE チーム立ち上げ前に考えたこと・取り組んだこと / Considerations and Preparations Before Establishing an SRE Team
mackey0225
3
320
ピグパーティにおけるMongoDB CommunityバージョンからAtlasへの移行事例
10969hotaka
0
130
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
生成AIをkintoneに連携してみた
hideg
0
230
Android開発者のための Kotlin Multiplatform入門
ntaro
0
190
Featured
See All Featured
Pencils Down: Stop Designing & Start Developing
hursman
118
11k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
129
32k
The Invisible Side of Design
smashingmag
294
50k
Producing Creativity
orderedlist
PRO
340
39k
We Have a Design System, Now What?
morganepeng
46
7k
5 minutes of I Can Smell Your CMS
philhawksworth
200
19k
What's new in Ruby 2.0
geeforr
338
31k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
23
1.9k
YesSQL, Process and Tooling at Scale
rocio
166
14k
Building Your Own Lightsaber
phodgson
101
5.9k
Automating Front-end Workflow
addyosmani
1362
200k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
Transcript
PHPのファイルに差分 が あるかを (astを使って)調 べ る君 ୈ157ճ PHPษڧձˏ౦ژ Hideki Kinjyo
GitHub: o0h / Twitter: @o0h_
自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ •
好きなFWはCakePHP • アイコンは 美味しい鮭親子丼の写真です
PHPは進化してますね
コーディング規約だって、変わっていく
None
大体どの会社にも1人はいる人 「うちのPJにも コーディング規約入れましょうよ」
vendor/bin/phpcs、そして─ とっても落ち着く景色(やったね!)
でも、 今やECSやPHP-CS-Fixerがありますもんで。 「過去のコードをきれいにする」も、 省エネで出来ちゃう。
???「修正してみました!レビューお願いします!」
このPRを「アリ」にする話
機械に「OK」って言われたら、 我々は従うことが出来る
元ネタ モノタロウさんのブログで見かけて、ずっと気になっていました https://tech-blog.monotaro.com/entry/2018/09/26/142451
ASTからPHPの世界を見上げる • いわば「品詞」「文法」の変更だけを見ることが出来る • この世界では、インデントや()の省略は「差分がない」 • AST的な変化がない = プログラムも変わってないよね?
スクリプトを 「木」構造に
見た目は違うコードも 同じ構造として 解釈される
dumpを取ってみている例 (とっても簡単!)
これを使って、PRを送る時に 「AST的な差分」を示せたら良いのでは?
先達も既にいる https://zenn.dev/snowcait/articles/30f44683fed179
作った https://daisuki.nichiyoubi.land/entry/2023/08/15/235930
こんなものを作りました • nikic/php-parser を使って • Gitのコミットハッシュを2つ指定して、差分を検出 • コミットとかブランチとかタグとか • PHPファイルのdiffがあったら、ASTのhashを取って比較
• 変更のある無しを出力
仕組み • `git diff` で差分の発生したファイルを取得 • `git show` で、比較元・比較先のコミットでのファイル 全体(ソースコード)を取得
• 取得したソースからASTを生成 <= モノタロウさんの方法ママ • 生成したASTをmd5でハッシュ化 <= モノタロウさんの方法ママ • ハッシュを比較
こんなdiffに・・
こんな結果を出せる 「ast-changed」だけ見ればOK
こういうのは差分扱い
こういうのを無視できる • 予約語の大文字/小文字 • スペースやタブ、改行 • 「ヒアドキュメント中の行頭スペース」とかを認識でき るのが、git ignore whitespaceとの違い(嬉)
• 省略可能な括弧の有無
今後やりたい • コードはOSSとしてGitHubに晒したい • GitHub Actionsで、PRに対して動かせるようにしたい
まとめ • 安心してクソデカPRを投げられるぞ • 理性的で説明可能な根拠を持って、 レビュアーフレンドリーなPRを投げましょう! • いろんな便利なものを使って(テストとか静的解析とか)、
ウキウキPHPライフを!
おしまい! お付き合いいただき ありがとうございました!!