forked from bleis-tift/Git-Hooks
-
Notifications
You must be signed in to change notification settings - Fork 2
/
update
executable file
·54 lines (50 loc) · 2.32 KB
/
update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env perl
# 初Perlプログラム!
# pushされてきたコミット全てにチケットIDが含まれているかどうかを確認します。
# テスト書いてないので正しく動くかまだ未検証なので注意
use strict;
use warnings;
# 効率化のために$oldと処理の終わったハッシュ値をハッシュテーブルにでも入れておいて、
# $crntがハッシュテーブルにすでに含まれている場合、そこの処理を切り上げるとかする?
my $ref = $ARGV[0];
my $old = $ARGV[1];
my $new = $ARGV[2];
# push, pop, shift, unshiftのどの組み合わせが効率いいのか知らないけど、
# キュー的に使いたいのと、終了判定が面倒だったのでpushとshiftを選択
my @waiting = $new;
while (my $crnt = shift(@waiting)) {
# 複数parentを考慮してないので何か問題あるかも?
# あとで考える
if ($crnt eq $old) {
exit(0);
}
# @linesにはコミットオブジェクトの情報(メタ情報とコミットメッセージ)が入ってくる
# メタ情報はそれほど大きくはないし、コミットメッセージもたかが知れている
# なので配列に入れても問題にはならないという判断。というかそれ以外を知らない
my @lines = `git cat-file -p $crnt`;
my $index = 0;
foreach my $line (@lines) {
# メタ情報のparentで始まる行から、たどるべきハッシュ値を入れる
if ($line =~ /^parent ([0-9a-f]{40})$/) {
push @waiting, $1;
}
# コミットオブジェクトはメタ情報とコミットメッセージの間を空行で分けているので、
# 空行が来たらこれ以上処理の必要はないので脱出
if ($line =~ /^$/) {
last;
}
$index++;
}
# 空行の次の行にコミットメッセージの先頭行があるので、
# その行にチケットIDが含まれているかどうかを確認する
unless ($lines[$index + 1] =~ /refs \d+/) {
print "\n";
print "+----------------------------------------+\n";
print "| please input ticket id to all commits. |\n";
print "+----------------------------------------+\n";
print "\n";
print " rejected ref: ", $ref, "\n";
print "\n";
exit(1);
}
}