1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
#!/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
try:
from configupdater import ConfigUpdater
except ImportError:
print("Warning: Cannot update .ini files without 'configupdater'")
print("Consider running 'python -m pip install configupdater'")
ConfigUpdater = None
sys.exit(1)
# 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
# cd picsar && git checkout COMMIT_TAG_OR_BRANCH && cd -
run_test_content = re.sub(
r'(.*cd\s+picsar.+git checkout\s+--detach\s+)(.+)(\s+&&\s.*)',
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)
if ConfigUpdater is not None:
# WarpX-tests.ini
tests_ini_path = str(REPO_DIR.joinpath("Regression/WarpX-tests.ini"))
cp = ConfigUpdater()
cp.optionxform = str
cp.read(tests_ini_path)
cp['extra-PICSAR']['branch'].value = PICSAR_new_branch
cp.update_file()
# WarpX-GPU-tests.ini
tests_gpu_ini_path = str(REPO_DIR.joinpath("Regression/WarpX-GPU-tests.ini"))
cp = ConfigUpdater()
cp.optionxform = str
cp.read(tests_gpu_ini_path)
cp['extra-PICSAR']['branch'].value = PICSAR_new_branch
cp.update_file()
# 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.""")
|