Commit 2223228b authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ktest updates from Steven Rostedt:

 - Add new -D option that allows to override variables and options

   For example:

     ./ktest.pl -DPATCH_START:=HEAD~1 -DOUTPUT_DIR=/work/build/urgent config

   The above sets the variable "PATCH_START" to HEAD~1 and the
   OUTPUT_DIR option to "/work/build/urgent".

   This is useful because currently the only way to make a slight change
   to a config file is by modifying that config file. For one time
   changes, this can be annoying. Having a way to do a one time override
   from the command line simplifies the workflow.

   Temp variables (PATCH_START) will override every temp variable in the
   config file, whereas options will act like a normal OVERRIDE option
   and will only affect the session they define.

      -DBUILD_OUTPUT=/work/git/linux.git

   Replaces the default BUILD_OUTPUT option.

      '-DBUILD_OUTPUT[2]=/work/git/linux.git'

   Only replaces the BUILD_OUTPUT variable for test #2.

 - If an option contains itself, just drop it instead of going into an
   infinite loop and failing to parse (it doesn't crash, it detects the
   recursion after 100 iterations anyway).

   Some configs may define a variable with the same name as the option:

      ADD_CONFIG := $(ADD_CONFIG)

   But if the option doesn't exist, it the above will fail to parse. In
   these cases, just ignore evaluating the option inside the definition
   of another option if it has the same name.

 - Display the BUILD_DIR and OUTPUT_DIR options at the start of every
   test

   It is useful to know which kernel source and what destination a test
   is using when it starts, in case a mistake is made. This makes it
   easier to abort the test if the wrong source or destination is being
   used instead of waiting until the test completes.

 - Add new PATCHCHECK_SKIP option

   When testing a series of commits that also includes changes to the
   Linux tools directory, it is useless to test the changes in tools as
   they may not affect the kernel itself. Doing tests on the kernel for
   changes that do not affect the kernel is a waste of time.

   Add a PATCHCHECK_SKIP that takes a series of shas that will be
   skipped while doing the individual commit tests.

* tag 'ktest-v6.17' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-ktest:
  ktest.pl: Add new PATCHCHECK_SKIP option to skip testing individual commits
  ktest.pl: Always display BUILD_DIR and OUTPUT_DIR at the start of tests
  ktest.pl: Prevent recursion of default variable options
  ktest.pl: Have -D option work without a space
  ktest.pl: Allow command option -D to override temp variables
  ktest.pl: Add -D option to override options
parents b7dbc2e8 a5e71638
Loading
Loading
Loading
Loading
+113 −3
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ my %opt;
my %repeat_tests;
my %repeats;
my %evals;
my @command_vars;
my %command_tmp_vars;

#default opts
my %default = (
@@ -216,6 +218,7 @@ my $patchcheck_type;
my $patchcheck_start;
my $patchcheck_cherry;
my $patchcheck_end;
my $patchcheck_skip;

my $build_time;
my $install_time;
@@ -380,6 +383,7 @@ my %option_map = (
    "PATCHCHECK_START"		=> \$patchcheck_start,
    "PATCHCHECK_CHERRY"		=> \$patchcheck_cherry,
    "PATCHCHECK_END"		=> \$patchcheck_end,
    "PATCHCHECK_SKIP"		=> \$patchcheck_skip,
);

# Options may be used by other options, record them.
@@ -900,14 +904,22 @@ sub set_eval {
}

sub set_variable {
    my ($lvalue, $rvalue) = @_;
    my ($lvalue, $rvalue, $command) = @_;

    # Command line variables override all others
    if (defined($command_tmp_vars{$lvalue})) {
	return;
    }
    if ($rvalue =~ /^\s*$/) {
	delete $variable{$lvalue};
    } else {
	$rvalue = process_variables($rvalue);
	$variable{$lvalue} = $rvalue;
    }

    if (defined($command)) {
	$command_tmp_vars{$lvalue} = 1;
    }
}

sub process_compare {
@@ -1286,6 +1298,19 @@ sub read_config {

    $test_case = __read_config $config, \$test_num;

    foreach my $val (@command_vars) {
	chomp $val;
	my %command_overrides;
	if ($val =~ m/^\s*([A-Z_\[\]\d]+)\s*=\s*(.*?)\s*$/) {
	    my $lvalue = $1;
	    my $rvalue = $2;

	    set_value($lvalue, $rvalue, 1, \%command_overrides, "COMMAND LINE");
	} else {
	    die "Invalid option definition '$val'\n";
	}
    }

    # make sure we have all mandatory configs
    get_mandatory_configs;

@@ -1371,7 +1396,10 @@ sub __eval_option {
	# If a variable contains itself, use the default var
	if (($var eq $name) && defined($opt{$var})) {
	    $o = $opt{$var};
	    # Only append if the default doesn't contain itself
	    if ($o !~ m/\$\{$var\}/) {
		$retval = "$retval$o";
	    }
	} elsif (defined($opt{$o})) {
	    $o = $opt{$o};
	    $retval = "$retval$o";
@@ -3511,10 +3539,36 @@ sub patchcheck {
	@list = reverse @list;
    }

    my %skip_list;
    my $will_skip = 0;

    if (defined($patchcheck_skip)) {
	foreach my $s (split /\s+/, $patchcheck_skip) {
	    $s = `git log --pretty=oneline $s~1..$s`;
	    $s =~ s/^(\S+).*/$1/;
	    chomp $s;
	    $skip_list{$s} = 1;
	    $will_skip++;
	}
    }

    doprint("Going to test the following commits:\n");
    foreach my $l (@list) {
	my $sha1 = $l;
	$sha1 =~ s/^([[:xdigit:]]+).*/$1/;
	next if (defined($skip_list{$sha1}));
	doprint "$l\n";
    }

    if ($will_skip) {
	doprint("\nSkipping the following commits:\n");
	foreach my $l (@list) {
	    my $sha1 = $l;
	    $sha1 =~ s/^([[:xdigit:]]+).*/$1/;
	    next if (!defined($skip_list{$sha1}));
	    doprint "$l\n";
	}
    }

    my $save_clean = $noclean;
    my %ignored_warnings;
@@ -3530,6 +3584,11 @@ sub patchcheck {
	my $sha1 = $item;
	$sha1 =~ s/^([[:xdigit:]]+).*/$1/;

	if (defined($skip_list{$sha1})) {
	    doprint "\nSkipping \"$item\"\n\n";
	    next;
	}

	doprint "\nProcessing commit \"$item\"\n\n";

	run_command "git checkout $sha1" or
@@ -4242,8 +4301,55 @@ sub cancel_test {
    die "\nCaught Sig Int, test interrupted: $!\n"
}

$#ARGV < 1 or die "ktest.pl version: $VERSION\n   usage: ktest.pl [config-file]\n";
sub die_usage {
    die << "EOF"
ktest.pl version: $VERSION
   usage: ktest.pl [options] [config-file]
    [options]:
       -D value: Where value can act as an option override.
                -D BUILD_NOCLEAN=1
                    Sets global BUILD_NOCLEAN to 1
                -D TEST_TYPE[2]=build
                    Sets TEST_TYPE of test 2 to "build"

	        It can also override all temp variables.
                 -D USE_TEMP_DIR:=1
                    Will override all variables that use
                    "USE_TEMP_DIR="

EOF
;
}

while ( $#ARGV >= 0 ) {
    if ( $ARGV[0] eq "-D" ) {
	shift;
	die_usage if ($#ARGV < 1);
	my $val = shift;

	if ($val =~ m/(.*?):=(.*)$/) {
	    set_variable($1, $2, 1);
	} else {
	    $command_vars[$#command_vars + 1] = $val;
	}

    } elsif ( $ARGV[0] =~ m/^-D(.*)/) {
	my $val = $1;
	shift;

	if ($val =~ m/(.*?):=(.*)$/) {
	    set_variable($1, $2, 1);
	} else {
	    $command_vars[$#command_vars + 1] = $val;
	}
    } elsif ( $ARGV[0] eq "-h" ) {
	die_usage;
    } else {
	last;
    }
}

$#ARGV < 1 or die_usage;
if ($#ARGV == 0) {
    $ktest_config = $ARGV[0];
    if (! -f $ktest_config) {
@@ -4466,6 +4572,10 @@ for (my $i = 1; $i <= $opt{"NUM_TESTS"}; $i++) {

    doprint "RUNNING TEST $i of $opt{NUM_TESTS}$name with option $test_type $run_type$installme\n\n";

    # Always show which build directory and output directory is being used
    doprint "BUILD_DIR=$builddir\n";
    doprint "OUTPUT_DIR=$outputdir\n\n";

    if (defined($pre_test)) {
	my $ret = run_command $pre_test;
	if (!$ret && defined($pre_test_die) &&
+2 −0
Original line number Diff line number Diff line
@@ -1017,6 +1017,8 @@
#      Note, PATCHCHECK_CHERRY requires PATCHCHECK_END to be defined.
#      (default 0)
#
#  PATCHCHECK_SKIP is an optional list of shas to skip testing
#
#  PATCHCHECK_TYPE is required and is the type of test to run:
#      build, boot, test.
#