forked from JOJ/Joint-Teapot
		
	feat: file lock on git operation
This commit is contained in:
		
							parent
							
								
									afb5d82421
								
							
						
					
					
						commit
						940112e696
					
				|  | @ -3,6 +3,7 @@ from datetime import datetime | |||
| from pathlib import Path | ||||
| from typing import List | ||||
| 
 | ||||
| from filelock import FileLock | ||||
| from git import Repo | ||||
| from typer import Argument, Option, Typer, echo | ||||
| 
 | ||||
|  | @ -249,34 +250,40 @@ def joj3_scoreboard( | |||
|     logger.info(f"debug log to file: {settings.log_file_path}") | ||||
|     if joj3.check_skipped(score_file_path, "skip-scoreboard"): | ||||
|         return | ||||
|     repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") | ||||
|     repo: Repo = tea.pot.git.get_repo(repo_name) | ||||
|     if "grading" not in repo.remote().refs: | ||||
|         logger.error( | ||||
|             '"grading" branch not found in remote, create and push it to origin first.' | ||||
|     lock = FileLock( | ||||
|         settings.joj3_lock_file_path, timeout=settings.joj3_lock_file_timeout | ||||
|     ) | ||||
|     with lock.acquire(): | ||||
|         repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") | ||||
|         repo: Repo = tea.pot.git.get_repo(repo_name) | ||||
|         if "grading" not in repo.remote().refs: | ||||
|             logger.error( | ||||
|                 '"grading" branch not found in remote, create and push it to origin first.' | ||||
|             ) | ||||
|             return | ||||
|         if "grading" not in repo.branches: | ||||
|             logger.error('"grading" branch not found in local, create it first.') | ||||
|             return | ||||
|         repo.git.reset("--hard", "origin/grading") | ||||
|         joj3.generate_scoreboard( | ||||
|             score_file_path, | ||||
|             submitter, | ||||
|             os.path.join(repo_path, scoreboard_file_name), | ||||
|             exercise_name, | ||||
|         ) | ||||
|         actions_link = ( | ||||
|             f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|             + f"{settings.gitea_org_name}/{submitter_repo_name}/" | ||||
|             + f"actions/runs/{run_number}" | ||||
|         ) | ||||
|         commit_message = ( | ||||
|             f"joj3: update scoreboard by @{submitter} in " | ||||
|             + f"{settings.gitea_org_name}/{submitter_repo_name}@{commit_hash}\n\n" | ||||
|             + f"gitea actions link: {actions_link}" | ||||
|         ) | ||||
|         tea.pot.git.add_commit_and_push( | ||||
|             repo_name, [scoreboard_file_name], commit_message | ||||
|         ) | ||||
|         return | ||||
|     if "grading" not in repo.branches: | ||||
|         logger.error('"grading" branch not found in local, create it first.') | ||||
|         return | ||||
|     repo.git.reset("--hard", "origin/grading") | ||||
|     joj3.generate_scoreboard( | ||||
|         score_file_path, | ||||
|         submitter, | ||||
|         os.path.join(repo_path, scoreboard_file_name), | ||||
|         exercise_name, | ||||
|     ) | ||||
|     actions_link = ( | ||||
|         f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|         + f"{settings.gitea_org_name}/{submitter_repo_name}/" | ||||
|         + f"actions/runs/{run_number}" | ||||
|     ) | ||||
|     commit_message = ( | ||||
|         f"joj3: update scoreboard by @{submitter} in " | ||||
|         + f"{settings.gitea_org_name}/{submitter_repo_name}@{commit_hash}\n\n" | ||||
|         + f"gitea actions link: {actions_link}" | ||||
|     ) | ||||
|     tea.pot.git.add_commit_and_push(repo_name, [scoreboard_file_name], commit_message) | ||||
| 
 | ||||
| 
 | ||||
| @app.command( | ||||
|  | @ -318,43 +325,47 @@ def joj3_failed_table( | |||
|     logger.info(f"debug log to file: {settings.log_file_path}") | ||||
|     if joj3.check_skipped(score_file_path, "skip-failed-table"): | ||||
|         return | ||||
|     repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") | ||||
|     repo: Repo = tea.pot.git.get_repo(repo_name) | ||||
|     if "grading" not in repo.remote().refs: | ||||
|         logger.error( | ||||
|             '"grading" branch not found in remote, create and push it to origin first.' | ||||
|     lock = FileLock( | ||||
|         settings.joj3_lock_file_path, timeout=settings.joj3_lock_file_timeout | ||||
|     ) | ||||
|     with lock.acquire(): | ||||
|         repo_path = tea.pot.git.repo_clean_and_checkout(repo_name, "grading") | ||||
|         repo: Repo = tea.pot.git.get_repo(repo_name) | ||||
|         if "grading" not in repo.remote().refs: | ||||
|             logger.error( | ||||
|                 '"grading" branch not found in remote, create and push it to origin first.' | ||||
|             ) | ||||
|             return | ||||
|         if "grading" not in repo.branches: | ||||
|             logger.error('"grading" branch not found in local, create it first.') | ||||
|             return | ||||
|         repo.git.reset("--hard", "origin/grading") | ||||
|         submitter_repo_link = ( | ||||
|             f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|             + f"{settings.gitea_org_name}/{submitter_repo_name}" | ||||
|         ) | ||||
|         actions_link = ( | ||||
|             f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|             + f"{settings.gitea_org_name}/{submitter_repo_name}/" | ||||
|             + f"actions/runs/{run_number}" | ||||
|         ) | ||||
|         joj3.generate_failed_table( | ||||
|             score_file_path, | ||||
|             submitter_repo_name, | ||||
|             submitter_repo_link, | ||||
|             os.path.join(repo_path, failed_table_file_name), | ||||
|             actions_link, | ||||
|         ) | ||||
|         commit_message = ( | ||||
|             f"joj3: update failed table by @{submitter} in " | ||||
|             + f"{settings.gitea_org_name}/{submitter_repo_name}@{commit_hash}\n\n" | ||||
|             + f"gitea actions link: {actions_link}" | ||||
|         ) | ||||
|         tea.pot.git.add_commit_and_push( | ||||
|             repo_name, | ||||
|             [failed_table_file_name], | ||||
|             commit_message, | ||||
|         ) | ||||
|         return | ||||
|     if "grading" not in repo.branches: | ||||
|         logger.error('"grading" branch not found in local, create it first.') | ||||
|         return | ||||
|     repo.git.reset("--hard", "origin/grading") | ||||
|     submitter_repo_link = ( | ||||
|         f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|         + f"{settings.gitea_org_name}/{submitter_repo_name}" | ||||
|     ) | ||||
|     actions_link = ( | ||||
|         f"https://{settings.gitea_domain_name}{settings.gitea_suffix}/" | ||||
|         + f"{settings.gitea_org_name}/{submitter_repo_name}/" | ||||
|         + f"actions/runs/{run_number}" | ||||
|     ) | ||||
|     joj3.generate_failed_table( | ||||
|         score_file_path, | ||||
|         submitter_repo_name, | ||||
|         submitter_repo_link, | ||||
|         os.path.join(repo_path, failed_table_file_name), | ||||
|         actions_link, | ||||
|     ) | ||||
|     commit_message = ( | ||||
|         f"joj3: update failed table by @{submitter} in " | ||||
|         + f"{settings.gitea_org_name}/{submitter_repo_name}@{commit_hash}\n\n" | ||||
|         + f"gitea actions link: {actions_link}" | ||||
|     ) | ||||
|     tea.pot.git.add_commit_and_push( | ||||
|         repo_name, | ||||
|         [failed_table_file_name], | ||||
|         commit_message, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @app.command( | ||||
|  |  | |||
|  | @ -35,9 +35,13 @@ class Settings(BaseSettings): | |||
|         "charlem", | ||||
|     ] | ||||
| 
 | ||||
|     # sid | ||||
|     # joj | ||||
|     joj_sid: str = "" | ||||
| 
 | ||||
|     # joj3 | ||||
|     joj3_lock_file_path: str = ".git/teapot.lock" | ||||
|     joj3_lock_file_timeout: int = 30 | ||||
| 
 | ||||
|     # log file | ||||
|     log_file_path: str = "joint-teapot.log" | ||||
|     stderr_log_level: str = "INFO" | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| canvasapi>=2.2.0 | ||||
| colorama>=0.4.6 | ||||
| filelock>=3.14.0 | ||||
| focs_gitea>=1.22.0 | ||||
| GitPython>=3.1.18 | ||||
| joj-submitter>=0.0.8 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user