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