public static function cleanup_tests_to_run(&$to_run_objects)
 {
     $skip_tests = ($e = pts_client::read_env('SKIP_TESTS')) ? pts_strings::comma_explode($e) : false;
     $tests_verified = array();
     $tests_missing = array();
     foreach ($to_run_objects as &$run_object) {
         if ($skip_tests && (in_array($run_object->get_identifier(false), $skip_tests) || $run_object instanceof pts_test_profile && in_array($run_object->get_identifier_base_name(), $skip_tests))) {
             pts_client::$display->generic_sub_heading('Skipping: ' . $run_object->get_identifier());
             continue;
         } else {
             if ($run_object instanceof pts_test_profile) {
                 if ($run_object->get_title() == null) {
                     pts_client::$display->generic_sub_heading('Not A Test: ' . $run_object);
                     continue;
                 } else {
                     if ($run_object->is_supported(false) == false) {
                         continue;
                     }
                     if ($run_object->is_test_installed() == false) {
                         // Check to see if older version of test is currently installed
                         // TODO: show change-log between installed versions and upstream
                         array_push($tests_missing, $run_object);
                         continue;
                     }
                 }
             } else {
                 if ($run_object instanceof pts_result_file) {
                     $num_installed = 0;
                     foreach ($run_object->get_contained_test_profiles() as $test_profile) {
                         if ($test_profile == null || $test_profile->get_identifier() == null || $test_profile->is_supported(false) == false) {
                             continue;
                         } else {
                             if ($test_profile->is_test_installed() == false) {
                                 array_push($tests_missing, $test_profile);
                             } else {
                                 $num_installed++;
                             }
                         }
                     }
                     if ($num_installed == 0) {
                         continue;
                     }
                 } else {
                     if ($run_object instanceof pts_test_suite || $run_object instanceof pts_virtual_test_suite || $run_object instanceof pts_virtual_test_queue) {
                         if ($run_object->is_core_version_supported() == false) {
                             pts_client::$display->generic_sub_heading($run_object->get_title() . ' is a suite not supported by this version of the Phoronix Test Suite.');
                             continue;
                         }
                         $num_installed = 0;
                         foreach ($run_object->get_contained_test_profiles() as $test_profile) {
                             if ($test_profile == null || $test_profile->get_identifier() == null || $test_profile->is_supported(false) == false) {
                                 continue;
                             }
                             if ($test_profile->is_test_installed() == false) {
                                 array_push($tests_missing, $test_profile);
                             } else {
                                 $num_installed++;
                             }
                         }
                         if ($num_installed == 0) {
                             continue;
                         }
                     } else {
                         pts_client::$display->generic_sub_heading('Not Recognized: ' . $run_object);
                         continue;
                     }
                 }
             }
         }
         array_push($tests_verified, $run_object);
     }
     $to_run_objects = $tests_verified;
     if (count($tests_missing) > 0 && !defined('PHOROMATIC_PROCESS')) {
         $tests_missing = array_unique($tests_missing);
         if (count($tests_missing) == 1) {
             trigger_error($tests_missing[0] . ' is not installed.', E_USER_ERROR);
             // PHP_EOL . 'To install, run: phoronix-test-suite install ' . $tests_missing[0]
         } else {
             $message = PHP_EOL . PHP_EOL . 'Multiple tests are not installed:' . PHP_EOL . PHP_EOL;
             $message .= pts_user_io::display_text_list($tests_missing);
             //$message .= PHP_EOL . 'To install, run: phoronix-test-suite install ' . implode(' ', $tests_missing) . PHP_EOL . PHP_EOL;
             echo $message;
         }
         if (!$this->batch_mode && !$this->auto_mode && pts_client::current_command() != 'benchmark') {
             $stop_and_install = pts_user_io::prompt_bool_input('Would you like to stop and install these tests now', true);
             if ($stop_and_install) {
                 pts_test_installer::standard_install($tests_missing);
                 self::cleanup_tests_to_run($to_run_objects);
             }
         }
     }
     return true;
 }
 public static function execute_command($command, $pass_args = null)
 {
     if (!class_exists($command, false) && is_file(PTS_COMMAND_PATH . $command . '.php')) {
         include PTS_COMMAND_PATH . $command . '.php';
     }
     if (is_file(PTS_COMMAND_PATH . $command . '.php') && method_exists($command, 'argument_checks')) {
         $argument_checks = call_user_func(array($command, 'argument_checks'));
         foreach ($argument_checks as &$argument_check) {
             $function_check = $argument_check->get_function_check();
             $method_check = false;
             if (is_array($function_check) && count($function_check) == 2) {
                 $method_check = $function_check[0];
                 $function_check = $function_check[1];
             }
             if (substr($function_check, 0, 1) == '!') {
                 $function_check = substr($function_check, 1);
                 $return_fails_on = true;
             } else {
                 $return_fails_on = false;
             }
             if ($method_check != false) {
                 if (!method_exists($method_check, $function_check)) {
                     echo PHP_EOL . 'Method check fails.' . PHP_EOL;
                     continue;
                 }
                 $function_check = array($method_check, $function_check);
             } else {
                 if (!function_exists($function_check)) {
                     continue;
                 }
             }
             if ($argument_check->get_argument_index() == 'VARIABLE_LENGTH') {
                 $return_value = null;
                 foreach ($pass_args as $arg) {
                     $return_value = call_user_func_array($function_check, array($arg));
                     if ($return_value == true) {
                         break;
                     }
                 }
             } else {
                 $return_value = call_user_func_array($function_check, array(isset($pass_args[$argument_check->get_argument_index()]) ? $pass_args[$argument_check->get_argument_index()] : null));
             }
             if ($return_value == $return_fails_on) {
                 $command_alias = defined($command . '::doc_use_alias') ? constant($command . '::doc_use_alias') : $command;
                 if (isset($pass_args[$argument_check->get_argument_index()]) && !empty($pass_args[$argument_check->get_argument_index()]) || $argument_check->get_argument_index() == 'VARIABLE_LENGTH' && !empty($pass_args)) {
                     trigger_error('Invalid Argument: ' . implode(' ', $pass_args), E_USER_ERROR);
                 } else {
                     trigger_error('Phoronix Test Suite Argument Missing.', E_USER_ERROR);
                 }
                 echo PHP_EOL . 'CORRECT SYNTAX:' . PHP_EOL . 'phoronix-test-suite ' . str_replace('_', '-', $command_alias) . ' ' . implode(' ', $argument_checks) . PHP_EOL . PHP_EOL;
                 if (method_exists($command, 'invalid_command')) {
                     call_user_func_array(array($command, 'invalid_command'), $pass_args);
                     echo PHP_EOL;
                 }
                 return false;
             } else {
                 if ($argument_check->get_function_return_key() != null && !isset($pass_args[$argument_check->get_function_return_key()])) {
                     $pass_args[$argument_check->get_function_return_key()] = $return_value;
                 }
             }
         }
     }
     pts_module_manager::module_process('__pre_option_process', $command);
     if (is_file(PTS_COMMAND_PATH . $command . '.php')) {
         self::$current_command = $command;
         if (method_exists($command, 'run')) {
             call_user_func(array($command, 'run'), $pass_args);
         } else {
             echo PHP_EOL . 'There is an error in the requested command: ' . $command . PHP_EOL . PHP_EOL;
         }
     } else {
         if (($t = pts_module::valid_run_command($command)) != false) {
             list($module, $module_command) = $t;
             pts_module_manager::set_current_module($module);
             pts_module_manager::run_command($module, $module_command, $pass_args);
             pts_module_manager::set_current_module(null);
         }
     }
     echo PHP_EOL;
     pts_module_manager::module_process('__post_option_process', $command);
 }
 public static function evaluate_string_to_qualifier($supplied, $bind_version = true, $check_only_type = false)
 {
     $qualified = false;
     $c_repo = null;
     $repos = self::linked_repositories();
     if (($c = strpos($supplied, '/')) !== false) {
         // A repository was explicitly defined
         $c_repo = substr($supplied, 0, $c);
         $test = substr($supplied, $c + 1);
         // If it's in the linked repo list it should have refreshed when starting client
         if (!in_array($c_repo, $repos)) {
             // Pull in this repository's index
             pts_openbenchmarking::refresh_repository_lists($repos);
         }
         $repos = array($c_repo);
     } else {
         // If it's in the linked repo list it should have refreshed when starting client
         $test = $supplied;
     }
     if (($c = strrpos($test, '-')) !== false) {
         $version = substr($test, $c + 1);
         // TODO: functionalize this and read against types.xsd
         if (isset($version[2]) && !isset($version[8]) && pts_strings::string_only_contains($version, pts_strings::CHAR_NUMERIC | pts_strings::CHAR_DECIMAL)) {
             $test = substr($test, 0, $c);
         } else {
             $version = null;
         }
     } else {
         $version = null;
     }
     if ($test == null) {
         return false;
     }
     foreach ($repos as $repo) {
         if ($repo == 'local') {
             if (self::check_only_type_compare($check_only_type, 'test')) {
                 if (is_file(PTS_TEST_PROFILE_PATH . $repo . '/' . $test . '/test-definition.xml')) {
                     return $repo . '/' . $test;
                     // ($bind_version ? '-' . $version : null)
                 } else {
                     if (is_file(PTS_TEST_PROFILE_PATH . $repo . '/' . $test . '-' . $version . '/test-definition.xml')) {
                         return $repo . '/' . $test . '-' . $version;
                         // ($bind_version ? '-' . $version : null)
                     }
                 }
             }
             if (self::check_only_type_compare($check_only_type, 'suite')) {
                 if (is_file(PTS_TEST_SUITE_PATH . $repo . '/' . $test . '/suite-definition.xml')) {
                     return $repo . '/' . $test;
                     // ($bind_version ? '-' . $version : null)
                 } else {
                     if (is_file(PTS_TEST_SUITE_PATH . $repo . '/' . $test . '-' . $version . '/suite-definition.xml')) {
                         return $repo . '/' . $test . '-' . $version;
                         // ($bind_version ? '-' . $version : null)
                     }
                 }
             }
         }
         $repo_index = pts_openbenchmarking::read_repository_index($repo);
         if (is_array($repo_index) && isset($repo_index['tests'][$test]) && self::check_only_type_compare($check_only_type, 'test')) {
             // The test profile at least exists
             // Looking for a particular test profile version?
             if ($version != null) {
                 if (!in_array($version, $repo_index['tests'][$test]['versions'])) {
                     // Grep to see if the version passed was e.g. 1.3 instead of 1.3.3
                     $versions = $repo_index['tests'][$test]['versions'];
                     sort($versions);
                     foreach (array_reverse($versions) as $check_version) {
                         if (strstr($check_version, $version) != false) {
                             $version = $check_version;
                             break;
                         }
                     }
                 }
                 if (in_array($version, $repo_index['tests'][$test]['versions'])) {
                     pts_openbenchmarking::download_test_profile($repo . '/' . $test . '-' . $version);
                     return $repo . '/' . $test . ($bind_version ? '-' . $version : null);
                 }
             } else {
                 // Assume to use the latest version unless something else is installed
                 $available_versions = $repo_index['tests'][$test]['versions'];
                 $version = $available_versions[0];
                 // the latest version available
                 if (PTS_IS_CLIENT && pts_client::current_command() == 'pts_test_run_manager') {
                     // Check to see if an older version of the test profile is currently installed to ru nthat since no version specified
                     foreach ($available_versions as $i => $v) {
                         if (is_file(pts_client::test_install_root_path() . $repo . '/' . $test . '-' . $v . '/pts-install.xml')) {
                             $version = $v;
                             if ($i > 0) {
                                 // It's not the latest test profile version available
                                 trigger_error($repo . '/' . $test . ': The latest test profile version available for upgrade is ' . $available_versions[0] . ' but version ' . $version . ' is the latest currently installed.', E_USER_WARNING);
                             }
                             break;
                         }
                     }
                 }
                 pts_openbenchmarking::download_test_profile($repo . '/' . $test . '-' . $version);
                 return $repo . '/' . $test . ($bind_version ? '-' . $version : null);
             }
         }
         if (is_array($repo_index) && isset($repo_index['suites'][$test]) && self::check_only_type_compare($check_only_type, 'suite')) {
             // The test profile at least exists
             // Looking for a particular test profile version?
             if ($version != null) {
                 if (!in_array($version, $repo_index['suites'][$test]['versions'])) {
                     // Grep to see if the version passed was e.g. 1.3 instead of 1.3.3
                     $versions = $repo_index['suites'][$test]['versions'];
                     sort($versions);
                     foreach (array_reverse($versions) as $check_version) {
                         if (strstr($check_version, $version) != false) {
                             $version = $check_version;
                             break;
                         }
                     }
                 }
                 if (in_array($version, $repo_index['suites'][$test]['versions'])) {
                     pts_openbenchmarking::download_test_suite($repo . '/' . $test . '-' . $version);
                     return $repo . '/' . $test . ($bind_version ? '-' . $version : null);
                 }
             } else {
                 // Assume to use the latest version
                 $version = array_shift($repo_index['suites'][$test]['versions']);
                 pts_openbenchmarking::download_test_suite($repo . '/' . $test . '-' . $version);
                 return $repo . '/' . $test . ($bind_version ? '-' . $version : null);
             }
         }
     }
     return false;
 }