X-Git-Url: http://git.samba.org/?p=metze%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=make-version.pl;h=f12f8bc590a0bd35c35a99eb7e20808b067e4432;hp=d9d27c69ab90032a52cd9c1dc75143079a892eab;hb=9058363ed7e99db7a36b9ab8f03ceb635a6cb94e;hpb=03c02f33214a2408cc5173d8a22ee6392ea43ccb diff --git a/make-version.pl b/make-version.pl index d9d27c69ab..f12f8bc590 100755 --- a/make-version.pl +++ b/make-version.pl @@ -38,14 +38,15 @@ # pkg_format - Like "format", but used for the local package version. # # If run with the "-r" or "--set-release" argument the AC_INIT macro in -# configure.ac and the VERSION macro in config.nmake will have the +# configure.ac and the VERSION macro in CMakeLists.txt will have the # pkg_format template appended to the version number. version.h will # _not_ be generated if either argument is present. # # Default configuration: # # enable: 1 -# svn_client: 1 +# git_client: 0 +# svn_client: 0 # tortoise_svn: 0 # format: git %Y%m%d%H%M%S # pkg_enable: 1 @@ -58,6 +59,7 @@ use strict; use Time::Local; use File::Basename; +use File::Spec; use POSIX qw(strftime); use Getopt::Long; use Pod::Usage; @@ -73,39 +75,47 @@ my $last_change = 0; my $num_commits = 0; my $commit_id = ''; my $repo_branch = "unknown"; +my $git_executable = "git"; my $git_description = undef; my $get_vcs = 0; my $set_vcs = 0; +my $print_vcs = 0; my $set_version = 0; my $set_release = 0; my %version_pref = ( - "version_major" => 1, - "version_minor" => 99, - "version_micro" => 7, + "version_major" => 2, + "version_minor" => 3, + "version_micro" => 0, "version_build" => 0, "enable" => 1, "git_client" => 0, # set if .git found and .git/svn not found - "svn_client" => 1, + "svn_client" => 0, # set if .svn found "tortoise_svn" => 0, "format" => "git %Y%m%d%H%M%S", # Normal development builds - #"pkg_enable" => 1, - #"pkg_format" => "-%#", + "pkg_enable" => 1, + "pkg_format" => "-%#", # Development releases - "pkg_enable" => 0, - "pkg_format" => "", + #"pkg_enable" => 0, + #"pkg_format" => "", ); my $srcdir = "."; my $info_cmd = ""; +my $verbose = 0; +my $devnull = File::Spec->devnull(); # 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 { my $line; @@ -114,24 +124,29 @@ sub read_repo_info { my $in_entries = 0; my $svn_name; my $repo_version; - my $repo_root = undef; - my $repo_url = undef; my $do_hack = 1; my $info_source = "Unknown"; + # Make sure git is available. + if (!`$git_executable --version`) { + print STDERR "Git unavailable. Git revision will be missing from version string.\n"; + return; + } + if ($version_pref{"pkg_enable"} > 0) { $package_format = $version_pref{"pkg_format"}; } - if (-d "$srcdir/.git" && ! -d "$srcdir/.git/svn") { + if (-e "$srcdir/.git" && ! -d "$srcdir/.git/svn") { $info_source = "Command line (git)"; $version_pref{"git_client"} = 1; } elsif (-d "$srcdir/.svn" or -d "$srcdir/../.svn") { $info_source = "Command line (svn info)"; - $info_cmd = "svn info $srcdir"; + $info_cmd = "cd $srcdir; svn info"; + $version_pref{"svn_client"} = 1; } elsif (-d "$srcdir/.git/svn") { $info_source = "Command line (git-svn)"; - $info_cmd = "(cd $srcdir; git svn info)"; + $info_cmd = "(cd $srcdir; $git_executable svn info)"; } #Git can give us: @@ -162,13 +177,13 @@ sub read_repo_info { use warnings "all"; no warnings "all"; - chomp($line = qx{git --git-dir=$srcdir/.git log -1 --pretty=format:%at}); + chomp($line = qx{$git_executable --git-dir="$srcdir"/.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=$srcdir/.git describe --long --always --match "v*"}); + chomp($line = qx{$git_executable --git-dir="$srcdir"/.git describe --long --always --match "v*"}); if ($? == 0 && length($line) > 1) { my @parts = split(/-/, $line); $git_description = $line; @@ -176,14 +191,9 @@ sub read_repo_info { $commit_id = $parts[-1]; } - chomp($line = qx{git --git-dir=$srcdir/.git ls-remote --get-url origin}); - if (defined($line)) { - $repo_url = $line; - } - # This will break in some cases. Hopefully not during # official package builds. - chomp($line = qx{git --git-dir=$srcdir/.git rev-parse --abbrev-ref --symbolic-full-name \@\{upstream\}}); + chomp($line = qx{$git_executable --git-dir="$srcdir"/.git rev-parse --abbrev-ref --symbolic-full-name \@\{upstream\} 2> $devnull}); if ($? == 0 && length($line) > 1) { $repo_branch = basename($line); } @@ -191,10 +201,12 @@ sub read_repo_info { 1; }; - if ($last_change && $num_commits && $repo_url && $repo_branch) { + if ($last_change && $num_commits && $repo_branch) { $do_hack = 0; } } elsif ($version_pref{"svn_client"}) { + my $repo_root = undef; + my $repo_url = undef; eval { use warnings "all"; no warnings "all"; @@ -217,6 +229,10 @@ sub read_repo_info { 1; }; + if ($repo_url && $repo_root && index($repo_url, $repo_root) == 0) { + $repo_branch = substr($repo_url, length($repo_root)); + } + if ($last_change && $num_commits && $repo_url && $repo_root) { $do_hack = 0; } @@ -239,21 +255,7 @@ sub read_repo_info { unlink($tortoise_file); } - if ($num_commits == 0) { - # Fall back to config.nmake - $info_source = "Prodding config.nmake"; - my $filepath = "$srcdir/config.nmake"; - open(CFGNMAKE, "< $filepath") || die "Can't read $filepath!"; - while ($line = ) { - if ($line =~ /^VCS_REVISION=(\d+)/) { - $num_commits = $1; - $do_hack = 0; - last; - } - } - close (CFGNMAKE); - } - if ($num_commits == 0 and -d "$srcdir/.git") { + if ($num_commits == 0 and -e "$srcdir/.git") { # Try git... eval { @@ -262,21 +264,21 @@ sub read_repo_info { # If someone had properly tagged 1.9.0 we could also use # "git describe --abbrev=1 --tags HEAD" - $info_cmd = "(cd $srcdir; git log --format='%b' -n 1)"; + $info_cmd = "(cd $srcdir; $git_executable log --format='%b' -n 1)"; $line = qx{$info_cmd}; if (defined($line)) { if ($line =~ /svn path=.*; revision=(\d+)/) { $num_commits = $1; } } - $info_cmd = "(cd $srcdir; git log --format='%ad' -n 1 --date=iso)"; + $info_cmd = "(cd $srcdir; $git_executable 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); } } - $info_cmd = "(cd $srcdir; git branch)"; + $info_cmd = "(cd $srcdir; $git_executable branch)"; $line = qx{$info_cmd}; if (defined($line)) { if ($line =~ /\* (\S+)/) { @@ -313,7 +315,7 @@ sub read_repo_info { if ($do_hack) { # Start of ugly internal SVN file hack if (! open (ENTRIES, "< $srcdir/.svn/entries")) { - print ("Unable to open $srcdir/.svn/entries\n"); + print STDERR "Unable to open $srcdir/.svn/entries\n"; } else { $info_source = "Prodding .svn"; # We need to find out whether our parser can handle the entries file @@ -363,10 +365,6 @@ sub read_repo_info { $package_string = strftime($package_format, gmtime($last_change)); } - if ($repo_url && $repo_root && index($repo_url, $repo_root) == 0) { - $repo_branch = substr($repo_url, length($repo_root)); - } - if ($get_vcs) { print <<"Fin"; Commit distance : $num_commits @@ -374,6 +372,8 @@ Commit ID : $commit_id Revision source : $info_source Release stamp : $package_string Fin + } elsif ($print_vcs) { + print new_version_h(); } } @@ -391,9 +391,6 @@ sub update_cmakelists_txt my $contents = ""; my $version = ""; my $filepath = "$srcdir/CMakeLists.txt"; - my $cmake_package_string = "\$ENV{WIRESHARK_VERSION_EXTRA}"; - - if ($package_string ne "") { $cmake_package_string = $package_string; } return if (!$set_version && $package_string eq ""); @@ -407,8 +404,8 @@ sub update_cmakelists_txt $line = sprintf("set(PROJECT_MINOR_VERSION %d)$1", $version_pref{"version_minor"}); } elsif ($line =~ /^set *\( *PROJECT_PATCH_VERSION .*([\r\n]+)$/) { $line = sprintf("set(PROJECT_PATCH_VERSION %d)$1", $version_pref{"version_micro"}); - } elsif ($line =~ /^set *\( *PROJECT_VERSION_EXTENSION.*([\r\n]+)$/) { - $line = sprintf("set(PROJECT_VERSION_EXTENSION \"%s\")$1", $cmake_package_string); + } elsif ($line =~ /^set *\( *PROJECT_VERSION_EXTENSION .*([\r\n]+)$/) { + $line = sprintf("set(PROJECT_VERSION_EXTENSION \"%s\")$1", $package_string); } $contents .= $line } @@ -438,8 +435,8 @@ sub update_configure_ac $line = sprintf("m4_define([version_minor], [%d])$1", $version_pref{"version_minor"}); } elsif ($line =~ /^m4_define\( *\[?version_micro\]? *,.*([\r\n]+)$/) { $line = sprintf("m4_define([version_micro], [%d])$1", $version_pref{"version_micro"}); - } elsif ($line =~ /^m4_append\( *\[?version_micro_extra\]? *,.*([\r\n]+)$/) { - $line = sprintf("m4_append([version_micro_extra], [%s])$1", $package_string); + } elsif ($line =~ /^m4_define\( *\[?version_extra\]? *,.*([\r\n]+)$/) { + $line = sprintf("m4_define([version_extra], [%s])$1", $package_string); } $contents .= $line } @@ -450,41 +447,6 @@ sub update_configure_ac print "$filepath has been updated.\n"; } -# Read config.nmake, then write it back out with an updated -# "VERSION" line. -sub update_config_nmake -{ - my $line; - my $contents = ""; - my $version = ""; - my $filepath = "$srcdir/config.nmake"; - my $win_package_string = "\$(WIRESHARK_VERSION_EXTRA)"; - - if ($package_string ne "") { $win_package_string = $package_string; } - - - open(CFGNMAKE, "< $filepath") || die "Can't read $filepath!"; - while ($line = ) { - if ($line =~ /^VCS_REVISION=.*([\r\n]+)$/) { - $line = sprintf("VCS_REVISION=%d$1", $num_commits); - } elsif ($set_version && $line =~ /^VERSION_MAJOR=.*([\r\n]+)$/) { - $line = sprintf("VERSION_MAJOR=%d$1", $version_pref{"version_major"}); - } elsif ($set_version && $line =~ /^VERSION_MINOR=.*([\r\n]+)$/) { - $line = sprintf("VERSION_MINOR=%d$1", $version_pref{"version_minor"}); - } elsif ($set_version && $line =~ /^VERSION_MICRO=.*([\r\n]+)$/) { - $line = sprintf("VERSION_MICRO=%d$1", $version_pref{"version_micro"}); - } elsif ($line =~ /^VERSION_EXTRA=.*([\r\n]+)$/) { - $line = "VERSION_EXTRA=$win_package_string$1"; - } - $contents .= $line - } - - open(CFGNMAKE, "> $filepath") || die "Can't write $filepath!"; - print(CFGNMAKE $contents); - close(CFGNMAKE); - print "$filepath has been updated.\n"; -} - # Read docbook/asciidoc.conf, then write it back out with an updated # wireshark-version replacement line. sub update_release_notes @@ -494,14 +456,12 @@ sub update_release_notes my $version = ""; my $filepath = "$srcdir/docbook/asciidoc.conf"; - return if (!$set_version); - open(ADOC_CONF, "< $filepath") || die "Can't read $filepath!"; while ($line = ) { # wireshark-version:\[\]=1.9.1 - if ($line =~ /^wireshark-version:\\\[\\\]=.*([\r\n]+)$/) { - $line = sprintf("wireshark-version:\\\[\\\]=%d.%d.%d$1", + if ($line =~ /^wireshark-version=.*([\r\n]+)$/) { + $line = sprintf("wireshark-version=%d.%d.%d$1", $version_pref{"version_major"}, $version_pref{"version_minor"}, $version_pref{"version_micro"}, @@ -524,8 +484,6 @@ sub update_debian_changelog my $version = ""; my $filepath = "$srcdir/debian/changelog"; - return if ($set_version == 0); - open(CHANGELOG, "< $filepath") || die "Can't read $filepath!"; while ($line = ) { if ($set_version && CHANGELOG->input_line_number() == 1) { @@ -553,8 +511,6 @@ sub update_automake_lib_releases my $filedir; my $filepath; - return if (!$set_version); - # The Libtool manual says # "If the library source code has changed at all since the last # update, then increment revision (‘c:r:a’ becomes ‘c:r+1:a’)." @@ -591,8 +547,6 @@ sub update_cmake_lib_releases my $filedir; my $filepath; - return if (!$set_version); - for $filedir ("epan", "wiretap") { # "wsutil" $contents = ""; $filepath = $filedir . "/CMakeLists.txt"; @@ -616,21 +570,31 @@ sub update_cmake_lib_releases # 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_pref{"version_major"}, + $version_pref{"version_minor"}, $version_pref{"version_micro"}, + $package_string; &update_cmakelists_txt; &update_configure_ac; - &update_config_nmake; - &update_release_notes; - &update_debian_changelog; - &update_automake_lib_releases; - &update_cmake_lib_releases; + if ($set_version) { + &update_release_notes; + &update_debian_changelog; + &update_automake_lib_releases; + &update_cmake_lib_releases; + } } -# Print the version control system's version to $version_file. -# Don't change the file if it is not needed. -sub print_VCS_REVISION +sub new_version_h { my $VCS_REVISION; - my $needs_update = 1; + my $set_header = shift @_; + + if (!$set_header) { + $VCS_REVISION = "/* #undef VCSVERSION */\n"; + $VCS_REVISION .= "/* #undef VCSBRANCH */\n"; + return $VCS_REVISION; + } if ($git_description) { $VCS_REVISION = "#define VCSVERSION \"" . @@ -645,6 +609,26 @@ sub print_VCS_REVISION " Rev Unknown\"\n" . "#define VCSBRANCH \"unknown\"\n"; } + + return $VCS_REVISION; +} + +# Print the version control system's version to $version_file. +# Don't change the file if it is not needed. +sub print_VCS_REVISION +{ + my $VCS_REVISION; + my $needs_update = 1; + my $set_header = 1; + my $git_cdir; + + chomp($git_cdir = qx{git --git-dir="$srcdir/.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"; + $set_header = 0; + } + + $VCS_REVISION = new_version_h($set_header); if (open(OLDREV, "<$version_file")) { my $old_VCS_REVISION = . ; if ($old_VCS_REVISION eq $VCS_REVISION) { @@ -661,6 +645,8 @@ sub print_VCS_REVISION print VER "$VCS_REVISION"; close VER; print "$version_file has been updated.\n"; + } elsif (!$set_header) { + print "$version_file disabled.\n"; } else { print "$version_file unchanged.\n"; } @@ -677,13 +663,16 @@ sub get_config { "help|h", \$show_help, "get-vcs|get-svn|g", \$get_vcs, "set-vcs|set-svn|s", \$set_vcs, + "git-bin", \$git_executable, + "print-vcs", \$print_vcs, "set-version|v", \$set_version, - "set-release|r|package-version|p", \$set_release + "set-release|r|package-version|p", \$set_release, + "verbose", \$verbose ) || pod2usage(2); if ($show_help) { pod2usage(1); } - if ( !( $show_help || $get_vcs || $set_vcs || $set_version || $set_release ) ) { + if ( !( $show_help || $get_vcs || $set_vcs || $print_vcs || $set_version || $set_release ) ) { $set_vcs = 1; } @@ -692,8 +681,8 @@ sub get_config { } if (! open(FILE, "<$vconf_file")) { - print STDERR "Version configuration file $vconf_file not " - . "found. Using defaults.\n"; + print_diag "Version configuration file $vconf_file not " + . "found. Using defaults.\n"; return 1; } @@ -719,7 +708,7 @@ sub get_config { if ($set_version || $set_release) { if ($set_version) { - print "Generating version information\n"; + print "Generating version information.\n"; } if ($version_pref{"enable"} == 0) { @@ -728,7 +717,7 @@ if ($set_version || $set_release) { } if ($set_release) { - print "Generating release information\n"; + print "Generating release information.\n"; } else { print "Resetting release information\n"; $num_commits = 0; @@ -753,16 +742,20 @@ make-version.pl [options] [source directory] --help, -h This help message --get-vcs, -g Print the VCS revision and source. --set-vcs, -s Set the information in version.h + --print-vcs Print the vcs version to standard output --set-version, -v Set the major, minor, and micro versions in - configure.ac, config.nmake, debian/changelog, - and docbook/asciidoc.conf. + the top-level CMakeLists.txt, configure.ac, + docbook/asciidoc.conf, debian/changelog, + the Makefile.am for all libraries, and the + CMakeLists.txt for all libraries. Resets the release information when used by - itself. - --set-release, -r Set the release information in configure.ac - and config.nmake + itself. + --set-release, -r Set the release information in the top-level + CMakeLists.txt, configure.ac --package-version, -p Deprecated. Same as --set-release. + --verbose Print diagnostic messages to STDERR. -Options can be used in any combination. If none are specified B<--set-svn> +Options can be used in any combination. If none are specified B<--set-vcs> is assumed. =cut