X-Git-Url: http://git.samba.org/?p=metze%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=make-version.pl;h=a3643ddef8e6f6d377e8a6f1a803b3fdf87431af;hp=af75a6986ba1ade9653f8a23c31f1878ea144ec0;hb=22e5cdbb9bd38710f59ad5ba19c3343b1c033dc7;hpb=fcac03d7e67fa46586b34e6974d57b45b2599660 diff --git a/make-version.pl b/make-version.pl index af75a6986b..a3643ddef8 100755 --- a/make-version.pl +++ b/make-version.pl @@ -45,7 +45,8 @@ # 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 @@ -73,20 +74,22 @@ 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" => 2, + "version_major" => 2, + "version_minor" => 1, + "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", @@ -106,8 +109,7 @@ $ENV{LANG} = "C"; $ENV{LC_ALL} = "C"; $ENV{GIT_PAGER} = ""; -# Run "svn info". Parse out the most recent modification time and the -# revision number. +# Attempt to get revision information from the repository. sub read_repo_info { my $line; my $version_format = $version_pref{"format"}; @@ -115,11 +117,15 @@ 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"}; } @@ -130,9 +136,10 @@ sub read_repo_info { } elsif (-d "$srcdir/.svn" or -d "$srcdir/../.svn") { $info_source = "Command line (svn info)"; $info_cmd = "svn info $srcdir"; + $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: @@ -163,13 +170,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; @@ -177,14 +184,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\}}); if ($? == 0 && length($line) > 1) { $repo_branch = basename($line); } @@ -192,10 +194,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"; @@ -218,6 +222,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; } @@ -263,21 +271,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+)/) { @@ -314,7 +322,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 @@ -364,10 +372,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 @@ -375,12 +379,15 @@ 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(GIT_REVISION 999) # set(PROJECT_MAJOR_VERSION 1) # set(PROJECT_MINOR_VERSION 99) # set(PROJECT_PATCH_VERSION 0) @@ -391,19 +398,24 @@ 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 ""); open(CFGIN, "< $filepath") || die "Can't read $filepath!"; while ($line = ) { - if ($line =~ /^set *\( *PROJECT_MAJOR_VERSION .*([\r\n]+)$/) { + if ($line =~ /^set *\( *GIT_REVISION .*([\r\n]+)$/) { + $line = sprintf("set(GIT_REVISION %d)$1", $num_commits); + } elsif ($line =~ /^set *\( *PROJECT_MAJOR_VERSION .*([\r\n]+)$/) { $line = sprintf("set(PROJECT_MAJOR_VERSION %d)$1", $version_pref{"version_major"}); } elsif ($line =~ /^set *\( *PROJECT_MINOR_VERSION .*([\r\n]+)$/) { $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", $package_string); + $line = sprintf("set(PROJECT_VERSION_EXTENSION \"%s\")$1", $cmake_package_string); } $contents .= $line } @@ -540,7 +552,7 @@ sub update_debian_changelog } # Read Makefile.am for each library, then write back out an updated version. -sub update_lib_releases +sub update_automake_lib_releases { my $line; my $contents = ""; @@ -577,6 +589,37 @@ sub update_lib_releases } } +# 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; + + return if (!$set_version); + + for $filedir ("epan", "wiretap") { # "wsutil" + $contents = ""; + $filepath = $filedir . "/CMakeLists.txt"; + open(CMAKELISTS_TXT, "< $filepath") || die "Can't read $filepath!"; + while ($line = ) { + # set(FULL_SO_VERSION "0.0.0") + + if ($line =~ /^(set\s*\(\s*FULL_SO_VERSION\s+"\d+\.\d+\.)\d+(".*)/) { + $line = sprintf("$1%d$2\n", $version_pref{"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 { @@ -585,15 +628,13 @@ sub update_versioned_files &update_config_nmake; &update_release_notes; &update_debian_changelog; - &update_lib_releases; + &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; if ($git_description) { $VCS_REVISION = "#define VCSVERSION \"" . @@ -608,6 +649,16 @@ 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 = new_version_h(); + my $needs_update = 1; if (open(OLDREV, "<$version_file")) { my $old_VCS_REVISION = . ; if ($old_VCS_REVISION eq $VCS_REVISION) { @@ -640,13 +691,15 @@ 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 ) || 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; } @@ -716,6 +769,7 @@ 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.