#!/usr/bin/perl -w
use strict;

my $dn = `dirname $0`;chomp($dn);
my $pwd = `pwd`;chomp($pwd);
if ($dn !~ /^\//) { $dn = $pwd . "/" . $dn; }
push @INC,$dn;

my $cverepobase=`dirname $dn`;
chomp($cverepobase);

require CanDBReader;


my $kernelgitdir = "/abuild/KERNEL/kernel-source";

my %kernelbranch = (
	"15-SP7" => "SLE15-SP7",
	"15-SP6" => "SLE15-SP6",
	"15-SP5" => "SLE15-SP5",
	"15-SP4" => "SLE15-SP4-LTSS",
	"15-SP3" => "SLE15-SP3-LTSS",
	"15-SP2" => "SLE15-SP2-LTSS",
	"12-SP5" => "SLE12-SP5",
	"12-SP4" => "SLE12-SP4-LTSS",
	"12-SP3" => "SLE12-SP3-LTSS",
	"11-SP4" => "SLE11-SP4-LTSS",
);

# This will fetch and update all remote refs
system("git -C $kernelgitdir fetch");

my $dummy;
my $mday;
my $mon;
my $year;
($dummy,$dummy,$dummy,$mday,$mon,$year,$dummy,$dummy,$dummy) = localtime(time);

my $datetag = sprintf("%04d%02d%02d",$year+1900,$mon+1,$mday);

my %cves = ();

foreach my $sp (sort keys %kernelbranch) {
	open(GIT,"git -C $kernelgitdir log remotes/origin/$kernelbranch{$sp}|");
	my $inblacklist = 0;
	while (<GIT>) {
		# multiline blacklist entries.
		$inblacklist = 0 if (/^\S/);
		$inblacklist = 1 if (/blacklist/);

		next if ($inblacklist);

		while (/(CVE-(\d\d\d\d)-(\d\d\d\d*))/) {
			my $cve = $1;
			if (!defined($CanDBReader::kernelcvedates{$sp}->{$cve})) {
				$CanDBReader::kernelcvedates{$sp}->{$cve} = $datetag;
			}
			s/CVE-(\d\d\d\d)-(\d\d\d\d*)//;
		}
	}
	close(GIT);

	system("git -C $kernelgitdir checkout $kernelbranch{$sp}");
	system("git -C $kernelgitdir pull -q");
	open(GREP,"grep -r References.*CVE $kernelgitdir/patches.*|");
	while (<GREP>) {
		while (/(CVE-(\d\d\d\d)-(\d\d\d\d*))/) {
			my $cve = $1;
			s/CVE-(\d\d\d\d)-(\d\d\d\d*)//;

			if (!defined($CanDBReader::kernelcvedates{$sp}->{$cve})) {
				$CanDBReader::kernelcvedates{$sp}->{$cve} = $datetag;
			}
		}
	}
	close(GREP);

	mkdir("data/kernel/");
	open(KERNELCVES,">data/kernel/$sp");
	my %spcves = %{$CanDBReader::kernelcvedates{$sp}};
	foreach my $kernelcve (sort keys %spcves) {
		printf KERNELCVES "$spcves{$kernelcve},$kernelcve\n";
	}
	close(KERNELCVES);
}
system("git add data/kernel/*");
system("git commit -m 'update via bin/kernel-git.pl'");
system("git pull --rebase");
system("git push");
