X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fscripts%2Fversion_tag.pl;h=04333665d68875c953815f6bbfeed71e79852fba;hp=a92fef4b527a223873940033f3cbf6810826b13e;hb=bc059a92353ad884d2659a60383cd6154bc8dad3;hpb=4b28597565a5e732e1bb2b6aecf25e71bfeacccc diff --git a/lustre/scripts/version_tag.pl b/lustre/scripts/version_tag.pl index a92fef4..0433366 100644 --- a/lustre/scripts/version_tag.pl +++ b/lustre/scripts/version_tag.pl @@ -7,20 +7,37 @@ use IO::File; use Time::Local; my $pristine = 1; -my $kernver; +my $kernver = ""; +# Use the CVS tag first otherwise use the portals version sub get_tag() { my $tag; + my $line; my $tagfile = new IO::File; - if (!$tagfile->open("CVS/Tag")) { - return "HEAD"; + if (!$tagfile->open("lustre/CVS/Tag")) { + # is there a good way to do this with git or should the git case just + # fall through to use config.h? it is always nice to know if we are + # working on a tag or branch. + my $verfile = new IO::File; + if (!$verfile->open("config.h")) { + return "UNKNOWN"; + } + while(defined($line = <$verfile>)) { + $line =~ /\#define VERSION "(.*)"/; + if ($1) { + $tag = $1; + last; + } + } + $verfile->close(); + return $tag } else { my $tmp = <$tagfile>; $tagfile->close(); - $tmp =~ m/T(.*)/; + $tmp =~ m/[TN](.*)/; return $1; } } @@ -32,84 +49,122 @@ sub get_latest_mtime() "Nov" => 10, "Dec" => 11); my $last_mtime = 0; - my @entries = `find . -name Entries`; - my $entry_file; - foreach $entry_file (@entries) { - chomp($entry_file); - my $entry = new IO::File; - if (!$entry->open($entry_file)) { - die "unable to open $entry_file: $!\n"; - } - my $line; - while (defined($line = <$entry>)) { - chomp($line); - #print "line: $line\n"; - my ($junk, $file, $version, $date) = split(/\//, $line); - - #print "junk: $junk\nfile: $file\nver: $version\ndate: $date\n"; - #print "last_mtime: " . localtime($last_mtime) . "\n"; - - if ($junk eq "D" || - $file eq "lustre.spec.in" || - $file !~ m/\.(c|h|am|in)$/) { - next; - } - my $cur_dir = $entry_file; - $cur_dir =~ s/\/CVS\/Entries$//; - my @statbuf = stat("$cur_dir/$file"); - my $mtime = $statbuf[9]; - my $local_date = gmtime($mtime); - if ($local_date ne $date && - $file ne "lustre.spec.in") { - #print "$file : " . localtime($mtime) . "\n"; - $pristine = 0; - } - - if ($mtime > $last_mtime) { - $last_mtime = $mtime; + # a CVS checkout + if (-d "CVS") { + # if we got here, we are operating in a CVS checkout + my @entries = `find . -name Entries`; + my $entry_file; + foreach $entry_file (@entries) { + chomp($entry_file); + my $entry = new IO::File; + if (!$entry->open($entry_file)) { + die "unable to open $entry_file: $!\n"; } + my $line; + while (defined($line = <$entry>)) { + chomp($line); + #print "line: $line\n"; + my ($junk, $file, $version, $date) = split(/\//, $line); + + #print "junk: $junk\nfile: $file\nver: $version\ndate: $date\n"; + #print "last_mtime: " . localtime($last_mtime) . "\n"; + + if ($junk eq "D" || + $file eq "lustre.spec.in") { + # also used to skip: "$file !~ m/\.(c|h|am|in)$/" but I see + # no good reason why only the above file patterns should + # count towards pristine/changed. it should be any file, + # surely. + next; + } - if ($date) { - my @t = split(/ +/, $date); - if (int(@t) != 5) { - #print "skipping: $date\n"; + my $cur_dir = $entry_file; + $cur_dir =~ s/\/CVS\/Entries$//; + my @statbuf = stat("$cur_dir/$file"); + my $mtime = $statbuf[9]; + if (!defined($mtime)) { next; } - my ($hours, $min, $sec) = split(/:/, $t[3]); - my ($mon, $mday, $year) = ($t[1], $t[2], $t[4]); - my $secs = 0; - $mon = $months{$mon}; - $secs = timelocal($sec, $min, $hours, $mday, $mon, $year); - if ($secs > $last_mtime) { - $last_mtime = $secs; + my $local_date = gmtime($mtime); + if ($local_date ne $date && + $file ne "lustre.spec.in") { + #print "$file : " . localtime($mtime) . "\n"; + $pristine = 0; + } + + if ($mtime > $last_mtime) { + $last_mtime = $mtime; + } + + if ($date) { + my @t = split(/ +/, $date); + if (int(@t) != 5) { + #print "skipping: $date\n"; + next; + } + my ($hours, $min, $sec) = split(/:/, $t[3]); + my ($mon, $mday, $year) = ($t[1], $t[2], $t[4]); + my $secs = 0; + $mon = $months{$mon}; + $secs = timelocal($sec, $min, $hours, $mday, $mon, $year); + if ($secs > $last_mtime) { + $last_mtime = $secs; + } } } + $entry->close(); + } + } elsif (-d ".git") { + # a git checkout + # TODO: figure out how to determine the most recently modified file + # in a git working copy. + # NOTE: this is not simply the newest file in the whole tree, + # but the newest file in the tree that is from the + # repository. + $last_mtime = time(); + } else { + my $tree_status = new IO::File; + if (!$tree_status->open("tree_status")) { + die "unable to open the tree_status file: $!\n"; + } + my $line; + while (defined($line = <$tree_status>)) { + if ($line =~ /^PRISTINE\s*=\s*(\d)/) { + $pristine = $1; + } elsif ($line =~ /^MTIME\s*=\s*(\d+)/) { + $last_mtime = $1; + } } - $entry->close(); } return $last_mtime; + } sub get_linuxdir() { my $config = new IO::File; - my ($line, $dir); - if (!$config->open("Makefile")) { + my ($line, $dir, $objdir); + if (!$config->open("autoMakefile")) { die "Run ./configure first\n"; } while (defined($line = <$config>)) { chomp($line); - if ($line =~ /LINUX = (.*)/) { + if ($line =~ /LINUX :?= (.*)/) { $dir = $1; + } elsif ($line =~ /LINUX_OBJ :?= (.*)/) { + $objdir = $1; last; } } $config->close(); my $ver = new IO::File; - if (!$ver->open("$dir/include/linux/version.h")) { - die "Run make dep on $dir\n"; - } + if (!$ver->open("$objdir/include/linux/utsrelease.h") && + !$ver->open("$objdir/include/linux/version.h") && + !$ver->open("$dir/include/linux/utsrelease.h") && + !$ver->open("$dir/include/linux/version.h")) { + die "Run make dep on $dir\n"; + } while(defined($line = <$ver>)) { $line =~ /\#define UTS_RELEASE "(.*)"/; if ($1) { @@ -123,13 +178,9 @@ sub get_linuxdir() return $dir; } -sub generate_ver($$$) +sub mtime2date($) { - my $tag = shift; my $mtime = shift; - my $linuxdir = shift; - - #print "localtime: " . localtime($mtime) . "\n"; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($mtime); @@ -138,20 +189,62 @@ sub generate_ver($$$) my $show_last = sprintf("%04d%02d%02d%02d%02d%02d", $year, $mon, $mday, $hour, $min, $sec); + return $show_last; +} + +sub generate_ver($$$) +{ + my $tag = shift; + my $mtime = shift; + my $linuxdir = shift; + + #print "localtime: " . localtime($mtime) . "\n"; + + my $show_last = mtime2date($mtime); + print "#define BUILD_VERSION \""; - if ($pristine) { + + my $lustre_vers = $ENV{LUSTRE_VERS}; + + if ($lustre_vers) { + print "$tag-$lustre_vers\"\n"; + # if we want to get rid of the PRISTINE/CHANGED thing, get rid of these + # lines. maybe we only want to print -CHANGED when something is changed + # and print nothing when it's pristine + } elsif ($pristine) { print "$tag-$show_last-PRISTINE-$linuxdir-$kernver\"\n"; } else { print "$tag-$show_last-CHANGED-$linuxdir-$kernver\"\n"; } } +my $progname = $0; +$progname =~ s/.*\///; + +if ($progname eq "tree_status.pl" && !-d "CVS" && !-d ".git") { + die("a tree status can only be determined in an source code control system checkout\n"); +} + +chomp(my $cwd = `pwd`); + +# ARGV[0] = srcdir +# ARGV[1] = builddir + +# for get_latest_mtime and get_tag you need to be in srcdir + if ($ARGV[0]) { chdir($ARGV[0]); } -my $linuxdir = get_linuxdir(); my $tag = get_tag(); my $mtime = get_latest_mtime(); -generate_ver($tag, $mtime, $linuxdir); + +if ($progname eq "version_tag.pl") { + my $linuxdir = get_linuxdir(); + $linuxdir =~ s/\//\./g; + generate_ver($tag, $mtime, $linuxdir); +} elsif ($progname eq "tree_status.pl") { + print "PRISTINE = $pristine\n"; + print "MTIME = $mtime\n"; +} exit(0);