diff options
Diffstat (limited to 'src/tools/utils/sbeGitTool.pl')
-rwxr-xr-x | src/tools/utils/sbeGitTool.pl | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/src/tools/utils/sbeGitTool.pl b/src/tools/utils/sbeGitTool.pl new file mode 100755 index 00000000..9ffd4b2b --- /dev/null +++ b/src/tools/utils/sbeGitTool.pl @@ -0,0 +1,332 @@ +#! /usr/bin/perl +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/tools/utils/sbeGitTool.pl $ +# +# OpenPOWER sbe Project +# +# Contributors Listed Below - COPYRIGHT 2016 +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. See the License for the specific language governing +# permissions and limitations under the License. +# +# IBM_PROLOG_END_TAG + +use strict; +#use lib "$ENV{'PERLMODULES'}"; +use lib "src/tools/utils/perl.modules"; +use Getopt::Long qw(:config pass_through); +use Data::Dumper; +use Cwd; +use gitUtil; + +# Global variables & constants +my $debug = 0; +my $help = 0; +my %globals = (); +my @references = (); +my @patchList = (); +my @commits = (); +my $patches = ""; +my $sbbase = ""; +my $sbname = ""; +my $sbrc = ""; +my $release = ""; + +my %commands = ( "extract" => \&execute_extract, + "get-commits" => \&execute_get_commits); + +# Handle input command +GetOptions("debug!" => \$debug, + "help" => \$help); + +if ($help) +{ + execute_help(); +} +else +{ + my $command = shift @ARGV; + if ($commands{$command}) + { + &{$commands{$command}}(); + } + else + { + execute_help(); + } +} + +foreach my $arg (@ARGV) +{ + print "Unprocessed arg: $arg\n" if $debug; +} + +############################## Begin Actions ################################## + +sub execute_help +{ + my $command = shift @ARGV; + + if ($command eq "") + { + print "sbeGitTool\n"; + print " Run FSP-CI from a set of git commits\n"; + print "\n"; + print " Syntax:\n"; + print " sbeGitTool <tool> [options]\n"; + print "\n"; + print " Available subtools:\n"; + foreach my $key (sort keys %commands) + { + print " $key\n"; + } + print "\n"; + print " Global options:\n"; + print " --debug Enable debug mode.\n"; + print " --help Display help on a specific tool.\n"; + print "\n"; + print " Note: Generally a <commit> can be any git or gerrit\n"; + print " reference. A git commit number, tag, branch, or\n"; + print " a gerrit change-id are all valid.\n"; + } + elsif (not defined $commands{$command}) + { + die "Unknown subcommand: $command.\n"; + } + else + { + my %help = ( + "extract" => +q( + Create the SBE binaries with the patch and its CMVC/GIT dependencies. + + Options: + --patches=<changeId:patch-set> CSV of changeId:patch-set's [required]. + --sbbase=<full-path-to-sb-base> Sandbox base for FSP-CI [required]. + --sbname=<name> Sandbox name [required]. + --rc=<rc file name> RC file for the sandbox with absolute path [optional]. +), + "get-commits" => +q( + Given a patch, find the corresponding commit id. + + Options: + --patches=<changeId:patch-set> CSV of changeId:patch-set's [required]. + --sbbase=<full-path-to-sb-base> Sandbox base for FSP-CI [required]. + --sbname=<name> Sandbox name [required]. +) + ); + + print "sbeGitTool $command:"; + print $help{$command}; + } +} + +sub execute_get_commits +{ + + # Set GIT environment + git_environ_init(); + + # Obtain the list of patches + retrivePatchList(); + + # Fetch the commits for the patches + fetchCommits(); + + # Prepare commit string + my $commitStr = prepareCommitStr(); + + print "The set of commits: $commitStr" if $debug; + print $commitStr; + return $commitStr; +} + +sub execute_extract +{ + # Set GIT environment + git_environ_init(); + + # Obtain the list of patches + retrivePatchList(); + + # Fetch the references for the patches + fetchRefs(); + + # Apply the patches on the GIT repo + applyRefs(); + + # Compile the SBE and copy binaries to sandbox + compileAndCopy(); +} + +sub git_environ_init +{ + # Handle the i/p to the function + GetOptions("patches:s" => \$patches, + "sbbase:s" => \$sbbase, + "sbname:s" => \$sbname, + "rc:s" => \$sbrc); + + die "Missing patch list" if ($patches eq ""); + die "Missing sandbox base path" if ($sbbase eq ""); + die "Missing sandbox name" if ($sbname eq ""); + + # Set global variables + $globals{sandbox} = $sbbase."/".$sbname; + $globals{sbe_git_root} = $globals{sandbox}."/git-ci"; + + print "Sandbox: $globals{sandbox}\n" if $debug; + print "GIT repository path: $globals{sbe_git_root}\n" if $debug; + + chdir($globals{sbe_git_root}); + die "ERROR $?: Invalid GIT repository path in the sandbox" if $? ; +} + +sub retrivePatchList +{ + # Parse out the CSV patch list + @patchList = split(/,+/, $patches); + + print ">>>Patches\n" if $debug; + print Dumper @patchList if $debug; + print "<<<End of Patches\n" if $debug; +} + +sub fetchRefs +{ + my $currentRef = ""; + my $validPatchCount = 0; + + foreach my $patch (@patchList) + { + my ($changeId,$patchSet) = split(":",$patch); + if (gitUtil::gerritIsPatch($changeId)) + { + $validPatchCount = $validPatchCount + 1; + print "Fetching reference for the patch : $patch \n" if $debug; + if (gitUtil::patchMergeStatus($changeId) == 0) + { + my $currentRef = gitUtil::gerritQueryReference($changeId, $patchSet); + push @references, $currentRef; + print "(patchset -> reference) = $patch -> $currentRef\n" if $debug; + } + } + else + { + print "\n Warning : Patchset $patch is invalid.. Continuing to check if there is any other valid patch \n"; + } + } + die "ERROR: No valid patches given..\n" if ($validPatchCount == 0); +} + +sub applyRefs +{ + my $statusFile = $globals{sbe_git_root}."/patchApply.status"; + + foreach my $ref (@references) + { + print "Cherrypicking reference $ref \n" if $debug; + open SBWORKON, " | ./sb workon"; + print SBWORKON "git fetch gerrit $ref && echo \"Fetch Done \" > $statusFile \n"; + #print SBWORKON "git cherry-pick FETCH_HEAD && echo \"Cherry-pick Done \" >> $statusFile \n"; // will be reused once appropriate support is there + print SBWORKON "git checkout FETCH_HEAD && echo \"Checkout Done \" >> $statusFile \n"; + print SBWORKON "exit \n"; + close SBWORKON; + + print "\nChecking cherrypick status for $ref...\n" if $debug; + my $ch_status = `cat $statusFile`; + if( ($ch_status =~ m/Fetch/) && ($ch_status =~ m/Checkout/)) + { + print "Checkout successful\n"; + } + else + { + die "ERROR: Checkout of $ref failed\n"; + } + } +} + +sub compileAndCopy +{ + my $statusFile = $globals{sbe_git_root}."/compile.status"; + my $compile_path = $globals{sbe_git_root}; + + print "Compiling and copying the generated binaries to sandbox\n" if $debug; + open SBWORKON, " | ./sb workon"; + print SBWORKON "cd $compile_path \n"; + print SBWORKON "make install && echo \"Compile Passed\" > $statusFile \n"; + print SBWORKON "export SANDBOXBASE=$globals{sandbox} \n"; + print SBWORKON "cd $globals{sbe_git_root} \n"; + print SBWORKON "./sb prime --sb $sbname --no_build && echo \"Prime Passed\" >> $statusFile \n"; + print SBWORKON "exit \n"; + close SBWORKON; + + print "\nChecking compile status...\n" if $debug; + my $compile_status = `cat $statusFile | grep "Compile"`; + if ($compile_status =~ m/Compile/) + { + print "SBE compile successful\n"; + } + else + { + die "ERROR: SBE compile failed\n"; + } + + print "\nChecking sandbox status...\n" if $debug; + my $sb_status = `cat $statusFile | grep "Prime"`; + if ($sb_status =~ m/Prime/) + { + print "SBE prime successful\n"; + } + else + { + die "ERROR: SBE prime failed\n"; + } +} + +sub fetchCommits +{ + my $currentCommit = ""; + + foreach my $patch (@patchList) + { + my ($changeId,$patchSet) = split(":",$patch); + if (gitUtil::gerritIsPatch($changeId)) + { + print "Fetching commit for the patch : $patch \n" if $debug; + my $currentCommit = gitUtil::gerritQueryCommit($changeId, $patchSet); + push @commits, $currentCommit; + print "(patchset -> commit) = $patch -> $currentCommit\n" if $debug; + } + else + { + print "\n Warning : Patchset $patch is invalid.. Continuing to check if there is any other valid patch \n"; + } + } + die "ERROR: No valid patches given..\n" if (scalar @commits == 0); +} + +sub prepareCommitStr +{ + my $commitStr = ""; + + foreach my $commit (@commits) + { + $commitStr = $commitStr.",".$commit; + } + $commitStr =~ s/^,//g; + return $commitStr; +} |