| #!/usr/bin/perl -w | |
| use File::Compare qw(compare); | |
| sub format_one { | |
| my ($out, $nameattr) = @_; | |
| my ($name, $attr) = @$nameattr; | |
| my ($state, $description); | |
| my $mansection; | |
| $state = 0; | |
| open I, '<', "$name.txt" or die "No such file $name.txt"; | |
| while (<I>) { | |
| if (/^(?:git|scalar)[a-z0-9-]*\(([0-9])\)$/) { | |
| $mansection = $1; | |
| next; | |
| } | |
| if (/^NAME$/) { | |
| $state = 1; | |
| next; | |
| } | |
| if ($state == 1 && /^----$/) { | |
| $state = 2; | |
| next; | |
| } | |
| next if ($state != 2); | |
| chomp; | |
| $description = $_; | |
| last; | |
| } | |
| close I; | |
| if (!defined $description) { | |
| die "No description found in $name.txt"; | |
| } | |
| if (my ($verify_name, $text) = ($description =~ /^($name) - (.*)/)) { | |
| print $out "linkgit:$name\[$mansection\]::\n\t"; | |
| if ($attr =~ / deprecated /) { | |
| print $out "(deprecated) "; | |
| } | |
| print $out "$text.\n\n"; | |
| } | |
| else { | |
| die "Description does not match $name: $description"; | |
| } | |
| } | |
| my ($input, @categories) = @ARGV; | |
| open IN, "<$input"; | |
| while (<IN>) { | |
| last if /^### command list/; | |
| } | |
| my %cmds = (); | |
| for (sort <IN>) { | |
| next if /^#/; | |
| chomp; | |
| my ($name, $cat, $attr) = /^(\S+)\s+(.*?)(?:\s+(.*))?$/; | |
| $attr = '' unless defined $attr; | |
| push @{$cmds{$cat}}, [$name, " $attr "]; | |
| } | |
| close IN; | |
| for my $out (@categories) { | |
| my ($cat) = $out =~ /^cmds-(.*)\.txt$/; | |
| open O, '>', "$out+" or die "Cannot open output file $out+"; | |
| for (@{$cmds{$cat}}) { | |
| format_one(\*O, $_); | |
| } | |
| close O; | |
| if (-f "$out" && compare("$out", "$out+") == 0) { | |
| unlink "$out+"; | |
| } | |
| else { | |
| print STDERR "$out\n"; | |
| rename "$out+", "$out"; | |
| } | |
| } |