Skip to content

Commit

Permalink
Change the way we compute the version so that github workflows can us…
Browse files Browse the repository at this point in the history
…e this

Version information is kept in the file VERSION. The file contains
lines for each version from the most recent to the most distant. Each
tab separated line contains a version (of the form
v?[0-9]+.[0-9]+.[0-9]+) and the hash of a git commit that represents
that version. Each line may also have a short description separated by
a tab.

When a new version is committed, only the VERSION file should be
modified and the commit should be tagged (annotated tag) with the
version number.

This also required some changes to the github workflow to pull
the full history of the repository (otherwise the patch level of
the version cannot be computed).

Signed-off-by: Mic Bowman <[email protected]>

Apply suggestions from code review

Co-authored-by: Michael Steiner <[email protected]>
Signed-off-by: Mic Bowman <[email protected]>
  • Loading branch information
cmickeyb and g2flyer committed Oct 16, 2024
1 parent 1b8279c commit 1bfecaf
Show file tree
Hide file tree
Showing 5 changed files with 158 additions and 35 deletions.
13 changes: 11 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
pdo_ci:
if: "!contains(github.event.commits[0].message, '[skip ci]')"
name: PDO CI Job
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04

strategy:
matrix:
Expand All @@ -17,7 +17,16 @@ jobs:

steps:
- name: Check out repo
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
fetch-tags: true

- name: Display branch name
run: |
echo "Building branch $GITHUB_HEAD_REF"
echo PDO VERSION is $(bin/get_version)
- name: Build and run tests
if: "!contains(github.event.commits[0].message, '[debug]')"
Expand Down
3 changes: 3 additions & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
0.3.0 5fa37a13fac2749b1a6a43039ed2bee16d6cc70e
0.2.0 90884c67bf6c1445f96e068c5c06904a89de2411
0.1.0 cd993a69cd5955ebfe5a9e74b37e26c1b479ddce
69 changes: 38 additions & 31 deletions bin/get_version
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,42 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import os
import pathlib
import subprocess
import sys
import warnings

count = 0
commit = ''
dirty = ''

try :
output = subprocess.check_output(['git', 'describe', '--dirty'])
(version, *rest) = output.decode('utf-8').strip().split('-')
(major, minor, patch) = version.strip('v').split('.')

# first case: this is a dirty tagged release, only dirty flag
if len(rest) == 1 :
assert rest[0] == 'dirty'
dirty = 'dirty'
# second case: this is a committed post tag release
elif len(rest) == 2 :
count = rest[0]
commit = rest[1]
# third case: this is a dirty, committed post tag release
elif len(rest) == 3 :
assert rest[2] == 'dirty'
count = rest[0]
commit = rest[1]
dirty = rest[2]

print('{}.{}.{}'.format(major, minor, count))
except Exception as e :
warnings.warn('failed to compute version, using default')
print('0.0.0')

pdo_source_root=pathlib.Path(__file__).parent.parent
version_file = pdo_source_root / 'VERSION'

parser = argparse.ArgumentParser()

parser.add_argument(
'--version-file', '-f',
help=f'File where version information is stored (default: {version_file})',
type=str)

options = parser.parse_args()

if options.version_file :
version_file = pathlib.Path(options.version_file)
pdo_source_root = version_file.parent

# the version file is a tab separated list of version numbers and git commit hashes in reverse
# order (newest is at the top of the file)
with open(version_file, 'r') as vf :
(version, commit, *rest) = vf.readline().strip().split('\t')

# the version is of the form x.y.z, there may be an optional 'v' at the beginning of the version
# string
(major, minor, patch) = version.strip('v').split('.')

# compute the number of commits since the tagged version was
# committed to the repository
command = ['git', 'rev-list', commit + '...HEAD', '--count']
output = subprocess.run(command, cwd=pdo_source_root, capture_output=True, text=True)
count = output.stdout.strip()

# the actual patch version number is the recorded patch number added to the number of commits
# since the version was committed
print('{}.{}.{}'.format(major, minor, int(patch) + int(count)))
100 changes: 100 additions & 0 deletions bin/set_version
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
#!/usr/bin/env python3

# Copyright 2018 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Add a new version to the version file. The version file is a tab separated list of version numbers
# and git commit hashes in reverse order (newest is at the top of the file). The version may contain
# a short description as well.

import argparse
import datetime
import os
import pathlib
import subprocess

pdo_source_root=pathlib.Path(__file__).parent.parent
version_file = pdo_source_root / 'VERSION'

parser = argparse.ArgumentParser()

parser.add_argument(
'--version-file', '-f',
help=f'File where version information is stored (default: {version_file})',
type=str)

parser.add_argument(
'--version', '-v',
help='Version to commit, form <major>.<minor>.<patch> (default: increment minor version by one and reset patch level)',
type=str)

parser.add_argument(
'--description', '-d',
help='Optional description to add to the version',
type=str)

parser.add_argument(
'--commit', '-c',
help='Hash of the git commit to associate with the version (default: commit at HEAD)',
type=str)

options = parser.parse_args()

# Get the VERSION file and current source path
if options.version_file :
version_file = pathlib.Path(options.version_file)
pdo_source_root = version_file.parent

# Compute the new version, by default the version will increment the minor version of the most
# recent version and reset the patch level. the version is of the form x.y.z, there may be an
# optional 'v' at the beginning of the version string
if options.version :
version = options.version
(major, minor, patch) = version.strip('v').split('.')

major = int(major)
minor = int(minor)
patch = int(patch)

else :
# get the current version information from the version file
with open(version_file, 'r') as vf :
(version, commit, *rest) = vf.readline().strip().split('\t')

(major, minor, patch) = version.strip('v').split('.')

major = int(major)
minor = int(minor) + 1
patch = 0

# Compute the commit to associate with the new version
if options.commit :
command = ['git', 'rev-parse', options.commit]
else :
command = ['git', 'rev-parse', 'HEAD']

output = subprocess.run(command, cwd=pdo_source_root, capture_output=True, text=True)
output.check_returncode()
commit = output.stdout.strip()

description = str(datetime.date.today())
if options.description :
description += f' {options.description}'

# Finally write the new version out to the VERSION file
version_entry = f'{major}.{minor}.{patch}\t{commit}\t{description}'
with open(version_file, 'r+') as vf :
content = vf.read()
vf.seek(0,0)
vf.write(version_entry + '\n' + content)
8 changes: 6 additions & 2 deletions build/cmake/ProjectVariables.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,13 @@ ENDIF()
# the version if something goes wrong (like running
# without any annotated version tags)
EXECUTE_PROCESS(
COMMAND ./get_version
WORKING_DIRECTORY ${PDO_SOURCE_ROOT}/bin
COMMAND ${PDO_SOURCE_ROOT}/bin/get_version
WORKING_DIRECTORY ${PDO_SOURCE_ROOT}
OUTPUT_VARIABLE PDO_VERSION
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE
)

IF (NOT PDO_VERSION)
MESSAGE(FATAL_ERROR "Unable to compute PDO_VERSION")
ENDIF()

0 comments on commit 1bfecaf

Please sign in to comment.