Skip to content
Merged

Log sha #1094

Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/archiver.sh
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ echo "VERSION.txt file available on ${topdir}/$(basename ${outfile})"
cd ${topdir}/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT
for file in $(git ls-tree --name-only HEAD -r); do
if [ "${file/acceptance_tests}" != "${file}" ]; then continue; fi # acceptance_tests are not needed for code generation
if [ "${file}" == "VERSION.txt" ]; then continue; fi # skip the committed (non-release) VERSION.txt: the release-ready one generated above must win
mkdir -p ${outdir}/$(dirname ${file})
cp -dp ${file} ${outdir}/${file} # preserve symlinks for AUTHORS, COPYING, COPYING.LESSER and COPYRIGHT
done
Expand Down
27 changes: 27 additions & 0 deletions .github/workflows/version_master.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/bash
# Copyright (C) 2020-2025 CERN and UCLouvain.
# Licensed under the GNU Lesser General Public License (version 3 or later).
# Created by: D. Massaro (2026) for the MG5aMC CUDACPP plugin.

# Generate the "non-release" form of CUDACPP_SA_OUTPUT/VERSION.txt for a normal
# commit/push on master (the release form is instead generated by archiver.sh).
# The file records the minimal supported MG5aMC version and the last commit block.
# It is committed back to the repository by version_master.yml, so at any time it
# stores the information about the most recent (non version-update) commit.

# Path to the top directory of madgraph4gpu
# In the CI this would be simply $(pwd), but allow the script to be run also outside the CI
echo "Executing $0 $*"
topdir=$(cd $(dirname $0)/../..; pwd)

# Create the VERSION.txt file directly inside the plugin source directory
cd ${topdir}/epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT
outfile=VERSION.txt
dateformat='%Y-%m-%d_%H:%M:%S UTC'
rm -f ${outfile} # remove any pre-existing VERSION.txt before regenerating it
touch ${outfile}
echo "mg5_version_minimal = $(cat __init__.py | awk '/minimal_mg5amcnlo_version/{print $3}' | sed 's/(//' | sed 's/)//' | sed 's/,/./g')" >> ${outfile}
echo "" >> ${outfile}
TZ=UTC git --no-pager log -n1 --date=format-local:"${dateformat}" --pretty=format:'commit %h%nAuthor: %an%nAuthorDate: %ad%nCommitter: %cn%nCommitterDate: %cd%nMessage: "%s"%n' >> ${outfile}
python3 -c 'print("="*132)'; cat ${outfile}; python3 -c 'print("="*132)'
echo "VERSION.txt file available on $(pwd)/${outfile}"
59 changes: 59 additions & 0 deletions .github/workflows/version_master.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# Copyright (C) 2020-2025 CERN and UCLouvain.
# Licensed under the GNU Lesser General Public License (version 3 or later).
# Created by: D. Massaro (2026) for the MG5aMC CUDACPP plugin.

#----------------------------------------------------------------------------------------------------------------------------------

name: Version (master)

#----------------------------------------------------------------------------------------------------------------------------------

# On every push to master, (re)generate the non-release CUDACPP_SA_OUTPUT/VERSION.txt
# describing the last commit, and commit it back. The auto commit uses '[skip ci]' so
# that it does not re-trigger this workflow (which would otherwise loop forever): as a
# result VERSION.txt always tracks the latest genuine commit on master.
on:
push:
branches:
- master

#----------------------------------------------------------------------------------------------------------------------------------

jobs:

version:

runs-on: ubuntu-latest

# TEMPORARY! this mirrors the repository guard used in archiver.yml
if: |
( github.repository == 'madgraph5/madgraph4gpu' )
|| ( github.repository == 'valassi/madgraph4gpu' )
Comment thread
Qubitol marked this conversation as resolved.
Outdated

steps:

- name: checkout
uses: actions/checkout@v4
with:
submodules: 'true'

- name: create_versiontxt
run: |
echo "Current directory is $(pwd)"
.github/workflows/version_master.sh

- name: commit_versiontxt
run: |
versiontxt=epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/VERSION.txt
git config user.name github-actions
git config user.email github-actions@github.com
if [ -z "$(git status --porcelain ${versiontxt})" ]; then
echo "No changes detected in ${versiontxt}: nothing to commit"
else
echo "Commit and push ${versiontxt}"
# '[skip ci]' prevents this push from re-triggering the workflow (avoid infinite loop)
git commit -m "Update VERSION.txt [skip ci]" ${versiontxt}
git push
fi

#----------------------------------------------------------------------------------------------------------------------------------
66 changes: 66 additions & 0 deletions epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/launch_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
import internal.extended_cmd as extended_cmd
import internal.banner as banner_mod
import internal.common_run_interface as common_run_interface
import internal.files as files
else:
import madgraph.interface.madevent_interface as madevent_interface
import madgraph.various.misc as misc
import madgraph.interface.extended_cmd as extended_cmd
import madgraph.various.banner as banner_mod
import madgraph.interface.common_run_interface as common_run_interface
import madgraph.iolibs.files as files

class CPPMEInterface(madevent_interface.MadEventCmdShell):
def compile(self, *args, **opts):
Expand Down Expand Up @@ -62,6 +64,70 @@ def compile(self, *args, **opts):
else:
return misc.compile(nb_core=self.options['nb_core'], *args, **opts)

def do_generate_events(self, *args, **kwargs):
cudacpp_version = os.path.join(self.me_dir, "CUDACPP_VERSION.txt")
if os.path.exists(cudacpp_version):
with open(cudacpp_version, "r") as f:
lines = f.readlines()
logger.info("=================================================")
for line in lines:
logger.info(line.strip())
logger.info("=================================================")
return super().do_generate_events(*args, **kwargs)

def do_create_gridpack(self, *args, **kwargs):
"""Overload to embed the CUDACPP_VERSION.txt banner into the gridpack.
The banner is not printed here (this runs at gridpack *creation* time); instead
it is packaged inside the tarball and printed at *run* time by run.sh, since a
gridpack run uses GridPackCmd and never goes through this plugin interface."""
self.embed_cudacpp_version_in_gridpack()
return super().do_create_gridpack(*args, **kwargs)

# DM - make the CUDACPP_VERSION.txt banner available (and printed) inside gridpacks
def embed_cudacpp_version_in_gridpack(self):
"""Prepare the process directory so that make_gridpack packages the CUDACPP banner
and run.sh prints it at runtime. Only files copied into the tarball are touched:
- copy CUDACPP_VERSION.txt into bin/internal/ (bin/ is packaged into madevent/)
- patch bin/internal/Gridpack/run.sh (the template packaged as ./run.sh) to cat it
This must run *before* super().do_create_gridpack(), which invokes make_gridpack."""
version_src = pjoin(self.me_dir, 'CUDACPP_VERSION.txt')
if not os.path.exists(version_src):
logger.warning('CUDACPP_VERSION.txt not found in %s: the gridpack will not print '
'the CUDACPP version banner' % self.me_dir)
return
# 1) copy the banner into a directory that make_gridpack moves into madevent/
# (make_gridpack packages 'bin' but not the process-root CUDACPP_VERSION.txt)
files.cp(version_src, pjoin(self.me_dir, 'bin', 'internal', 'CUDACPP_VERSION.txt'))
# 2) patch the gridpack run.sh so it prints the banner at runtime (idempotent)
runsh = pjoin(self.me_dir, 'bin', 'internal', 'Gridpack', 'run.sh')
if not os.path.exists(runsh):
logger.warning('%s not found: the gridpack will not print the CUDACPP version banner'
% runsh)
return
marker = '# CUDACPP version banner'
with open(runsh) as fsock:
content = fsock.read()
if marker in content:
return # already patched (e.g. create_gridpack called more than once)
# DIR (=./madevent when the gridpack is unpacked) is defined just above this anchor
anchor = '# For Linux'
banner_block = (
'%s (printed by the MG5aMC CUDACPP plugin)\n'
'if [ -f "${DIR}/bin/internal/CUDACPP_VERSION.txt" ]; then\n'
' echo "================================================="\n'
' cat "${DIR}/bin/internal/CUDACPP_VERSION.txt"\n'
' echo "================================================="\n'
'fi\n\n' % marker
)
if anchor not in content:
logger.warning('Could not find the expected anchor in %s: the gridpack will not '
'print the CUDACPP version banner' % runsh)
return
content = content.replace(anchor, banner_block + anchor, 1)
with open(runsh, 'w') as fsock:
fsock.write(content)
logger.info('Patched %s to print the CUDACPP version banner at gridpack runtime' % runsh)

# Phase-Space Optimization ------------------------------------------------------------------------------------
template_on = \
"""#***********************************************************************
Expand Down
50 changes: 50 additions & 0 deletions epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,59 @@ def finalize(self, matrix_element, cmdhistory, MG5options, outputflag):

# Additional patching (OM)
self.add_madevent_plugin_fct() # Added by OM
# DM - write the CUDACPP_VERSION.txt banner file at the root of the process directory
self.write_cudacpp_version_file()
# do not call standard finalize since is this is already done...
#return super().finalize(matrix_element, cmdhistory, MG5options, outputflag)

# DM - build the CUDACPP_VERSION.txt file logged at runtime by the cudacpp bridge (see counters.cc/smatrix_multi.f)
def write_cudacpp_version_file(self):
"""Write <dir_path>/CUDACPP_VERSION.txt, the 4-line version banner printed at runtime.
Information is gathered from two files:
- PLUGIN/CUDACPP_OUTPUT/VERSION.txt : cudacpp version/tag/commit and the minimal MG5 version supported
- <MG5DIR>/VERSION : the current MG5aMC version
The plugin VERSION.txt can be in two forms (release / non-release), see the plugin CLAUDE.md."""
sha_or_tag = 'unknown'
commit_message = ''
mg5_minimal = 'unknown'
mg5_current = 'unknown'
# Parse the plugin VERSION.txt (created by the archiver / master-push workflow)
version_txt = pjoin(PLUGINDIR, 'VERSION.txt')
if os.path.exists(version_txt):
keyval = {} # lines of the form 'key = value'
commit_sha = None
for line in open(version_txt):
if '=' in line:
key, val = line.split('=', 1)
keyval[key.strip()] = val.strip()
elif line.startswith('commit '): # 'commit <sha>'
commit_sha = line.split(None, 1)[1].strip() if len(line.split(None, 1)) > 1 else None
elif line.startswith('Message:'): # 'Message: "<msg>"'
commit_message = line.split(':', 1)[1].strip().strip('"')
# <sha_or_tag>: the tagged cudacpp_version if this is a release, else the commit sha
sha_or_tag = keyval.get('cudacpp_version') or commit_sha or 'unknown'
mg5_minimal = keyval.get('mg5_version_minimal', 'unknown')
else:
logger.warning('CUDACPP VERSION.txt not found in %s: CUDACPP_VERSION.txt will be incomplete' % PLUGINDIR)
# Parse the current MG5aMC version
mg5_version_file = pjoin(MG5DIR, 'VERSION')
if os.path.exists(mg5_version_file):
for line in open(mg5_version_file):
if line.strip().startswith('version'):
mg5_current = line.split('=', 1)[1].strip()
break
# Assemble and write the 4-line banner
cudacpp_line = '%s' % sha_or_tag
if commit_message:
cudacpp_line += ' "%s"' % commit_message
banner = [ 'You are using MadGraph5_aMC@NLO + CUDACPP plugin:',
'CUDACPP version = %s' % cudacpp_line,
'Minimal MadGraph5 version supported = %s' % mg5_minimal,
'Current MadGraph5 version = %s' % mg5_current ]
outpath = pjoin(self.dir_path, 'CUDACPP_VERSION.txt')
open(outpath, 'w').write('\n'.join(banner) + '\n')
logger.info('Created CUDACPP_VERSION.txt in %s' % self.dir_path)

# AV (default from OM's tutorial) - overload settings and add a debug printout
def modify_grouping(self, matrix_element):
"""allow to modify the grouping (if grouping is in place)
Expand Down
Loading