Annotation of embedaddon/curl/scripts/completion.pl, revision 1.1

1.1     ! misho       1: #!/usr/bin/env perl
        !             2: #***************************************************************************
        !             3: #                                  _   _ ____  _
        !             4: #  Project                     ___| | | |  _ \| |
        !             5: #                             / __| | | | |_) | |
        !             6: #                            | (__| |_| |  _ <| |___
        !             7: #                             \___|\___/|_| \_\_____|
        !             8: #
        !             9: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
        !            10: #
        !            11: # This software is licensed as described in the file COPYING, which
        !            12: # you should have received as part of this distribution. The terms
        !            13: # are also available at https://curl.haxx.se/docs/copyright.html.
        !            14: #
        !            15: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
        !            16: # copies of the Software, and permit persons to whom the Software is
        !            17: # furnished to do so, under the terms of the COPYING file.
        !            18: #
        !            19: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
        !            20: # KIND, either express or implied.
        !            21: #
        !            22: ###########################################################################
        !            23: 
        !            24: use strict;
        !            25: use warnings;
        !            26: use Getopt::Long();
        !            27: use Pod::Usage();
        !            28: 
        !            29: my $curl = 'curl';
        !            30: my $shell = 'zsh';
        !            31: my $help = 0;
        !            32: Getopt::Long::GetOptions(
        !            33:     'curl=s' => \$curl,
        !            34:     'shell=s' => \$shell,
        !            35:     'help' => \$help,
        !            36: ) or Pod::Usage::pod2usage();
        !            37: Pod::Usage::pod2usage() if $help;
        !            38: 
        !            39: my $regex = '\s+(?:(-[^\s]+),\s)?(--[^\s]+)\s*(\<.+?\>)?\s+(.*)';
        !            40: my @opts = parse_main_opts('--help', $regex);
        !            41: 
        !            42: if ($shell eq 'fish') {
        !            43:     print "# curl fish completion\n\n";
        !            44:     print qq{$_ \n} foreach (@opts);
        !            45: } elsif ($shell eq 'zsh') {
        !            46:     my $opts_str;
        !            47: 
        !            48:     $opts_str .= qq{  $_ \\\n} foreach (@opts);
        !            49:     chomp $opts_str;
        !            50: 
        !            51: my $tmpl = <<"EOS";
        !            52: #compdef curl
        !            53: 
        !            54: # curl zsh completion
        !            55: 
        !            56: local curcontext="\$curcontext" state state_descr line
        !            57: typeset -A opt_args
        !            58: 
        !            59: local rc=1
        !            60: 
        !            61: _arguments -C -S \\
        !            62: $opts_str
        !            63:   '*:URL:_urls' && rc=0
        !            64: 
        !            65: return rc
        !            66: EOS
        !            67: 
        !            68:     print $tmpl;
        !            69: } else {
        !            70:     die("Unsupported shell: $shell");
        !            71: }
        !            72: 
        !            73: sub parse_main_opts {
        !            74:     my ($cmd, $regex) = @_;
        !            75: 
        !            76:     my @list;
        !            77:     my @lines = call_curl($cmd);
        !            78: 
        !            79:     foreach my $line (@lines) {
        !            80:         my ($short, $long, $arg, $desc) = ($line =~ /^$regex/) or next;
        !            81: 
        !            82:         my $option = '';
        !            83: 
        !            84:         $arg =~ s/\:/\\\:/g if defined $arg;
        !            85: 
        !            86:         $desc =~ s/'/'\\''/g if defined $desc;
        !            87:         $desc =~ s/\[/\\\[/g if defined $desc;
        !            88:         $desc =~ s/\]/\\\]/g if defined $desc;
        !            89:         $desc =~ s/\:/\\\:/g if defined $desc;
        !            90: 
        !            91:         if ($shell eq 'fish') {
        !            92:             $option .= "complete --command curl";
        !            93:             $option .= " --short-option '" . strip_dash(trim($short)) . "'"
        !            94:                 if defined $short;
        !            95:             $option .= " --long-option '" . strip_dash(trim($long)) . "'"
        !            96:                 if defined $long;
        !            97:             $option .= " --description '" . strip_dash(trim($desc)) . "'"
        !            98:                 if defined $desc;
        !            99:         } elsif ($shell eq 'zsh') {
        !           100:             $option .= '{' . trim($short) . ',' if defined $short;
        !           101:             $option .= trim($long)  if defined $long;
        !           102:             $option .= '}' if defined $short;
        !           103:             $option .= '\'[' . trim($desc) . ']\'' if defined $desc;
        !           104: 
        !           105:             $option .= ":'$arg'" if defined $arg;
        !           106: 
        !           107:             $option .= ':_files'
        !           108:                 if defined $arg and ($arg eq '<file>' || $arg eq '<filename>'
        !           109:                     || $arg eq '<dir>');
        !           110:         }
        !           111: 
        !           112:         push @list, $option;
        !           113:     }
        !           114: 
        !           115:     # Sort longest first, because zsh won't complete an option listed
        !           116:     # after one that's a prefix of it.
        !           117:     @list = sort {
        !           118:         $a =~ /([^=]*)/; my $ma = $1;
        !           119:         $b =~ /([^=]*)/; my $mb = $1;
        !           120: 
        !           121:         length($mb) <=> length($ma)
        !           122:     } @list if $shell eq 'zsh';
        !           123: 
        !           124:     return @list;
        !           125: }
        !           126: 
        !           127: sub trim { my $s = shift; $s =~ s/^\s+|\s+$//g; return $s };
        !           128: sub strip_dash { my $s = shift; $s =~ s/^-+//g; return $s };
        !           129: 
        !           130: sub call_curl {
        !           131:     my ($cmd) = @_;
        !           132:     my $output = `"$curl" $cmd`;
        !           133:     if ($? == -1) {
        !           134:         die "Could not run curl: $!";
        !           135:     } elsif ((my $exit_code = $? >> 8) != 0) {
        !           136:         die "curl returned $exit_code with output:\n$output";
        !           137:     }
        !           138:     return split /\n/, $output;
        !           139: }
        !           140: 
        !           141: __END__
        !           142: 
        !           143: =head1 NAME
        !           144: 
        !           145: completion.pl - Generates tab-completion files for various shells
        !           146: 
        !           147: =head1 SYNOPSIS
        !           148: 
        !           149: completion.pl [options...]
        !           150: 
        !           151:     --curl   path to curl executable
        !           152:     --shell  zsh/fish
        !           153:     --help   prints this help
        !           154: 
        !           155: =cut

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>