@@ -74,6 +74,8 @@ class DOMJudgeService
7474 protected ?Executable $ defaultCompareExecutable = null ;
7575 protected ?Executable $ defaultRunExecutable = null ;
7676
77+ private string $ localVersionString = '' ;
78+
7779 final public const EVAL_DEFAULT = 0 ;
7880 final public const EVAL_LAZY = 1 ;
7981 final public const EVAL_FULL = 2 ;
@@ -1708,6 +1710,25 @@ public function getAllowedLanguagesForContest(?Contest $contest) : array {
17081710 ->getResult ();
17091711 }
17101712
1713+ /**
1714+ * @return String[]|false
1715+ */
1716+ public function cacher_checkNewVersion (ItemInterface $ item ): array |false {
1717+ $ item ->expiresAfter (86400 );
1718+
1719+ $ versionUrl = 'https://versions.domjudge.org ' ;
1720+ $ options = ['http ' => ['timeout ' => 1 , 'method ' => 'GET ' , 'header ' => "User-Agent: DOMjudge# " . $ this ->domjudgeInstallMethod . "/ " . $ this ->localVersionString . "\r\n" ]];
1721+ $ context = stream_context_create ($ options );
1722+ $ response = @file_get_contents ($ versionUrl , false , $ context );
1723+ if ($ response === false ) {
1724+ return false ;
1725+ }
1726+ // Assume we get a one-level unordered JSON list with the released versions e.g. ["10.0.0", "9.11.0", "12.0.12", "10.0.1"]
1727+ $ tmp_versions = json_decode ($ response , true );
1728+ natsort ($ tmp_versions );
1729+ return array_reverse ($ tmp_versions );
1730+ }
1731+
17111732 /**
17121733 * Returns either the next strictly higher version or false when nothing is found/requested.
17131734 */
@@ -1718,29 +1739,19 @@ public function checkNewVersion(): string|false {
17181739 // The local version is something like "x.y.z / commit hash", e.g. "8.4.0DEV/4e25adb13" for development
17191740 // or 8.3.2 for a released version
17201741 // In case of development we remove the commit hash for some anonymity but keep the DEV to not count those as the (possibly) released version
1721- $ localVersionString = strtok ($ this ->domjudgeVersion , "/ " );
1722- $ localVersion = explode (". " , $ localVersionString );
1742+ $ this -> localVersionString = ( string ) strtok ($ this ->domjudgeVersion , "/ " );
1743+ $ localVersion = explode (". " , $ this -> localVersionString );
17231744 if (count ($ localVersion ) !== 3 ) {
17241745 // Unknown version, someone might have locally modified and used their own versioning
17251746 return false ;
17261747 }
17271748
17281749 $ cache = new FilesystemAdapter ();
1729- $ versions = $ cache ->get ('domjudge_versions ' , function (ItemInterface $ item , string $ localVersionString ): string |false {
1730- $ item ->expiresAfter (86400 );
1731-
1732- $ versionUrl = 'https://versions.domjudge.org ' ;
1733- $ options = ['http ' => ['timeout ' => 1 , 'method ' => 'GET ' , 'header ' => "User-Agent: DOMjudge# " . $ this ->domjudgeInstallMethod . "/ " . $ localVersionString . "\r\n" ]];
1734- $ context = stream_context_create ($ options );
1735- $ response = @file_get_contents ($ versionUrl , false , $ context );
1736- if ($ response === false ) {
1737- return false ;
1738- }
1739- // Assume we get a one-level unordered JSON list with the released versions e.g. ["10.0.0", "9.11.0", "12.0.12", "10.0.1"]
1740- $ tmp_versions = json_decode ($ response , true );
1741- natsort ($ tmp_versions );
1742- return array_reverse ($ tmp_versions );
1743- });
1750+ try {
1751+ $ versions = $ cache ->get ('domjudge_versions ' , [$ this , 'cacher_checkNewVersion ' ]);
1752+ } catch (InvalidArgumentException $ e ) {
1753+ return false ;
1754+ }
17441755
17451756 if (!$ versions ) {
17461757 return false ;
0 commit comments