Documentation / cmd-list.perlon commit editor: add a function to launch the sequence editor (2aed018)
   1#!/usr/bin/perl -w
   2
   3use File::Compare qw(compare);
   4
   5sub 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
  41while (<>) {
  42        last if /^### command list/;
  43}
  44
  45my %cmds = ();
  46for (sort <>) {
  47        next if /^#/;
  48
  49        chomp;
  50        my ($name, $cat, $attr) = /^(\S+)\s+(.*?)(?:\s+(.*))?$/;
  51        $attr = '' unless defined $attr;
  52        push @{$cmds{$cat}}, [$name, " $attr "];
  53}
  54
  55for my $cat (qw(ancillaryinterrogators
  56                ancillarymanipulators
  57                mainporcelain
  58                plumbinginterrogators
  59                plumbingmanipulators
  60                synchingrepositories
  61                foreignscminterface
  62                purehelpers
  63                synchelpers)) {
  64        my $out = "cmds-$cat.txt";
  65        open O, '>', "$out+" or die "Cannot open output file $out+";
  66        for (@{$cmds{$cat}}) {
  67                format_one(\*O, $_);
  68        }
  69        close O;
  70
  71        if (-f "$out" && compare("$out", "$out+") == 0) {
  72                unlink "$out+";
  73        }
  74        else {
  75                print STDERR "$out\n";
  76                rename "$out+", "$out";
  77        }
  78}