public static function refresh_repository_lists($repos = null, $force_refresh = false)
 {
     if ($repos == null) {
         if ($force_refresh == false) {
             if (!defined('HAS_REFRESHED_OBO_LIST')) {
                 pts_define('HAS_REFRESHED_OBO_LIST', true);
             } else {
                 return true;
             }
         }
         $repos = self::linked_repositories();
     }
     foreach ($repos as $repo_name) {
         pts_file_io::mkdir(PTS_OPENBENCHMARKING_SCRATCH_PATH . $repo_name);
         if ($repo_name == 'local') {
             // Local is a special case, not actually a real repository
             continue;
         }
         if (!is_dir(PTS_OPENBENCHMARKING_SCRATCH_PATH . $repo_name)) {
             mkdir(PTS_OPENBENCHMARKING_SCRATCH_PATH . $repo_name, 0777, true);
         }
         $index_file = PTS_OPENBENCHMARKING_SCRATCH_PATH . $repo_name . '.index';
         $server_index = null;
         if (is_file($index_file)) {
             $repo_index = json_decode(file_get_contents($index_file), true);
             $generated_time = $repo_index['main']['generated'];
             // Refreshing the indexes once every few days should be suffice
             // Refresh approximately every three days by default
             $index_cache_ttl = 3;
             if (PTS_IS_CLIENT && ($config_ttl = pts_config::read_user_config('PhoronixTestSuite/Options/OpenBenchmarking/IndexCacheTTL'))) {
                 if ($config_ttl === 0) {
                     // if the value is 0, only rely upon manual refreshes
                     continue;
                 } else {
                     if (is_numeric($config_ttl) && $config_ttl >= 1) {
                         $index_cache_ttl = $config_ttl;
                     }
                 }
             }
             if ($generated_time > time() - 86400 * $index_cache_ttl && $force_refresh == false && (!defined('FIRST_RUN_ON_PTS_UPGRADE') || FIRST_RUN_ON_PTS_UPGRADE == false)) {
                 // The index is new enough
                 continue;
             }
             if (pts_network::internet_support_available()) {
                 $server_index = pts_openbenchmarking::make_openbenchmarking_request('repo_index', array('repo' => $repo_name));
                 self::$openbenchmarking_index_refreshed = true;
             }
             if (!$server_index && ($phoromatic_cache_index = self::phoromatic_server_ob_cache_request('index', $repo_name))) {
                 // Ensure the Phoromatic cache has a newer version of the index than what's currently on the system
                 $repo_index = json_decode($phoromatic_cache_index, true);
                 if (isset($repo_index['main']['generated'])) {
                     $cache_generated_time = $repo_index['main']['generated'];
                     if ($cache_generated_time > $generated_time) {
                         $server_index = $phoromatic_cache_index;
                     }
                     self::$openbenchmarking_index_refreshed = true;
                 }
             }
         } else {
             if (pts_network::internet_support_available()) {
                 $server_index = pts_openbenchmarking::make_openbenchmarking_request('repo_index', array('repo' => $repo_name));
                 self::$openbenchmarking_index_refreshed = true;
             }
         }
         if (!$server_index && ($phoromatic_cache_index = self::phoromatic_server_ob_cache_request('index', $repo_name))) {
             $server_index = $phoromatic_cache_index;
         }
         if ($server_index != null && json_decode($server_index) != false) {
             file_put_contents($index_file, $server_index);
         } else {
             if (PTS_IS_CLIENT && is_file('/var/cache/phoronix-test-suite/openbenchmarking.org/' . $repo_name . '.index')) {
                 copy('/var/cache/phoronix-test-suite/openbenchmarking.org/' . $repo_name . '.index', $index_file);
             }
         }
         if (!is_file($index_file)) {
             static $reported_read_failure_notice;
             if (!isset($reported_read_failure_notice[$repo_name]) && PTS_IS_CLIENT) {
                 trigger_error('Failed To Fetch OpenBenchmarking.org Repository Data: ' . $repo_name, E_USER_WARNING);
                 $reported_read_failure_notice[$repo_name] = true;
             }
         }
     }
 }