head 1.4; access; symbols; locks alexis:1.4; strict; comment @# @; 1.4 date 97.10.06.22.44.58; author alexis; state Exp; branches; next 1.3; 1.3 date 97.10.06.16.20.10; author alexis; state Exp; branches; next 1.2; 1.2 date 97.10.06.11.05.29; author alexis; state Exp; branches; next 1.1; 1.1 date 97.10.06.10.34.21; author alexis; state Exp; branches; next ; desc @@ 1.4 log @*** empty log message *** @ text @#!/usr/bin/perl ############################################################################### # # MAKE RELEASE - A RELEASE MANAGEMENT SYSTEM # Copyright (C) 1995-1997 Alexis Huxley # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # ############################################################################### ############################################################################### # # CONFIGURABLE THINGS # ############################################################################### # PERL 5 LIBRARY DIRECTORY # Where are you going to put those .pl files you should have just configured? # and if perl isn't going to be able to find find.pl, then add a colon and # the path to that here as well. $main::localpl_dir = "."; # This lists what should be done to what files. Ideally it should be moved # to an external file. # (V)erson control, (I)d/(N)one/(W)e/(O)ther, (Y)es ident/(N)o ident $MR_ZERO = 0x0000; $MR_VN = 0x0000; $MR_VW = 0x0001; $MR_VO = 0x0002; $MR_VI = 0x0004; $MR_VWY = $MR_VW | $MR_VI; $MR_VOY = $MR_VO | $MR_VI; $MR_VWN = $MR_VW ; $MR_VON = $MR_VO; # (R)elease, (S)ource/(B)inary/(A)ll/(N)either $MR_RN = 0x0000; $MR_RS = 0x0010; $MR_RB = 0x0020; $MR_RA = $MR_RS | $MR_RB; # (M)arker, (Y)es/(N)o $MR_MN = 0x0000; $MR_MY = 0x0040; # VerCntl Rels Marker $files{'Makefile'} = $MR_VWY | $MR_RS; $files{'animal.c'} = $MR_VWY | $MR_RS; $files{'ppplcd_utils.c'} = $MR_VOY | $MR_RS; $files{'ppplcd_utils.h'} = $MR_VOY | $MR_RS; $files{'version.c'} = $MR_VWY | $MR_RS | $MR_MY; $files{'version.h'} = $MR_VWY | $MR_RS; $files{'animal.dat'} = $MR_VN | $MR_RA; $files{'being.dat'} = $MR_VN | $MR_RA; $files{'fruit.dat'} = $MR_VN | $MR_RA; $files{'person.dat'} = $MR_VN | $MR_RA; $files{'girlfriend.dat'} = $MR_VN | $MR_RA; $files{'number.dat'} = $MR_VN | $MR_RA; $files{'person.dat'} = $MR_VN | $MR_RA; $files{'soap.dat'} = $MR_VN | $MR_RA; ############################################################################### # # DON'T CHANGE ANYTHING BELOW HERE # ############################################################################### # Uses first for checking #use strict; #use FileHandle; # STDOUT->autoflush(1); # Progname ($main::progname = $0) =~ s/^.*\/([^\/]+)/$1/; # RCS version string $main::modvers{$main::progname} = "PATCHLEVEL_MARKER"; ($main::modvers{$main::progname} =~ /^P.*R$/) && ($main::modvers{$main::progname} = '$Id: make_release,v 1.3 1997/10/06 16:20:10 alexis Exp alexis $') =~ s/^.*,v (\S+) .*$/$1/; # Modify include path $ENV{'FAD_PERLLIB_DIR'} && ($main::localpl_dir = $ENV{'FAD_PERLLIB_DIR'}); push(@@INC,split(/:/, $main::localpl_dir)); # Requires require "msgs.pl"; ($main::modvers{'msgs.pl'} ne "1.14") && (!$ENV{'FAD_IGNVERS_FLG'}) && &msgs::error("configuration error: wrong version of msgs.pl"); # Program proper starts here $versions_in_releases_file = ".versions_in_releases"; $files{$versions_in_releases_file} = $MR_VWN; ############################################################################## # # ROUTINES TO PERFORM A SIMPLE OPERATION ON A SINGLE FILE # ############################################################################## sub gotmarker { my($file) = @@_; my($rc); open(MARKER_HANDLE, $file) || die; $rc = 0; while () { if (/PATCHLEVEL_MARKER/) { $rc = 1; } } close MARKER_HANDLE; return($rc); } sub usage { print "Usage: $main::progname [ -v | -d ]\n"; print " $main::progname -V\n"; exit(1); } sub main { my(@@ARGV) = @@_; while (defined($ARGV[0]) && $ARGV[0] =~ /^-/) { $_ = shift @@ARGV; if (/^-d(.*)/) { $msgs::verboselevel = ($1 ? $1 : shift @@ARGV); } elsif (/^-v$/) { $msgs::verboselevel = 3; } elsif (/^-V$/) { print "$main::progname version ", $main::modvers{$main::progname}, "\n"; exit 0; } else { &usage; } } &msgs::info("fixing missing, writable and marked files"); foreach $file (sort keys(%files)) { $bits = $files{$file}; (! -f $file && $bits & $MR_VW && &msgs::info("$file: retrieving") && system("co $file > /dev/null 2>&1")); (! -f $file && &msgs::error("$file: missing")); (-w $file && ($bits & $MR_VW) && &msgs::info("$file: writable, investigting") && &coifnc($file) && &msgs::error("$file: modified")); ($bits & $MR_MY && !&gotmarker($file) && &msgs::info("$file: clearing marker") && (system("co $file > /dev/null 2>&1") || !&gotmarker($file)) && &msgs::error("$file: clear marker failed")); } &msgs::info("examining previous and current releases"); $new_release_id = &get_release_id; &msgs::info("marking files"); foreach $file (keys %files) { $bits = $files{$file}; ($bits & $MR_MY && system("perl -pi -e \"s/PATCHLEVEL_MARKER/$new_release_id/g\" $file")); } &msgs::info("making source release $new_release_id"); &make_source_release_files; &msgs::info("clearing marked files and tidying up"); foreach $file (sort keys(%files)) { $bits = $files{$file}; ($bits & $MR_MY && !&gotmarker($file) && (system("co $file > /dev/null 2>&1") || !&gotmarker($file)) && &msgs::error("$file: clear marker failed")); } system("rm -f /tmp/$main::progname.$$.*"); } sub coifnc { my($file) = @@_; if (-w $file && `rcsdiff $file 2>/dev/null` eq "") { &msgs::info("$file: unmodified, checking out again"); system("co -f $file 2>/dev/null"); } return(-w $file); } sub ident { my($file) = @@_; ( ! -f $file || ! -r $file ) && return(0); open(IDENT_HANDLE, $file) || return(0); while () { chop; if (/^.*,v ([0-9\.]+) .*$/) { close(IDENT_HANDLE); return($1); } } close(IDENT_HANDLE); return(0); } sub get_release_id { my ($new_release_id, $old_release_id, $id); open(NEWVERIDS_HANDLE, ">/tmp/$main::progname.$$.newverids") || die; foreach $file ((sort(keys %files))) { $bits = $files{$file}; if ($bits & $MR_VI) { ($id = &ident($file)) == 0 && &msgs::error("$file: ident failed"); print NEWVERIDS_HANDLE "ComponentId: $file $id\n"; } } close NEWVERIDS_HANDLE; open(OLDVERIDS_HANDLE, ">/tmp/$main::progname.$$.oldverids"); open(RELEASE_HANDLE, $versions_in_releases_file) || die; while () { chop; (/^ComponentId: /) && print OLDVERIDS_HANDLE "$_\n"; (/^ReleaseId: (.*)/) && ($old_release_id = "$1"); } close OLDVERIDS_HANDLE; if (!$old_release_id) { $old_release_id = "NONE"; } close RELEASE_HANDLE; if (system("diff /tmp/$main::progname.$$.oldverids /tmp/$main::progname.$$.newverids > /dev/null")) { &question("old release id is $old_release_id, enter new release id:"); chop($new_release_id = ); (($old_release_id cmp $new_release_id) != -1 && &msgs::error("release ids must rise")); system("co -l $versions_in_releases_file 2>/dev/null"); system("echo ReleaseId: $new_release_id > $versions_in_releases_file"); system("cat /tmp/$main::progname.$$.newverids >> $versions_in_releases_file"); system("ci -u -m\"Release $new_release_id (`date`)\" $versions_in_releases_file 2>/dev/null"); } else { $new_release_id = $old_release_id; } unlink("/tmp/$PROGNAME.$$.newverids"); unlink("/tmp/$PROGNAME.$$.oldverids"); return $new_release_id; } sub shell { &msgs::info("now do what you will and exit"); system("PS1=\"$main::progname> \" /bin/sh"); print "\n"; } sub make_source_release_files { ($stem = `pwd`) =~ s/^.*\/([^\/]+)/$1/; chop($stem); foreach $file (sort keys(%files)) { $bits = $files{$file}; ($bits & $MR_RS && push(@@make_source_release_files, "$stem-$new_release_id/$file")); } symlink ".", "$stem-$new_release_id"; system("tar chf - " . join(' ', @@make_source_release_files) . " | gzip > $stem-$new_release_id.tar.gz"); unlink "$stem-$new_release_id"; } sub question { local($question) = @@_; print "$main::progname: QUESTION: $question "; } ############################################################################### # # ENTRY POINT # ############################################################################### # Force a sensible umask, this should really do something like # newumask = 022 binary-ored with oldumask, but I can't remember # the umask syntax and the camel book is not around. umask 077; exit(&main(@@ARGV)); @ 1.3 log @*** empty log message *** @ text @d64 4 d70 4 a73 2 $files{'version.c'} = $MR_VWY | $MR_RS | $MR_MY; $files{'version.h'} = $MR_VWY | $MR_RS; d91 1 a91 1 ($main::modvers{$main::progname} =~ /^P.*R$/) && ($main::modvers{$main::progname} = '$Id: make_release,v 1.2 1997/10/06 11:05:29 alexis Exp alexis $') =~ s/^.*,v (\S+) .*$/$1/; d127 7 d239 1 a239 2 &msgs::info("old release id: $old_release_id"); &question("new release id:"); @ 1.2 log @*** empty log message *** @ text @d34 2 a35 1 $main::localpl_dir = "/usr/local/lib/fad"; d40 28 a67 16 @@rcs_managed_files = ( 'Makefile', 'animal.c', 'version.c', 'version.h', 'fruit.dat', 'person.dat' ); @@co_if_writable_and_not_changed = ( 'Makefile', 'animal.c', 'version.h', 'version.c' ); @@error_if_writable = (); @@stamp_these = ( 'version.c' ); @@ident_these = ( 'Makefile', 'animal.c', 'version.c', 'version.h', 'ppplcd_utils.h', 'ppplcd_utils.c' ); @@source_release_files = ( 'Makefile', 'animal.c', 'ppplcd_utils.h', 'ppplcd_utils.c', 'version.c', 'version.h', 'fruit.dat', 'person.dat', 'animal.dat', 'being.dat' ); d78 1 d85 1 a85 1 ($main::modvers{$main::progname} =~ /^P.*R$/) && ($main::modvers{$main::progname} = '$Id$') =~ s/^.*,v (\S+) .*$/$1/; d97 7 a103 2 push(@@rcs_managed_files, $versions_in_releases_file); push(@@error_if_writable, $versions_in_releases_file); d121 1 a121 1 sub do_rcs_managed_files d123 13 a135 8 &msgs::info("checking out missing files"); foreach $file (@@rcs_managed_files) { &msgs::debug(5, $file); if (! -f $file) { system("co $file > /dev/null 2>&1"); if (! -f $file) { &msgs::error("check out of missing file failed for $file"); } d138 28 d173 1 a179 49 sub do_error_if_writable { &msgs::info("checking for writable files which should not be writable"); foreach $file (@@error_if_writable) { &msgs::debug(5, $file); if (-w $file) { &msgs::error("$file is writable, it should *never* be!"); exit 1; } } } sub do_co_if_writable_and_not_changed { &msgs::info("checking out writable but unchanged files"); foreach $file (@@co_if_writable_and_not_changed) { &msgs::debug(5, $file); if (! -w $file) { # print "$main::progname: $file: not writable, no action\n"; } elsif (&coifnc($file)) { &msgs::error("$file is writable and modified"); } } } sub do_makes { &msgs::info("doing makes"); foreach $file (keys %do_makes) { &msgs::debug(5, $file); if (system($do_makes{$file})) { &msgs::error("do_makes action failed for $file") } } } sub clear_release_markers { &msgs::info("clearing markers in files"); foreach $file (@@stamp_these) { &msgs::debug(5, $file); if (&gotmarker($file)) { # print "$main::progname: $file: got marker, no action\n"; } elsif (system("co $file > /dev/null 2>&1") || !&gotmarker($file)) { &msgs::error("failed to clear marker for file $file"); } } } a201 1 &msgs::info("extracting new idents"); d203 5 a207 5 foreach $file ((sort(@@ident_these))) { if (($id = &ident($file)) == 0) { &msgs::error("ident expected but not found in $file"); } else { print NEWVERIDS_HANDLE "ComponentId: $file $id\n"; a211 1 &msgs::info("extracting old idents"); d226 2 a227 2 &msgs::info("component ids are different"); print "Old release id is $old_release_id. Enter new release id: "; d229 2 a230 5 # if (($old_release_id cmp $new_release_id) != -1) { # &msgs::error("versions ids must rise!"); # exit 1; # } system("co -l $versions_in_releases_file"); d233 1 a233 1 system("ci -u -m\"Release $new_release_id (`date`)\" $versions_in_releases_file"); a234 1 &msgs::info("component ids are identical"); a238 1 &msgs::info("release is $new_release_id"); a241 13 sub substitute_release_markers { my($new_release_id) = @@_; # $stamp = sprintf("%-17s", $new_release_id); # $stamp = $new_release_id; &msgs::info("substituting markers in files"); foreach $file (@@stamp_these) { &msgs::debug(5, $file); system("perl -pi -e \"s/PATCHLEVEL_MARKER/$new_release_id/g\" $file"); } } a248 17 sub make_binary_release { if (defined(%make_binary_release)) { &msgs::info("making binary release"); $release_stem = "$stem-$new_release_id"; foreach $key (sort keys(%make_binary_release)) { $make_binary_release{$key} = "$release_stem/$key"; } $files = join(' ', values(%make_binary_release)); symlink ".", $release_stem; system("tar chf - $files | gzip > $release_stem-bin.tar.gz"); unlink $release_stem; } } d251 2 a252 2 &msgs::info("making source release"); $release_stem = "$stem-$new_release_id"; d254 3 a256 2 foreach $key (sort keys(%make_source_release_files)) { $make_source_release_files{$key} = "$release_stem/$key"; a257 1 $files = join(' ', values(%make_source_release_files)); d259 3 a261 3 symlink ".", $release_stem; system("tar chf - $files | gzip > $release_stem.tar.gz"); unlink $release_stem; d264 1 a264 1 sub main d266 1 a266 15 my(@@ARGV) = @@_; while (defined($ARGV[0]) && $ARGV[0] =~ /^-/) { $_ = shift @@ARGV; if (/^-d(.*)/) { $msgs::verboselevel = ($1 ? $1 : shift @@ARGV); } elsif (/^-v$/) { $msgs::verboselevel = 3; } elsif (/^-V$/) { print "$main::progname version ", $main::modvers{$main::progname}, "\n"; exit 0; } else { &usage; } } d268 1 a268 15 # STDOUT->autoflush(1); ($stem = `pwd`) =~ s/^.*\/([^\/]+)/$1/; chop($stem); &do_error_if_writable; &do_co_if_writable_and_not_changed; unlink $versions_in_releases_file; &do_rcs_managed_files; &clear_release_markers; $new_release_id = &get_release_id; &substitute_release_markers($new_release_id); &do_makes; &make_binary_release; &make_source_release_files; # &shell; &clear_release_markers; system("rm -f /tmp/$main::progname.$$.*"); @ 1.1 log @Initial revision @ text @d5 1 a5 1 # FAD SYSTEM - GENERATE A FAD FILE d36 20 d83 2 a84 52 $missing{'Makefile'} = 'co Makefile'; $missing{'animal.c'} = 'co animal.c'; $missing{'version.c'} = 'co version.c'; $missing{'version.h'} = 'co version.h'; $missing{'fruit.dat'} = 'co fruit.dat'; $missing{'person.dat'} = 'co person.dat'; $missing{$versions_in_releases_file} = "co $versions_in_releases_file"; $writable{'Makefile'} = 1; $writable{'animal.c'} = 1; $writable{'version.c'} = 1; $writable{'version.h'} = 1; $writable{$versions_in_releases_file} = 0; $nomarker{'version.c'} = 'co version.c'; $identable{'Makefile'} = 1; $identable{'animal.c'} = 1; $identable{'version.c'} = 1; $identable{'version.h'} = 1; $identable{'ppplcd_utils.h'} = 1; $identable{'ppplcd_utils.c'} = 1; # $do_makes{'ppplcd'} = 'do_makes ppplcd'; # $do_makes{'sndmsg'} = 'do_makes sndmsg'; # $make_binary_release{'examples/getmail'} = 1; # $make_binary_release{'examples/getnews'} = 1; # $make_binary_release{'examples/sndmail'} = 1; # $make_binary_release{'examples/sndnews'} = 1; # $make_binary_release{'qtest'} = 1; # $make_binary_release{'ip-up'} = 1; # $make_binary_release{'ip-down'} = 1; # $make_binary_release{'announce'} = 1; # $make_binary_release{'sndmsg'} = 1; # $make_binary_release{'ppplcd'} = 1; # $make_binary_release{'ppplcc'} = 1; $make_source_release{'Makefile'} = 1; $make_source_release{'animal.c'} = 1; $make_source_release{'ppplcd_utils.c'} = 1; $make_source_release{'ppplcd_utils.h'} = 1; $make_source_release{'version.c'} = 1; $make_source_release{'version.h'} = 1; $make_source_release{'fruit.dat'} = 1; $make_source_release{'person.dat'} = 1; $make_source_release{'animal.dat'} = 1; $make_source_release{'being.dat'} = 1; $versions_in_releases_file = ".versions_in_releases"; d102 1 a102 1 sub fix_missing_files d104 3 a106 2 &msgs::info("retrieving missing files"); foreach $file (keys %missing) { d108 1 a108 1 system("$missing{$file} > /dev/null 2>&1"); d110 1 a110 1 &msgs::error("unable to retrieve $file"); d127 1 a127 1 sub fix_writable_files d129 4 a132 3 &msgs::info("fixing writable files"); foreach $file (keys %writable) { if ($writable{$file} == 0 && -w $file) { d135 10 a144 1 } elsif (! -w $file) { d156 1 d166 2 a167 1 foreach $file (keys %nomarker) { d170 2 a171 4 } elsif ($rc = system("$nomarker{$file} > /dev/null 2>&1")) { &msgs::error("nomarker action failed for $file"); } elsif (!&gotmarker($file)) { &msgs::error("can't fix missing marker in $file"); d200 1 a200 1 foreach $file (sort (keys %identable)) { d250 1 a250 1 $stamp = $new_release_id; d252 3 a254 2 foreach $file (keys %nomarker) { system("perl -pi -e \"s/PATCHLEVEL_MARKER/$stamp/g\" $file"); d282 1 a282 1 sub make_source_release d287 2 a288 2 foreach $key (sort keys(%make_source_release)) { $make_source_release{$key} = "$release_stem/$key"; d290 1 a290 1 $files = join(' ', values(%make_source_release)); d317 2 a318 1 &fix_writable_files; d320 1 a320 1 &fix_missing_files; d326 1 a326 1 &make_source_release; @