Windows-Server-2003/tools/postbuildscripts/buildname.pm

227 lines
5.8 KiB
Perl
Raw Permalink Normal View History

2024-08-04 01:28:15 +02:00
#---------------------------------------------------------------------
package BuildName;
#
# Copyright (c) Microsoft Corporation. All rights reserved.
#
# Version:
# 1.00 08/31/2000 JeremyD: initial design
# 1.01 12/18/2000 JeremyD: expect and return all lowercase
# add filter_build_names function
#---------------------------------------------------------------------
use strict;
use vars qw(@ISA @EXPORT $VERSION);
use Carp;
use Exporter;
use IO::File;
@ISA = qw(Exporter);
@EXPORT = qw(build_name build_name_parts build_number build_arch
build_type build_branch build_date build_flavor
build_number_major);
$VERSION = '1.01';
sub build_name {
if ($_[0]) { return lc($_[0]) }
my $BuildNamePath = "$ENV{_NTPOSTBLD}\\build_logs";
my $BuildNameFile = "$BuildNamePath\\BuildName.txt";
my $build_name;
if (-e $BuildNameFile) {
my $fh = new IO::File $BuildNameFile, "r";
if (defined $fh) {
$build_name = $fh->getline;
chomp($build_name);
undef $fh;
} else {
carp "Couldn't open file $BuildNameFile: $!";
}
} else {
carp "File $BuildNameFile did not exist";
}
return lc($build_name);
}
sub build_name_parts {
my $name = lc(build_name($_[0]));
return ($name =~ /(\d+(?:-\d+)?) # b. number and opt. revision
\.
(x86|amd64|ia64) # hardcoded flavor list...
(fre|chk) # debug type
\.
([^\.]+) # branch name, no .'s allowed
\.
(\d{6}-\d{4})/x); # date-time stamp
}
sub build_number {
return (build_name_parts($_[0]))[0];
}
sub build_arch {
return (build_name_parts($_[0]))[1];
}
sub build_type {
return (build_name_parts($_[0]))[2];
}
sub build_branch {
return (build_name_parts($_[0]))[3];
}
sub build_date {
return (build_name_parts($_[0]))[4];
}
sub build_flavor {
my ($arch, $type) = (build_arch($_[0]), build_type($_[0]));
if (defined $arch and defined $type) {
return "$arch$type";
}
else {
return;
}
}
sub build_number_major {
my $number = build_number($_[0]);
my ($major) = $number =~ /^(\d+)/;
return $major;
}
1;
__END__
=head1 NAME
BuildName - Read and parse build names
=head1 SYNOPSIS
use BuildName;
$build_name = build_name;
$build_number = build_number;
$build_number = build_number("2222-33.x86fre.LabT2_n.000829-0000");
=head1 DESCRIPTION
BuildName provides several functions for reading and parsing
buildnames.
All build name functions (including build_name) can take a build name
argument to override the default of using the buildname stored in
$ENV{_NTPostBld}\build_logs\BuildName.txt.
If no build name is specified then errors finding or reading
$ENV{_NTPostBld}\build_logs\BuildName.txt are printed to STDERR.
All build name functions return undef if the buildname cannot be read
or parsed.
All functions expect and return lowercase strings.
=over
=item build_name( [$build_name] )
Returns the buildname stored in BuildName.txt, if an argument is
provided that is returned instead without checking BuildName.txt.
Errors finding or reading the buildname file are printed to STDERR
and undef is returned.
=item build_name_parts( [$build_name] )
Returns the individual components of a build name as an array
($number, $arch, $debugtype, $branch, $datetime).
=item build_number( [$build_name] )
Returns the build number component of a build name, including the
minor revision. Minor revision is for international builds only. As
a result the build number may contain non-digit characters. When
testing for equality use the string comparison operator 'eq' instead
of '=='.
=item build_number_major( [$build_name] )
Returns the build number component of a build name, without the minor
revision. This function may return non-digit characters. When testing
for equality use the string comparison operator 'eq' instead of '=='.
=item build_flavor( [$build_name] )
Returns the build flavor component of a build name. 'x86fre' for
example. This is the simple concatenation of arch and debug type.
This can usually be better obtained from
"$ENV{_BuildArch}$ENV{_BuildType}".
=item build_arch( [$build_name] )
Returns the build architecture component of a build name. The only
possible values are currently 'x86', 'amd64', and 'ia64'. This can
usually be better obtained from $ENV{_BuildArch}.
=item build_type( [$build_name] )
Returns the build debug type component of a build name. This is
either 'chk' for builds with debugging enabled and 'fre' for free
builds. This can usually be better obtained from $ENV{_BuildType}.
=item build_branch( [$build_name] )
Returns the branch name component of a build name. This is the value
of branch name environment variable in effect when postbuild was
started. This can usually be better obtained from $ENV{_BuildBranch}.
=item build_date( [$build_name] )
Returns the date/time stamp component of a build name. This is
always in the format YYMMDD-HHMM. Note that sorting this string
ASCIIbetically will also achieve chronological sorting (you can use
perl's default sort).
=back
=head1 RETURN VALUES
All functions return lowercase strings. This includes the functions
build_number and build_number_major.
=head1 ERRORS
All functions return undef to indicate and error and a true value
otherwise.
=head1 ENVIRONMENT
The _NTPOSTBLD environment variable is used to find the build name if
none is given.
=head1 NOTES
Several things are hardcoded in the buildname regular expression. Any
significant change to the build name will require this module to be
updated.
=head1 AUTHOR
Jeremy Devenport <JeremyD>
=head1 COPYRIGHT
Copyright (c) Microsoft Corporation. All rights reserved.
=cut