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