/
c3mc-ci-gitreport-sync
executable file
·93 lines (70 loc) · 2.91 KB
/
c3mc-ci-gitreport-sync
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/data/Software/mydan/perl/bin/perl -I/data/Software/mydan/CI/lib
use strict;
use warnings;
$| ++;
use Digest::MD5;
use MYDan::Util::OptConf;
use Temp;
=head1 SYNOPSIS
$0 flowid flowid2 .. flowidn
$0 flowid .. [--path /path/foo ]
=cut
my $option = MYDan::Util::OptConf->load();
my %o = $option->set( path => '/data/open-c3-data/gitreport.cache' )->get( qw( path=s ) )->dump();
sub sync
{
my $id = shift @_;
die "error id: $id" unless $id && $id =~ /^\d+$/;
my $x = `c3mc-base-db-get -t openc3_ci_project groupid ticketid addr -f 'id=$id'`;
chomp $x;
my ( $treeid, $ticketid, $addr ) = split /;/, $x;
my $errstr = "flowid: $id";
die "$errstr treeid error: $treeid" unless defined $treeid && $treeid =~ /^\d+$/;
die "$errstr gitaddr error: $addr " unless defined $addr && $addr =~ /^[a-z][a-zA-Z0-9\.\-_:\/\@]+$/ && $addr =~ /git/;
my $uuid = Digest::MD5->new()->add( YAML::XS::Dump +{ treeid => $treeid, addr => $addr } )->hexdigest();
my $ticket;
if( $ticketid && $ticketid =~ /^\d+$/ )
{
$ticket = `c3mc-base-db-get -t openc3_ci_ticket ticket -f "type='SSHKey' and id='$ticketid'"`;
chomp $ticket;
}
my $git = $ticket ? "/data/Software/mydan/CI/bin/git -i " . Temp->new( chmod => 0600 )->dump( $ticket ) : 'git';
my $datapath = "$o{path}/$treeid";
system "mkdir -p $datapath" unless -d $datapath;
print YAML::XS::Dump +{ treeid => $treeid, id => $id, addr => $addr, uuid => $uuid };
my $error;
my $dir = "$datapath/$uuid";
for( 1..2 )
{
eval{
unless( -d "$dir" )
{
die "download fail: $!" if system "cd '$datapath' && $git clone $addr $uuid 2>&1";
}
my @rbranch = `cd $dir && $git branch -r|grep -v '\\->'`;
chomp @rbranch;
map{ $_ =~ s/^\s*origin\/// }@rbranch;
@rbranch = grep{ /^[a-zA-z0-9][a-zA-Z0-9\.\-\@_]*$/ }@rbranch;
my @lbranch = `cd $dir && git branch`;
chomp @lbranch;
map{ $_ =~ s/^\**\s*// }@lbranch;
my %lbranch = map{ $_ => 1 } grep{ /^[a-zA-z0-9][a-zA-Z0-9\.\-\@_]*$/ } @lbranch;
for my $branch ( @rbranch )
{
next if $lbranch{$branch};
die "track branch fail" if system "cd $dir && $git branch --track '$branch' 'origin/$branch'";
}
my @branch = `cd $dir && git branch`;
chomp @branch;
map{ $_ =~ s/^\**\s*// }@branch;
map{ die "pull fail:$!" if system "cd $dir && git checkout '$_' 2>&1 && $git fetch --all 2>&1 && $git pull --all 2>&1"; }
grep{ /^[a-zA-z0-9][a-zA-Z0-9\.\-\@_]*$/ }
@branch;
};
$error = $@;
last unless $error;
system "rm -rf '$dir'";
}
warn "gitreport-sync error: $errstr $error" if $error;
}
if( @ARGV ) { map{ sync( $_ ) }@ARGV; } else { while(<STDIN>){ chomp; sync($_); } }