text: #!/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 sys
  
  import requests
  
  # 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 #####################################################################
  
  # 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.""")
  