Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tag builds done through alr build with unique build string #1530

Merged
merged 8 commits into from
Jun 14, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
23 changes: 23 additions & 0 deletions alire.toml
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,26 @@ commit = "f607a63b714f09bbf6126de9851cbc21cf8666c9"
[pins.toml_slicer]
url = "https://github.com/mosteo/toml_slicer"
branch = "alire"

# To disable version updating, export ALR_VERSION_DONT_PATCH with any value

# Before building, we add the commit to the version, for unique identification:
[[actions]]
[actions.'case(os)'.windows]
type = "pre-build"
command = ["pwsh", "scripts/version-patcher.ps1"]

[actions.'case(os)'.'...']
type = "pre-build"
command = ["scripts/version-patcher.sh"]

# Afterwards we leave an extra note, so people manually building don't use a
# misleading commit.
[[actions]]
[actions.'case(os)'.windows]
type = "post-build"
command = ["pwsh", "scripts/version-patcher.ps1", "_or_later"]

[actions.'case(os)'.'...']
type = "post-build"
command = ["scripts/version-patcher.sh", "_or_later"]
12 changes: 8 additions & 4 deletions dev/build.sh
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
#!/usr/bin/env bash

# Import reusable bits
pushd $( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) > /dev/null
pushd "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" > /dev/null || exit 1
. functions.sh
popd > /dev/null
popd > /dev/null || exit 1

ALIRE_BUILD_JOBS="${ALIRE_BUILD_JOBS:-0}"
export ALIRE_OS=$(get_OS)
ALIRE_OS=$(get_OS); export ALIRE_OS

scripts/version-patcher.sh

echo "Building with ALIRE_OS=$ALIRE_OS..."
gprbuild "-j$ALIRE_BUILD_JOBS" -r -p -P `dirname $0`/../alr_env.gpr "$@"
gprbuild "-j$ALIRE_BUILD_JOBS" -r -p -P "$(dirname $0)/../alr_env.gpr" "$@"

scripts/version-patcher.sh _or_later
17 changes: 13 additions & 4 deletions scripts/ci-github.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,19 @@ set -o nounset
export PATH+=:${PWD}/bin

# Import reusable bits
pushd $( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
pushd "$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
. ../dev/functions.sh
popd

# Mark location safe to assuage git if necessary (happens in some distros)
if git status 2>&1 | grep -q "dubious ownership"; then
echo "Marking $PWD as safe for git"
git config --global --add safe.directory "$PWD"
fi

# Patch version
scripts/version-patcher.sh

# Build alr
export ALIRE_OS=$(get_OS)
gprbuild -j0 -p -P alr_env
Expand All @@ -37,7 +46,7 @@ echo ............................

# Set up index if not default:
if [ "${INDEX:-}" != "" ]; then
echo Setting default index to: $INDEX
echo Setting default index to: "$INDEX"
alr index --name default --add "$INDEX"
fi

Expand Down Expand Up @@ -65,8 +74,8 @@ fi

echo PYTHON installing testsuite dependencies...

echo Python version: $($run_python --version)
echo Pip version: $($run_pip --version)
echo "Python version: $($run_python --version)"
echo "Pip version: $($run_pip --version)"

$run_pip install --upgrade -r requirements.txt
echo Python search paths:
Expand Down
25 changes: 25 additions & 0 deletions scripts/version-patcher.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# This script dispatches to the Ada patcher, after building it.

# Set strict mode for PowerShell to exit on error
$ErrorActionPreference = "Stop"

$bin = "support/version_patcher/bin/version_patcher.exe"

# If the binary is already in place, do nothing
if (Test-Path $bin) {
Write-Output "Patcher already built."
} elseif (Get-Command gprbuild -ErrorAction SilentlyContinue) {
Write-Output "Building patcher with gprbuild..."
gprbuild -P support/version_patcher/version_patcher.gpr
} elseif (Get-Command alr -ErrorAction SilentlyContinue) {
Write-Output "Building patcher with alr..."
alr -C (Split-Path $bin) build
} else {
Write-Output "WARNING: No Ada tool available to build patcher, skipping."
exit 0
}

& $bin @args

Write-Output "Resulting version file:"
Get-Content src/alire/alire-version.ads | Select-String "Current_Str"
55 changes: 55 additions & 0 deletions scripts/version-patcher.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import os
import re
import subprocess
import sys

def replace_version(filename, build_info):
pattern = r'(Current : constant String := "[^+]+\+)([^"]*)(";)'

# Depending on the context in which this is run, there may be mix-ups with
# line terminators between the environment detected, github runner, etc...
# So just keep them as they are and that should always work.

with open(filename, 'rb') as file:
content = file.read().decode()

# The pattern captures the part between '+' and '";', replacing it with our
# new build information

new_content = re.sub(pattern, r'\g<1>' + build_info + r'\3', content)

# A few sanity checks and write if needed

if new_content == content:
if build_info in content:
print(f"Note: version in {filename} already up to date")
else:
print(f"WARNING: failed to update version in {filename}")
else:
# Ensure the content line terminators are not changed
with open(filename, 'wb') as file:
file.write(new_content.encode())


# If a flag exists, skip any updating, just print a message and exit
if "ALR_VERSION_DONT_PATCH" in os.environ:
print("Note: skipping version update")
sys.exit(0)

# If there is an argument to the script, retrieve it here and use it as the new
# dirty flag after the commit
if len(sys.argv) > 1:
dirty = sys.argv[1]
else:
# Detect whether the current directory contains changes
if subprocess.call(['git', 'diff-index', '--quiet', 'HEAD', '--']) != 0:
dirty = "_dirty"
else:
dirty = ""

# Find the short git commit of the repository in the current directory
commit = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('utf-8').strip()

# Replace the build version part with the short commit hash plus any extra info
print(f"Updating version in src/alire/alire-version.ads to commit {commit}{dirty}...")
replace_version('src/alire/alire-version.ads', commit+dirty)
31 changes: 31 additions & 0 deletions scripts/version-patcher.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/usr/bin/env bash
# This script dispatches to the Ada patcher, after building it.

set -o errexit

# Exit already if the ALR_VERSION_DONT_PATCH flag is defined
if [ "${ALR_VERSION_DONT_PATCH:-unset}" != "unset" ]; then
echo "Skipping version patching..."
exit 0
fi

bin=support/version_patcher/bin/version_patcher

# If the binary is already in place, do nothing
if [ -f $bin ]; then
echo "Patcher already built."
elif (which gprbuild &>/dev/null); then
echo "Building patcher with gprbuild..."
gprbuild -P support/version_patcher/version_patcher.gpr
elif (which alr &>/dev/null); then
echo "Building patcher with alr..."
alr -C "$(dirname $bin)" build
else
echo "WARNING: No Ada tool available to build patcher, skipping."
exit 0
fi

$bin "$@"

echo "Resulting version file:"
cat src/alire/alire-version.ads | grep Current_Str
4 changes: 4 additions & 0 deletions src/alire/alire-version.ads
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ private

-- Remember to update Alire.Index branch if needed too

-- NOTE: in the following version string, the build part (after '+') will
-- be replaced by `alr build` with the current commit, and appended with
-- "_or_later" after build.

Current_Str : constant String := "2.1-dev";
-- 2.0.0: alr settings refactor and minor fixes
-- 2.0.0-rc1: release candidate for 2.0
Expand Down
4 changes: 4 additions & 0 deletions support/version_patcher/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/obj/
/bin/
/alire/
/config/
12 changes: 12 additions & 0 deletions support/version_patcher/alire.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name = "version_patcher"
description = "Patches current commit into alire-version.ads"
version = "0.1.0-dev"

authors = ["Alejandro R. Mosteo"]
maintainers = ["Alejandro R. Mosteo <[email protected]>"]
maintainers-logins = ["mosteo"]
licenses = "MIT OR Apache-2.0 WITH LLVM-exception"
website = ""
tags = []

executables = ["version_patcher"]
20 changes: 20 additions & 0 deletions support/version_patcher/config/version_patcher_config.ads
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
-- Configuration for version_patcher generated by Alire
pragma Restrictions (No_Elaboration_Code);
pragma Style_Checks (Off);

package Version_Patcher_Config is
pragma Pure;

Crate_Version : constant String := "0.1.0-dev";
Crate_Name : constant String := "version_patcher";

Alire_Host_OS : constant String := "linux";

Alire_Host_Arch : constant String := "x86_64";

Alire_Host_Distro : constant String := "ubuntu";

type Build_Profile_Kind is (release, validation, development);
Build_Profile : constant Build_Profile_Kind := development;

end Version_Patcher_Config;
50 changes: 50 additions & 0 deletions support/version_patcher/config/version_patcher_config.gpr
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
-- Configuration for version_patcher generated by Alire
abstract project Version_Patcher_Config is
Crate_Version := "0.1.0-dev";
Crate_Name := "version_patcher";

Alire_Host_OS := "linux";

Alire_Host_Arch := "x86_64";

Alire_Host_Distro := "ubuntu";
Ada_Compiler_Switches := External_As_List ("ADAFLAGS", " ");
Ada_Compiler_Switches := Ada_Compiler_Switches &
(
"-Og" -- Optimize for debug
,"-ffunction-sections" -- Separate ELF section for each function
,"-fdata-sections" -- Separate ELF section for each variable
,"-g" -- Generate debug info
,"-gnatwa" -- Enable all warnings
,"-gnatw.X" -- Disable warnings for No_Exception_Propagation
,"-gnatVa" -- All validity checks
,"-gnaty3" -- Specify indentation level of 3
,"-gnatya" -- Check attribute casing
,"-gnatyA" -- Use of array index numbers in array attributes
,"-gnatyB" -- Check Boolean operators
,"-gnatyb" -- Blanks not allowed at statement end
,"-gnatyc" -- Check comments
,"-gnaty-d" -- Disable check no DOS line terminators present
,"-gnatye" -- Check end/exit labels
,"-gnatyf" -- No form feeds or vertical tabs
,"-gnatyh" -- No horizontal tabs
,"-gnatyi" -- Check if-then layout
,"-gnatyI" -- check mode IN keywords
,"-gnatyk" -- Check keyword casing
,"-gnatyl" -- Check layout
,"-gnatym" -- Check maximum line length
,"-gnatyn" -- Check casing of entities in Standard
,"-gnatyO" -- Check that overriding subprograms are explicitly marked as such
,"-gnatyp" -- Check pragma casing
,"-gnatyr" -- Check identifier references casing
,"-gnatyS" -- Check no statements after THEN/ELSE
,"-gnatyt" -- Check token spacing
,"-gnatyu" -- Check unnecessary blank lines
,"-gnatyx" -- Check extra parentheses
,"-gnatW8" -- UTF-8 encoding for wide characters
);

type Build_Profile_Kind is ("release", "validation", "development");
Build_Profile : Build_Profile_Kind := "development";

end Version_Patcher_Config;
20 changes: 20 additions & 0 deletions support/version_patcher/config/version_patcher_config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* Configuration for version_patcher generated by Alire */
#ifndef VERSION_PATCHER_CONFIG_H
#define VERSION_PATCHER_CONFIG_H

#define CRATE_VERSION "0.1.0-dev"
#define CRATE_NAME "version_patcher"

#define ALIRE_HOST_OS "linux"

#define ALIRE_HOST_ARCH "x86_64"

#define ALIRE_HOST_DISTRO "ubuntu"

#define BUILD_PROFILE_RELEASE 1
#define BUILD_PROFILE_VALIDATION 2
#define BUILD_PROFILE_DEVELOPMENT 3

#define BUILD_PROFILE 3

#endif
Loading
Loading