#!/usr/bin/env python3 # # Copyright 2021 Axel Huebl # # This file is part of WarpX. # # This file is a maintainer tool to bump the PICSAR version that we pull in # when building WarpX. # import datetime from pathlib import Path import re import requests import sys # Maintainer Inputs ########################################################### print("""Hi there, this is a WarpX maintainer tool to update the source code of WarpX to a new commit/release of PICSAR. For it to work, you need write access on the source directory and you should be working in a clean git branch without ongoing rebase/merge/conflict resolves and without unstaged changes.""") # check source dir REPO_DIR = Path(__file__).parent.parent.parent.absolute() print(f"\nYour current source directory is: {REPO_DIR}") REPLY = input("Are you sure you want to continue? [y/N] ") print() if not REPLY in ["Y", "y"]: print("You did not confirm with 'y', aborting.") sys.exit(1) # Current Versions ############################################################ # PICSAR development HEAD PICSAR_gh = requests.get('https://api.github.com/repos/ECP-WarpX/picsar/commits/development') PICSAR_HEAD = PICSAR_gh.json()["sha"] # WarpX references to PICSAR: cmake/dependencies/PICSAR.cmake PICSAR_cmake_path = str(REPO_DIR.joinpath("cmake/dependencies/PICSAR.cmake")) # branch/commit/tag (git fetcher) version # set(WarpX_picsar_branch "development" ... PICSAR_branch = f"unknown (format issue in {PICSAR_cmake_path})" with open(PICSAR_cmake_path, encoding='utf-8') as f: r_minimal = re.findall(r'.*set\(WarpX_picsar_branch\s+"(.+)"\s+.*', f.read(), re.MULTILINE) if len(r_minimal) >= 1: PICSAR_branch = r_minimal[0] # minimal (external) version # find_package(PICSAR YY.MM CONFIG ... PICSAR_minimal = f"unknown (format issue in {PICSAR_cmake_path})" with open(PICSAR_cmake_path, encoding='utf-8') as f: r_minimal = re.findall(r'.*find_package\(PICSAR\s+(.+)\s+CONFIG\s+.*', f.read(), re.MULTILINE) if len(r_minimal) >= 1: PICSAR_minimal = r_minimal[0] # Ask for new ################################################################# print("""We will now run a few sed commands on your source directory. Please answer the following questions about the version number you want to require from PICSAR:\n""") print(f"Currently, WarpX builds against this PICSAR commit/branch/sha: {PICSAR_branch}") print(f"PICSAR HEAD commit (development branch): {PICSAR_HEAD}") PICSAR_new_branch = input(f"Update PICSAR commit/branch/sha: ").strip() if not PICSAR_new_branch: PICSAR_new_branch = PICSAR_branch print(f"--> Nothing entered, will keep: {PICSAR_branch}") print() print(f"Currently, a pre-installed PICSAR is required at least at version: {PICSAR_minimal}") today = datetime.date.today().strftime("%y.%m") PICSAR_new_minimal = input(f"New minimal PICSAR version (e.g. {today})? ").strip() if not PICSAR_new_minimal: PICSAR_new_minimal = PICSAR_minimal print(f"--> Nothing entered, will keep: {PICSAR_minimal}") print() print(f"New PICSAR commit/branch/sha: {PICSAR_new_branch}") print(f"New minimal PICSAR version: {PICSAR_new_minimal}\n") REPLY = input("Is this information correct? Will now start updating! [y/N] ") print() if not REPLY in ["Y", "y"]: print("You did not confirm with 'y', aborting.") sys.exit(1) # Updates ##################################################################### # run_test.sh (used also for Azure Pipelines) run_test_path = str(REPO_DIR.joinpath("run_test.sh")) with open(run_test_path, encoding='utf-8') as f: run_test_content = f.read() # branch/commit/tag (git fetcher) version # git clone --branch development https://github.com/PICSAR-Codes/PICSAR.git run_test_content = re.sub( r'(.*git\s+clone\s+\-\-branch\s+)(.+)(\s+https://github\.com/ECP\-WarpX/picsar\.git)', r'\g<1>{}\g<3>'.format(PICSAR_new_branch), run_test_content, flags = re.MULTILINE) with open(run_test_path, "w", encoding='utf-8') as f: f.write(run_test_content) # WarpX references to PICSAR: cmake/dependencies/PICSAR.cmake with open(PICSAR_cmake_path, encoding='utf-8') as f: PICSAR_cmake_content = f.read() # branch/commit/tag (git fetcher) version # set(WarpX_picsar_branch "development" ... PICSAR_cmake_content = re.sub( r'(.*set\(WarpX_picsar_branch\s+")(.+)("\s+.*)', r'\g<1>{}\g<3>'.format(PICSAR_new_branch), PICSAR_cmake_content, flags = re.MULTILINE) # minimal (external) version # find_package(PICSAR YY.MM CONFIG ... PICSAR_cmake_content = re.sub( r'(.*find_package\(PICSAR\s+)(.+)(\s+CONFIG\s+.*)', r'\g<1>{}\g<3>'.format(PICSAR_new_minimal), PICSAR_cmake_content, flags = re.MULTILINE) with open(PICSAR_cmake_path, "w", encoding='utf-8') as f: f.write(PICSAR_cmake_content) # Epilogue #################################################################### print("""Done. Please check your source, e.g. via git diff now and commit the changes if no errors occurred.""")