13 Script to prepare the release of Gaudi. 15 @author Marco Clemencic 17 from __future__
import print_function
23 from subprocess
import check_output, CalledProcessError
28 Ensure we have a usable version of Git (>= 1.7.9.1). 31 * https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/1.7.9.1.txt 32 * https://github.com/git/git/commit/36ed1913e1d5de0930e59db6eeec3ccb2bd58bd9 34 version = check_output([
'git',
'--version']).split()[-1]
37 'bad version of git found: %s (1.7.9.1 required)' % version)
40 _VK_RE = re.compile(
r'(\d+|\D+)')
45 Key function to be passes to list.sort() to sort strings 49 int(i)
if i[0]
in '0123456789' else i
for i
in _VK_RE.split(x)
if i
55 Return the latest Gaudi tag (of the format "v*r*..."). 57 logging.info(
'looking for latest tag')
59 logging.debug(
'using command %r', cmd)
60 output = check_output(cmd)
61 vers_exp = re.compile(
r'^v\d+r\d+(p\d+)?$')
62 tags = [tag
for tag
in output.splitlines()
if vers_exp.match(tag)]
64 tags.sort(key=versionKey)
65 logging.info(
'found %s', tags[-1])
67 logging.info(
'no valid tag found')
72 Return the release notes (in the old LHCb format) extracted from git 73 commits for a given path. 76 'git',
'log',
'--first-parent',
'--date=short',
77 '--pretty=format:! %ad - commit %h%n%n%w(80,1,3)- %s%n%n%b%n' 80 cmd.append(
'{0}..{1}'.
format(from_tag, branch
or ''))
85 logging.info(
'preparing release notes for %s%s', path,
86 ' since ' + from_tag
if from_tag
else '')
87 logging.debug(
'using command %r', cmd)
89 out = check_output(cmd).replace(
'\r',
'')
92 def add_contributors(match):
98 '--pretty=format:%aN',
99 '{0}^1..{0}^2'.
format(match.group(1)),
101 return ' - {0} (commit {1})'.
format(
', '.join(sorted(authors)),
103 except CalledProcessError:
104 return match.group(0)
106 out = re.sub(
r' - commit ([0-9a-f]+)', add_contributors, out)
112 Smartly prepend the content of notes to the release.notes file in path. 114 notes_filename = os.path.join(path,
'doc',
'release.notes')
115 logging.info(
'updating %s', notes_filename)
116 from itertools
import takewhile, dropwhile
118 def dropuntil(predicate, iterable):
119 return dropwhile(
lambda x:
not predicate(x), iterable)
121 with open(notes_filename)
as notes_file:
122 orig_data = iter(list(notes_file))
123 header = takewhile(str.strip, orig_data)
124 with open(notes_filename,
'w')
as notes_file:
125 notes_file.writelines(header)
126 notes_file.write(
'\n')
127 notes_file.writelines(l.rstrip() +
'\n' for l
in notes.splitlines())
128 notes_file.write(
'\n')
129 notes_file.writelines(
130 dropuntil(re.compile(
r'^!?============').match, orig_data))
134 title =
' %s %s ' % (pkg, version)
135 letf_chars = (78 - len(title)) / 2
136 right_chars = 78 - letf_chars - len(title)
137 separator = (
'=' * letf_chars) + title + (
'=' * right_chars)
142 logging.basicConfig(level=logging.DEBUG)
143 os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
145 for l
in open(
'toolchain.cmake'):
146 m = re.match(
r'^\s*set\(\s*heptools_version\s+(\S*)\s*\)', l)
148 HEPToolsVers = m.group(1)
149 print(
"Using HEPTools", HEPToolsVers)
152 logging.error(
'Cannot find HEPTools version')
157 for dirpath, dirnames, filenames
in os.walk(os.curdir):
158 if 'CMakeLists.txt' in filenames
and dirpath != os.curdir:
163 dirname
for dirname
in dirnames
164 if (
not dirname.startswith(
'build.')
and dirname !=
'cmake' 171 old_version = latest_tag.split(
'_')[-1]
172 new_version = raw_input((
"The old version of the project is %s, " 173 "which is the new one? ") % old_version)
177 for pkgdir
in all_subdirs():
181 pkgdir, latest_tag,
'master'))
185 for l
in open(
'CMakeLists.txt'):
186 if l.strip().startswith(
'gaudi_project'):
187 l =
'gaudi_project(Gaudi %s)\n' % new_version
189 open(
'CMakeLists.txt',
"w").writelines(out)
192 if __name__ ==
'__main__':
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
def releaseNotes(path=os.curdir, from_tag=None, branch=None)
def tag_bar(pkg, version=None)
def updateReleaseNotes(path, notes)