make-release: Clean up whitespace and spelling
[openafs.git] / build-tools / make-release
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Getopt::Long;
6 use Pod::Usage;
7 use File::Path;
8 use File::Temp;
9
10 my $help;
11 my $man;
12 my $tagPoint;
13 my $last;
14 my $outDir = ".";
15
16 GetOptions(
17     "help|?" => \$help,
18     "man" => \$man,
19     "tagpoint=s" => \$tagPoint,
20     "last=s" => \$last,
21     "dir=s" => \$outDir,
22 ) or pod2usage(2);
23
24 pod2usage(1) if $help;
25 pod2usage(-exitstatus => 0, -verbose => 2) if $man;
26
27 my $tagName = shift;
28 my $version = shift;
29
30 pod2usage(2) if !defined($tagName);
31
32 # Tag the repository
33
34 if ($tagPoint) {
35     system ("git tag -s $tagName $tagPoint") == 0
36         or die "git tag failed with : $!";
37
38     # Push the tag upstream
39     system ("git push ssh://gerrit.openafs.org:29418/openafs tag $tagName") == 0
40         or die "git push failed with : $!";
41 }
42
43 $version = `git describe --abbrev=4 $tagName`;
44 chomp $version;
45 $version=~s/openafs-[^-]*-//;
46 $version=~s/_/./g;
47
48 # Grab the tagged code into a temporary directory
49
50 my $name = "openafs-".$version;
51
52 my $tempDir = File::Temp::tempdir();
53 system ("git archive --format=tar --prefix=$name/ $tagName ".
54         " | tar -C $tempDir -x") == 0
55     or die "Git archive failed with: $?";
56
57 # Construct the ChangeLog
58 if ($last) {
59     system("git log $last..$tagName > $outDir/ChangeLog");
60 } else {
61     system("git log $tagName > $outDir/ChangeLog");
62 }
63
64 # Describe the tree
65 system("git describe --abbrev=4 $tagName > $tempDir/$name/.version");
66
67 # Run regen.sh to create the rest of the tree
68 system ("cd $tempDir/$name && ./regen.sh") == 0
69     or die $!;
70
71 # A list of files to compress
72 my @toCompress;
73
74 # Create the documentation tarball
75 system("tar -cf $outDir/$name-doc.tar -C $tempDir $name/doc") == 0
76     or die "Unable to create documentation tarball : $!";
77 push @toCompress, "$outDir/$name-doc.tar";
78
79 # Remove the docs directory (we've already build a tarball for it)
80 File::Path::rmtree("$tempDir/$name/doc");
81
82 # Create the source tarball (both .gz and .bz2)
83 system("tar -cf $outDir/$name-src.tar -C $tempDir $name") == 0
84     or die "Unable to create source code tarball : $!";
85 push @toCompress, "$outDir/$name-src.tar";
86
87 # Construct the diffs, and zip them
88 if ($last) {
89     system("git diff $last..$tagName > $outDir/$name.diff") == 0
90        or die "Unable to create diff : $!";
91     push @toCompress, "$outDir/$name.diff";
92 }
93
94 my @toMD5;
95
96 # Compress everything that needs squashing,
97 # and also set up a list for md5 checksumming.
98 foreach my $file (@toCompress) {
99     system("gzip < $file > $file.gz") == 0
100         or die "Unable to create gzip file of '$file' : $!";
101     push @toMD5, "$file.gz";
102
103     system("bzip2 < $file > $file.bz2") == 0
104         or die "Unable to create bzip file of '$file' : $!";
105     push @toMD5, "$file.bz2";
106
107     # Delete the uncompressed tar files.
108     if ($file =~ /\.tar$/) {
109       unlink($file);
110     } else {
111       # Otherwise, queue this file for md5 checksumming.
112       push @toMD5, $file;
113     }
114 }
115
116 foreach my $file (@toMD5) {
117     if (-x "/sbin/md5") {
118         system("/sbin/md5 -q $file > $file.md5");
119     } elsif (-x "/usr/bin/md5sum") {
120         system("/usr/bin/md5sum $file > $file.md5");
121     } else {
122         print STDERR "No md5 utility found. Not producing checksums\n";
123     }
124 }
125
126
127 __END__
128
129 =head1 NAME
130
131 make-release - Make an OpenAFS release from git
132
133 =head1 SYNOPSIS
134
135 make-release [options] <tag> [<version>]
136
137  Options:
138     --help               brief help message
139     --man                full documentation
140     --tagpoint <object>  create new tag
141     --last <object>      generate changelog and diffs from this point
142     --dir <dir>          output results into this directory
143
144 =head1 DESCRIPTION
145
146 make-release constructs an OpenAFS release from a local git clone. If run
147 with just the standard arguments, it will extract the contents of the
148 specified tag into the current directory, creating src and doc tarballs,
149 gzipping and bzipping them, and generating md5 hashes. It will also create a
150 ChangeLog file, listing all of the changes in that release.
151
152 This standard behaviour may be modified by the following options
153
154 =head1 OPTIONS
155
156 =over 8
157
158 =item B<--last> I<object>
159
160 Generate the ChangeLog starting from I<object>. Also generate a
161 openafs-$version.diff file in the output directory containing all of the
162 changes between I<object> and the current tag
163
164 =item B<--dir> I<directory>
165
166 Instead of generating all of the output in the current directory, place it
167 in <directory>, which must already exist.
168
169 =item B<--tagpoint> I<commit|branch>
170
171 Rather than using an existing tag, create a new one on the specified commit,
172 or on the tip of the specified branch. This will GPG sign the new tag, and
173 push it into gerrit.
174
175 =back
176
177 =cut