#!/usr/bin/env perl
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 2010 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################
#
#
# - Get all options mentioned in the $cmddir.
# - Make sure they're all mentioned in the $opts document
# - Make usre that the version in $opts matches the version in the file in
#   $cmddir
#

my $opts = $ARGV[0];
my $cmddir = $ARGV[1];

sub cmdfiles {
    my ($dir)=@_;

    opendir(my $dh, $dir) || die "Can't opendir $dir: $!";
    my @opts = grep { /\.d$/ && -f "$dir/$_" } readdir($dh);
    closedir $dh;

    for(@opts) {
        $_ =~ s/\.d$//;
        $file{$_}=1;
    }
    return @opts;
}

sub mentions {
    my ($f) = @_;
    my @options;
    open(F, "<$f");
    while(<F>) {
        chomp;
        if(/(.*) +([0-9.]+)/) {
            my ($flag, $version)=($1, $2);

            # store the name without the leading dashes
            $flag =~ s/^--//;

            # cut out short option (if present)
            $flag =~ s/ \(-.\)//;

            # store the name without trailing space
            $flag =~ s/ +$//;

            push @options, $flag;

            # options-in-versions says...
            $oiv{$flag} = $version;
        }
    }
    return @options;
}

sub versioncheck {
    my ($f, $v)=@_;
    open(F, "<$cmddir/$f.d");
    while(<F>) {
        chomp;
        if(/^Added: ([0-9.]+)/) {
            if($1 ne $v) {
                print STDERR "$f lists $v in doc but $1 in file\n";
                $error++;
            }
            last;
        }
    }
    close(F);
}

# get all the files
my @cmdopts = cmdfiles($cmddir);

# get all the options mentioned in $o
my @veropts = mentions($opts);

# check if all files are in the doc
for my $c (sort @cmdopts) {
    if($oiv{$c}) {
        # present, but at same version?
        versioncheck($c, $oiv{$c});
    }
    else {
        print STDERR "--$c is in the option directory but not in $opts!\n";
        $error++;
    }
}

# check if the all options in the doc have files
for my $v (sort @veropts) {
    if($file{$v}) {
        # present
    }
    else {
        print STDERR "$v is in the doc but NOT as a file!\n";
        $error++;
    }
}

print STDERR "ok\n" if(!$error);

exit $error;
