Skip to content
Snippets Groups Projects
Commit c5688304 authored by Frank Winklmeier's avatar Frank Winklmeier
Browse files

Extend release notes script to sweeps

Add a `--sweep` mode to create "release notes" (MR diffs) for our daily
master merges. The main change is to add a new template for merge
descriptions and use `git log HEAD^..HEAD` to retrieve the diff.

See !61782 for an example.
parent 9b0403d0
No related branches found
No related tags found
42 merge requests!66406ZDC & ZDC LED monitoring updates,!66102ZDC & RPD monitoring update,!65937Draft: Updated post-processing and plotting scripts for 2023 data in ZLumi_Scripts directory,!65537ZDC - Fix problem with swapping of low and high gain data,!64732Add hypo for time-significance based selection of HLT jets,!64579Draft: Replace status() with functions from TruthUtils,!64531gFex Simulation Updates,!64529gFEX simulation updates,!64426CREST server URL parameter added in IOVDbSvc,!64423CREST server URL parameter added in IOVDbSvc,!64403Draft: ZFinder for jet super ROI,!64345potential bug,!64193Fix WriteDecorHandleKey type for ftag electron barcode decorators,!64090Configuration of AFP+dijet chains,!63927Update NSWPRDValAlg output filenames,!63828Revert "Merge branch 'skip.PyUtils-20230618' into '23.0'",!63827Draft: Updated logic in DQTGlobalWZFinderAlg for trigger function if DQ.useTrigger flag is disabled,!6382423.0-coverity-FPGATrackSimMaps,!63790Draft: replacing HT1000 preselj180 with HT1000 preselcHT450,!63694Draft: Add histograms for overflow monitoring in L1Topo,!63616Substituting hard-coded Z5/Z1 ratio values with soft-coded ones,!63486Draft: Added fragments to record extra infor from HI reco,!63316WIP: Changing default value of tolerance in STEP propagator,!63264Draft: Pass by reference in FTF loops,!63164bugfix NswCondTestAlg,!63067add inner-coincidence plots to TGC offline DQ,!63027Fixing large-R jets collection name,!63010Update R22 derivations to use large-R jet pre-recommendations calibration,!62744Draft: Z-Counting Release 23 Pandas Scripts Directory,!62682CREST data dump option added for IOVDbSvc,!62533createTagMetaInfoFS update,!62410Remove deprecated LLP1 config,!62396Add Iso and Trigger key properties in the example Alg,!62387Draft: Improve Trigger EGamma Emulator python code,!62384store Electron LH (charge ID selector) as float rather than double in derivations,!62222Draft: Replace outdated code with STL,!62134AF3: mirror showers for positrons and negative hadrons,!62001MuonCondTest: Fix compilation with clang15.,!61907Draft: Remove boost from HepMCWeightSvc,!61790Extend release notes script to sweeps,!60432Add linear extrapolation in old charge calibration (ATLASRECTS-7337),!58516Draft: optimization in simulation
#!/bin/env python3
"""Prepare ATLAS release notes with a list of merge requests
#
# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
#
# Original Author: davide.gerbaudo@gmail.com, Jul 2017
# Modified by edward.moyse@cern.ch, Dec 2020
#
"""Create merge request lists for releases and sweeps. Supports two modes:
- Release mode [default], to create release notes for a release built from nightly:
> prepare_release_notes.py release/22.0.82 nightly/22.0/2022-08-02T2101
- Sweep mode, to create the MR diff of the currently checked out branch:
> prepare_release_notes.py --sweep
davide.gerbaudo@gmail.com
Jul 2017
Modified by edward.moyse@cern.ch
Dec 2020
"""
from collections import defaultdict
import subprocess
import re
import os
import argparse
usage = """%prog target_release nightly_tag
where
target_release is the release you are creating, e.g. release/21.1.6
nightly_tag is the nightly tag the release will be based on, e.g. nightly/21.1/2017-06-07T2215
Example:
git clone ssh://git@gitlab.cern.ch:7999/atlas/athena.git
cd athena
%prog release/21.1.6 nightly/21.1/2017-06-07T2215
"""
gitlab_available = True
......@@ -33,31 +29,43 @@ except ImportError:
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser = argparse.ArgumentParser(description=__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('-p', '--previous',
help='previous release wrt. which we diff')
parser.add_argument('-o', '--output', default='release_notes.md',
help='where the notes are written')
parser.add_argument('-r', '--relaxed', action='store_true',
help='do not stop on dubious configurations')
parser.add_argument('-s', '--sweep', action='store_true',
help='prepare notes for a sweep')
parser.add_argument('-v', '--verbose',
action='store_true', help='print more info')
parser.add_argument('--group-merge-requests', action='store_true',
help='Group merge requests with the same labels together.')
parser.add_argument(
'-t', '--token', help='Optionally pass a gitlab token to get more information.')
parser.add_argument('target', help='Target release')
parser.add_argument('nightly', help='Nightly tag to use')
parser.add_argument('target', nargs='?', help='Target release')
parser.add_argument('nightly', nargs='?', help='Nightly tag to use')
args = parser.parse_args()
if args.token and not gitlab_available:
print('WARNING - passing a token but was not able to import gitlab. You probably need to setup python-gitlab first (i.e. lsetup gitlab) or install it locally (see https://python-gitlab.readthedocs.io)')
target_release = args.target
nightly_tag = args.nightly
sanitize_args(target_release, nightly_tag, keep_going=args.relaxed)
previous_release = guess_previous_and_check(
target_release=target_release) if not args.previous else args.previous
if args.sweep:
target_release = '' # not used
previous_release = 'HEAD^' # parent of merge commit
nightly_tag = 'HEAD' # current HEAD
else:
if args.target is None or args.nightly is None:
parser.error('target and nightly are required in release mode')
target_release = args.target
nightly_tag = args.nightly
sanitize_args(target_release, nightly_tag, keep_going=args.relaxed)
previous_release = guess_previous_and_check(
target_release=target_release) if not args.previous else args.previous
verbose = args.verbose
pretty_format = '%b' # perhaps some combination of '%s%n%b' ?
cmd = "git log "+previous_release+".."+nightly_tag + \
......@@ -79,11 +87,14 @@ def main():
print('About to parse the MRs. Depending on the number, this could take a few minutes (run with --verbose to get more output while this is happening).')
merged_mrs = parse_mrs_from_log(output_log['stdout'].decode("utf-8"),
pretty_format=pretty_format, verbose=verbose, gl_project=gl_project)
release_notes = fill_template(target_release, nightly_tag, previous_release,
merged_mrs, output_filename=args.output, verbose=verbose, gl_project=gl_project, group_mrs=args.group_merge_requests)
release_notes = fill_template(sweep_template() if args.sweep else default_template(),
target_release, nightly_tag, previous_release,
merged_mrs, output_filename=args.output, verbose=verbose,
gl_project=gl_project, group_mrs=args.group_merge_requests)
print()
if args.token and gitlab_available:
if not args.sweep and args.token and gitlab_available:
msg = 'Would you like me to create the release for you in gitlab (i.e. make the tag and fill in the release notes)?'
if input("%s (y/N) " % msg).lower() == 'y':
print('Is there a ticket associated with the release build request e.g. ATLINFR-XXXX? (press return to skip)')
......@@ -244,6 +255,11 @@ https://gitlab.cern.ch/atlas/athena/compare/{previous_release:s}...{target_relea
"""
def sweep_template():
return """
This sweep contains the following MRs:
{formatted_list_of_merge_requests:s}
"""
def format_mrs_from_gitlab(merged_mrs, group_mrs=False):
# FIXME - we don't want to dump all labels, so have an approved list
......@@ -274,7 +290,7 @@ def format_mrs_from_gitlab(merged_mrs, group_mrs=False):
return '\n'.join(lines)
def fill_template(target_release, nightly_tag, previous_release,
def fill_template(template, target_release, nightly_tag, previous_release,
merged_mrs=[], output_filename='foo.md', verbose=False, gl_project=None, group_mrs=False):
formatted_mrs = ""
if gl_project:
......@@ -286,13 +302,14 @@ def fill_template(target_release, nightly_tag, previous_release,
def formatted_tag_link(tag=''):
base_url = 'https://gitlab.cern.ch/atlas/athena/tags'
return "[%s](%s)" % (tag, base_url+'/'+tag)
filled_template = default_template().format(**{'target_release': target_release,
'target_release_link': formatted_tag_link(target_release),
'nightly_tag': nightly_tag,
'nightly_tag_link': formatted_tag_link(nightly_tag),
'previous_release': previous_release,
'previous_release_link': formatted_tag_link(previous_release),
'formatted_list_of_merge_requests': formatted_mrs})
filled_template = template.format(**{'target_release': target_release,
'target_release_link': formatted_tag_link(target_release),
'nightly_tag': nightly_tag,
'nightly_tag_link': formatted_tag_link(nightly_tag),
'previous_release': previous_release,
'previous_release_link': formatted_tag_link(previous_release),
'formatted_list_of_merge_requests': formatted_mrs})
out_file = open(output_filename, 'w')
out_file.write(filled_template)
out_file.close()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment