From 8c3b8742326951e7ed700aa2b257fe306d36367b Mon Sep 17 00:00:00 2001 From: Amirkeivan Mohtashami Date: Sun, 27 Jul 2025 22:48:57 +0200 Subject: [PATCH 1/3] guess language based on available languages in the contest --- cms/grading/languagemanager.py | 4 +++- cmscontrib/AddSubmission.py | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cms/grading/languagemanager.py b/cms/grading/languagemanager.py index 7f008660b6..8fb7c2882a 100644 --- a/cms/grading/languagemanager.py +++ b/cms/grading/languagemanager.py @@ -50,7 +50,7 @@ def get_language(name: str) -> Language: return _BY_NAME[name] -def filename_to_language(filename: str) -> Language | None: +def filename_to_language(filename: str, available_languages: list[Language] | None=None) -> Language | None: """Return one of the languages inferred from the given filename. filename: the file to test. @@ -59,6 +59,8 @@ def filename_to_language(filename: str) -> Language | None: matching the given filename, or None if none match. """ + if available_languages is None: + available_languages = LANGUAGES ext_index = filename.rfind(".") if ext_index == -1: return None diff --git a/cmscontrib/AddSubmission.py b/cmscontrib/AddSubmission.py index 41aca34955..118b9ed9ab 100755 --- a/cmscontrib/AddSubmission.py +++ b/cmscontrib/AddSubmission.py @@ -46,7 +46,7 @@ def maybe_send_notification(submission_id: int): rs.disconnect() -def language_from_submitted_files(files: dict[str, str]) -> Language | None: +def language_from_submitted_files(files: dict[str, str], contest_languages: list[Language]) -> Language | None: """Return the language inferred from the submitted files. files: dictionary mapping the expected filename to a path in @@ -61,7 +61,7 @@ def language_from_submitted_files(files: dict[str, str]) -> Language | None: # TODO: deduplicate with the code in SubmitHandler. language = None for filename in files.keys(): - this_language = filename_to_language(files[filename]) + this_language = filename_to_language(files[filename], contest_languages) if this_language is None and ".%l" in filename: raise ValueError( "Cannot recognize language for file `%s'." % filename) @@ -126,7 +126,11 @@ def add_submission( if given_language is not None: language = get_language(given_language) else: - language = language_from_submitted_files(files) + contest_languages = [ + get_language(language) + for language in task.contest.languages + ] + language = language_from_submitted_files(files, contest_languages) except ValueError as e: logger.critical(e) return False From 6b137cee6b99a4de189e1fe5093596e24d561988 Mon Sep 17 00:00:00 2001 From: Amirkeivan Mohtashami Date: Sun, 27 Jul 2025 23:24:00 +0200 Subject: [PATCH 2/3] fix --- cms/grading/languagemanager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cms/grading/languagemanager.py b/cms/grading/languagemanager.py index 8fb7c2882a..9fd6b75962 100644 --- a/cms/grading/languagemanager.py +++ b/cms/grading/languagemanager.py @@ -66,8 +66,12 @@ def filename_to_language(filename: str, available_languages: list[Language] | No return None ext = filename[ext_index:] names = sorted(language.name - for language in LANGUAGES + for language in available_languages if ext in language.source_extensions) + if len(names) == 0: + names = sorted(language.name + for language in LANGUAGES + if ext in language.source_extensions) return None if len(names) == 0 else get_language(names[0]) From 77d4d68d49de6e2eb77e482fecf2db5de727e451 Mon Sep 17 00:00:00 2001 From: Amirkeivan Mohtashami Date: Sun, 27 Jul 2025 23:26:51 +0200 Subject: [PATCH 3/3] don't revert to all languages unless lang is explicitly given --- cms/grading/languagemanager.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cms/grading/languagemanager.py b/cms/grading/languagemanager.py index 9fd6b75962..097dc0adc2 100644 --- a/cms/grading/languagemanager.py +++ b/cms/grading/languagemanager.py @@ -68,10 +68,6 @@ def filename_to_language(filename: str, available_languages: list[Language] | No names = sorted(language.name for language in available_languages if ext in language.source_extensions) - if len(names) == 0: - names = sorted(language.name - for language in LANGUAGES - if ext in language.source_extensions) return None if len(names) == 0 else get_language(names[0])