From 77d6bb2d8cbc6f9d56cebe1616f36324da039d8d Mon Sep 17 00:00:00 2001 From: KernelDeimos Date: Wed, 29 Jan 2025 10:31:58 -0500 Subject: [PATCH] dev: always select highest version of the specified language --- .../src/modules/puterexec/Judge0Service.js | 5 ++- src/backend/src/util/versionutil.js | 33 +++++++++++++++++++ src/backend/src/util/versionutil.test.js | 18 ++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/backend/src/util/versionutil.js create mode 100644 src/backend/src/util/versionutil.test.js diff --git a/src/backend/src/modules/puterexec/Judge0Service.js b/src/backend/src/modules/puterexec/Judge0Service.js index 6c0d9fd57..a7d067225 100644 --- a/src/backend/src/modules/puterexec/Judge0Service.js +++ b/src/backend/src/modules/puterexec/Judge0Service.js @@ -2,6 +2,7 @@ const putility = require("@heyputer/putility"); const BaseService = require("../../services/BaseService"); const { Judge0Client } = require("./Judge0Client"); const { Context } = require("../../util/context"); +const { find_highest_version } = require("../../util/versionutil"); class Judge0Service extends BaseService { _construct () { @@ -46,7 +47,9 @@ class Judge0Service extends BaseService { return lang.judge0_id; } } - let lang = this.languages.find((lang) => lang.language === runtime); + const matchingLangs = this.languages.filter((lang) => lang.language === runtime); + const lang = find_highest_version(matchingLangs); + if ( lang ) { return lang.judge0_id; } diff --git a/src/backend/src/util/versionutil.js b/src/backend/src/util/versionutil.js new file mode 100644 index 000000000..c86f106d7 --- /dev/null +++ b/src/backend/src/util/versionutil.js @@ -0,0 +1,33 @@ +/** + * Select the object with the highest version. + * Objects are of the form: + * { version: '1.2.0' } + * + * Semver is assumed. + * + * @param {*} objects + */ +const find_highest_version = (objects) => { + let highest = [0,0,0]; + let highest_obj = null; + + for ( const obj of objects ) { + const parts = obj.version.split('.'); + for ( let i = 0; i < 3; i++ ) { + const part = parseInt(parts[i]); + if ( part > highest[i] ) { + highest = parts; + highest_obj = obj; + break; + } else if ( part < highest[i] ) { + break; + }1 + } + } + + return highest_obj; +}; + +module.exports = { + find_highest_version, +}; diff --git a/src/backend/src/util/versionutil.test.js b/src/backend/src/util/versionutil.test.js new file mode 100644 index 000000000..b8ac38b10 --- /dev/null +++ b/src/backend/src/util/versionutil.test.js @@ -0,0 +1,18 @@ +const { expect } = require('chai'); + +describe('versionutil', () => { + it('works', () => { + const objects = [ + { version: '1.2.0' }, + { version: '3.0.2' }, + { version: '1.2.1' }, + { version: '1.2.0' }, + { version: '3.1.0', h: true }, + { version: '1.2.2' }, + ]; + + const { find_highest_version } = require('./versionutil'); + const highest_object = find_highest_version(objects); + expect(highest_object).to.deep.equal({ version: '3.1.0', h: true }); + }); +}); \ No newline at end of file