1
0
mirror of https://github.com/tateisu/SubwayTooter synced 2025-02-03 20:27:40 +01:00

trunkからmainにブランチを変更したのでチェックスクリプトも変更。mainブランチへのコミットを禁止する

This commit is contained in:
tateisu 2021-07-03 23:26:12 +09:00
parent c01cfdf954
commit 28318d650e

View File

@ -1,160 +1,165 @@
#!/usr/bin/perl -- #!/usr/bin/perl --
use XML::Parser; use XML::Parser;
use strict; use strict;
use warnings; use warnings;
use File::Find; use File::Find;
use XML::Simple; use XML::Simple;
use Data::Dump qw(dump); use Data::Dump qw(dump);
use utf8; use utf8;
binmode $_ for \*STDOUT,\*STDERR; binmode $_ for \*STDOUT,\*STDERR;
my $preCommit = grep{ $_ eq '--pre-commit'} @ARGV;
sub cmd($){
print "+ ",$_[0],"\n"; sub cmd($){
my $rv=system $_[0]; print "+ ",$_[0],"\n";
if ($? == -1) { my $rv=system $_[0];
die "failed to execute: $!\n"; if ($? == -1) {
}elsif ($? & 127) { die "failed to execute: $!\n";
die "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without'; }elsif ($? & 127) {
}else { die "child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without';
my $rv = $? >> 8; }else {
$rv and die "child exited with value $rv\n"; my $rv = $? >> 8;
} $rv and die "child exited with value $rv\n";
} }
}
# ワーキングツリーに変更がないことを確認
open(my $fh,"-|","git status --porcelain --branch") # ワーキングツリーに変更がないことを確認
or die "can't check git status. $!"; open(my $fh,"-|","git status --porcelain --branch")
or die "can't check git status. $!";
my @untrackedFiles;
while(<$fh>){ my @untrackedFiles;
s/[\x0d\x0a]+//; while(<$fh>){
if(/^\?\?\s*(\S+)/){ s/[\x0d\x0a]+//;
my $path =$1; if(/^\?\?\s*(\S+)/){
next if $path =~ /\.idea|_Emoji/; my $path =$1;
push @untrackedFiles,$path next if $path =~ /\.idea|_Emoji/;
}elsif( /^##\s*(\S+?)(?:\.\.|$)/ ){ push @untrackedFiles,$path
my $branch=$1; }elsif( /^##\s*(\S+?)(?:\.\.|$)/ ){
print "# branch=$branch\n"; my $branch=$1;
$branch eq 'trunk' print "# branch=$branch\n";
or warn "!!!! current branch is not trunk !!!!\n"; if($preCommit){
# }else{ # mainブランチに直接コミットすることはなくなった
# warn "working tree is not clean.\n"; $branch eq 'main' and warn "!!!! current branch is main. Direct commits and pushes are prohibited. !!!!\n";
# cmd "git status"; }
# exit 1; # }else{
} # warn "working tree is not clean.\n";
} # cmd "git status";
# exit 1;
close($fh) }
or die "can't check git status. $!"; }
@untrackedFiles and die "forgot git add?\n",map{ "- $_\n"} @untrackedFiles; close($fh)
or die "can't check git status. $!";
@untrackedFiles and die "forgot git add?\n",map{ "- $_\n"} @untrackedFiles;
my $xml = XML::Simple->new;
my $default_name = "_default";
my $xml = XML::Simple->new;
my @files;
my $default_name = "_default";
find(sub{
return if not -f $_; my @files;
($_ eq "strings.xml") and push @files,$File::Find::name;
},"app/src/main/res/"); find(sub{
return if not -f $_;
@files or die "missing string files.\n"; ($_ eq "strings.xml") and push @files,$File::Find::name;
},"app/src/main/res/");
my %langs;
for my $file(@files){ @files or die "missing string files.\n";
my $lang;
if( $file =~ m|values-([^/]+)| ){ my %langs;
$lang = $1; for my $file(@files){
}else{ my $lang;
$lang=$default_name; if( $file =~ m|values-([^/]+)| ){
} $lang = $1;
my $data = $xml->XMLin($file); }else{
if( not $data->{string} or ($data->{string}{content} and not ref $data->{string}{content} )){ $lang=$default_name;
warn "?? please make at least 2 string entries in $file\n"; }
next;
} my $data = $xml->XMLin($file);
if( not $data->{string} or ($data->{string}{content} and not ref $data->{string}{content} )){
my %names; warn "?? please make at least 2 string entries in $file\n";
while(my($name,$o)=each %{$data->{string}}){ next;
if(not $o->{content}){ }
warn "$lang : $name : missing content in ",dump($o),"\n";
}else{ my %names;
$names{$name}= $o->{content}; while(my($name,$o)=each %{$data->{string}}){
} if(not $o->{content}){
} warn "$lang : $name : missing content in ",dump($o),"\n";
$langs{ $lang } = \%names; }else{
} $names{$name}= $o->{content};
}
my $hasError = 0; }
$langs{ $lang } = \%names;
my $master = $langs{ $default_name }; }
$master or die "missing master languages.\n";
my %params; my $hasError = 0;
while(my($name,$value)=each %$master){
my @params = $value =~ /(%\d+\$[\d\.]*[sdxf])/g; my $master = $langs{ $default_name };
$params{$name} = join ',', sort @params; $master or die "missing master languages.\n";
} my %params;
while(my($name,$value)=each %$master){
my %missing; my @params = $value =~ /(%\d+\$[\d\.]*[sdxf])/g;
my %allNames; $params{$name} = join ',', sort @params;
for my $lang ( sort keys %langs ){ }
my $names = $langs{$lang};
while(my($name,$value)=each %$names){ my %missing;
my %allNames;
$allNames{$name}=1; for my $lang ( sort keys %langs ){
if(not $master->{$name} ){ my $names = $langs{$lang};
$missing{$name} =1; while(my($name,$value)=each %$names){
}
my @params = $value =~ /(%\d+\$[\d\.]*[sdxf])/g; $allNames{$name}=1;
my $params = join ',', sort @params; if(not $master->{$name} ){
my $master_params = $params{$name} // ''; $missing{$name} =1;
if( $params ne $master_params){ }
$hasError =1;
print "!! ($lang)$name : parameter mismatch. master=$master_params, found=$params\n"; my @params = $value =~ /(%\d+\$[\d\.]*[sdxf])/g;
} my $params = join ',', sort @params;
my $master_params = $params{$name} // '';
# 残りの部分に%が登場したらエラー if( $params ne $master_params){
my $sv = $value; $hasError =1;
$sv =~ s/(%\d+\$[\d\.]*[sdxf])//g; print "!! ($lang)$name : parameter mismatch. master=$master_params, found=$params\n";
# Unit:%. を除外したい }
$sv =~ s/%[\s.。]//g;
if( $sv =~ /%/ ){ # 残りの部分に%が登場したらエラー
$hasError =1; my $sv = $value;
print "!! ($lang)$name : broken param: $sv // $value\n"; $sv =~ s/(%\d+\$[\d\.]*[sdxf])//g;
} # Unit:%. を除外したい
$sv =~ s/%[\s.。]//g;
# エスケープされていないシングルクォートがあればエラー if( $sv =~ /%/ ){
if( $value =~ m/(?<!\\)['"]/ ){ $hasError =1;
print "!! ($lang)$name : containg single or double quote without escape.\n"; print "!! ($lang)$name : broken param: $sv // $value\n";
} }
}
my $nameCount = 0+ keys %$names; # エスケープされていないシングルクォートがあればエラー
print "($lang)string resource count=$nameCount\n"; if( $value =~ m/(?<!\\)['"]/ ){
} print "!! ($lang)$name : containg single or double quote without escape.\n";
}
my @missing = sort keys %missing; }
@missing and die "missing string resources in master language: ",join(', ',@missing),"\n"; my $nameCount = 0+ keys %$names;
print "($lang)string resource count=$nameCount\n";
my $nameCount = 0+ keys %allNames; }
print "(total)string resource count=$nameCount\n";
my @missing = sort keys %missing;
$hasError and die "please fix error(s).\n"; @missing and die "missing string resources in master language: ",join(', ',@missing),"\n";
# Weblateの未マージのブランチがあるか調べる my $nameCount = 0+ keys %allNames;
system qq(git fetch weblate -q); print "(total)string resource count=$nameCount\n";
my @list = `git branch -r --no-merged`;
for(@list){ $hasError and die "please fix error(s).\n";
s/[\x0d\x0a]+//;
print "# Unmerged branch: $_\n"; # Weblateの未マージのブランチがあるか調べる
} system qq(git fetch weblate -q);
my @list = `git branch -r --no-merged`;
exit 0; for(@list){
s/[\x0d\x0a]+//;
print "# Unmerged branch: $_\n";
}
exit 0;