Difference between revisions of "Release Process"

From Einstein Toolkit Documentation
Jump to: navigation, search
(remove spurious python3 fom command to get ZENODO access token)
(update Zenodo instructions)
 
(151 intermediate revisions by 5 users not shown)
Line 3: Line 3:
 
This page describes the release process in some detail.  Getting a release out of the door without embarrassing oversights requires a bit more planning and care than one would like.
 
This page describes the release process in some detail.  Getting a release out of the door without embarrassing oversights requires a bit more planning and care than one would like.
  
TODO: reformat this page as a checklist which can be marked up for each release as each item is addressed
+
== Timeline for a release and estimated time required ==
  
==Long-term planning==
+
# Form a release coordination team ('''6 months''') (''<span style="background:yellow">part of ET calls</span>'')
 +
## a release coordinator
 +
## a release coordinator assistant, who may be the release coordinator for the next release
 +
## the former release coordinator to help out
 +
## test runner(s) who will run the testsuites on the list of supported machines
 +
## gallery runners for gallery examples
 +
## final list may include others contributing directly to the release process
 +
# Come up with release timeline (by translating the last release timeline forward in time), see ('''5 months''') (''<span style="background:yellow">30 minutes</span>''), see https://docs.einsteintoolkit.org/et-docs/Release_Details#Schedule_for_ET_2020_05
 +
## Release coordinator needs write access to the following repos (or must arrange all needed changes with a repo maintainer)
 +
### https://bitbucket.org/einsteintoolkit
 +
### https://github.com/nds-org/jupyter-et.git
 +
### https://github.com/einsteintoolkit/simfactory2-www
 +
## Frequently remind participants of timeline (''<span style="background:yellow">part of ET calls</span>'')
 +
## Begin discussions on the mailing list, reminding people to look at test cases, review patches etc. (''<span style="background:yellow">5 minutes per week</span>'')
 +
# Choose features which are going to be included, and those which won't be included ('''4 months''')
 +
## ask for review volunteers, assign tasks to people (part of ET calls) e.g. https://docs.einsteintoolkit.org/et-docs/Meeting_agenda#2020-09-10
 +
## create tickets for each proposed item on https://trac.einsteintoolkit.org eg. https://bitbucket.org/einsteintoolkit/tickets/issues/2416
 +
## Decide on a list of release-critical compute systems eg XSEDE, LCCF, DOE, PRACE: http://einsteintoolkit.org/testsuite_results/index.php
 +
### get accounts for test runners
 +
# Drive review of thorns for code quality, documentation, test cases ('''continuously''')
 +
## Include positively reviewed and voted on items in main ET repositories
 +
## Remove new features without reviewer or negatively reviewed from list of new features
 +
## Frequently remind participants of timeline
 +
# Start testing on release-critical compute systems ('''2 months''') (''<span style="background:yellow">30 minutes per week per cluster</span>'' to compile, run, check, upload)
 +
## initially test to make sure clusters can still build code
 +
## test code as they become positively reviewed (code is present in master before final positive review)
 +
## report on test failures
 +
## assign found bugs to volunteers
 +
# Release preparation I ('''4 weeks''')
 +
## Announce feature freeze based on currently positively reviewed components
 +
### fix branch to use for kuibit to one of the tagged releases. TODO: add instructions on how to use that branch when creating ET branches
 +
## Collect list of new features, newsworthy items, and acknowledgements for release announcement on wiki (there’s a [https://docs.einsteintoolkit.org/et-docs/Release_Process#Changes_to_announce script] in the wiki to help with this) (''<span style="background:yellow">45 minutes</span>'')
 +
## Create Zenodo item ([https://docs.einsteintoolkit.org/et-docs/Release_Process#drafting_Zenodo_entry notes]) (''<span style="background:yellow">1 hour</span>'')
 +
### Send to maintainers@einsteintoolkit.org for review re typos etc.
 +
### Include in "do you want to be included" email to contributors.
 +
## Contact [https://docs.einsteintoolkit.org/et-docs/Release_Process#Contributors contributors] and [https://docs.einsteintoolkit.org/et-docs/Release_Process#Release_team release team] about permanent (contributors) and one-off (release team) inclusion in the ET author list (''<span style="background:yellow">10 minutes of work per author</span>'' to poke and prod them to respond). Include maintainers@einsteintoolkit.org in cc to have a record.
 +
## announce final member list of release team:
 +
::::* release coordinator(s)
 +
::::* test runner(s)
 +
::::* gallery example runner(s)
 +
::::* reviewer(s)
 +
::::* anyone putting in work specifically for the release
 +
## Draft release announcement (''<span style="background:yellow">1 hour</span>'')
 +
### send to maintainers@einsteintoolkit.org for review re typos etc.
 +
## Announce release date publicly
 +
# Release preparation II ('''1 week'''), detailed list of items and partial scripts at end of text
 +
## Finalize announcement draft (''<span style="background:yellow">1 hour</span>'')
 +
### Send to maintainers@einsteintoolkit.org for review re typos etc.
 +
## Update einsteintoolkit.bib (https://bitbucket.org/einsteintoolkit/manifest/src/master/) with
 +
### Update or add requested and suggested citations for all ET components in thorn list (''<span style="background:yellow">10 minutes</span>'').
 +
### Latest release info and DOI (from Zenodo entry above)
 +
### move requested-for for main ET cite (Zenodo)
 +
## Update version information in Makefile, the documentation tex files and Baikal documentation.tex file (''<span style="background:yellow">15 minutes</span>'')
 +
## [https://docs.einsteintoolkit.org/et-docs/Release_Process#regenerate_files Regenerate] all auto-generated files (''30 minutes of work'', plus time to wait for Kranc)
 +
## Create release branch and tag for all ET codes (''<span style="background:yellow">30 minutes</span>'')
 +
## Update websites in a branch (''<span style="background:yellow">2 hours</span>'')
 +
### EinsteinToolkit.org (https://docs.einsteintoolkit.org/et-docs/Editing_the_Einstein_Toolkit_website ; be sure to update the main page; then about/releases/ET_202X_YZ_announcement.md; then from that directory run `mk_release_announcements.py ET_202X_YZ_announcement.md` [you'll need to `pip install markdown` for this to work]; then be sure to `git add` and commit the new files.)
 +
### CactusCode.org (https://github.com/einsteintoolkit/www.cactuscode.org, see [https://docs.einsteintoolkit.org/et-docs/Release_Process#update-cactuscode below] for a script.
 +
### Simfactory.org (https://github.com/einsteintoolkit/simfactory2-www/ make life using https://simfactory.org/update.php)
 +
### CactusTutorial.ipynb (https://github.com:nds-org/jupyter-et.git)
 +
### update docker image for tutorial server [https://docs.einsteintoolkit.org/et-docs/Release_Process#update-tutorial-image script], but do not yet push
 +
# The release ('''0 days''')
 +
## make all updated branches live (''<span style="background:yellow">30 min</span>'')
 +
## push tutorial server docker image to Dockerhub (only Erik, Steve, Roland, Ian can do so)
 +
## announce on users@einsteintoolkit.org, news@cactuscode.org (''<span style="background:yellow">5 min</span>'')
 +
## http://hyperspace.uni-frankfurt.de/ based on previous release announcement (''<span style="background:yellow">15 min</span>'')
 +
## update Wikipedia Cactus entry https://en.wikipedia.org/wiki/Cactus_Framework (''<span style="background:yellow">5 min</span>'')
 +
## Run the testsuite using the release code on all supported machines (''<span style="background:yellow">30 min per cluster</span>'')
 +
## Update https://docs.einsteintoolkit.org/et-docs/Release_Process with lessons learned (''<span style="background:yellow">30 minutes</span>'')
  
A few months or weeks before the release:
+
== Helpful tools and notes ==
* Decide it is time to make another release
+
This section collects a handful of useful commands that may become critical
* form a release coordination team
+
to guarantee the quality of the release. The descriptions below are quite
** a release coordinator
+
technical and intended for the developers and maintainers only.
** a release coordinator assistant, who may be the release coordinator for the next release
+
 
** the former release coordinator to help out
+
=== add gallery runners ===
* Choose features which are going to be included, and those which won't be included
+
 
* Choose a tentative date
+
Gallery runners should be mentioned in their respective gallery example's ticket and should have the ticket assigned to them. This requires that they are a member of the Einstein Toolkit [https://bitbucket.org/einsteintoolkit/workspace/projects/ET bitbucket organization].
* Begin discussions on the mailing list, reminding people to look at test cases, review patches etc.
+
 
 +
* they must be invited to it using their email address on: https://bitbucket.org/einsteintoolkit/workspace/settings/groups
 +
* they should be made members of the the "All Members" and "gallery runners" groups. The former to be assigned the ticket, the latter to be able to upload files to the website repository and edit the web-pages
 +
* find the gallery ticket and use the "Edit" button to assign users
 +
** [https://bitbucket.org/einsteintoolkit/tickets/issues/2176/test-binary-neutron-star-example BNS]
 +
** [https://bitbucket.org/einsteintoolkit/tickets/issues/2172/test-binary-black-hole-gw150914-example BBH]
 +
** [https://bitbucket.org/einsteintoolkit/tickets/issues/2175/test-single-stable-neutron-star-example TOV]
 +
** [https://bitbucket.org/einsteintoolkit/tickets/issues/2174/test-multi-patch-scalar-wave-equation Scalar Wave]
 +
** [https://bitbucket.org/einsteintoolkit/tickets/issues/2173/test-poisson-equation-example Poisson Equation]
 +
* gallery examples should be run using the "master" branch of the toolkit, that will become the release branch, of manifest and thornlist
 +
* results should be archived in a tar archive as shown on https://bitbucket.org/einsteintoolkit/www/downloads/ and the archive name should include year, month and day of month YYYYMMDD following the pattern visible in the existing tar files. On ''macOS'' make sure to not include <code>__MACOSX</code> a folder. This is most easily achieved by using the command line <code>zip</code> tool and not a GUI tool or Finder (to be verified)
 +
* some archives are large and special tools are needed to upload them, this is described in the ticket for the example
 +
* after updating the archive, clone the website repo https://bitbucket.org/einsteintoolkit/www/src, edit the gallery page to point to the new archive file and update the "last run" line. Don't forget to update and add any images and plots you have regenerated. Verify the change by opening the html file in a local browsers. Commit and push to nmaster.
 +
 
 +
=== update developers.txt ===
 +
 
 +
Inside https://bitbucket.org/einsteintoolkit/www/src/master/ , you will find a developers.txt file, which needs to be updated with any new developers for this release. Any developers who helped with the last release but have not yet contributed code to the Toolkit need to be removed, and likewise any new folks who contributed to this release need to be added.
 +
 
 +
Here is a script for finding all code contributers to the Einstein Toolkit, ever. You will need this for the release announcement also.
 +
 
 +
for repo in */.git/.. ; do
 +
      (cd $repo && git shortlog $(git describe --tags --abbrev=0)..HEAD --summary --email) | perl -p -e 's/^\s*\d+\s*//'
 +
done | sort -u
 +
 
 +
After updating, run
 +
 
 +
  developers.py
 +
 
 +
Next, update zenodo.py. It contains the hard-coded information in between the <code>EDIT BELOW</code> and <code>EDIT ABOVE</code> tags.
 +
 
 +
  release_team = [
 +
    "Zachariah B. Etienne",
 +
    "Roland Haas",
 +
    "Steven R. Brandt",
 +
    "William E. Gabella",
 +
    "Peter Diener",
 +
    "Atul Kedia",
 +
    "Miguel Gracia",
 +
    ...
 +
  ]
 +
  contributers = [
 +
    "Roland Haas",
 +
    "Steven R. Brandt",
 +
    ...
 +
  ]
 +
  et_release = "ET_2021_05"
 +
  et_release_codename = "Lorentz"
 +
  et_description = ...
  
==Two months before the release==
+
Publish to the sandbox (following the steps below). Once that is done and reviewed, it can be published without --sandbox.
* Set up a wiki planning page for the release
 
* Review thorns for code quality, documentation, test cases
 
** Ask for review volunteers, assign tasks to people
 
** Remove new features without reviewer from list of new features
 
* Decide on a thorn list
 
* Choose a concrete date
 
  
==One months before the release==
+
=== drafting Zenodo entry ===
* Ask for example runner volunteers, assign tasks to people
 
* Update einsteinttoolkit.bib with requested and suggested citations for all thorns in thorn list
 
* Decide on a list of release-critical systems
 
* Collect list of new features, newsworthy items, and acknowledgements for release announcement on wiki
 
* Announce date publicly
 
  
==Two weeks before the release==
 
* feature freeze, no more new features accepted
 
* verify that gallery runs and example parfiles still work with new release
 
* contact contributors and example runners about permanent (contributors) and one-off (example runners) inclusion in the ET author list
 
* announce final member list of release team:
 
** release coordinator(s)
 
** test runner(s)
 
** gallery example runner(s)
 
** reviewer(s)
 
** anyone putting in work specifically for the release
 
* Draft release announcement
 
* set up draft Zenodo entry:
 
 
<pre>
 
<pre>
 
# get Steve Brandt's personal access token for zenodo.org
 
# get Steve Brandt's personal access token for zenodo.org
# create your own personal access token for sandbox.zenodo.org: https://sandbox.zenodo.org/account/settings/applications/tokens/new/
+
# create your own personal access token for sandbox.zenodo.org:
 +
# https://sandbox.zenodo.org/account/settings/applications/tokens/new/
 +
export ZENODO_ACCESS=STEVES_ZENODO_ACCESS_TOKEN
 +
export SANDBOX_ZENODO_ACCESS=YOUR_ZENODO_SANDBOX_ACCESS_TOKEN
  
# get data out of current Zenodo entry
 
export ZENODO_ACCESS=$(secret-tool lookup hostname https://zenodo.org username sbrandt@cct.lsu.edu)
 
python3 ./zenodo.py --list
 
 
# note down ID of "Einstein Toolkit" (will change each release)
 
# note down ID of "Einstein Toolkit" (will change each release)
python3 ./zenodo.py --id 3522086
+
ZENODO_ID=$(python3 ./zenodo.py --list | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')
mv zupload.py et-zupload.py
+
 
wget "https://zenodo.org/record/3522086/files/Definition.md?download=1" -O Definition.md
+
# This will generate Definition.md and zupload.py (metadata)
 +
python3 ./zenodo.py --id $ZENODO_ID --generate
 +
 
 +
# recreate current release in sandbox, note that zenodo.py will use
 +
# SANDBOX_ZENODO_ACCESS token and sanbox.zenodo.org when --sandbox is used.
 +
# note down ID of the deposit
 +
ZENODO_SANDBOX_ID=$(python3 ./zenodo.py --sandbox --create zupload.py | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')
 +
 
 +
# publish current release in sandbox
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --deposit Definition.md
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --publish
 +
 
 +
# now we make the new release
 +
 
 +
# Edit the lines in zenodo.py that are between the Edit Below/Edit Above comments.
 +
# This includes the release, the code name, the release team, etc.
 +
vi zenodo.py
 +
 
 +
# This will generate Definition.md and zupload.py (metadata)
 +
rm Definition.md zupload.py
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --generate
 +
 
 +
# create a new version in sandbox
 +
# and note down its id
 +
ZENODO_SANDBOX_ID=$(python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --newversion | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')
 +
 
 +
# upload updated metadata (zenodo.py)
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --upload
 +
 
 +
# deposit updated dummy file
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --deposit Definition.md
 +
# publish new version (cannot be undone)
 +
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --publish
 +
 
 +
# create a new version in real Zenodo but *do not* publish (yet)
 +
# and not down its id
 +
ZENODO_ID=$(python3 ./zenodo.py --id $ZENODO_ID --newversion)
 +
 
 +
echo "Zenodo ID is: $ZENODO_ID."
 +
echo "You MUST write down this ID since I will not be able to retrieve it later"
 +
 
 +
# generate metadata for actual Zenodo (different DOI!)
 +
rm Definition.md zupload.py
 +
python3 ./zenodo.py --id $ZENODO_ID --generate
 +
 
 +
# upload updated metadata (zenodo.py)
 +
python3 ./zenodo.py --id $ZENODO_ID --upload
 +
 
 +
# deposit updated dummy file
 +
python3 ./zenodo.py --id $ZENODO_ID --deposit Definition.md
 +
 
 +
# re-download and check what we think we deposited
 +
mv Definition.md Definition.md.bak
 +
python3 ./zenodo.py --id $ZENODO_ID --retrieve Definition.md
 +
diff --report-identical-files Definition.md.bak Definition.md
 +
 
 +
# get reserved DOI to use in bibtex file
 +
python3 ./zenodo.py --id $ZENODO_ID --show-doi
 +
</pre>
 +
 
 +
Send the Zenodo entry from the sandbox to [mailto:maintainers@einsteintoolkit.org maintainers@einsteintoolkit.org] for proofreading, include in "do you want to be included" email to contributors.
 +
 
 +
=== final Zenodo entry ===
 +
 
 +
This replicates the latter steps of the draft to create a new entry on the real Zenodo site. Do so *only* after the draft has been reviewed since it cannot be undone.
 +
 
 +
<pre>
 +
export ZENODO_ACCESS=STEVES_ZENODO_ACCESS_TOKEN
  
# recreate in sandbox
 
export ZENODO_ACCESS=$(secret-tool lookup hostname https://sandbox.zenodo.org username rhaas@illinois.edu)
 
python3 ./zenodo.py --sandbox --create et-zupload.py
 
 
# note down ID of newest (topmost) "Einstein Toolkit"
 
# note down ID of newest (topmost) "Einstein Toolkit"
python3 ./zenodo.py --sandbox --list
+
ZENODO_ID=$(python3 ./zenodo.py --list | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')
python3 ./zenodo.py --sandbox --id 587417 --deposit Definition.md
+
 
python3 ./zenodo.py --sandbox --id 587417 --publish
+
# publish new version (cannot be undone)
 +
python3 ./zenodo.py --id $ZENODO_ID --publish
 +
</pre>
  
# update metadata and dummy deposit file (file must change or Zenodo will reject the new version)
+
=== update version information ===
sed -i 's/ET_2019_10/ET_2020_05/;s/c32f345352864d88cb4fa6e649262d35da69a1a7/ET_2020_05_v0/g'  Definition.md
+
* update version information in <code>flesh/Makefile</code> in the <code>CCTK_VERSION_XXX</code> variables
python3 ./zenodo.py --sandbox --id 587417 --newversion
+
* update version information in  <code>flesh/doc/latex.sty</code> in the <code>\cactustitlepage</code> command
python3 ./zenodo.py --sandbox --list
+
<pre>
python3 ./zenodo.py --sandbox --id 587432 --deposit Definition.md
+
export CCTK_VERSION=Cactus_4.X.0
python3 ./zenodo.py --sandbox --id 587432 --upload
+
CCTK_VERSION_MINOR=$(echo $CCTK_VERSION | cut -f2 -d.)
python3 ./zenodo.py --sandbox --id 587432 --publish
+
sed -i "s/CCTK_VERSION_MINOR = .*/CCTK_VERSION_MINOR = $CCTK_VERSION_MINOR/" Makefile
 +
sed -i 's/\\cactustitlepage}\[4\]\[4\..*\]/\\cactustitlepage}[4][4.'$CCTK_VERSION_MINOR']/' doc/latex/cactus.sty
 +
git add Makefile doc/latex/cactus.sty
 +
git commit -m 'Cactus: update version in information in Makefile and docs'
 
</pre>
 
</pre>
  
==One or two days before the release==
+
* update wvuthorns/Baikal/doc/documentation.tex and wvuthorns/BaikalETK/doc/documentation.tex with git hash of nrpytutorial used to generate code. The hash is mentioned in the README file (see below for instructions).
* Have a telecon with the release team, discuss (and modify if necessary) release process and responsibilities
 
* Get a list of all repositories that are involved (including repositories for tools such as GetComponents)
 
* Publicly declare a freeze on all involved thorns and tools
 
* Ensure that any manually-generated files are consistent
 
** regenerate McLachlan, WeylScal4, CTThorns, and EinsteinExact from their source with the current version of Kranc
 
** generate the Cactus configure script
 
** generate the Cactus loop macros etc
 
** generate UsersGuide, ReferenceManual and MaintGuide pdf files
 
* Test all thorns on all systems, collect status reports on wiki
 
* verify that new users tutorial still works
 
* Update release planning wiki page with peoples', thorns', and systems' statuses
 
* Set up a (smaller) technical release team who will be available all day on the day of the release
 
  
==The release==
+
=== regenerate files ===
* Have the technical release team meet in the same room (brick, EVO, chat, phone)
+
* regenerate McLachlan, WeylScal4, CTThorns, and EinsteinExact from their source with the current version of Kranc by running <code>make -j NJOBS</code> in their respective <code>m</code> directory.
* Briefly re-check status of thorns and machines
+
* check that BaikalVaccum and Baikal can be regenerated using the nrpytutorial hash listed in their README file using <code>cd BaikalETK && make</code>
* Possibly disable all outside write access to all critical repositories
+
* Next run the following script, which
* update version information:
+
** generates the Cactus configure script by running <code>autoconf2.13</code> in <code>lib/make</code>
** update version information in <code>flesh/Makefile</code> in the <code>CCTK_VERSION_XXX</code> variables
+
** generates the Cactus loop macros by running <code>perl cctk_Loop.h.pl</code> in <code>src/include</code>
** update version information in  <code>flesh/doc/latex.sty</code> in the <code>\cactustitlepage</code> command
+
** generates UsersGuide, ReferenceManual and MaintGuide pdf files by running <code>make UsersGuide ReferenceManual MaintGuide</code>
** update wvuthorns/Baikal/doc/documentation.tex and wvuthorns/BaikalETK/doc/documentation.tex with git hash of nrpytutorial used to generate code. The hash is mentioned in the README file. To compare codes, check out https://github.com/zachetienne/nrpytutorial.git at the hash in question and generate using <code>./run_Jupyter_notebook.sh Tutorial-BaikalETK.ipynb</code>. In ET_2020_05 this required forcing python3. The generated code lacks using <code>CCTK_REAL</code> for non-vectorized code, and the order in which finite difference orders are checked and included is timing dependent and thus random.
 
* Update component list <code>einsteintoolkit.th</code> in *master* before tagging it for release branch to point to new stable version
 
 
<pre>
 
<pre>
sed -i "/!DEFINE  *COMPONENTLIST_TARGET/a \\\\n!DEFINE ET_RELEASE = $ET_RELEASE" einsteintoolkit.th
+
cd lib/make
sed -i '/!URL/a \!REPO_BRANCH = ET_RELEASE' einsteintoolkit.th
+
autoconf2.13
sed -i 's!/trunk!/branches/$ET_RELEASE!' einsteintoolkit.th
+
git add configure
 +
git commit -a -m 'Cactus: regenerate configure' || true
 +
cd ../../src/include
 +
perl cctk_Loop.h.pl
 +
git commit -a -m 'Cactus: regenerate cctk_Loop.h' || true
 +
cd ../../
 +
make UsersGuide ReferenceManual MaintGuide
 +
cd doc
 +
git add MaintGuide.pdf ReferenceManual.pdf UsersGuide.pdf
 +
git commit -a -m 'Cactus: regenerate documentation' || true
 
</pre>
 
</pre>
:* undo changes on master branch
+
 
 +
=== create branches ===
 +
* Important! Before this step, add the new bibtex entry to einsteintoolkit.bib in https://bitbucket.org/einsteintoolkit/manifest.git
 +
** This relies on the bibtex entry from zenodo, so make the zenodo entry first!
 +
** The https://bitbucket.org/einsteintoolkit/manifest.git repo has a script called "utf8ToLaTeX.pl" to fix special characters in people's names
 
* Create release branches for all repositories in the ET
 
* Create release branches for all repositories in the ET
 
** A new ET branch ET_YYYY_MM
 
** A new ET branch ET_YYYY_MM
Line 107: Line 267:
 
** A new Cactus branch Cactus_4.X.0 if in CactusCode
 
** A new Cactus branch Cactus_4.X.0 if in CactusCode
 
** A new Cactus tag Cactus_4.X.0_v0 if in CactusCode
 
** A new Cactus tag Cactus_4.X.0_v0 if in CactusCode
 +
* '''Note''': SelfForce-1D is not automatically downloaded with GetComponents, so the repo can either be manually cloned into the repos directory or the branch and tag can be made and pushed separately from the script
 
<pre>
 
<pre>
 
#!/bin/bash
 
#!/bin/bash
 +
# This script is run from inside the repos directory
 
export ET_RELEASE=ET_XXXX_YY
 
export ET_RELEASE=ET_XXXX_YY
 
export CCTK_VERSION=Cactus_4.X.0
 
export CCTK_VERSION=Cactus_4.X.0
Line 115: Line 277:
 
   cd $repo/..
 
   cd $repo/..
 
   pwd
 
   pwd
 +
  if git branch -a | grep -q origin/$ET_RELEASE ; then
 +
    echo "Already pushed"
 +
    cd - >/dev/null
 +
    continue
 +
  fi
 +
  if ! grep -q 'fetch  *= *[+]refs/heads/[*]' .git/config ; then
 +
    # unshallow in case --no-shallow was not passed to GetComponents
 +
    git fetch --unshallow
 +
    git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
 +
    git fetch origin
 +
  fi
 +
  repo_name=$(basename $PWD)
 
   git checkout -b $ET_RELEASE
 
   git checkout -b $ET_RELEASE
 +
  if [ $repo_name = manifest ] ; then
 +
    sed -i "/!DEFINE  *COMPONENTLIST_TARGET/a \\\\n!DEFINE ET_RELEASE = $ET_RELEASE" einsteintoolkit.th
 +
    sed -i '/!URL/a \!REPO_BRANCH = $ET_RELEASE' einsteintoolkit.th
 +
    sed -i 's!/trunk!/branches/$ET_RELEASE!' einsteintoolkit.th
 +
    git add einsteintoolkit.th
 +
    git commit -m 'einsteintoolkit.th: use release branch'
 +
  fi
 
   git tag ${ET_RELEASE}_v0
 
   git tag ${ET_RELEASE}_v0
 
   git push --tags --set-upstream origin $ET_RELEASE
 
   git push --tags --set-upstream origin $ET_RELEASE
Line 124: Line 305:
 
   fi
 
   fi
 
   cd - >/dev/null
 
   cd - >/dev/null
 +
  sleep 5 # bitbucket enforces some rate limit on pushes its seems
 
done
 
done
 
</pre>
 
</pre>
* Create a release branch in master git repo at https://bitbucket.org/einsteintoolkit/einsteintoolkit via:
+
* create a new version and milestone on https://bitbucket.org/einsteintoolkit/tickets/admin/issues/versions and https://bitbucket.org/einsteintoolkit/tickets/admin/issues/milestones
<pre>
+
 
export ET_RELEASE=ET_XXXX_YY
+
=== update websites and online documentation ===
git checkout -b $ET_RELEASE
+
 
sed -i "s/master/$ET_RELEASE/" .gitmodules
+
https://docs.einsteintoolkit.org/et-docs/Editing_the_Einstein_Toolkit_website
git add .gitmodules
+
 
git submodule foreach bash -c "git fetch ; git checkout origin/$ET_RELEASE"
+
* Update main ET web site (update version numbers, urls), searching for <code>ET_YYYY_MM</code> finds them all
git commit -am "Create release branch for $ET_RELEASE"
+
<pre id="update-et-website">
</pre>
 
* update branch mentioned in https://build-test.barrywardell.net/job/EinsteinToolkitReleased/configure and trigger a build
 
* update websites
 
** Update main ET web site (update version numbers, urls), searching for <code>ET_YYYY_MM</code> finds them all
 
<pre>
 
 
#!/bin/bash
 
#!/bin/bash
  
 
set -e -x
 
set -e -x
 +
 +
export EDITOR=vim
  
 
export ET_RELEASE=ET_2020_05
 
export ET_RELEASE=ET_2020_05
Line 148: Line 327:
 
export ET_RELEASE_CODENAME=Turing
 
export ET_RELEASE_CODENAME=Turing
 
export PREVIOUS_ET_RELEASE_CODENAME=Mayer
 
export PREVIOUS_ET_RELEASE_CODENAME=Mayer
 +
export ET_RELEASE_CODENAME_FULL="Alan Turing"
  
 
export ET_RELEASE_URL="https://en.wikipedia.org/wiki/Alan_Turing"
 
export ET_RELEASE_URL="https://en.wikipedia.org/wiki/Alan_Turing"
Line 153: Line 333:
  
 
export ET_RELEASE_DATE="May 31st, 2020"
 
export ET_RELEASE_DATE="May 31st, 2020"
 +
export ET_RELEASE_DATE_ISO=2020-05-31
  
ALL_FILES=$(git grep -l "\($PREVIOUS_ET_RELEASE\|$PREVIOUS_ET_RELEASE_CODENAME\)"  | grep -v 'about/releases/' | grep -vF past-releases.html | grep -vF publications/2013_MHD/index.php | grep -vF mp.html)  
+
ALL_FILES=$(git grep -l "\($PREVIOUS_ET_RELEASE\|$PREVIOUS_ET_RELEASE_CODENAME\)"  | grep -v 'about/releases/' | grep -vF past-releases.html | grep -vF publications/2013_MHD/index.php | grep -vF developers. | grep -vF members.txt | grep -vF mp.html)  
  
 
# update URL first since it tends to include the release codename
 
# update URL first since it tends to include the release codename
Line 167: Line 348:
  
 
# update past reelases, mark this one as most recent
 
# update past reelases, mark this one as most recent
$EDITOR past-releases.html
+
# TODO: use something other than sed for this
 +
sed -i -e '/List of Einstein Toolkit releases:/{n;b add_release}' -e 'b end' -e ':add_release;a\
 +
          <li>'$ET_RELEASE' "'"$ET_RELEASE_CODENAME_FULL"'", <a href="about/releases/'$ET_RELEASE'_announcement.html">released '$ET_RELEASE_DATE_ISO'</a>\
 +
          </li>' -e ':end' past-releases.html
  
 
# add news item to front page
 
# add news item to front page
Line 176: Line 360:
 
git add $ALL_FILES past-releases.html download.html index.html
 
git add $ALL_FILES past-releases.html download.html index.html
 
git commit -m "update to $ET_RELEASE"
 
git commit -m "update to $ET_RELEASE"
</pre>
+
 
 +
echo 'Use git show and git commit --amend to correct mistakes'
 +
<pre>
 
:* Update simfactory.org https://svn.cct.lsu.edu/repos/numrel/simfactory2/www/
 
:* Update simfactory.org https://svn.cct.lsu.edu/repos/numrel/simfactory2/www/
 
<pre>
 
<pre>
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" index.php
+
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" simfactory/download/index.php
 
</pre>
 
</pre>
 
:* update CactusTutorial.ipynb in https://github.com:nds-org/jupyter-et.git
 
:* update CactusTutorial.ipynb in https://github.com:nds-org/jupyter-et.git
 
<pre>
 
<pre>
 +
export KUIBIT_RELEASE=...
 
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" CactusTutorial.ipynb
 
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" CactusTutorial.ipynb
 +
sed -i "s/kuibit==[0-9.]*/kuibit==$KUIBIT_RELEASE/" CactusTutorial.ipynb
 
</pre>
 
</pre>
::*log into etkhub.ndslabs.org, pull the repo, and rebuild the docker image
 
* once release documentation finishes building on Jenkins, [http://einsteintoolkit.org/update.php trigger] update of ET website
 
  
* Check out release branch on all systems, re-run all quick tests
+
From the https://github.com/nds-org/jupyter-et repo, do the following
 +
<pre id="update-tutorial-image">
 +
cd tutorial-server
 +
sed -i "s/ENV ET_RELEASE.*/ENV ET_RELEASE ${ET_RELEASE}/" base.docker
 +
sed -i "s/ENV KUIBIT_RELEASE.*/ENV KUIBIT_RELEASE ${KUIBIT_RELEASE}/" base.docker
 +
git add base.docker
 +
git commit -m "All changes for the $ET_RELEASE release"
 +
touch variables.env
 +
docker-compose -f docker-compose.base.yml build --no-cache --pull 2>&1 | tee docker-compose.base.log
 +
docker-compose -f docker-compose.base.yml push
 +
for c in notebook cilogon cyol ; do
 +
    docker-compose -f docker-compose.$c.yml build 2>&1 | tee docker-compose.$c.log
 +
    docker-compose -f docker-compose.$c.yml push
 +
done
 +
</pre>
 +
The tutorial server at https://etk.cct.lsu.edu checks for a new image once a day.
 +
 
 +
* To update cactuscode.org: <code>git clone git@github.com:EinsteinToolkit/www.cactuscode.org.git</code>
 +
<pre id="update-cactuscode">
 +
#!/bin/bash
 +
 
 +
set -e -x
 +
 
 +
PREVIOUS_ET_RELEASE=ET_2021_11
 +
ET_RELEASE=ET_2022_05
 +
 
 +
PREVIOUS_ET_ITER=twenty-third
 +
ET_ITER=twenty-fourth
 +
 
 +
PREVIOUS_CACTUS_VERSION=4.11.0
 +
CACTUS_VERSION=4.12.0
 +
 
 +
PREVIOUS_ET_WIKIPEDIA="Katherine_Johnson"
 +
ET_WIKIPEDIA="Bernhard_Riemann"
 +
 
 +
PREVIOUS_ET_NAME="Johnson"
 +
ET_NAME="Riemann"
 +
 
 +
 
 +
ET_DATE="$(date +"%B %d, %Y")"
 +
AUTHOR="$(git config --get user.name)"
  
* Re-enable write access to all repositories
+
cd media/news
* Finalise release announcement
+
 
** Ensure email does not go past column 72 to support old email clients.
+
# keep the mkdir below to so that it fails if the output directories already
** Send the announcement to the release team to ensure that the email client and/or server does not scramble the text in any way.
+
# exist
* ANNOUNCE: users@einsteintoolkit.org, {news|users}@cactuscode.org, Jennifer Claudet <jennifer@cct.lsu.edu> for AllCCT, http://hyperspace.uni-frankfurt.de/, http://astro-sim.org/, HPCWire
+
 
 +
mkdir $ET_RELEASE
 +
cp -a $PREVIOUS_ET_RELEASE/* $ET_RELEASE/
 +
sed -i "s!/$PREVIOUS_ET_WIKIPEDIA!/$ET_WIKIPEDIA!g" $ET_RELEASE/index.md
 +
sed -i "s!$PREVIOUS_ET_NAME!$ET_NAME!g" $ET_RELEASE/index.md
 +
sed -i "s!$PREVIOUS_ET_ITER!$ET_ITER!g" $ET_RELEASE/index.md
 +
sed -i "s!^### .*!### $ET_DATE $AUTHOR!" $ET_RELEASE/index.md
 +
 
 +
mkdir cactus_$CACTUS_VERSION
 +
cp -a cactus_$PREVIOUS_CACTUS_VERSION/* cactus_$CACTUS_VERSION/
 +
sed -i "s!${PREVIOUS_CACTUS_VERSION//./[.]}!$CACTUS_VERSION!g;" cactus_$CACTUS_VERSION/index.md
 +
sed -i "s!/$PREVIOUS_ET_WIKIPEDIA!/$ET_WIKIPEDIA!g" cactus_$CACTUS_VERSION/index.md
 +
sed -i "s!$PREVIOUS_ET_NAME!$ET_NAME!g" cactus_$CACTUS_VERSION/index.md
 +
sed -i "s!^### .*!### $ET_DATE $AUTHOR!" cactus_$CACTUS_VERSION/index.md
 +
 
 +
NEWS="$(<../../_data/news.yml)"
 +
cat >../../_data/news.yml <<EOF
 +
- date: "$ET_DATE"
 +
  link: "$ET_RELEASE/index.html"
 +
  title: 'Einstein Toolkit "$ET_NAME" Release'
 +
- date: "$ET_DATE"
 +
  link: "cactus_$CACTUS_VERSION/index.html"
 +
  title: 'Cactus $CACTUS_VERSION Release'
 +
$NEWS
 +
EOF
 +
 
 +
git add ../../_data/news.yml git add $ET_RELEASE/index.md cactus_$CACTUS_VERSION/index.md
 +
git commit -m "news: add $ET_RELEASE announcement"
 +
</pre>
 +
* update Cactus Wikipedia entry https://en.wikipedia.org/wiki/Cactus_Framework
 +
 
 +
=== release anouncement issues ===
 +
* Ensure email does not go past column 72 to support old email clients.
 +
* Send the announcement to the release team and maintainers@einsteintoolkit.org to ensure that the email client and/or server does not scramble the text in any way.
 +
* ANNOUNCE: users@einsteintoolkit.org, news@cactuscode.org, users@cactuscode.org
 +
* ANNOUNCE: http://hyperspace.uni-frankfurt.de/
 
** Keywords used on hyperspace: Einstein Toolkit, numerical relativity, cactus, carpet, software
 
** Keywords used on hyperspace: Einstein Toolkit, numerical relativity, cactus, carpet, software
 
** In the URL section, put the html link.
 
** In the URL section, put the html link.
 
** No manual breaks or non-ascii characters.
 
** No manual breaks or non-ascii characters.
 
** Post as a news item.
 
** Post as a news item.
** must be short enough to be acceptable: compare http://einsteintoolkit.org/about/releases/ET_2020_05_announcement.html and https://hyperspace.uni-frankfurt.de/2020/05/30/the-twentieth-release-of-the-einstein-toolkit/ . The hypersapce editor says that https://hyperspace.uni-frankfurt.de/2020/05/30/the-twentieth-release-of-the-einstein-toolkit/ is now of appropriate length.
+
** must be short enough to be acceptable: compare http://einsteintoolkit.org/about/releases/ET_2020_05_announcement.html and https://hyperspace.uni-frankfurt.de/2020/06/02/the-twentieth-release-of-the-einstein-toolkit-2/ . The hypersapce editor says that https://hyperspace.uni-frankfurt.de/2020/06/02/the-twentieth-release-of-the-einstein-toolkit-2/ is now of appropriate length.
* To update cactuscode.org: "svn checkout https://svn.cactuscode.org/www" After modifying, visit http://cactuscode.org/x to make changes live.
+
 
** affected by SSL issue in: https://svn.cactuscode.org/www
+
===Other stuff===
* update Cactus Wikipedia entry https://en.wikipedia.org/wiki/Cactus_Framework
+
 
 +
==== Changes to announce ====
 +
First grab the latest dev version:
 +
 
 +
  curl -kLO https://raw.githubusercontent.com/gridaphobe/CRL/master/GetComponents
 +
  chmod a+x GetComponents
 +
  ./GetComponents --no-shallow --parallel https://bitbucket.org/einsteintoolkit/manifest/raw/master/einsteintoolkit.th
 +
 
 +
 
 +
Then in that directory, the following script may be helpful in figuring out what has changed since the last
 +
release:
 +
 
 
<pre>
 
<pre>
cd media/news
+
#/bin/bash
 +
PREVRELEASEMONTH=05
 +
PREVRELEASEYEAR=2022
 +
FORMAT="%h %ae %an: %s"
 +
####
 +
TAG="ET_${PREVRELEASEYEAR}_${PREVRELEASEMONTH}_v0"
 +
DATE="${PREVRELEASEMONTH}/01/${PREVRELEASEYEAR}"
 +
for i in repos/*/.git
 +
do
 +
  export GIT_DIR=$i
 +
  DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')
 +
  echo "CHANGES FOR $(dirname $i)"
 +
  git fetch --tags 1>/dev/null 2>/dev/null
 +
  git log --format="$FORMAT" ${TAG}..${DEFAULT_BRANCH} -- 2>/dev/null
 +
  E=$?
 +
  if [ $E != 0 ]
 +
  then
 +
    echo " >> TAG ${TAG} missing for repo, using date."
 +
    git log --format="$FORMAT" $(git rev-list -n 1 --before="${DATE} 00:00" ${DEFAULT_BRANCH})..${DEFAULT_BRANCH} --
 +
  fi
 +
done
 +
</pre>
 +
 
 +
Note that when analyzing the output from the *nrpytutorial/* repo, you'll need to be careful to only check for changes to NRPyPN; all other changes are not ET related.
 +
 
 +
This misses changes in subversion repositories, currently only in <code>ExternalLibraries</code> which can be queried manually using <code>svn log</code> and usually contain very few changes.
 +
 
 +
This misses new repositories (or at best only considers recent changes to them).
 +
 
 +
=== Emails to send to contributors and gallery runners ===
 +
 
 +
==== Contributors ====
 +
<blockquote>
 +
Dear $CONTRIBUTOR,
 +
 
 +
In preparation for the upcoming "$RELEASE" release of the Einstein Toolkit I am collecting information about all who contributed to this release of the Einstein Toolkit. All contributors will be listed as authors as shown in this draft
 +
 
 +
https://sandbox.zenodo.org/record/$ZENODO
 +
 
 +
You are shown as a contributor to $CODE in
  
cp -a ET_2019_10 ET_2020_05
+
$GIT_COMMIT_HASH_URL
sed -i 's!Maria_Goeppert_Mayer!Alan_Turing!g' ET_2020_05/index.php
 
sed -i 's!Mayer!Turing!g' ET_2020_05/index.php
 
sed -i 's!>.*</h3>!>May 31, 2020 Roland Haas</h3>!' ET_2020_05/index.php
 
  
cp -a cactus_4.7.0 cactus_4.8.0
+
Since you therefore contributed to this release, would you agree to be listed as an author in this and all future releases of the Einstein Toolkit?
sed -i 's!4[.]7[.]0!4.8.0!g;' cactus_4.8.0/index.php
 
sed -i 's!Maria_Goeppert_Mayer!Alan_Turing!g' cactus_4.8.0/index.php
 
sed -i 's!Mayer!Turing!g' cactus_4.8.0/index.php
 
sed -i 's!ET_2019_10!ET_2020_05!g' cactus_4.8.0/index.php
 
sed -i 's!>.*</h3>!>May 31, 2020 Roland Haas</h3>!' cactus_4.8.0/index.php
 
  
mv recent.php tmp.php
+
If you agree to be listed I will add the information found here
head -n4 <tmp.php | \
 
sed 's!4[.]7[.]0!4.8.0!g;' | \
 
sed 's!Maria_Goeppert_Mayer!Alan_Turing!g' | \
 
sed 's!Mayer!Turing!g' | \
 
sed 's!ET_2019_10!ET_2020_05!g' | \
 
sed 's!Oct 2019!May 2020!' | \
 
cat tmp.php - >recent.php
 
rm tmp.php
 
</pre>
 
* To update simfactory.org: 'svn checkout https://svn.cct.lsu.edu/repos/numrel/simfactory2/www' and modify
 
** need to request write access to repository first
 
** <code>sed -i 's/ET_2019_10/ET_2020_05/' simfactory/download/index.php</code>
 
  
==After the release==
+
https://www.einsteintoolkit.org/developers.html
* Watch mailing lists for problem reports
 
* Use released version to repeat a few production simulations
 
* Update this page with new lessons learned
 
  
=Helpful Tools=
+
to Zenodo.
  
This section collects a handful of useful commands that may become critical
+
Please let me or any of the other maintainers know, no later than $DEADLINE_DATE, if you agree to be included as an author and whether the information shown is correct. If there are additional persons that should be listed as authors, please let myself or one of the other maintainers know soon, so that they can be contacted.
to guarantee the quality of the release. The descriptions below are quite
 
technical and intended for the developers and maintainers only.
 
  
==Technical Details==
+
Yours,
 +
$YOURNAME
 +
</blockquote>
  
===On einsteintoolkit.org===
+
To the main contributor (champion) send a request for citations
* ThornGuide.php is in /www/einstein/www/documentation
 
* It draws on the autogenerated http doc files, which are found here:
 
  
  /var/www/einstein/documentation
+
<blockquote>
 +
Dear $CONTRIBUTOR,,
  
* Rebuild the website to update docs using https://github.com/stevenrbrandt/et-websites.git
+
For each component the Einstein Toolkit keeps track of requested ("required") and suggested ("optional") citations that those who use the component should cite.
  
  docker build --no-cache -f etk-website.docker -t stevenrbrandt/etk-website .
+
These are listed on:
  docker push stevenrbrandt/etk-website
 
  
 +
https://www.einsteintoolkit.org/citation.html
  
===Other stuff===
+
and auto-generated from the main bibtex file (einsteintoolkit.bib) using the suggested-for and requested-for tags.
  
On https://stevenrbrandt@bitbucket.org/einsteintoolkit/www.git
+
For you contributions, if you have any, please send me bibtex entries (in SPIRES style, see the beginning of
* Create new docs in about/releases/
 
  
On https://svn.cactuscode.org/www
+
https://bitbucket.org/einsteintoolkit/manifest/raw/master/einsteintoolkit.bib
* Create the announcement in media/news/recent.php and associated links.
 
  
The following script may be helpful in figuring out what has changed since the last
+
for the desired format) of any requested and suggested citations.
release:
 
  
  MONTH=05
+
Typically we would suggest one requested citation and any number of suggested citations (eg for optional features or secondary citations).
  YEAR=2020
 
  FORMAT=oneline
 
  ####
 
  TAG="ET_${YEAR}_${MONTH}_v0"
 
  DATE="${MONTH}/01/${YEAR}"
 
  for i in repos/*/.git
 
  do
 
    export GIT_DIR=$i
 
    echo "CHANGES FOR $(dirname $i)"
 
    git fetch --tags 1>/dev/null 2>/dev/null
 
    git log ${TAG}..master --format=$FORMAT 2>/dev/null
 
    E=$?
 
    if [ $E != 0 ]
 
    then
 
      echo " >> TAG ${TAG} missing for repo, using date."
 
      git log $(git rev-list -n 1 --before="${DATE} 00:00" master)..master --format=$FORMAT
 
    fi
 
  done
 
  
* Visit http://cactuscode.org/x.php to make the change live.
+
Websites and Zenodo DOIs are fine, it does not have to be a published paper (though having a DOI would be good).
  
News announcement to users@einsteintoolkit.org, users@cactuscode.org, news@cactuscode.org, allcct@cct.lsu.edu
+
Yours,
 +
$YOURNAME
 +
</blockquote>
  
Post to Ad, news on http://hyperspace.uni-frankfurt.de/
+
==== Release team ====
 +
<blockquote>
 +
Dear $RELEASE_TEAM_MEMBER,
  
Post announcement to the Einstein Toolkit Facebook page.
+
in preparation for the upcoming "$RELEASE" release of the Einstein Toolkit I am collecting information about the release team for this release of the Einstein Toolkit. All release team members will be listed as authors in
  
Update and commit the changes to the thornlist in the manifest
+
https://sandbox.zenodo.org/record/$ZENODO
  
    https://bitbucket.org/einsteintoolkit/manifest.git
+
Since you are a member of the release team, would you agree to be listed as an author in this release of the Einstein Toolkit?
  
Create the git tags and branches: ET_2018_02_v0, Cactus_4.4.0
+
If you agree to be listed I will add the information found here
* in each git repo:
 
        git tag ET_2018_02_v0; git push origin ET_2018_02_v0
 
        git checkout -b ET_2018_02; git push origin ET_2018_02
 
* use <code>git fetch -t</code> to get the latest tags.
 
* Create svn tags and branches (no longer needed since ET_2019_03 "Proca")
 
  
  for i in BLAS LORENE GSL PETSc LAPACK FFTW3 pciutils  hwloc OpenBLAS MPI OpenCL HDF5 PAPI zlib libjpeg
+
https://www.einsteintoolkit.org/developers.html
  do
 
      cd /home/sbrandt/cactus/Cactus/arrangements/ExternalLibraries/$i
 
      svn copy https://svn.cactuscode.org/projects/ExternalLibraries/$i/trunk \
 
          https://svn.cactuscode.org/projects/ExternalLibraries/$i/tags/ET_2018_02_v0 \
 
          -m "Tagging release ET_2018_02"
 
done
 
for i in BLAS LORENE GSL PETSc LAPACK FFTW3 pciutils  hwloc OpenBLAS MPI OpenCL HDF5 PAPI zlib libjpeg
 
do
 
    cd /home/sbrandt/cactus/Cactus/arrangements/ExternalLibraries/$i
 
    svn copy https://svn.cactuscode.org/projects/ExternalLibraries/$i/trunk \
 
        https://svn.cactuscode.org/projects/ExternalLibraries/$i/branches/ET_2018_02 \
 
        -m "New branch for release ET_2018_02"
 
done
 
  
 +
to Zenodo.
  
 +
Please let me or any of the other maintainers know, no later than $DEADLINE_DATE, if you agree to be included as an author and whether the information shown is correct. If there are additional persons that should be listed as authors, please let myself or one of the other maintainers know soon, so that they can be contacted.
  
* creating release branches
+
Yours,
** svn: <nowiki>svn copy https://<repository-server>/<repository-path>/trunk https://<repository-server>/<repository-path>/branches/ET_2011_05</nowiki>
+
$YOURNAME
** darcs: clone the repository, appending a suffix to the name
+
</blockquote>
** git: git checkout -b ET_2011_05 ; git push --set-upstream origin ET_2011_05
 

Latest revision as of 18:11, 7 December 2023

Release Process

This page describes the release process in some detail. Getting a release out of the door without embarrassing oversights requires a bit more planning and care than one would like.

Timeline for a release and estimated time required

  1. Form a release coordination team (6 months) (part of ET calls)
    1. a release coordinator
    2. a release coordinator assistant, who may be the release coordinator for the next release
    3. the former release coordinator to help out
    4. test runner(s) who will run the testsuites on the list of supported machines
    5. gallery runners for gallery examples
    6. final list may include others contributing directly to the release process
  2. Come up with release timeline (by translating the last release timeline forward in time), see (5 months) (30 minutes), see https://docs.einsteintoolkit.org/et-docs/Release_Details#Schedule_for_ET_2020_05
    1. Release coordinator needs write access to the following repos (or must arrange all needed changes with a repo maintainer)
      1. https://bitbucket.org/einsteintoolkit
      2. https://github.com/nds-org/jupyter-et.git
      3. https://github.com/einsteintoolkit/simfactory2-www
    2. Frequently remind participants of timeline (part of ET calls)
    3. Begin discussions on the mailing list, reminding people to look at test cases, review patches etc. (5 minutes per week)
  3. Choose features which are going to be included, and those which won't be included (4 months)
    1. ask for review volunteers, assign tasks to people (part of ET calls) e.g. https://docs.einsteintoolkit.org/et-docs/Meeting_agenda#2020-09-10
    2. create tickets for each proposed item on https://trac.einsteintoolkit.org eg. https://bitbucket.org/einsteintoolkit/tickets/issues/2416
    3. Decide on a list of release-critical compute systems eg XSEDE, LCCF, DOE, PRACE: http://einsteintoolkit.org/testsuite_results/index.php
      1. get accounts for test runners
  4. Drive review of thorns for code quality, documentation, test cases (continuously)
    1. Include positively reviewed and voted on items in main ET repositories
    2. Remove new features without reviewer or negatively reviewed from list of new features
    3. Frequently remind participants of timeline
  5. Start testing on release-critical compute systems (2 months) (30 minutes per week per cluster to compile, run, check, upload)
    1. initially test to make sure clusters can still build code
    2. test code as they become positively reviewed (code is present in master before final positive review)
    3. report on test failures
    4. assign found bugs to volunteers
  6. Release preparation I (4 weeks)
    1. Announce feature freeze based on currently positively reviewed components
      1. fix branch to use for kuibit to one of the tagged releases. TODO: add instructions on how to use that branch when creating ET branches
    2. Collect list of new features, newsworthy items, and acknowledgements for release announcement on wiki (there’s a script in the wiki to help with this) (45 minutes)
    3. Create Zenodo item (notes) (1 hour)
      1. Send to maintainers@einsteintoolkit.org for review re typos etc.
      2. Include in "do you want to be included" email to contributors.
    4. Contact contributors and release team about permanent (contributors) and one-off (release team) inclusion in the ET author list (10 minutes of work per author to poke and prod them to respond). Include maintainers@einsteintoolkit.org in cc to have a record.
    5. announce final member list of release team:
  • release coordinator(s)
  • test runner(s)
  • gallery example runner(s)
  • reviewer(s)
  • anyone putting in work specifically for the release
    1. Draft release announcement (1 hour)
      1. send to maintainers@einsteintoolkit.org for review re typos etc.
    2. Announce release date publicly
  1. Release preparation II (1 week), detailed list of items and partial scripts at end of text
    1. Finalize announcement draft (1 hour)
      1. Send to maintainers@einsteintoolkit.org for review re typos etc.
    2. Update einsteintoolkit.bib (https://bitbucket.org/einsteintoolkit/manifest/src/master/) with
      1. Update or add requested and suggested citations for all ET components in thorn list (10 minutes).
      2. Latest release info and DOI (from Zenodo entry above)
      3. move requested-for for main ET cite (Zenodo)
    3. Update version information in Makefile, the documentation tex files and Baikal documentation.tex file (15 minutes)
    4. Regenerate all auto-generated files (30 minutes of work, plus time to wait for Kranc)
    5. Create release branch and tag for all ET codes (30 minutes)
    6. Update websites in a branch (2 hours)
      1. EinsteinToolkit.org (https://docs.einsteintoolkit.org/et-docs/Editing_the_Einstein_Toolkit_website ; be sure to update the main page; then about/releases/ET_202X_YZ_announcement.md; then from that directory run `mk_release_announcements.py ET_202X_YZ_announcement.md` [you'll need to `pip install markdown` for this to work]; then be sure to `git add` and commit the new files.)
      2. CactusCode.org (https://github.com/einsteintoolkit/www.cactuscode.org, see below for a script.
      3. Simfactory.org (https://github.com/einsteintoolkit/simfactory2-www/ make life using https://simfactory.org/update.php)
      4. CactusTutorial.ipynb (https://github.com:nds-org/jupyter-et.git)
      5. update docker image for tutorial server script, but do not yet push
  2. The release (0 days)
    1. make all updated branches live (30 min)
    2. push tutorial server docker image to Dockerhub (only Erik, Steve, Roland, Ian can do so)
    3. announce on users@einsteintoolkit.org, news@cactuscode.org (5 min)
    4. http://hyperspace.uni-frankfurt.de/ based on previous release announcement (15 min)
    5. update Wikipedia Cactus entry https://en.wikipedia.org/wiki/Cactus_Framework (5 min)
    6. Run the testsuite using the release code on all supported machines (30 min per cluster)
    7. Update https://docs.einsteintoolkit.org/et-docs/Release_Process with lessons learned (30 minutes)

Helpful tools and notes

This section collects a handful of useful commands that may become critical to guarantee the quality of the release. The descriptions below are quite technical and intended for the developers and maintainers only.

add gallery runners

Gallery runners should be mentioned in their respective gallery example's ticket and should have the ticket assigned to them. This requires that they are a member of the Einstein Toolkit bitbucket organization.

  • they must be invited to it using their email address on: https://bitbucket.org/einsteintoolkit/workspace/settings/groups
  • they should be made members of the the "All Members" and "gallery runners" groups. The former to be assigned the ticket, the latter to be able to upload files to the website repository and edit the web-pages
  • find the gallery ticket and use the "Edit" button to assign users
  • gallery examples should be run using the "master" branch of the toolkit, that will become the release branch, of manifest and thornlist
  • results should be archived in a tar archive as shown on https://bitbucket.org/einsteintoolkit/www/downloads/ and the archive name should include year, month and day of month YYYYMMDD following the pattern visible in the existing tar files. On macOS make sure to not include __MACOSX a folder. This is most easily achieved by using the command line zip tool and not a GUI tool or Finder (to be verified)
  • some archives are large and special tools are needed to upload them, this is described in the ticket for the example
  • after updating the archive, clone the website repo https://bitbucket.org/einsteintoolkit/www/src, edit the gallery page to point to the new archive file and update the "last run" line. Don't forget to update and add any images and plots you have regenerated. Verify the change by opening the html file in a local browsers. Commit and push to nmaster.

update developers.txt

Inside https://bitbucket.org/einsteintoolkit/www/src/master/ , you will find a developers.txt file, which needs to be updated with any new developers for this release. Any developers who helped with the last release but have not yet contributed code to the Toolkit need to be removed, and likewise any new folks who contributed to this release need to be added.

Here is a script for finding all code contributers to the Einstein Toolkit, ever. You will need this for the release announcement also.

for repo in */.git/.. ; do
      (cd $repo && git shortlog $(git describe --tags --abbrev=0)..HEAD --summary --email) | perl -p -e 's/^\s*\d+\s*//'
done | sort -u

After updating, run

 developers.py

Next, update zenodo.py. It contains the hard-coded information in between the EDIT BELOW and EDIT ABOVE tags.

 release_team = [
   "Zachariah B. Etienne",
   "Roland Haas",
   "Steven R. Brandt",
   "William E. Gabella",
   "Peter Diener",
   "Atul Kedia",
   "Miguel Gracia",
   ...
 ]
 contributers = [
   "Roland Haas",
   "Steven R. Brandt",
   ...
 ]
 et_release = "ET_2021_05"
 et_release_codename = "Lorentz"
 et_description = ...

Publish to the sandbox (following the steps below). Once that is done and reviewed, it can be published without --sandbox.

drafting Zenodo entry

# get Steve Brandt's personal access token for zenodo.org
# create your own personal access token for sandbox.zenodo.org:
# https://sandbox.zenodo.org/account/settings/applications/tokens/new/
export ZENODO_ACCESS=STEVES_ZENODO_ACCESS_TOKEN
export SANDBOX_ZENODO_ACCESS=YOUR_ZENODO_SANDBOX_ACCESS_TOKEN

# note down ID of "Einstein Toolkit" (will change each release)
ZENODO_ID=$(python3 ./zenodo.py --list | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')

# This will generate Definition.md and zupload.py (metadata)
python3 ./zenodo.py --id $ZENODO_ID --generate

# recreate current release in sandbox, note that zenodo.py will use
# SANDBOX_ZENODO_ACCESS token and sanbox.zenodo.org when --sandbox is used.
# note down ID of the deposit
ZENODO_SANDBOX_ID=$(python3 ./zenodo.py --sandbox --create zupload.py | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')

# publish current release in sandbox
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --deposit Definition.md
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --publish

# now we make the new release

# Edit the lines in zenodo.py that are between the Edit Below/Edit Above comments.
# This includes the release, the code name, the release team, etc.
vi zenodo.py

# This will generate Definition.md and zupload.py (metadata)
rm Definition.md zupload.py
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --generate

# create a new version in sandbox
# and note down its id
ZENODO_SANDBOX_ID=$(python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --newversion | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')

# upload updated metadata (zenodo.py)
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --upload

# deposit updated dummy file
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --deposit Definition.md
# publish new version (cannot be undone)
python3 ./zenodo.py --sandbox --id $ZENODO_SANDBOX_ID --publish

# create a new version in real Zenodo but *do not* publish (yet)
# and not down its id
ZENODO_ID=$(python3 ./zenodo.py --id $ZENODO_ID --newversion)

echo "Zenodo ID is: $ZENODO_ID."
echo "You MUST write down this ID since I will not be able to retrieve it later"

# generate metadata for actual Zenodo (different DOI!)
rm Definition.md zupload.py
python3 ./zenodo.py --id $ZENODO_ID --generate

# upload updated metadata (zenodo.py)
python3 ./zenodo.py --id $ZENODO_ID --upload

# deposit updated dummy file
python3 ./zenodo.py --id $ZENODO_ID --deposit Definition.md

# re-download and check what we think we deposited
mv Definition.md Definition.md.bak
python3 ./zenodo.py --id $ZENODO_ID --retrieve Definition.md
diff --report-identical-files Definition.md.bak Definition.md

# get reserved DOI to use in bibtex file
python3 ./zenodo.py --id $ZENODO_ID --show-doi

Send the Zenodo entry from the sandbox to maintainers@einsteintoolkit.org for proofreading, include in "do you want to be included" email to contributors.

final Zenodo entry

This replicates the latter steps of the draft to create a new entry on the real Zenodo site. Do so *only* after the draft has been reviewed since it cannot be undone.

export ZENODO_ACCESS=STEVES_ZENODO_ACCESS_TOKEN

# note down ID of newest (topmost) "Einstein Toolkit"
ZENODO_ID=$(python3 ./zenodo.py --list | perl -n -e '/(\d*) The Einstein Toolkit/ && print ($1) && exit 0')

# publish new version (cannot be undone)
python3 ./zenodo.py --id $ZENODO_ID --publish

update version information

  • update version information in flesh/Makefile in the CCTK_VERSION_XXX variables
  • update version information in flesh/doc/latex.sty in the \cactustitlepage command
export CCTK_VERSION=Cactus_4.X.0
CCTK_VERSION_MINOR=$(echo $CCTK_VERSION | cut -f2 -d.)
sed -i "s/CCTK_VERSION_MINOR = .*/CCTK_VERSION_MINOR = $CCTK_VERSION_MINOR/" Makefile
sed -i 's/\\cactustitlepage}\[4\]\[4\..*\]/\\cactustitlepage}[4][4.'$CCTK_VERSION_MINOR']/' doc/latex/cactus.sty
git add Makefile doc/latex/cactus.sty
git commit -m 'Cactus: update version in information in Makefile and docs'
  • update wvuthorns/Baikal/doc/documentation.tex and wvuthorns/BaikalETK/doc/documentation.tex with git hash of nrpytutorial used to generate code. The hash is mentioned in the README file (see below for instructions).

regenerate files

  • regenerate McLachlan, WeylScal4, CTThorns, and EinsteinExact from their source with the current version of Kranc by running make -j NJOBS in their respective m directory.
  • check that BaikalVaccum and Baikal can be regenerated using the nrpytutorial hash listed in their README file using cd BaikalETK && make
  • Next run the following script, which
    • generates the Cactus configure script by running autoconf2.13 in lib/make
    • generates the Cactus loop macros by running perl cctk_Loop.h.pl in src/include
    • generates UsersGuide, ReferenceManual and MaintGuide pdf files by running make UsersGuide ReferenceManual MaintGuide
cd lib/make
autoconf2.13
git add configure 
git commit -a -m 'Cactus: regenerate configure' || true
cd ../../src/include
perl cctk_Loop.h.pl
git commit -a -m 'Cactus: regenerate cctk_Loop.h' || true
cd ../../
make UsersGuide ReferenceManual MaintGuide
cd doc
git add MaintGuide.pdf ReferenceManual.pdf UsersGuide.pdf
git commit -a -m 'Cactus: regenerate documentation' || true

create branches

  • Important! Before this step, add the new bibtex entry to einsteintoolkit.bib in https://bitbucket.org/einsteintoolkit/manifest.git
  • Create release branches for all repositories in the ET
    • A new ET branch ET_YYYY_MM
    • A new ET tag ET_YYYY_MM_v0
    • A new Cactus branch Cactus_4.X.0 if in CactusCode
    • A new Cactus tag Cactus_4.X.0_v0 if in CactusCode
  • Note: SelfForce-1D is not automatically downloaded with GetComponents, so the repo can either be manually cloned into the repos directory or the branch and tag can be made and pushed separately from the script
#!/bin/bash
# This script is run from inside the repos directory
export ET_RELEASE=ET_XXXX_YY
export CCTK_VERSION=Cactus_4.X.0
set -x -e
for repo in */.git ; do
  cd $repo/..
  pwd
  if git branch -a | grep -q origin/$ET_RELEASE ; then
    echo "Already pushed"
    cd - >/dev/null
    continue
  fi
  if ! grep -q 'fetch  *= *[+]refs/heads/[*]' .git/config ; then
    # unshallow in case --no-shallow was not passed to GetComponents
    git fetch --unshallow
    git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
    git fetch origin
  fi
  repo_name=$(basename $PWD)
  git checkout -b $ET_RELEASE
  if [ $repo_name = manifest ] ; then
    sed -i "/!DEFINE  *COMPONENTLIST_TARGET/a \\\\n!DEFINE ET_RELEASE = $ET_RELEASE" einsteintoolkit.th
    sed -i '/!URL/a \!REPO_BRANCH = $ET_RELEASE' einsteintoolkit.th
    sed -i 's!/trunk!/branches/$ET_RELEASE!' einsteintoolkit.th
    git add einsteintoolkit.th
    git commit -m 'einsteintoolkit.th: use release branch'
  fi
  git tag ${ET_RELEASE}_v0
  git push --tags --set-upstream origin $ET_RELEASE
  if git remote get-url origin | grep cactuscode ; then
    git branch $CCTK_VERSION
    git tag ${CCTK_VERSION}_v0
    git push --tags --set-upstream origin $CCTK_VERSION
  fi
  cd - >/dev/null
  sleep 5 # bitbucket enforces some rate limit on pushes its seems
done

update websites and online documentation

https://docs.einsteintoolkit.org/et-docs/Editing_the_Einstein_Toolkit_website

  • Update main ET web site (update version numbers, urls), searching for ET_YYYY_MM finds them all
#!/bin/bash

set -e -x

export EDITOR=vim

export ET_RELEASE=ET_2020_05
export PREVIOUS_ET_RELEASE=ET_2019_10

export ET_RELEASE_CODENAME=Turing
export PREVIOUS_ET_RELEASE_CODENAME=Mayer
export ET_RELEASE_CODENAME_FULL="Alan Turing"

export ET_RELEASE_URL="https://en.wikipedia.org/wiki/Alan_Turing"
export PREVIOUS_ET_RELEASE_URL="https://en.wikipedia.org/wiki/Maria_Goeppert_Mayer"

export ET_RELEASE_DATE="May 31st, 2020"
export ET_RELEASE_DATE_ISO=2020-05-31

ALL_FILES=$(git grep -l "\($PREVIOUS_ET_RELEASE\|$PREVIOUS_ET_RELEASE_CODENAME\)"  | grep -v 'about/releases/' | grep -vF past-releases.html | grep -vF publications/2013_MHD/index.php | grep -vF developers. | grep -vF members.txt | grep -vF mp.html) 

# update URL first since it tends to include the release codename
sed -i "s!$PREVIOUS_ET_RELEASE_URL!$ET_RELEASE_URL!g" index.html

# update release names
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" $ALL_FILES
sed -i "s/$PREVIOUS_ET_RELEASE_CODENAME/$ET_RELEASE_CODENAME/g" $ALL_FILES

# release date
sed -i "s/[(]released on [^)]*[)]/(released on $ET_RELEASE_DATE)/g" download.html

# update past reelases, mark this one as most recent
# TODO: use something other than sed for this
sed -i -e '/List of Einstein Toolkit releases:/{n;b add_release}' -e 'b end' -e ':add_release;a\
          <li>'$ET_RELEASE' "'"$ET_RELEASE_CODENAME_FULL"'", <a href="about/releases/'$ET_RELEASE'_announcement.html">released '$ET_RELEASE_DATE_ISO'</a>\
          </li>' -e ':end' past-releases.html

# add news item to front page
$EDITOR index.html

git diff

git add $ALL_FILES past-releases.html download.html index.html
git commit -m "update to $ET_RELEASE"

echo 'Use git show and git commit --amend to correct mistakes'
<pre>
:* Update simfactory.org https://svn.cct.lsu.edu/repos/numrel/simfactory2/www/
<pre>
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" simfactory/download/index.php
export KUIBIT_RELEASE=...
sed -i "s/$PREVIOUS_ET_RELEASE/$ET_RELEASE/g" CactusTutorial.ipynb
sed -i "s/kuibit==[0-9.]*/kuibit==$KUIBIT_RELEASE/" CactusTutorial.ipynb

From the https://github.com/nds-org/jupyter-et repo, do the following

cd tutorial-server
sed -i "s/ENV ET_RELEASE.*/ENV ET_RELEASE ${ET_RELEASE}/" base.docker
sed -i "s/ENV KUIBIT_RELEASE.*/ENV KUIBIT_RELEASE ${KUIBIT_RELEASE}/" base.docker
git add base.docker
git commit -m "All changes for the $ET_RELEASE release"
touch variables.env
docker-compose -f docker-compose.base.yml build --no-cache --pull 2>&1 | tee docker-compose.base.log
docker-compose -f docker-compose.base.yml push
for c in notebook cilogon cyol ; do
    docker-compose -f docker-compose.$c.yml build 2>&1 | tee docker-compose.$c.log
    docker-compose -f docker-compose.$c.yml push
done

The tutorial server at https://etk.cct.lsu.edu checks for a new image once a day.

  • To update cactuscode.org: git clone git@github.com:EinsteinToolkit/www.cactuscode.org.git
#!/bin/bash

set -e -x

PREVIOUS_ET_RELEASE=ET_2021_11
ET_RELEASE=ET_2022_05

PREVIOUS_ET_ITER=twenty-third
ET_ITER=twenty-fourth

PREVIOUS_CACTUS_VERSION=4.11.0
CACTUS_VERSION=4.12.0

PREVIOUS_ET_WIKIPEDIA="Katherine_Johnson"
ET_WIKIPEDIA="Bernhard_Riemann"

PREVIOUS_ET_NAME="Johnson"
ET_NAME="Riemann"


ET_DATE="$(date +"%B %d, %Y")"
AUTHOR="$(git config --get user.name)"

cd media/news

# keep the mkdir below to so that it fails if the output directories already
# exist

mkdir $ET_RELEASE
cp -a $PREVIOUS_ET_RELEASE/* $ET_RELEASE/
sed -i "s!/$PREVIOUS_ET_WIKIPEDIA!/$ET_WIKIPEDIA!g" $ET_RELEASE/index.md
sed -i "s!$PREVIOUS_ET_NAME!$ET_NAME!g" $ET_RELEASE/index.md
sed -i "s!$PREVIOUS_ET_ITER!$ET_ITER!g" $ET_RELEASE/index.md
sed -i "s!^### .*!### $ET_DATE $AUTHOR!" $ET_RELEASE/index.md

mkdir cactus_$CACTUS_VERSION
cp -a cactus_$PREVIOUS_CACTUS_VERSION/* cactus_$CACTUS_VERSION/
sed -i "s!${PREVIOUS_CACTUS_VERSION//./[.]}!$CACTUS_VERSION!g;" cactus_$CACTUS_VERSION/index.md
sed -i "s!/$PREVIOUS_ET_WIKIPEDIA!/$ET_WIKIPEDIA!g" cactus_$CACTUS_VERSION/index.md
sed -i "s!$PREVIOUS_ET_NAME!$ET_NAME!g" cactus_$CACTUS_VERSION/index.md
sed -i "s!^### .*!### $ET_DATE $AUTHOR!" cactus_$CACTUS_VERSION/index.md

NEWS="$(<../../_data/news.yml)"
cat >../../_data/news.yml <<EOF
- date: "$ET_DATE"
  link: "$ET_RELEASE/index.html"
  title: 'Einstein Toolkit "$ET_NAME" Release'
- date: "$ET_DATE"
  link: "cactus_$CACTUS_VERSION/index.html"
  title: 'Cactus $CACTUS_VERSION Release'
$NEWS
EOF

git add ../../_data/news.yml git add $ET_RELEASE/index.md cactus_$CACTUS_VERSION/index.md
git commit -m "news: add $ET_RELEASE announcement"

release anouncement issues

Other stuff

Changes to announce

First grab the latest dev version:

 curl -kLO https://raw.githubusercontent.com/gridaphobe/CRL/master/GetComponents
 chmod a+x GetComponents
 ./GetComponents --no-shallow --parallel https://bitbucket.org/einsteintoolkit/manifest/raw/master/einsteintoolkit.th


Then in that directory, the following script may be helpful in figuring out what has changed since the last release:

#/bin/bash
PREVRELEASEMONTH=05
PREVRELEASEYEAR=2022
FORMAT="%h %ae %an: %s"
####
TAG="ET_${PREVRELEASEYEAR}_${PREVRELEASEMONTH}_v0"
DATE="${PREVRELEASEMONTH}/01/${PREVRELEASEYEAR}"
for i in repos/*/.git
do
  export GIT_DIR=$i
  DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@')
  echo "CHANGES FOR $(dirname $i)"
  git fetch --tags 1>/dev/null 2>/dev/null
  git log --format="$FORMAT" ${TAG}..${DEFAULT_BRANCH} -- 2>/dev/null
  E=$?
  if [ $E != 0 ]
  then
    echo " >> TAG ${TAG} missing for repo, using date."
    git log --format="$FORMAT" $(git rev-list -n 1 --before="${DATE} 00:00" ${DEFAULT_BRANCH})..${DEFAULT_BRANCH} --
  fi
done

Note that when analyzing the output from the *nrpytutorial/* repo, you'll need to be careful to only check for changes to NRPyPN; all other changes are not ET related.

This misses changes in subversion repositories, currently only in ExternalLibraries which can be queried manually using svn log and usually contain very few changes.

This misses new repositories (or at best only considers recent changes to them).

Emails to send to contributors and gallery runners

Contributors

Dear $CONTRIBUTOR,

In preparation for the upcoming "$RELEASE" release of the Einstein Toolkit I am collecting information about all who contributed to this release of the Einstein Toolkit. All contributors will be listed as authors as shown in this draft

https://sandbox.zenodo.org/record/$ZENODO

You are shown as a contributor to $CODE in

$GIT_COMMIT_HASH_URL

Since you therefore contributed to this release, would you agree to be listed as an author in this and all future releases of the Einstein Toolkit?

If you agree to be listed I will add the information found here

https://www.einsteintoolkit.org/developers.html

to Zenodo.

Please let me or any of the other maintainers know, no later than $DEADLINE_DATE, if you agree to be included as an author and whether the information shown is correct. If there are additional persons that should be listed as authors, please let myself or one of the other maintainers know soon, so that they can be contacted.

Yours, $YOURNAME

To the main contributor (champion) send a request for citations

Dear $CONTRIBUTOR,,

For each component the Einstein Toolkit keeps track of requested ("required") and suggested ("optional") citations that those who use the component should cite.

These are listed on:

https://www.einsteintoolkit.org/citation.html

and auto-generated from the main bibtex file (einsteintoolkit.bib) using the suggested-for and requested-for tags.

For you contributions, if you have any, please send me bibtex entries (in SPIRES style, see the beginning of

https://bitbucket.org/einsteintoolkit/manifest/raw/master/einsteintoolkit.bib

for the desired format) of any requested and suggested citations.

Typically we would suggest one requested citation and any number of suggested citations (eg for optional features or secondary citations).

Websites and Zenodo DOIs are fine, it does not have to be a published paper (though having a DOI would be good).

Yours, $YOURNAME

Release team

Dear $RELEASE_TEAM_MEMBER,

in preparation for the upcoming "$RELEASE" release of the Einstein Toolkit I am collecting information about the release team for this release of the Einstein Toolkit. All release team members will be listed as authors in

https://sandbox.zenodo.org/record/$ZENODO

Since you are a member of the release team, would you agree to be listed as an author in this release of the Einstein Toolkit?

If you agree to be listed I will add the information found here

https://www.einsteintoolkit.org/developers.html

to Zenodo.

Please let me or any of the other maintainers know, no later than $DEADLINE_DATE, if you agree to be included as an author and whether the information shown is correct. If there are additional persons that should be listed as authors, please let myself or one of the other maintainers know soon, so that they can be contacted.

Yours, $YOURNAME