Spaces:
Paused
Paused
| import re | |
| import subprocess | |
| import sys | |
| from mainLogic.utils.process import shell | |
| from mainLogic.utils.glv import Global | |
| from mainLogic.error import errorList | |
| from mainLogic.utils.glv_var import vars, debugger | |
| defaults = [ | |
| "defaults.json", | |
| "defaults.linux.json" | |
| ] | |
| UPDATE_CHECK_CODE = 'git fetch --dry-run --verbose' | |
| UNTRACK_DEFAULTS = f'git update-index --no-skip-worktree {" ".join(defaults)}' | |
| def check_git_availability(): | |
| """Check if Git is available.""" | |
| try: | |
| subprocess.run(['git', '--version'], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
| except subprocess.CalledProcessError: | |
| debugger.error("Git is not available. Please install Git to use this script.") | |
| sys.exit(errorList["gitNotAvailable"]["code"]) | |
| def check_for_updates(): | |
| """Check for updates.""" | |
| debugger.success("Checking for updates...") | |
| check_git_availability() | |
| code, output = shell(UPDATE_CHECK_CODE.split(), return_out=True, cwd=vars["$script"]) | |
| output = "\n".join(output) | |
| # Simplify pattern for detecting "up to date" status | |
| if re.search(r"up to date", output, re.MULTILINE): | |
| return False | |
| return True | |
| def run_git_command(args): | |
| """Helper function to run Git commands and return output.""" | |
| code, output = shell(args, return_out=True, cwd=vars["$script"]) | |
| output = "\n".join(output) | |
| return code, output | |
| def pull_latest_changes(): | |
| """Pull the latest changes from the remote repository.""" | |
| debugger.success("Pulling the latest changes from the remote repository...") | |
| code, output = run_git_command(["git", "pull"]) | |
| debugger.success(output) | |
| return code | |
| def untrack_defaults(): | |
| """Untrack the default files.""" | |
| debugger.success("Untracking defaults...") | |
| return run_git_command(UNTRACK_DEFAULTS.split()) | |
| def stash_and_pull(): | |
| """Stash local changes and pull the latest changes.""" | |
| debugger.success("Stashing local changes...") | |
| code, output = run_git_command(["git", "stash"]) | |
| if code == 0: | |
| debugger.success("Successfully stashed changes. Pulling latest changes...") | |
| return pull_latest_changes() | |
| else: | |
| debugger.error("Failed to stash changes. Exiting...") | |
| sys.exit(errorList["gitStashError"]["code"]) | |
| def main(): | |
| if check_for_updates(): | |
| untrack_defaults() | |
| code = pull_latest_changes() | |
| if code == 0: | |
| debugger.success("Please restart the script.") | |
| else: | |
| debugger.error(f"Error occurred while pulling the latest changes (exit code {code}).") | |
| answer = input("Do you want to stash your changes and try pulling again? (y/n): ").strip().lower() | |
| if answer == 'y': | |
| stash_code = stash_and_pull() | |
| if stash_code == 0: | |
| debugger.success("Please restart the script.") | |
| else: | |
| debugger.error("Failed to pull after stashing. Exiting...") | |
| sys.exit(errorList["gitPullError"]["code"]) | |
| else: | |
| debugger.error("User opted not to stash changes. Exiting...") | |
| sys.exit(errorList["gitPullError"]["code"]) | |
| else: | |
| debugger.success("No updates found.") | |
| sys.exit(errorList["noError"]["code"]) | |
| def get_latest_origin_hash(): | |
| """Get the latest origin commit hash.""" | |
| debugger.success("Getting the latest origin hash...") | |
| code, output = run_git_command(["git", "ls-remote", "origin", "HEAD"]) | |
| commit_hash = output.split()[0] | |
| debugger.success(f"Latest origin hash: {commit_hash}") | |
| return commit_hash | |
| def parse_git_log(log_data): | |
| """Parse Git log output.""" | |
| commit_info = {} | |
| lines = log_data.splitlines() | |
| for line in lines: | |
| line = line.strip() | |
| if line.startswith('commit'): | |
| commit_info['commit'] = line.split(' ')[1].strip() | |
| elif line.startswith('Author'): | |
| commit_info['author'] = line.split('Author: ')[1].strip() | |
| elif line.startswith('Date'): | |
| commit_info['date'] = line.split('Date: ')[1].strip() | |
| elif line and not line.startswith(('commit', 'Author', 'Date')): | |
| commit_info['message'] = line.strip() | |
| return commit_info | |
| def get_info_by_commit_hash(commit_hash): | |
| """Get information for a specific commit.""" | |
| debugger.success(f"Getting information for commit: {commit_hash}") | |
| code, output = run_git_command(["git", "log", "-1", commit_hash]) | |
| commit_info = parse_git_log(output) | |
| debugger.success(commit_info) | |
| return commit_info | |
| if __name__ == "__main__": | |
| main() | |