diff options
-rw-r--r-- | .gitattributes | 2 | ||||
-rw-r--r-- | .gitlab-ci.yml | 12 | ||||
-rw-r--r-- | CMakeLists.txt | 10 | ||||
-rw-r--r-- | appveyor.yml | 2 | ||||
-rw-r--r-- | docbook/developer-guide-docinfo.xml | 2 | ||||
-rw-r--r-- | docbook/user-guide-docinfo.xml | 2 | ||||
-rw-r--r-- | docbook/wsdg_src/WSDG_chapter_sources.adoc | 6 | ||||
-rw-r--r-- | packaging/nsis/CMakeLists.txt | 2 | ||||
-rwxr-xr-x | packaging/source/git-export-release.sh.in | 2 | ||||
-rw-r--r-- | packaging/wix/CMakeLists.txt | 2 | ||||
-rwxr-xr-x | tools/make-version.pl | 685 | ||||
-rwxr-xr-x | tools/make-version.py | 445 |
12 files changed, 466 insertions, 706 deletions
diff --git a/.gitattributes b/.gitattributes index d6e99cb389..23a4a3e1b2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,5 +5,5 @@ .gitattributes export-ignore .gitignore export-ignore .gitreview export-ignore -tools/make-version.pl export-subst +tools/make-version.py export-subst packaging/source/git-export-release.sh.in export-subst diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1bd87a0bc5..40bcdb4c13 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -143,7 +143,7 @@ variables: - git config --global user.name "Your Name" - mkdir build - cd build - - perl ../tools/make-version.pl --set-release + - python3 ../tools/make-version.py --set-release .. - mv -v ../wireshark-*.tar.* . artifacts: paths: @@ -185,7 +185,7 @@ Source Package: stage: .pre rules: !reference [.if-merged] script: - - perl ../tools/make-version.pl --set-release || ../perl make-version.pl --set-release + - python3 ../tools/make-version.py --set-release .. - printf "\e[0Ksection_start:%s:cmake_section[collapsed=true]\r\e[0KRunning CMake" "$( date +%s)" - cmake -G Ninja $CMAKE_ARGS -DENABLE_CCACHE=ON .. - printf "\e[0Ksection_end:%s:cmake_section\r\e[0K" "$( date +%s)" @@ -208,7 +208,7 @@ Debian Stable APT Package: image: registry.gitlab.com/wireshark/wireshark-containers/debian-stable-dev script: - ln --symbolic --no-dereference --force packaging/debian - - perl tools/make-version.pl --set-release + - python3 tools/make-version.py --set-release . # Shared GitLab runners limit the log size to 4M, so reduce verbosity. See # https://gitlab.com/gitlab-com/support-forum/issues/2790 - export DH_QUIET=1 @@ -330,7 +330,7 @@ Win64 Package: - mkdir build - cd build script: - - perl ../tools/make-version.pl --set-release + - python3 ../tools/make-version.py --set-release .. - cmake -G "Visual Studio 17 2022" -A x64 -DUSE_qt6=ON -DENABLE_LTO=off .. - msbuild /verbosity:minimal "/consoleloggerparameters:PerformanceSummary;NoSummary" /maxcpucount Wireshark.sln - msbuild /verbosity:minimal /maxcpucount test-programs.vcxproj @@ -366,7 +366,7 @@ macOS Arm Package: - wireshark-macos-arm-package retry: 1 script: - - perl tools/make-version.pl --set-release + - python3 tools/make-version.py --set-release . - mkdir build - cd build - printf "\e[0Ksection_start:%s:cmake_section[collapsed=true]\r\e[0KRunning CMake" "$( date +%s)" @@ -400,7 +400,7 @@ macOS Intel Package: script: - export CMAKE_PREFIX_PATH=/usr/local/Qt-5.15.3 - export PATH="$PATH:$HOME/bin" - - perl tools/make-version.pl --set-release + - python3 tools/make-version.py --set-release . - mkdir build - cd build - printf "\e[0Ksection_start:%s:cmake_section[collapsed=true]\r\e[0KRunning CMake" "$( date +%s)" diff --git a/CMakeLists.txt b/CMakeLists.txt index 643cf87573..534df8a313 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,7 @@ endif() project(${_project_name} C CXX) -# Updated by tools/make-version.pl +# Updated by tools/make-version.py set(PROJECT_MAJOR_VERSION 3) set(PROJECT_MINOR_VERSION 7) set(PROJECT_PATCH_VERSION 2) @@ -1715,8 +1715,8 @@ if(VCSVERSION_OVERRIDE) else() add_custom_target(vcs_version BYPRODUCTS vcs_version.h - COMMAND ${PERL_EXECUTABLE} - ${CMAKE_SOURCE_DIR}/tools/make-version.pl + COMMAND ${PYTHON_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/tools/make-version.py ${CMAKE_SOURCE_DIR} ) set_target_properties(vcs_version PROPERTIES FOLDER "Auxiliary") @@ -3582,8 +3582,8 @@ if(RPMBUILD_EXECUTABLE) endif() execute_process( - COMMAND ${PERL_EXECUTABLE} - ${CMAKE_SOURCE_DIR}/tools/make-version.pl + COMMAND ${PYTHON_EXECUTABLE} + ${CMAKE_SOURCE_DIR}/tools/make-version.py ${CMAKE_SOURCE_DIR} ) diff --git a/appveyor.yml b/appveyor.yml index f2709cdd4c..5003615552 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -38,7 +38,7 @@ build: project: build\Wireshark.sln before_build: - - perl tools/make-version.pl --set-release --untagged-version-extra=-{vcsinfo}-AppVeyor --tagged-version-extra=-AppVeyor + - python3 tools/make-version.py --set-release --untagged-version-extra=-{vcsinfo}-AppVeyor --tagged-version-extra=-AppVeyor - mkdir build - cd build - cmake -E time cmake -DCMAKE_SYSTEM_VERSION=10.0.20348.0 -G "%CMAKE_GENERATOR%" .. diff --git a/docbook/developer-guide-docinfo.xml b/docbook/developer-guide-docinfo.xml index 11320680ef..b7b8f5b230 100644 --- a/docbook/developer-guide-docinfo.xml +++ b/docbook/developer-guide-docinfo.xml @@ -1,6 +1,6 @@ <!-- Document information for the Developer's Guide. --> -<!-- Updated by tools/make-version.pl --> +<!-- Updated by tools/make-version.py --> <subtitle>For Wireshark 3.7</subtitle> <!-- <title><inlinegraphic entityref="WiresharkLogo" valign="middle" format="PNG"/> &DocumentTitle;</title> --> diff --git a/docbook/user-guide-docinfo.xml b/docbook/user-guide-docinfo.xml index 70239c3bbb..30a938ee7f 100644 --- a/docbook/user-guide-docinfo.xml +++ b/docbook/user-guide-docinfo.xml @@ -1,6 +1,6 @@ <!-- Document information for the User's Guide. --> -<!-- Updated by tools/make-version.pl --> +<!-- Updated by tools/make-version.py --> <subtitle>For Wireshark 3.7</subtitle> <!-- diff --git a/docbook/wsdg_src/WSDG_chapter_sources.adoc b/docbook/wsdg_src/WSDG_chapter_sources.adoc index 41bce5c3d8..a824925886 100644 --- a/docbook/wsdg_src/WSDG_chapter_sources.adoc +++ b/docbook/wsdg_src/WSDG_chapter_sources.adoc @@ -899,16 +899,16 @@ show how to restrict access using setcap and setuid respectively: ===== Customization Custom version information can be added by running -`tools/make-version.pl`. If your package contains significant changes we +`tools/make-version.py`. If your package contains significant changes we recommend that you use this to differentiate it from official Wireshark releases. [source, sh] ---- -tools/make-version.pl --set-release --untagged-version-extra=-{vcsinfo}-FooCorp --tagged-version-extra=-FooCorp +tools/make-version.py --set-release --untagged-version-extra=-{vcsinfo}-FooCorp --tagged-version-extra=-FooCorp . ---- -See `tools/make-version.pl` for details. +See `tools/make-version.py` for details. The Git version corresponding to each release is in _version.h_. It's defined as a string. If you need a numeric definition, let us know. diff --git a/packaging/nsis/CMakeLists.txt b/packaging/nsis/CMakeLists.txt index 6ba6a68b97..61cc6e566b 100644 --- a/packaging/nsis/CMakeLists.txt +++ b/packaging/nsis/CMakeLists.txt @@ -73,7 +73,7 @@ set(USBPCAP_PACKAGE_VERSION "1.5.4.0") # To do: # - Sync the various version names between CMake and NSIS. -# - Set CMakeLists.txt version strings in tools/make-version.pl +# - Set CMakeLists.txt version strings in tools/make-version.py # - Add a VERSION_EXTRA cmake option set (PRODUCT_VERSION ${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION}.${PROJECT_BUILD_VERSION}) set (LOG_PRODUCT_VERSION ${LOG_PROJECT_MAJOR_VERSION}.${LOG_PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION}.${PROJECT_BUILD_VERSION}) diff --git a/packaging/source/git-export-release.sh.in b/packaging/source/git-export-release.sh.in index f0ebde4039..cc6794d752 100755 --- a/packaging/source/git-export-release.sh.in +++ b/packaging/source/git-export-release.sh.in @@ -33,7 +33,7 @@ shift $(( OPTIND - 1 )) # The remaining parameter, if set, is a package version such as 3.4.5 # or 3.4.5-67-gabcd4321 -# By default the version from make-version.pl + CMake is used. +# By default the version from make-version.py + CMake is used. PROJECT_VERSION=@PROJECT_VERSION@ if test -n "${1-}"; then PROJECT_VERSION="$1" diff --git a/packaging/wix/CMakeLists.txt b/packaging/wix/CMakeLists.txt index 6f229fe0cd..a0925e9e71 100644 --- a/packaging/wix/CMakeLists.txt +++ b/packaging/wix/CMakeLists.txt @@ -71,7 +71,7 @@ endif() # To do: # - Sync the various version names between CMake and Wix. -# - Set CMakeLists.txt version strings in tools/make-version.pl +# - Set CMakeLists.txt version strings in tools/make-version.py # - Add a VERSION_EXTRA cmake option set (VERSION "${PROJECT_VERSION}") set(PRODUCT_VERSION ${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_PATCH_VERSION}.${PROJECT_BUILD_VERSION}) diff --git a/tools/make-version.pl b/tools/make-version.pl deleted file mode 100755 index 1904cb7217..0000000000 --- a/tools/make-version.pl +++ /dev/null @@ -1,685 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright 2004 Jörg Mayer (see AUTHORS file) -# -# Wireshark - Network traffic analyzer -# By Gerald Combs <gerald@wireshark.org> -# Copyright 1998 Gerald Combs -# -# SPDX-License-Identifier: GPL-2.0-or-later - -# See below for usage. -# -# If run with the "-r" or "--set-release" argument the VERSION macro in -# CMakeLists.txt will have the version_extra template appended to the -# version number. vcs_version.h will _not_ be generated if either argument is -# present. -# -# make-version.pl is called during the build to update vcs_version.h in the build -# directory. To set a fixed version, use something like: -# -# cmake -DVCSVERSION_OVERRIDE="Git v3.1.0 packaged as 3.1.0-1" -# - -# XXX - We're pretty dumb about the "{vcsinfo}" substitution, and about having -# spaces in the package format. - -use strict; - -use Time::Local; -use File::Basename; -use File::Spec; -use POSIX qw(strftime); -use Getopt::Long; -use Pod::Usage; -use IO::Handle; -use English; - -my $version_major = undef; -my $version_minor = undef; -my $version_micro = undef; -my $tagged_version_extra = ""; -my $untagged_version_extra = "-{vcsinfo}"; -my $force_extra = undef; -my $package_string = ""; -my $version_file = 'vcs_version.h'; -my $vcs_name = "Git"; -my $last_change = 0; -my $num_commits = 0; -my $commit_id = ''; -my $git_description = undef; -my $get_vcs = 0; -my $set_vcs = 0; -my $print_vcs = 0; -my $set_version = undef; -my $set_release = 0; -my $is_tagged = 0; -my $git_client = 0; -my $svn_client = 0; -my $git_svn = 0; -my $script_dir = dirname(__FILE__); -my $src_dir = "$script_dir/.."; -my $verbose = 0; -my $devnull = File::Spec->devnull(); -my $enable_vcsversion = 1; - -# Ensure we run with correct locale -$ENV{LANG} = "C"; -$ENV{LC_ALL} = "C"; -$ENV{GIT_PAGER} = ""; - -sub print_diag { - print STDERR @_ if $verbose; -} - -# Attempt to get revision information from the repository. -sub read_repo_info { - return if ($set_version); - - my $line; - my $release_candidate = ""; - my $info_source = "Unknown"; - my $is_git_repo = 0; - my $git_abbrev_length = 12; - my $git_cdir; - my $vcs_tag; - my $info_cmd = ""; - - # Tarball produced by 'git archive' will have the $Format string - # substituted due to the use of 'export-subst' in .gitattributes. - my $git_archive_commit = '$Format:%H$'; - my @git_refs = split(/, /, '$Format:%D$'); - if (substr($git_archive_commit, 0, 1) eq '$') { - # If $Format is still present, then this is not a git archive. - $git_archive_commit = undef; - } else { - foreach my $git_ref (@git_refs) { - if ($git_ref =~ /^tag: (v[1-9].+)/) { - $vcs_tag = $1; - $is_tagged = 1; - } - } - } - - $package_string = $untagged_version_extra; - - # For tarball releases, do not invoke git at all and instead rely on - # versioning information that was provided at tarball creation time. - if ($git_archive_commit) { - $info_source = "git archive"; - } elsif (-e "$src_dir/.git" && ! -d "$src_dir/.git/svn") { - $info_source = "Command line (git)"; - $git_client = 1; - $is_git_repo = 1; - } elsif (-d "$src_dir/.svn" or -d "$src_dir/../.svn") { - $info_source = "Command line (svn info)"; - $info_cmd = "cd $src_dir; svn info"; - $svn_client = 1; - } elsif (-d "$src_dir/.git/svn") { - $info_source = "Command line (git-svn)"; - $info_cmd = "(cd $src_dir; git svn info)"; - $is_git_repo = 1; - $git_svn = 1; - } - - # Make sure git is available. - if ($is_git_repo && !`git --version`) { - print STDERR "Git unavailable. Git revision will be missing from version string.\n"; - return; - } - - # Check whether to include VCS version information in vcs_version.h - if ($is_git_repo) { - chomp($git_cdir = qx{git --git-dir="$src_dir/.git" rev-parse --git-common-dir 2> $devnull}); - if ($git_cdir && -f "$git_cdir/wireshark-disable-versioning") { - print_diag "Header versioning disabled using git override.\n"; - $enable_vcsversion = 0; - } - } - - #Git can give us: - # - # A big ugly hash: git rev-parse HEAD - # efd7cb38e67cbfd3333a8c2fd4bc47aaec4ba83c - # - # A small ugly hash: git rev-parse --short HEAD - # efd7cb38e6 - # - # The upstream branch path: git rev-parse --abbrev-ref --symbolic-full-name @{upstream} - # origin/master - # - # A version description: git describe --tags --dirty - # v3.3.0rc0-1829-gefd7cb38e6 - # - # Number of commits in this branch: git rev-list --count HEAD - # 78451 - # - # Number of commits since v3.3.0rc0: git rev-list --count beb1fee6586725bd37651b8a73a1ef51888e99be..HEAD - # 1829 - # Where git show-ref --tags -d | grep v3.3.0 | grep '{}' - # beb1fee6586725bd37651b8a73a1ef51888e99be refs/tags/v3.3.0rc0^{} - # - # Refs: git ls-remote https://gitlab.com/wireshark/wireshark.git | head -n1 - # efd7cb38e67cbfd3333a8c2fd4bc47aaec4ba83c HEAD - - if ($git_archive_commit) { - # Assume a full commit hash, abbreviate it. - $commit_id = substr($git_archive_commit, 0, $git_abbrev_length); - } elsif ($git_client) { - eval { - use warnings "all"; - no warnings "all"; - - chomp($line = qx{git --git-dir="$src_dir"/.git log -1 --pretty=format:%at}); - if ($? == 0 && length($line) > 1) { - $last_change = $line; - } - - # Commits since last annotated tag. - chomp($line = qx{git --git-dir="$src_dir"/.git describe --abbrev=$git_abbrev_length --long --always --match "v[1-9]*"}); - if ($? == 0 && length($line) > 1) { - my @parts = split(/-/, $line); - $git_description = $line; - $num_commits = $parts[-2] ? $parts[-2] : "0"; - $commit_id = $parts[-1]; - - if ($line =~ /v\d+\.\d+\.\d+(rc\d+)-/) { - $release_candidate = $1; - } - - chomp($vcs_tag = qx{git --git-dir="$src_dir"/.git describe --exact-match --match "v[1-9]*" 2> $devnull}); - $is_tagged = ! ($? >> 8); - } - 1; - }; - } elsif ($svn_client || $git_svn) { - eval { - use warnings "all"; - no warnings "all"; - $line = qx{$info_cmd}; - if (defined($line)) { - if ($line =~ /Last Changed Date: (\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/) { - $last_change = timegm($6, $5, $4, $3, $2 - 1, $1); - } - if ($line =~ /Last Changed Rev: (\d+)/) { - $num_commits = $1; - } - $vcs_name = "SVN"; - } - 1; - }; - } - - if (defined $num_commits and $num_commits == 0 and -e "$src_dir/.git") { - - # Try git... - eval { - use warnings "all"; - no warnings "all"; - # If someone had properly tagged 1.9.0 we could also use - # "git describe --abbrev=1 --tags HEAD" - - $info_cmd = "(cd $src_dir; git log --format='%b' -n 1)"; - $line = qx{$info_cmd}; - if (defined($line)) { - if ($line =~ /svn path=.*; revision=(\d+)/) { - $num_commits = $1; - } - } - $info_cmd = "(cd $src_dir; git log --format='%ad' -n 1 --date=iso)"; - $line = qx{$info_cmd}; - if (defined($line)) { - if ($line =~ /(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)/) { - $last_change = timegm($6, $5, $4, $3, $2 - 1, $1); - } - } - 1; - }; - } - - if ($force_extra) { - if ($force_extra eq "tagged") { - $is_tagged = 1; - } elsif ($force_extra eq "untagged") { - $is_tagged = 0; - } - } - - if ($is_tagged) { - print "We are on tag $vcs_tag.\n"; - $package_string = $tagged_version_extra; - } else { - print "We are not tagged.\n"; - } - - # If we picked up the revision and modification time, - # generate our strings. - if ($package_string) { - if(defined $num_commits){ - if($commit_id){ - $package_string =~ s/{vcsinfo}/$num_commits-$commit_id/; - }else{ - $package_string =~ s/{vcsinfo}/$num_commits/; - } - } - else{ - if($commit_id){ - $package_string =~ s/{vcsinfo}/-$commit_id/; - }else{ - $package_string =~ s/{vcsinfo}//; - } - } - } - $package_string = $release_candidate . $package_string; - - if ($get_vcs) { - print <<"Fin"; -Commit distance : $num_commits -Commit ID : $commit_id -Revision source : $info_source -Release stamp : $package_string -Fin - } elsif ($print_vcs) { - print new_version_h(); - } -} - - -# Read CMakeLists.txt, then write it back out with updated "set(PROJECT_..._VERSION ...) -# lines -# set(PROJECT_MAJOR_VERSION 1) -# set(PROJECT_MINOR_VERSION 99) -# set(PROJECT_PATCH_VERSION 0) -# set(PROJECT_BUILD_VERSION 999) -# set(PROJECT_VERSION_EXTENSION "-rc5") -sub update_cmakelists_txt -{ - my $line; - my $contents = ""; - my $version = ""; - my $filepath = "$src_dir/CMakeLists.txt"; - - return if (!$set_version && $package_string eq ""); - - open(CFGIN, "< $filepath") || die "Can't read $filepath!"; - while ($line = <CFGIN>) { - if ($line =~ /^set *\( *PROJECT_MAJOR_VERSION .*?([\r\n]+)$/) { - $line = sprintf("set(PROJECT_MAJOR_VERSION %d)$1", $version_major); - } elsif ($line =~ /^set *\( *PROJECT_MINOR_VERSION .*?([\r\n]+)$/) { - $line = sprintf("set(PROJECT_MINOR_VERSION %d)$1", $version_minor); - } elsif ($line =~ /^set *\( *PROJECT_PATCH_VERSION .*?([\r\n]+)$/) { - $line = sprintf("set(PROJECT_PATCH_VERSION %d)$1", $version_micro); - } elsif ($line =~ /^set *\( *PROJECT_BUILD_VERSION .*?([\r\n]+)$/) { - $line = sprintf("set(PROJECT_BUILD_VERSION %d)$1", $num_commits); - } elsif ($line =~ /^set *\( *PROJECT_VERSION_EXTENSION .*?([\r\n]+)$/) { - $line = sprintf("set(PROJECT_VERSION_EXTENSION \"%s\")$1", $package_string); - } - $contents .= $line - } - - open(CFGIN, "> $filepath") || die "Can't write $filepath!"; - print(CFGIN $contents); - close(CFGIN); - print "$filepath has been updated.\n"; -} - -# Read docbook/attributes.adoc, then write it back out with an updated -# wireshark-version replacement line. -sub update_attributes_asciidoc -{ - my $line; - my $contents = ""; - my $version = ""; - my $filepath = "$src_dir/docbook/attributes.adoc"; - - open(ADOC_CONF, "< $filepath") || die "Can't read $filepath!"; - while ($line = <ADOC_CONF>) { - # :wireshark-version: 2.3.1 - - if ($line =~ /^:wireshark-version:.*?([\r\n]+)$/) { - $line = sprintf(":wireshark-version: %d.%d.%d$1", - $version_major, - $version_minor, - $version_micro, - ); - } - $contents .= $line - } - - open(ADOC_CONF, "> $filepath") || die "Can't write $filepath!"; - print(ADOC_CONF $contents); - close(ADOC_CONF); - print "$filepath has been updated.\n"; -} - -sub update_docinfo_asciidoc -{ - my $line; - my @paths = ("$src_dir/docbook/developer-guide-docinfo.xml", - "$src_dir/docbook/user-guide-docinfo.xml"); - - foreach my $filepath (@paths) { - my $contents = ""; - open(DOCINFO_XML, "< $filepath") || die "Can't read $filepath!"; - while ($line = <DOCINFO_XML>) { - if ($line =~ /^<subtitle>For Wireshark \d.\d+<\/subtitle>([\r\n]+)$/) { - $line = sprintf("<subtitle>For Wireshark %d.%d</subtitle>$1", - $version_major, - $version_minor, - ); - } - $contents .= $line - } - - open(DOCINFO_XML, "> $filepath") || die "Can't write $filepath!"; - print(DOCINFO_XML $contents); - close(DOCINFO_XML); - print "$filepath has been updated.\n"; - } -} - -# Read packaging/debian/changelog, then write back out an updated version. -sub update_debian_changelog -{ - my $line; - my $contents = ""; - my $version = ""; - my $filepath = "$src_dir/packaging/debian/changelog"; - - open(CHANGELOG, "< $filepath") || die "Can't read $filepath!"; - while ($line = <CHANGELOG>) { - if (CHANGELOG->input_line_number() == 1) { - $line =~ /^.*?([\r\n]+)$/; - $line = sprintf("wireshark (%d.%d.%d%s) unstable; urgency=low$1", - $version_major, - $version_minor, - $version_micro, - $package_string, - ); - } - $contents .= $line - } - - open(CHANGELOG, "> $filepath") || die "Can't write $filepath!"; - print(CHANGELOG $contents); - close(CHANGELOG); - print "$filepath has been updated.\n"; -} - -# Read CMakeLists.txt for each library, then write back out an updated version. -sub update_cmake_lib_releases -{ - my $line; - my $contents = ""; - my $version = ""; - my $filedir; - my $filepath; - - for $filedir ("$src_dir/epan", "$src_dir/wiretap") { # "$src_dir/wsutil" - $contents = ""; - $filepath = $filedir . "/CMakeLists.txt"; - open(CMAKELISTS_TXT, "< $filepath") || die "Can't read $filepath!"; - while ($line = <CMAKELISTS_TXT>) { - # VERSION "0.0.0" SOVERSION 0 - - if ($line =~ /^(\s*VERSION\s+"\d+\.\d+\.)\d+(".*[\r\n]+)$/) { - $line = sprintf("$1%d$2", $version_micro); - } - $contents .= $line - } - - open(CMAKELISTS_TXT, "> $filepath") || die "Can't write $filepath!"; - print(CMAKELISTS_TXT $contents); - close(CMAKELISTS_TXT); - print "$filepath has been updated.\n"; - } -} - -# Update distributed files that contain any version information -sub update_versioned_files -{ - # Matches CMakeLists.txt - printf "GR: %d, MaV: %d, MiV: %d, PL: %d, EV: %s\n", - $num_commits, $version_major, - $version_minor, $version_micro, - $package_string; - &update_cmakelists_txt; - &update_debian_changelog; - if ($set_version) { - &update_attributes_asciidoc; - &update_docinfo_asciidoc; - &update_cmake_lib_releases; - } -} - -sub new_version_h -{ - my $line; - if (!$enable_vcsversion) { - return "/* #undef VCSVERSION */\n"; - } - - if ($git_description) { - # Do not bother adding the git branch, the git describe output - # normally contains the base tag and commit ID which is more - # than sufficient to determine the actual source tree. - return "#define VCSVERSION \"$git_description\"\n"; - } - - if ($last_change && $num_commits) { - $line = sprintf("v%d.%d.%d", - $version_major, - $version_minor, - $version_micro, - ); - return "#define VCSVERSION \"$line-$vcs_name-$num_commits\"\n"; - } - - if ($commit_id) { - return "#define VCSVERSION \"$vcs_name commit $commit_id\"\n"; - } - - return "#define VCSVERSION \"$vcs_name Rev Unknown from unknown\"\n"; -} - -# Print the version control system's version to $version_file. -# Don't change the file if it is not needed. -# -# XXX - We might want to add VCSVERSION to CMakeLists.txt so that it can -# generate vcs_version.h independently. -sub print_VCS_REVISION -{ - my $VCS_REVISION; - my $needs_update = 1; - - $VCS_REVISION = new_version_h(); - if (open(OLDREV, "<$version_file")) { - my $old_VCS_REVISION = <OLDREV>; - if ($old_VCS_REVISION eq $VCS_REVISION) { - $needs_update = 0; - } - close OLDREV; - } - - if (! $set_vcs) { return; } - - if ($needs_update) { - # print "Updating $version_file so it contains:\n$VCS_REVISION"; - open(VER, ">$version_file") || die ("Cannot write to $version_file ($!)\n"); - print VER "$VCS_REVISION"; - close VER; - print "$version_file has been updated.\n"; - } elsif (!$enable_vcsversion) { - print "$version_file disabled.\n"; - } else { - print "$version_file unchanged.\n"; - } -} - -# Read our major, minor, and micro version from CMakeLists.txt. -sub get_version -{ - my $line; - my $filepath = "$src_dir/CMakeLists.txt"; - - open(CFGIN, "< $filepath") || die "Can't read $filepath!"; - while ($line = <CFGIN>) { - $line =~ s/^\s+|\s+$//g; - if ($line =~ /^set *\( *PROJECT_MAJOR_VERSION *(\d+) *\)$/) { - $version_major = $1; - } elsif ($line =~ /^set *\( *PROJECT_MINOR_VERSION *(\d+) *\)$/) { - $version_minor = $1; - } elsif ($line =~ /^set *\( *PROJECT_PATCH_VERSION *(\d+) *\)$/) { - $version_micro = $1; - } - } - - close(CFGIN); - - die "Couldn't get major version" if (!defined($version_major)); - die "Couldn't get minor version" if (!defined($version_minor)); - die "Couldn't get micro version" if (!defined($version_micro)); -} - -# Read values from the configuration file, if it exists. -sub get_config { - my $arg; - my $show_help = 0; - - # Get our command-line args - # XXX - Do we need an option to undo --set-release? - GetOptions( - "help|h", \$show_help, - "tagged-version-extra|t=s", \$tagged_version_extra, - "untagged-version-extra|u=s", \$untagged_version_extra, - "force-extra|f=s", \$force_extra, - "get-vcs|g", \$get_vcs, - "set-vcs|s", \$set_vcs, - "print-vcs", \$print_vcs, - "set-version|v=s", \$set_version, - "set-release|r", \$set_release, - "verbose", \$verbose - ) || pod2usage(2); - - if ($show_help) { pod2usage(1); } - - if ( !( $show_help || $get_vcs || $set_vcs || $print_vcs || $set_version || $set_release ) ) { - $set_vcs = 1; - } - - if ($force_extra && !($force_extra eq "tagged" || $force_extra eq "untagged")) { - die "force-extra must be one of \"tagged\" or \"untagged\".\n"; - } - - if ($set_version) { - if ($set_version =~ /^(\d+)\.(\d+)\.(\d+)/) { - $version_major = $1; - $version_minor = $2; - $version_micro = $3; - } else { - die "\"$set_version\" isn't a version.\n"; - } - } - - if ($#ARGV >= 0) { - $src_dir = $ARGV[0] - } - - return 1; -} - -## -## Start of code -## - -&get_version(); - -&get_config(); - -if (! $set_version) { - &read_repo_info(); -} - -&print_VCS_REVISION; - -if ($set_version || $set_release) { - if ($set_version) { - print "Generating version information.\n"; - } - - &update_versioned_files; -} - -__END__ - -=head1 NAM - -make-version.pl - Get and set build-time version information for Wireshark - -=head1 SYNOPSIS - -make-version.pl [options] [source directory] - -=head1 OPTIONS - -=over 4 - -=item --help, -h - -Show this help message. - -=item --tagged-version-extra=<format>, -t <format> - -Extra version information format to use when a tag is found. No format -(an empty string) is used by default. - -=item --untagged-version-extra, -u <format> - -Extra version information format to use when no tag is found. The format -"-{vcsinfo}" (the number of commits and commit ID) is used by default. - -=item --force-extra=<tagged,untagged>, -f <tagged,untagged> - -Force either the tagged or untagged format to be used. - -=item --get-vcs, -g - -Print the VCS revision and source. - -=item --print-vcs - -Print the vcs version to standard output - -=item --set-version=<x.y.z>, -v <x.y.z> - -Set the major, minor, and micro versions in the top-level -CMakeLists.txt, configure.ac, docbook/attributes.adoc, -packaging/debian/changelog, and the CMakeLists.txt for all libraries -to the provided version number. - -=item --set-release, -r - -Set the extra release information in the top-level CMakeLists.txt -based on either default or command-line specified options. - -=item --verbose - -Print diagnostic messages to STDERR. - -=back - -=cut - -# -# Editor modelines - https://www.wireshark.org/tools/modelines.html -# -# Local variables: -# c-basic-offset: 8 -# tab-width: 8 -# indent-tabs-mode: t -# End: -# -# vi: set shiftwidth=8 tabstop=8 noexpandtab: -# :indentSize=8:tabSize=8:noTabs=false: -# -# diff --git a/tools/make-version.py b/tools/make-version.py new file mode 100755 index 0000000000..5a69e3377c --- /dev/null +++ b/tools/make-version.py @@ -0,0 +1,445 @@ +#!/usr/bin/env python3 +# +# Copyright 2022 by Moshe Kaplan +# Based on make-version.pl by Jörg Mayer +# +# Wireshark - Network traffic analyzer +# By Gerald Combs <gerald@wireshark.org> +# Copyright 1998 Gerald Combs +# +# SPDX-License-Identifier: GPL-2.0-or-later + +# See below for usage. +# +# If run with the "-r" or "--set-release" argument the VERSION macro in +# CMakeLists.txt will have the version_extra template appended to the +# version number. vcs_version.h will _not_ be generated if either argument is +# present. +# +# make-version.py is called during the build to update vcs_version.h in the build +# directory. To set a fixed version, use something like: +# +# cmake -DVCSVERSION_OVERRIDE="Git v3.1.0 packaged as 3.1.0-1" +# + +# XXX - We're pretty dumb about the "{vcsinfo}" substitution, and about having +# spaces in the package format. + +import argparse +import os +import os.path +import re +import shlex +import shutil +import sys +import subprocess + +GIT_ABBREV_LENGTH = 12 + +# `git archive` will use an 'export-subst' entry in .gitattributes to replace +# the $Format strings with `git log --pretty=format:` placeholders. +# The output will look something like the following: +# GIT_EXPORT_SUBST_H = '51315cf37cdf6c0add1b1c99cb7941aac4489a6f' +# GIT_EXPORT_SUBST_D = 'HEAD -> master, upstream/master, upstream/HEAD' +# If the text "$Format" is still present, it means that +# git archive did not replace the $Format string, which +# means that this not a git archive. +GIT_EXPORT_SUBST_H = '$Format:%H$' +GIT_EXPORT_SUBST_D = '$Format:%D$' +IS_GIT_ARCHIVE = not GIT_EXPORT_SUBST_H.startswith('$Format') + + +def update_cmakelists_txt(src_dir, set_version, repo_data): + if not set_version and repo_data['package_string'] == "": + return + + cmake_filepath = os.path.join(src_dir, "CMakeLists.txt") + + with open(cmake_filepath, encoding='utf-8') as fh: + cmake_contents = fh.read() + + MAJOR_PATTERN = r"^set *\( *PROJECT_MAJOR_VERSION *\d+ *\)$" + MINOR_PATTERN = r"^set *\( *PROJECT_MINOR_VERSION *\d+ *\)$" + PATCH_PATTERN = r"^set *\( *PROJECT_PATCH_VERSION *\d+ *\)$" + VERSION_EXTENSION_PATTERN = r"^set *\( *PROJECT_VERSION_EXTENSION .*?$" + + new_cmake_contents = cmake_contents + new_cmake_contents = re.sub(MAJOR_PATTERN, + f"set(PROJECT_MAJOR_VERSION {repo_data['version_major']})", + new_cmake_contents, + flags=re.MULTILINE) + new_cmake_contents = re.sub(MINOR_PATTERN, + f"set(PROJECT_MINOR_VERSION {repo_data['version_minor']})", + new_cmake_contents, + flags=re.MULTILINE) + new_cmake_contents = re.sub(PATCH_PATTERN, + f"set(PROJECT_PATCH_VERSION {repo_data['version_patch']})", + new_cmake_contents, + flags=re.MULTILINE) + new_cmake_contents = re.sub(VERSION_EXTENSION_PATTERN, + f"set(PROJECT_VERSION_EXTENSION \"{repo_data['package_string']}\")", + new_cmake_contents, + flags=re.MULTILINE) + + with open(cmake_filepath, mode='w', encoding='utf-8') as fh: + fh.write(new_cmake_contents) + print(cmake_filepath + " has been updated.") + + +def update_debian_changelog(src_dir, repo_data): + # Read packaging/debian/changelog, then write back out an updated version. + + deb_changelog_filepath = os.path.join(src_dir, "packaging", "debian", "changelog") + with open(deb_changelog_filepath, encoding='utf-8') as fh: + changelog_contents = fh.read() + + CHANGELOG_PATTERN = r"^.*" + text_replacement = f"wireshark ({repo_data['version_major']}.{repo_data['version_minor']}.{repo_data['version_patch']}{repo_data['package_string']}) unstable; urgency=low" + # Note: Only need to replace the first line, so we don't use re.MULTILINE or re.DOTALL + new_changelog_contents = re.sub(CHANGELOG_PATTERN, text_replacement, changelog_contents) + with open(deb_changelog_filepath, mode='w', encoding='utf-8') as fh: + fh.write(new_changelog_contents) + print(deb_changelog_filepath + " has been updated.") + + +def update_attributes_asciidoc(src_dir, repo_data): + # Read docbook/attributes.adoc, then write it back out with an updated + # wireshark-version replacement line. + asiidoc_filepath = os.path.join(src_dir, "docbook", "attributes.adoc") + with open(asiidoc_filepath, encoding='utf-8') as fh: + asciidoc_contents = fh.read() + + # Sample line (without quotes): ":wireshark-version: 2.3.1" + ASCIIDOC_PATTERN = r"^:wireshark-version:.*$" + text_replacement = f":wireshark-version: {repo_data['version_major']}.{repo_data['version_minor']}.{repo_data['version_patch']}" + + new_asciidoc_contents = re.sub(ASCIIDOC_PATTERN, text_replacement, asciidoc_contents, flags=re.MULTILINE) + + with open(asiidoc_filepath, mode='w', encoding='utf-8') as fh: + fh.write(new_asciidoc_contents) + + print(asiidoc_filepath + " has been updated.") + + +def update_docinfo_asciidoc(src_dir, repo_data): + doc_paths = [] + doc_paths += [os.path.join(src_dir, 'docbook', 'developer-guide-docinfo.xml')] + doc_paths += [os.path.join(src_dir, 'docbook', 'user-guide-docinfo.xml')] + + for doc_path in doc_paths: + with open(doc_path, encoding='utf-8') as fh: + doc_contents = fh.read() + + # Sample line (without quotes): "<subtitle>For Wireshark 1.2</subtitle>" + DOC_PATTERN = r"^<subtitle>For Wireshark \d+.\d+<\/subtitle>$" + text_replacement = f"<subtitle>For Wireshark {repo_data['version_major']}.{repo_data['version_minor']}</subtitle>" + + new_doc_contents = re.sub(DOC_PATTERN, text_replacement, doc_contents, flags=re.MULTILINE) + + with open(doc_path, mode='w', encoding='utf-8') as fh: + fh.write(new_doc_contents) + print(doc_path + " has been updated.") + + +def update_cmake_lib_releases(src_dir, repo_data): + # Read CMakeLists.txt for each library, then write back out an updated version. + dir_paths = [] + dir_paths += [os.path.join(src_dir, 'epan')] + dir_paths += [os.path.join(src_dir, 'wiretap')] + + for dir_path in dir_paths: + cmakelists_filepath = os.path.join(dir_path, "CMakeLists.txt") + with open(cmakelists_filepath, encoding='utf-8') as fh: + cmakelists_contents = fh.read() + + # Sample line (without quotes; note leading tab: " VERSION "0.0.0" SOVERSION 0") + VERSION_PATTERN = r'^(\s*VERSION\s+"\d+\.\d+\.)\d+' + replacement_text = f"\\g<1>{repo_data['version_patch']}" + new_cmakelists_contents = re.sub(VERSION_PATTERN, + replacement_text, + cmakelists_contents, + flags=re.MULTILINE) + + with open(cmakelists_filepath, mode='w', encoding='utf-8') as fh: + fh.write(new_cmakelists_contents) + print(cmakelists_filepath + " has been updated.") + + +# Update distributed files that contain any version information +def update_versioned_files(src_dir, set_version, repo_data): + update_cmakelists_txt(src_dir, set_version, repo_data) + update_debian_changelog(src_dir, repo_data) + if set_version: + update_attributes_asciidoc(src_dir, repo_data) + update_docinfo_asciidoc(src_dir, repo_data) + update_cmake_lib_releases(src_dir, repo_data) + + +def generate_version_h(repo_data): + # Generate new contents of version.h from repository data + + if not repo_data.get('enable_vcsversion'): + return "/* #undef VCSVERSION */\n" + + if repo_data.get('git_description'): + # Do not bother adding the git branch, the git describe output + # normally contains the base tag and commit ID which is more + # than sufficient to determine the actual source tree. + return f'#define VCSVERSION "{repo_data["git_description"]}"\n' + + if repo_data.get('last_change') and repo_data.get('num_commits'): + version_string = f"v{repo_data['version_major']}.{repo_data['version_minor']}.{repo_data['version_patch']}" + vcs_line = f'#define VCSVERSION "{version_string}-Git-{repo_data["num_commits"]}"\n' + return vcs_line + + if repo_data.get('commit_id'): + vcs_line = f'#define VCSVERSION "Git commit {repo_data["commit_id"]}"\n' + return vcs_line + + vcs_line = '#define VCSVERSION "Git Rev Unknown from unknown"\n' + return vcs_line + + +def print_VCS_REVISION(version_file, repo_data, set_vcs): + # Write the version control system's version to $version_file. + # Don't change the file if it is not needed. + # + # XXX - We might want to add VCSVERSION to CMakeLists.txt so that it can + # generate vcs_version.h independently. + + new_version_h = generate_version_h(repo_data) + + needs_update = True + if os.path.exists(version_file): + with open(version_file, encoding='utf-8') as fh: + current_version_h = fh.read() + if current_version_h == new_version_h: + needs_update = False + + if not set_vcs: + return + + if needs_update: + with open(version_file, mode='w', encoding='utf-8') as fh: + fh.write(new_version_h) + print(version_file + " has been updated.") + elif not repo_data['enable_vcsversion']: + print(version_file + " disabled.") + else: + print(version_file + " unchanged.") + return + + +def get_version(cmakelists_file_data): + # Reads major, minor, and patch + # Sample data: + # set(PROJECT_MAJOR_VERSION 3) + # set(PROJECT_MINOR_VERSION 7) + # set(PROJECT_PATCH_VERSION 2) + + MAJOR_PATTERN = r"^set *\( *PROJECT_MAJOR_VERSION *(\d+) *\)$" + MINOR_PATTERN = r"^set *\( *PROJECT_MINOR_VERSION *(\d+) *\)$" + PATCH_PATTERN = r"^set *\( *PROJECT_PATCH_VERSION *(\d+) *\)$" + + major_match = re.search(MAJOR_PATTERN, cmakelists_file_data, re.MULTILINE) + minor_match = re.search(MINOR_PATTERN, cmakelists_file_data, re.MULTILINE) + patch_match = re.search(PATCH_PATTERN, cmakelists_file_data, re.MULTILINE) + + if not major_match: + raise Exception("Couldn't get major version") + if not minor_match: + raise Exception("Couldn't get minor version") + if not patch_match: + raise Exception("Couldn't get patch version") + + major_version = major_match.groups()[0] + minor_version = minor_match.groups()[0] + patch_version = patch_match.groups()[0] + return major_version, minor_version, patch_version + + +def read_git_archive(tagged_version_extra, untagged_version_extra): + # Reads key data from the git repo. + # For git archives, this does not need to access the source directory because + # `git archive` will use an 'export-subst' entry in .gitattributes to replace + # the value for GIT_EXPORT_SUBST_H in the script. + # Returns a dictionary with key values from the repository + + is_tagged = False + for git_ref in GIT_EXPORT_SUBST_D.split(r', '): + match = re.match(r'^tag: (v[1-9].+)', git_ref) + if match: + is_tagged = True + vcs_tag = match.groups[0] + + if is_tagged: + print(f"We are on tag {vcs_tag}.") + package_string = tagged_version_extra + else: + print("We are not tagged.") + package_string = untagged_version_extra + + # Always 0 commits for a git archive + num_commits = 0 + + # Assume a full commit hash, abbreviate it. + commit_id = GIT_EXPORT_SUBST_H[:GIT_ABBREV_LENGTH] + package_string = package_string.replace("{vcsinfo}", str(num_commits) + "-" + commit_id) + + repo_data = {} + repo_data['commit_id'] = commit_id + repo_data['enable_vcsversion'] = True + repo_data['info_source'] = "git archive" + repo_data['is_tagged'] = is_tagged + repo_data['num_commits'] = num_commits + repo_data['package_string'] = package_string + return repo_data + + +def read_git_repo(src_dir, tagged_version_extra, untagged_version_extra): + # Reads metadata from the git repo for generating the version string + # Returns the data in a dict + + IS_GIT_INSTALLED = shutil.which('git') != '' + if not IS_GIT_INSTALLED: + print("Git unavailable. Git revision will be missing from version string.", file=sys.stderr) + return {} + + GIT_DIR = os.path.join(src_dir, '.git') + # Check whether to include VCS version information in vcs_version.h + enable_vcsversion = True + git_get_commondir_cmd = shlex.split(f'git --git-dir="{GIT_DIR}" rev-parse --git-common-dir') + git_commondir = subprocess.check_output(git_get_commondir_cmd, universal_newlines=True).strip() + if git_commondir and os.path.exists(f"{git_commondir}{os.sep}wireshark-disable-versioning"): + print("Header versioning disabled using git override.") + enable_vcsversion = False + + git_last_changetime_cmd = shlex.split(f'git --git-dir="{GIT_DIR}" log -1 --pretty=format:%at') + git_last_changetime = subprocess.check_output(git_last_changetime_cmd, universal_newlines=True).strip() + + # Commits since last annotated tag. + # Output could be something like: v3.7.2rc0-64-g84d83a8292cb + # Or g84d83a8292cb + git_last_annotated_cmd = shlex.split(f'git --git-dir="{GIT_DIR}" describe --abbrev={GIT_ABBREV_LENGTH} --long --always --match "v[1-9]*"') + git_last_annotated = subprocess.check_output(git_last_annotated_cmd, universal_newlines=True).strip() + parts = git_last_annotated.split('-') + git_description = git_last_annotated + if len(parts) > 1: + num_commits = int(parts[1]) + else: + num_commits = 0 + commit_id = parts[-1] + + release_candidate = '' + RC_PATTERN = r'^v\d+\.\d+\.\d+(rc\d+)$' + match = re.match(RC_PATTERN, parts[0]) + if match: + release_candidate = match.groups()[0] + + # This command is expected to fail if the version is not tagged + try: + git_vcs_tag_cmd = shlex.split(f'git --git-dir="{GIT_DIR}" describe --exact-match --match "v[1-9]*"') + git_vcs_tag = subprocess.check_output(git_vcs_tag_cmd, stderr=subprocess.DEVNULL, universal_newlines=True).strip() + is_tagged = True + except subprocess.CalledProcessError: + is_tagged = False + + git_timestamp = "" + if num_commits == 0: + # Get the timestamp; format is similar to: 2022-06-27 23:09:20 -0400 + # Note: This doesn't appear to be used, only checked for command success + git_timestamp_cmd = shlex.split(f'git --git-dir="{GIT_DIR}" log --format="%ad" -n 1 --date=iso') + git_timestamp = subprocess.check_output(git_timestamp_cmd, universal_newlines=True).strip() + + if is_tagged: + print(f"We are on tag {git_vcs_tag}.") + package_string = tagged_version_extra + else: + print("We are not tagged.") + package_string = untagged_version_extra + + package_string = release_candidate + package_string.replace("{vcsinfo}", str(num_commits) + "-" + commit_id) + + repo_data = {} + repo_data['commit_id'] = commit_id + repo_data['enable_vcsversion'] = enable_vcsversion + repo_data['git_timestamp'] = git_timestamp + repo_data['git_description'] = git_description + repo_data['info_source'] = "Command line (git)" + repo_data['is_tagged'] = is_tagged + repo_data['last_change'] = git_last_changetime + repo_data['num_commits'] = num_commits + repo_data['package_string'] = package_string + return repo_data + + +def parse_versionstring(version_arg): + version_parts = version_arg.split('.') + if len(version_parts) != 3: + msg = "Version must have three numbers of the form x.y.z. You entered: " + version_arg + raise argparse.ArgumentTypeError(msg) + for i, version_type in enumerate(('Major', 'Minor', 'Patch')): + try: + int(version_parts[i]) + except ValueError: + msg = f"{version_type} version must be a number! {version_type} version was '{version_parts[i]}'" + raise argparse.ArgumentTypeError(msg) + return version_parts + + +def read_repo_info(src_dir, tagged_version_extra, untagged_version_extra): + if IS_GIT_ARCHIVE: + repo_data = read_git_archive(tagged_version_extra, untagged_version_extra) + elif os.path.exists(src_dir + os.sep + '.git') and not os.path.exists(os.path.join(src_dir, '.git', 'svn')): + repo_data = read_git_repo(src_dir, tagged_version_extra, untagged_version_extra) + else: + raise Exception(src_dir + " does not appear to be a git repo or git archive!") + + cmake_path = os.path.join(src_dir, "CMakeLists.txt") + with open(cmake_path, encoding='utf-8') as fh: + version_major, version_minor, version_patch = get_version(fh.read()) + repo_data['version_major'] = version_major + repo_data['version_minor'] = version_minor + repo_data['version_patch'] = version_patch + + return repo_data + + +# CMakeLists.txt calls this with no arguments to create vcs_version.h +# AppVeyor calls this with --set-release --untagged-version-extra=-{vcsinfo}-AppVeyor --tagged-version-extra=-AppVeyor +# .gitlab-ci calls this with --set-release +# Release checklist requires --set-version +def main(): + parser = argparse.ArgumentParser(description='Wireshark file and package versions') + action_group = parser.add_mutually_exclusive_group() + action_group.add_argument('--set-version', '-v', metavar='<x.y.z>', type=parse_versionstring, help='Set the major, minor, and patch versions in the top-level CMakeLists.txt, docbook/attributes.adoc, packaging/debian/changelog, and the CMakeLists.txt for all libraries to the provided version number') + sr = action_group.add_argument('--set-release', '-r', action='store_true', help='Set the extra release information in the top-level CMakeLists.txt based on either default or command-line specified options.') + setrel_group = parser.add_argument_group() + setrel_group._group_actions.append(sr) + setrel_group.add_argument('--tagged-version-extra', '-t', default="", help="Extra version information format to use when a tag is found. No format \ +(an empty string) is used by default.") + setrel_group.add_argument('--untagged-version-extra', '-u', default='-{vcsinfo}', help='Extra version information format to use when no tag is found. The format "-{vcsinfo}" (the number of commits and commit ID) is used by default.') + parser.add_argument("src_dir", metavar='src_dir', nargs=1, help="path to source code") + args = parser.parse_args() + + src_dir = args.src_dir[0] + + if args.set_version: + repo_data = {} + repo_data['version_major'] = args.set_version[0] + repo_data['version_minor'] = args.set_version[1] + repo_data['version_patch'] = args.set_version[2] + repo_data['package_string'] = '' + else: + repo_data = read_repo_info(src_dir, args.tagged_version_extra, args.untagged_version_extra) + + set_vcs = not (args.set_release or args.set_version) + VERSION_FILE = 'vcs_version.h' + print_VCS_REVISION(VERSION_FILE, repo_data, set_vcs) + + if args.set_release or args.set_version: + update_versioned_files(src_dir, args.set_version, repo_data) + + +if __name__ == "__main__": + main() |