Documentation: don't hardcode command categories twice
[git] / Documentation / cmd-list.perl
1 #!/usr/bin/perl -w
2
3 use File::Compare qw(compare);
4
5 sub format_one {
6         my ($out, $nameattr) = @_;
7         my ($name, $attr) = @$nameattr;
8         my ($state, $description);
9         $state = 0;
10         open I, '<', "$name.txt" or die "No such file $name.txt";
11         while (<I>) {
12                 if (/^NAME$/) {
13                         $state = 1;
14                         next;
15                 }
16                 if ($state == 1 && /^----$/) {
17                         $state = 2;
18                         next;
19                 }
20                 next if ($state != 2);
21                 chomp;
22                 $description = $_;
23                 last;
24         }
25         close I;
26         if (!defined $description) {
27                 die "No description found in $name.txt";
28         }
29         if (my ($verify_name, $text) = ($description =~ /^($name) - (.*)/)) {
30                 print $out "linkgit:$name\[1\]::\n\t";
31                 if ($attr =~ / deprecated /) {
32                         print $out "(deprecated) ";
33                 }
34                 print $out "$text.\n\n";
35         }
36         else {
37                 die "Description does not match $name: $description";
38         }
39 }
40
41 my ($input, @categories) = @ARGV;
42
43 open IN, "<$input";
44 while (<IN>) {
45         last if /^### command list/;
46 }
47
48 my %cmds = ();
49 for (sort <IN>) {
50         next if /^#/;
51
52         chomp;
53         my ($name, $cat, $attr) = /^(\S+)\s+(.*?)(?:\s+(.*))?$/;
54         $attr = '' unless defined $attr;
55         push @{$cmds{$cat}}, [$name, " $attr "];
56 }
57 close IN;
58
59 for my $out (@categories) {
60         my ($cat) = $out =~ /^cmds-(.*)\.txt$/;
61         open O, '>', "$out+" or die "Cannot open output file $out+";
62         for (@{$cmds{$cat}}) {
63                 format_one(\*O, $_);
64         }
65         close O;
66
67         if (-f "$out" && compare("$out", "$out+") == 0) {
68                 unlink "$out+";
69         }
70         else {
71                 print STDERR "$out\n";
72                 rename "$out+", "$out";
73         }
74 }