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