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 AMReX 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 AMReX.
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 ############################################################
# AMReX development HEAD
amrex_gh = requests.get('https://api.github.com/repos/AMReX-Codes/amrex/commits/development')
amrex_HEAD = amrex_gh.json()["sha"]
# WarpX references to AMReX: cmake/dependencies/AMReX.cmake
amrex_cmake_path = str(REPO_DIR.joinpath("cmake/dependencies/AMReX.cmake"))
# branch/commit/tag (git fetcher) version
# set(WarpX_amrex_branch "development" ...
amrex_branch = f"unknown (format issue in {amrex_cmake_path})"
with open(amrex_cmake_path, encoding='utf-8') as f:
r_minimal = re.findall(r'.*set\(WarpX_amrex_branch\s+"(.+)"\s+.*',
f.read(), re.MULTILINE)
if len(r_minimal) >= 1:
amrex_branch = r_minimal[0]
# minimal (external) version
# find_package(AMReX YY.MM CONFIG ...
amrex_minimal = f"unknown (format issue in {amrex_cmake_path})"
with open(amrex_cmake_path, encoding='utf-8') as f:
r_minimal = re.findall(r'.*find_package\(AMReX\s+(.+)\s+CONFIG\s+.*',
f.read(), re.MULTILINE)
if len(r_minimal) >= 1:
amrex_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 AMReX:\n""")
print(f"Currently, WarpX builds against this AMReX commit/branch/sha: {amrex_branch}")
print(f"AMReX HEAD commit (development branch): {amrex_HEAD}")
amrex_new_branch = input(f"Update AMReX commit/branch/sha: ").strip()
if not amrex_new_branch:
amrex_new_branch = amrex_branch
print(f"--> Nothing entered, will keep: {amrex_branch}")
print()
print(f"Currently, a pre-installed AMReX is required at least at version: {amrex_minimal}")
today = datetime.date.today().strftime("%y.%m")
amrex_new_minimal = input(f"New minimal AMReX version (e.g. {today})? ").strip()
if not amrex_new_minimal:
amrex_new_minimal = amrex_minimal
print(f"--> Nothing entered, will keep: {amrex_minimal}")
print()
print(f"New AMReX commit/branch/sha: {amrex_new_branch}")
print(f"New minimal AMReX version: {amrex_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 amrex && git checkout COMMIT_TAG_OR_BRANCH && cd -
run_test_content = re.sub(
r'(.*cd\s+amrex.+git checkout\s+--detach\s+)(.+)(\s+&&\s.*)',
r'\g<1>{}\g<3>'.format(amrex_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['AMReX']['branch'].value = amrex_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['AMReX']['branch'].value = amrex_new_branch
cp.update_file()
# WarpX references to AMReX: cmake/dependencies/AMReX.cmake
with open(amrex_cmake_path, encoding='utf-8') as f:
amrex_cmake_content = f.read()
# branch/commit/tag (git fetcher) version
# set(WarpX_amrex_branch "development" ...
amrex_cmake_content = re.sub(
r'(.*set\(WarpX_amrex_branch\s+")(.+)("\s+.*)',
r'\g<1>{}\g<3>'.format(amrex_new_branch),
amrex_cmake_content, flags = re.MULTILINE)
# minimal (external) version
# find_package(AMReX YY.MM CONFIG ...
amrex_cmake_content = re.sub(
r'(.*find_package\(AMReX\s+)(.+)(\s+CONFIG\s+.*)',
r'\g<1>{}\g<3>'.format(amrex_new_minimal),
amrex_cmake_content, flags = re.MULTILINE)
with open(amrex_cmake_path, "w", encoding='utf-8') as f:
f.write(amrex_cmake_content)
# Epilogue ####################################################################
print("""Done. Please check your source, e.g. via
git diff
now and commit the changes if no errors occurred.""")
|