| Samuel Mendoza-Jonas | 52bd75b | 2018-02-28 10:59:02 +1100 | [diff] [blame] | 1 | #!/usr/bin/env perl | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 2 |  | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 3 | use strict; | 
 | 4 |  | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 5 | use Getopt::Long; | 
 | 6 | use DBI; | 
 | 7 |  | 
 | 8 | # We use an in-memory SQLite database as SQL is good for doing queries | 
 | 9 | # of differences between data sets, and doing that in perl is annoying. | 
 | 10 | my $db = "dbi:SQLite:dbname=release-notes.sqlite"; | 
 | 11 | #my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:","",""); | 
 | 12 | my $dbh = DBI->connect($db,undef,undef, {AutoCommit => 1, RaiseError=>1}); | 
 | 13 |  | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 14 | my $repos = | 
 | 15 | { | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 16 |     'op-build' => { REPO => "https://github.com/open-power/op-build" }, | 
| Stewart Smith | b7cab66 | 2018-05-09 16:38:43 -0500 | [diff] [blame] | 17 |     'hcode'    => { REPO => "https://github.com/open-power/hcode" , | 
 | 18 |                     DIR => "openpower/package/hcode" }, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 19 |     'hostboot' => { REPO => "https://github.com/open-power/hostboot" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 20 |                     DIR => "openpower/package/hostboot" }, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 21 |     'sbe'      => { REPO => "https://github.com/open-power/sbe" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 22 |                     DIR => "openpower/package/sbe"}, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 23 |     'skiboot'  => { REPO => "https://github.com/open-power/skiboot" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 24 |                     DIR => "openpower/package/skiboot"}, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 25 |     'occ'      => { REPO => "https://github.com/open-power/occ" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 26 |                     DIR => "openpower/package/occ"}, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 27 |     'pnor'     => { REPO => "https://github.com/open-power/pnor" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 28 |                     DIR => "openpower/package/openpower-pnor"}, | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 29 |     'petitboot'     => { REPO => "https://github.com/open-power/petitboot" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 30 | 			 DIR => "openpower/package/petitboot"}, | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 31 | }; | 
 | 32 |  | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 33 | my $begin_release; | 
 | 34 | my $end_release; | 
 | 35 | my $begin_worktree; | 
 | 36 | my $end_worktree; | 
 | 37 | my $platform; | 
 | 38 |  | 
 | 39 | GetOptions("begin-release=s" => \$begin_release, | 
 | 40 | 	   "end-release=s" => \$end_release, | 
 | 41 | 	   "begin-worktree=s" => \$begin_worktree, | 
 | 42 | 	   "platform=s" => \$platform, | 
 | 43 | 	   "end-worktree=s" => \$end_worktree) | 
 | 44 |     or die("Error in command line arguments"); | 
 | 45 |  | 
 | 46 | die "Required argument missing" unless ($begin_release and $end_release and $begin_worktree and $end_worktree); | 
 | 47 |  | 
 | 48 | open(OUTPUT, "> RELEASE.md") || die "Failed to open RELEASE.md"; | 
 | 49 |  | 
 | 50 | print OUTPUT "# Release Notes for OpenPower Firmware $end_release\n"; | 
 | 51 |  | 
 | 52 | if (-e $begin_worktree) { | 
 | 53 |     system("cd $begin_worktree && git checkout $begin_release && git submodule update --reference ../buildroot && git submodule update") and die "Could not update $begin_worktree"; | 
 | 54 | } else { | 
 | 55 |     system("git worktree add $begin_worktree $begin_release && cd $begin_worktree&& git submodule update --reference ../buildroot && git submodule update && rm -rf dl && ln -s ../dl dl") and die "Couldn't init $begin_worktree"; | 
 | 56 | } | 
 | 57 |  | 
 | 58 | if (-e $end_worktree) { | 
 | 59 |     system("cd $end_worktree && git checkout $end_release  && git submodule update --reference ../buildroot && git submodule update") and die "Could not update $end_worktree"; | 
 | 60 | } else { | 
 | 61 |     system("git worktree add $end_worktree $end_release && cd $end_worktree && git submodule update --reference ../buildroot && git submodule update && rm -rf dl && ln -s ../dl dl") and die "Couldn't init $end_worktree"; | 
 | 62 | } | 
 | 63 |  | 
 | 64 | opendir (my $dh, "$begin_worktree/openpower/configs") | 
 | 65 |     or die "can't scan $begin_worktree defconfigs"; | 
 | 66 | my @begin_platforms = grep { /.*_defconfig/ } readdir($dh); | 
 | 67 | closedir $dh; | 
 | 68 |  | 
 | 69 | opendir (my $dh, "$end_worktree/openpower/configs") | 
 | 70 |     or die "can't scan $end_worktree defconfigs"; | 
 | 71 | my @end_platforms = grep { /.*_defconfig/ } readdir($dh); | 
 | 72 | closedir $dh; | 
 | 73 |  | 
 | 74 | s/_defconfig// foreach (@begin_platforms); | 
 | 75 | s/_defconfig// foreach (@end_platforms); | 
 | 76 |  | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 77 | my $witherspoon_insanity; | 
 | 78 |  | 
| Samuel Mendoza-Jonas | 93c5a54 | 2017-09-21 13:55:00 +1000 | [diff] [blame] | 79 | # If both witherspoon and witherspoon-sequoia exist we've switched back | 
 | 80 | # to a single witherspoon platform and the -sequoia platform is just to | 
 | 81 | # keep Jenkins happy - ignore it. | 
 | 82 | if ("witherspoon" ~~ @begin_platforms | 
 | 83 | 	&& "witherspoon-sequoia" ~~ @begin_platforms) { | 
 | 84 | 	my $index = 0; | 
 | 85 | 	$index++ until @begin_platforms[$index] eq "witherspoon-sequoia"; | 
 | 86 | 	splice(@begin_platforms, $index, 1); | 
 | 87 | } | 
 | 88 |  | 
 | 89 | if ("witherspoon" ~~ @end_platforms | 
 | 90 | 	&& "witherspoon-sequoia" ~~ @end_platforms) { | 
 | 91 | 	my $index = 0; | 
 | 92 | 	$index++ until @end_platforms[$index] eq "witherspoon-sequoia"; | 
 | 93 | 	splice(@end_platforms, $index, 1); | 
 | 94 | } | 
 | 95 |  | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 96 | if (($platform && $platform eq 'witherspoon') | 
 | 97 |     && -f "$end_worktree/openpower/configs/witherspoon-sequoia_defconfig") { | 
 | 98 |     @begin_platforms = ('witherspoon'); | 
 | 99 |     @end_platforms = ('witherspoon-sequoia', 'witherspoon-redbud'); | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 100 |     $witherspoon_insanity = 1; | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 101 | } elsif ($platform) { | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 102 |     @begin_platforms = ($platform); | 
 | 103 |     @end_platforms = ($platform); | 
 | 104 | } | 
 | 105 |  | 
 | 106 | $dbh->do("CREATE TABLE platforms (platform TEXT, version TEXT);") or die "$!"; | 
 | 107 | { | 
 | 108 |     my $q = "INSERT INTO platforms (platform,version) VALUES (?,?)"; | 
 | 109 |     my $sth = $dbh->prepare($q) or die "$!"; | 
 | 110 |     $sth->execute($_, $begin_release) foreach (@begin_platforms); | 
 | 111 |     $sth->execute($_, $end_release) foreach (@end_platforms); | 
 | 112 | } | 
 | 113 |  | 
 | 114 | { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 115 |     my $q = "SELECT platform as p FROM platforms WHERE version is ? AND platform NOT IN (SELECT platform FROM platforms WHERE version is ? and platform=p)"; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 116 |     my $sth = $dbh->prepare($q) or die $!; | 
 | 117 |     $sth->execute($begin_release, $end_release); | 
 | 118 |     my $r; | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 119 |     print OUTPUT "\n## Removed platforms\n\n- ".$r->{p}."\n" if $r = $sth->fetchrow_hashref; | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 120 |     print OUTPUT "- ".$r->{p}."\n" while ($r = $sth->fetchrow_hashref); | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 121 |  | 
 | 122 |     $sth->execute($end_release, $begin_release); | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 123 |     print OUTPUT "\n## New platforms\n\n- ".$r->{p}."\n" if $r = $sth->fetchrow_hashref; | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 124 |     print OUTPUT "- ".$r->{p}."\n" while($r = $sth->fetchrow_hashref); | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 125 | } | 
 | 126 |  | 
 | 127 | my @common_platforms; | 
 | 128 | { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 129 |     my $q = "SELECT platform as p FROM platforms WHERE version is ? AND EXISTS (select platform from platforms where version is ? and platform=p)"; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 130 |     my $sth = $dbh->prepare($q) or die $!; | 
 | 131 |     $sth->execute($begin_release, $end_release); | 
 | 132 |     my $r; | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 133 |     push @common_platforms, $r->{p} while ($r = $sth->fetchrow_hashref); | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 134 | } | 
 | 135 |  | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 136 | use Data::Dumper; | 
 | 137 |  | 
 | 138 | print "# COMMON PLATFORMS\n"; | 
 | 139 | print Dumper(\@common_platforms); | 
 | 140 |  | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 141 | foreach my $p (@common_platforms) { | 
 | 142 |     next if $p =~ /firenze/; | 
 | 143 |     next if $p =~ /^zz$/; | 
 | 144 |     next if $p =~ /mambo/; | 
| Samuel Mendoza-Jonas | 84f3d25 | 2017-07-12 13:26:55 +1000 | [diff] [blame] | 145 |     next if $p =~ /redbud/; | 
| Samuel Mendoza-Jonas | 264a6cd | 2017-08-04 11:42:41 +1000 | [diff] [blame] | 146 |     next if $p =~ /pseries/; | 
 | 147 |     next if $p =~ /witherspoon-redbud/; | 
 | 148 |     if ($p =~ /witherspoon-sequoia/) { | 
 | 149 | 	    $p = "witherspoon"; | 
 | 150 | 	    $witherspoon_insanity = 1; | 
 | 151 |     } | 
| Samuel Mendoza-Jonas | a6262a0 | 2017-08-17 14:46:02 +1000 | [diff] [blame] | 152 |     $repos->{"$p-xml"} = { REPO => "https://github.com/open-power/$p-xml" , | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 153 | 			   DIR => "openpower/package/$p-xml" }; | 
 | 154 | } | 
 | 155 |  | 
 | 156 | foreach my $p (@begin_platforms) { | 
 | 157 |     system("bash -c '(cd $begin_worktree && . op-build-env && op-build ".$p."_defconfig && op-build legal-info)'"); | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 158 |     # Work-around bug in op-build v1.17, fixed 2 commits later | 
 | 159 |     system('sed -e \'s/,""\([^",]\)/,"\1/; s/\([^,]\)"",/\1",/; s/machine-xml-"\(.*\)".tar/machine-xml-\1.tar/\' -i '. $begin_worktree .'/output/legal-info/manifest.csv'); | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 160 |     # Forgive me for this.... | 
| Stewart Smith | cd96a99 | 2017-07-14 15:40:19 +1000 | [diff] [blame] | 161 |     system("sqlite3 release-notes.sqlite \".mode csv\" \".import $begin_worktree/output/legal-info/manifest.csv i\""); | 
 | 162 |     $dbh->do("ALTER TABLE i RENAME to 'begin_".$p."_manifest'") or die $!; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 163 | } | 
 | 164 |  | 
 | 165 | foreach my $p (@end_platforms) { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 166 |     print "# END PLATFORMS LEGAL-INFO $p\n"; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 167 |     system("bash -c '(cd $end_worktree && . op-build-env && op-build ".$p."_defconfig && op-build legal-info)'"); | 
 | 168 |     # Forgive me for this.... | 
| Stewart Smith | cd96a99 | 2017-07-14 15:40:19 +1000 | [diff] [blame] | 169 |     print "# loading manifest\n"; | 
 | 170 |     system("sqlite3 release-notes.sqlite \".mode csv\" \".import $end_worktree/output/legal-info/manifest.csv i\""); | 
 | 171 |     $dbh->do("ALTER TABLE i RENAME to 'end_".$p."_manifest'") or die $!; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 172 | } | 
 | 173 |  | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 174 | if ($witherspoon_insanity) { | 
 | 175 |     $dbh->do("ALTER TABLE 'end_witherspoon-sequoia_manifest' RENAME to end_witherspoon_manifest"); | 
| Samuel Mendoza-Jonas | 264a6cd | 2017-08-04 11:42:41 +1000 | [diff] [blame] | 176 |     $dbh->do("ALTER TABLE 'begin_witherspoon-sequoia_manifest' RENAME to begin_witherspoon_manifest"); | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 177 |     @end_platforms = grep { $_ != 'witherspoon-sequoia' } @end_platforms; | 
| Samuel Mendoza-Jonas | 264a6cd | 2017-08-04 11:42:41 +1000 | [diff] [blame] | 178 |     @begin_platforms = grep { $_ != 'witherspoon-sequoia' } @begin_platforms; | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 179 |     push @end_platforms, 'witherspoon'; | 
| Samuel Mendoza-Jonas | 264a6cd | 2017-08-04 11:42:41 +1000 | [diff] [blame] | 180 |     push @begin_platforms, 'witherspoon'; | 
| Stewart Smith | 24f8255 | 2017-07-14 15:53:22 +1000 | [diff] [blame] | 181 |     push @common_platforms, 'witherspoon'; | 
 | 182 | } | 
 | 183 |  | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 184 | $dbh->do(<<'SQL') or die "$!"; | 
 | 185 | CREATE TABLE package_upgrades ( | 
 | 186 |   PACKAGE TEXT, | 
 | 187 |   OLDVERSION TEXT, | 
 | 188 |   NEWVERSION TEXT, | 
 | 189 |   PLATFORM TEXT | 
 | 190 | ) | 
 | 191 | SQL | 
 | 192 |  | 
 | 193 | foreach my $p (@common_platforms) { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 194 |     $dbh->do("INSERT INTO package_upgrades select b.package,b.version,e.version,'$p' from 'begin_".$p."_manifest' as b LEFT JOIN 'end_".$p."_manifest' AS e ON b.package=e.package WHERE b.version != e.version") or die $!; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 195 | } | 
 | 196 |  | 
 | 197 | $dbh->do(<<'SQL') or die "$!"; | 
 | 198 | CREATE TABLE new_package ( | 
 | 199 |   PACKAGE TEXT, | 
 | 200 |   VERSION TEXT, | 
 | 201 |   PLATFORM TEXT | 
 | 202 | ) | 
 | 203 | SQL | 
 | 204 |  | 
 | 205 | foreach my $p (@common_platforms) { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 206 |     $dbh->do("INSERT INTO new_package select b.package,b.version,'$p' from 'end_".$p."_manifest' as b WHERE NOT EXISTS(SELECT package FROM 'begin_".$p."_manifest' AS e WHERE b.package=e.package)") or die $!; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 207 | } | 
 | 208 |  | 
 | 209 | $dbh->do(<<'SQL') or die "$!"; | 
 | 210 | CREATE TABLE removed_package ( | 
 | 211 |   PACKAGE TEXT, | 
 | 212 |   VERSION TEXT, | 
 | 213 |   PLATFORM TEXT | 
 | 214 | ) | 
 | 215 | SQL | 
 | 216 |  | 
 | 217 | foreach my $p (@common_platforms) { | 
| Stewart Smith | 88c7e35 | 2017-07-14 15:12:36 +1000 | [diff] [blame] | 218 |     $dbh->do("INSERT INTO removed_package select b.package,b.version,'$p' from 'begin_".$p."_manifest' as b WHERE NOT EXISTS(SELECT package FROM 'end_".$p."_manifest' AS e WHERE b.package=e.package)") or die $!; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 219 | } | 
 | 220 |  | 
 | 221 | my $old_level = {}; | 
 | 222 | my $new_level = {}; | 
 | 223 |  | 
 | 224 | { | 
 | 225 |     my $q = <<'SQL'; | 
 | 226 | select package as pk ,oldversion as o ,newversion as n,  | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 227 | 	GROUP_CONCAT(platform,', ') as ps | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 228 | FROM package_upgrades  | 
 | 229 | 	GROUP BY package,oldversion,newversion | 
 | 230 | ORDER BY package,platform | 
 | 231 | SQL | 
 | 232 |     my $sth = $dbh->prepare($q) or die $!; | 
 | 233 |     $sth->execute(); | 
 | 234 |  | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 235 |     print OUTPUT "\n## Updated Packages\n\n"; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 236 |     print OUTPUT "Package | Old Version | New Version | Platforms\n"; | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 237 |     my $t; | 
 | 238 |     my ($plen,$olen,$nlen,$platlen) = (3,3,3,3); | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 239 |     while (my $r = $sth->fetchrow_hashref) { | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 240 | 	$t.= join(' | ',($r->{pk}, $r->{o}, $r->{n}, $r->{ps}))."\n" ; | 
 | 241 | 	$plen = length($r->{pk}) if $plen < length($r->{pk}); | 
 | 242 | 	$olen = length($r->{o}) if $olen < length($r->{o}); | 
 | 243 | 	$nlen = length($r->{n}) if $nlen < length($r->{n}); | 
 | 244 | 	$platlen = length($r->{ps}) if $platlen < length($r->{ps}); | 
 | 245 |  | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 246 | 	if ($r->{pk} eq 'machine-xml') { | 
 | 247 | 	    $old_level->{$r->{ps}."-xml"} = $r->{o}; | 
 | 248 | 	    $new_level->{$r->{ps}."-xml"} = $r->{n}; | 
 | 249 | 	} else { | 
 | 250 | 	    $old_level->{$r->{pk}} = $r->{o}; | 
 | 251 | 	    $new_level->{$r->{pk}} = $r->{n}; | 
 | 252 | 	} | 
 | 253 |     } | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 254 |     print OUTPUT "-"x$plen." | "."-"x$olen." | "."-"x$nlen." | ". | 
 | 255 | 	"-"x$platlen."\n"; | 
 | 256 |     print OUTPUT $t; | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 257 | } | 
 | 258 |  | 
 | 259 | { | 
 | 260 |     my $q = <<'SQL'; | 
 | 261 | select package as pk ,version as v, | 
 | 262 | 	GROUP_CONCAT(platform) as ps | 
 | 263 | FROM new_package | 
 | 264 | 	GROUP BY package,version | 
 | 265 | ORDER BY package,platform | 
 | 266 | SQL | 
 | 267 |     my $sth = $dbh->prepare($q) or die $!; | 
 | 268 |     $sth->execute(); | 
 | 269 |  | 
 | 270 |     print OUTPUT "\n\n## New Packages\n\n"; | 
 | 271 |     print OUTPUT "Package | Version | Platforms\n"; | 
 | 272 |     print OUTPUT "--- | --- | ---\n"; | 
 | 273 |     while (my $r = $sth->fetchrow_hashref) { | 
 | 274 | 	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."\n" ; | 
 | 275 | 	if ($r->{pk} eq 'machine-xml') { | 
 | 276 | 	    $new_level->{$r->{ps}."-xml"} = $r->{v}; | 
 | 277 | 	} | 
 | 278 |     } | 
 | 279 | } | 
 | 280 |  | 
 | 281 | { | 
 | 282 |     my $q = <<'SQL'; | 
 | 283 | select package as pk ,version as v, | 
 | 284 | 	GROUP_CONCAT(platform) as ps | 
 | 285 | FROM removed_package | 
 | 286 | 	GROUP BY package,version | 
 | 287 | ORDER BY package,platform | 
 | 288 | SQL | 
 | 289 |     my $sth = $dbh->prepare($q) or die $!; | 
 | 290 |     $sth->execute(); | 
 | 291 |  | 
 | 292 |     print OUTPUT "\n\n## Removed Packages\n\n"; | 
 | 293 |     print OUTPUT "Package | Version | Platforms\n"; | 
 | 294 |     print OUTPUT "--- | --- | ---\n"; | 
 | 295 |     while (my $r = $sth->fetchrow_hashref) { | 
 | 296 | 	print OUTPUT join(' | ',($r->{pk}, $r->{v}, $r->{ps}))."\n" ; | 
 | 297 | 	if ($r->{pk} eq $r->{ps}."-xml") { | 
 | 298 | 	    $old_level->{$r->{ps}."-xml"} = $r->{v}; | 
 | 299 | 	} | 
 | 300 |     } | 
 | 301 |     print OUTPUT "\n\n"; | 
 | 302 | } | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 303 |  | 
 | 304 | foreach my $repo (keys %{$repos}) | 
 | 305 | { | 
 | 306 |     if (-e $repo) | 
 | 307 |     { | 
 | 308 |         system("cd $repo; git fetch") && die "Could not fetch $repo"; | 
 | 309 |     } | 
 | 310 |     else | 
 | 311 |     { | 
 | 312 |         system("git clone $repos->{$repo}->{REPO} $repo") && | 
 | 313 |             die "Could not clone $repo"; | 
 | 314 |     } | 
 | 315 | } | 
 | 316 |  | 
 | 317 | system("cd op-build; git checkout $end_release --force; git reset HEAD --hard"); | 
 | 318 |  | 
 | 319 |  | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 320 | my $op_url = $repos->{'op-build'}->{REPO}; | 
 | 321 |  | 
 | 322 | foreach my $repo (sort keys %{$repos}) | 
 | 323 | { | 
| Stewart Smith | f76e7f9 | 2017-05-19 10:42:01 +1000 | [diff] [blame] | 324 |     my $package = $repo; | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 325 |     my $url = $repos->{$repo}->{REPO}; | 
 | 326 |     my $dir = $repos->{$repo}->{DIR}; | 
 | 327 |  | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 328 |     print OUTPUT "\n## Package: $repo\n"; | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 329 |     print OUTPUT "[Repository]($url)\n"; | 
 | 330 |     print OUTPUT "\n"; | 
 | 331 |  | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 332 |     # Display patches. | 
 | 333 |     if (open(LSLOG, "ls op-build/$dir/*.patch | ". | 
 | 334 |                     "xargs -n1 --no-run-if-empty basename |")) | 
 | 335 |     { | 
 | 336 |         print OUTPUT "### Patches\n"; | 
 | 337 |         while (my $logline = <LSLOG>) | 
 | 338 |         { | 
 | 339 |             chomp $logline; | 
 | 340 |             print OUTPUT "* [$logline]". | 
 | 341 |                 "($op_url/tree/$end_release/$dir/$logline)\n"; | 
 | 342 |         } | 
 | 343 |         close LSLOG; | 
 | 344 |         print OUTPUT "\n"; | 
 | 345 |     } | 
 | 346 |     else | 
 | 347 |     { | 
 | 348 |         print OUTPUT "None.\n"; | 
 | 349 |     } | 
 | 350 |  | 
 | 351 |     # Display changes. | 
 | 352 |     print OUTPUT "### Commits\n"; | 
 | 353 |     if ((not exists $old_level->{$package}) && | 
 | 354 |         (not exists $new_level->{$package})) | 
 | 355 |     { | 
 | 356 |         # No change identified. | 
 | 357 |         print "No changes: $repo\n"; | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 358 |         print OUTPUT "No changes.\n\n"; | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 359 |         next; | 
 | 360 |     } | 
 | 361 |  | 
 | 362 |     if ((exists $old_level->{$package}) && | 
 | 363 |         (exists $new_level->{$package})) | 
 | 364 |     { | 
 | 365 |         print "Changes in $repo...\n"; | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 366 |         open(GITLOG, "cd $repo; git shortlog $old_level->{$package}...". | 
 | 367 |                      "$new_level->{$package} --no-merges --format=". | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 368 |                      "\"- [%h]($url/commit/%h) %s\" |"); | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 369 |  | 
 | 370 |         while (my $logline = <GITLOG>) | 
 | 371 |         { | 
 | 372 |             chomp $logline; | 
 | 373 |             $logline =~ s/^[[:space:]]*//; | 
| Stewart Smith | 59d3cb4 | 2018-02-12 11:52:12 +1100 | [diff] [blame] | 374 |             $logline =~ s/:$/:\n/; | 
| Patrick Williams | 37567b7 | 2015-06-08 15:25:40 -0500 | [diff] [blame] | 375 |             print OUTPUT "$logline\n"; | 
 | 376 |         } | 
 | 377 |         close GITLOG; | 
 | 378 |         print OUTPUT "\n"; | 
 | 379 |         next; | 
 | 380 |     } | 
 | 381 |  | 
 | 382 |     if (not exists $old_level->{$package}) | 
 | 383 |     { | 
 | 384 |         print "New package $repo.\n"; | 
 | 385 |         print OUTPUT "New package.\n"; | 
 | 386 |         next; | 
 | 387 |     } | 
 | 388 |  | 
 | 389 |     if (not exists $new_level->{$package}) | 
 | 390 |     { | 
 | 391 |         print "Deleted package $repo.\n"; | 
 | 392 |         print OUTPUT "Package removed.\n"; | 
 | 393 |         next; | 
 | 394 |     } | 
 | 395 | } |