Changeset 884 for dasscm/trunk


Ignore:
Timestamp:
Jun 15, 2010, 11:21:02 PM (14 years ago)
Author:
joergs
Message:

preparation for bash completion

File:
1 edited

Legend:

Unmodified
Added
Removed
  • dasscm/trunk/usr/bin/dasscm

    r882 r884  
    3737my $doc_file = "/usr/share/doc/packages/dasscm/dasscm_howto.txt";
    3838
    39 # commands that require write access (and therefore a login)
    40 # to the repository server
    41 my @COMMANDS_REQUIRE_WRITE = ( "add", "commit" );
    42 
    43 # configuration file
    4439my $config_file = "/etc/dasscm.conf";
    4540my $config      = get_config($config_file);
     41
     42
     43
     44my %COMMANDS = (
     45    '--help' => 'help',
     46    'help' => 'help',
     47    'login' => 'login',
     48    'init' => 'init',
     49    'ls' => 'ls',
     50    'update' => 'update',
     51    'up' => 'update',
     52    'add' => 'add',
     53    'commit' => 'commit',
     54    'checkin' => 'commit',
     55    'ci' => 'commit',
     56    'revert' => 'revert',
     57    'blame' => 'blame',
     58    'diff' => 'diff',
     59    'status' => 'status',
     60    'st' => 'status',
     61    'check' => 'check',
     62    'permissions' => 'permissions',
     63    'cleanup' => 'cleanup',
     64    'complete' => 'complete'
     65);
     66
     67# desc: description (eg. for usage)
     68# params: parameters
     69#           CMD
     70#           USER
     71#           PATH
     72#           REPOPATH
     73# require:
     74#           WRITE commands that require write access (and therefore a login)
     75my %COMMAND_DEFINITIONS = (
     76    'help' => {
     77        'desc' => [],
     78        'params' => [ "CMD" ],
     79        'function' => \&help,
     80    },
     81    'login' => {
     82        'desc' => [],
     83        'params' => [ "USER" ],
     84        'function' => \&login
     85    },
     86    'init' => {
     87        'desc' => [ "initialize local subversion checkout.", "This is the first thing to do (after configuring $config_file)" ],
     88        'params' => [],
     89        'function' => \&init
     90    },
     91    'ls' => {
     92        'desc' => [],
     93        'params' => [ "PATH" ],
     94        'function' => \&ls
     95    },
     96    'update' => {
     97        'desc' => [],
     98        'params' => [ "PATH" ],
     99        'function' => \&update
     100    },
     101    'add' => {
     102        'desc' => [],
     103        'params' => [ "PATH" ],
     104        'require' => [ "WRITE" ],
     105        'function' => \&add
     106    },
     107    'commit' => {
     108        'desc' => [],
     109        'params' => [ "PATH" ],
     110        'require' => [ "WRITE" ],
     111        'function' => \&commit
     112    },
     113    'revert' => {
     114        'desc' => [ "revert local changes back to version from repository" ],
     115        'params' => [ "REPOPATH" ],
     116        'function' => \&revert
     117    },
     118    'blame' => {
     119        'desc' => [],
     120        'params' => [ "PATH" ],
     121        'function' => \&blame
     122    },
     123    'diff' => {
     124        'desc' => [],
     125        'params' => [ "PATH" ],
     126        'function' => \&diff
     127    },
     128    'status' => {
     129        'desc' => [],
     130        'params' => [ "PATH" ],
     131        'function' => \&status
     132    },
     133    'check' => {
     134        'desc' => [ "perform Nagios NRPE conform check" ],
     135        'params' => [],
     136        'function' => \&check
     137    },
     138    'permissions' => {
     139        'desc' => [],
     140        'params' => [],
     141        'function' => \&permissions
     142    },
     143    'cleanup' => {
     144        'desc' => [],
     145        'params' => [],
     146        'function' => \&cleanup
     147    },
     148    'complete' => {
     149        'desc' => [ "internally, used for bash completion" ],
     150        'params' => [ "CMD" ],
     151        'function' => \&complete
     152    },
     153);
     154
     155
     156# configuration file
    46157my $DASSCM_LOCAL_REPOSITORY_BASE;
    47158my $DASSCM_REPOSITORY_NAME;
     
    85196    print "\n";
    86197    print "Available subcommands:\n";
    87     print "   help <subcommand>\n";
    88     print "   init\n";
    89     print "   login <username>\n";
    90     print "   up <path>\n";
    91     print "   ls <path>\n";
    92     print "   add <path>\n";
    93     print "   commit <path>\n";
    94     print "   revert <path>\n";
    95     print "   diff <path>\n";
    96     print "   status <path>\n";
    97     print "   check\n";
    98     print "   cleanup\n";
    99     print "   permissions\n";
     198    # print "   help <subcommand>\n";
     199    # print "   init\n";
     200    # print "   login <username>\n";
     201    # print "   up <path>\n";
     202    # print "   ls <path>\n";
     203    # print "   add <path>\n";
     204    # print "   commit <path>\n";
     205    # print "   revert <path>\n";
     206    # print "   diff <path>\n";
     207    # print "   status <path>\n";
     208    # print "   check\n";
     209    # print "   cleanup\n";
     210    # print "   permissions\n";
     211    foreach my $i (sort keys(%COMMAND_DEFINITIONS)) {
     212        print "    ", $i, " ", join( " ", get_command_possible_params($i) ), "\n";
     213        foreach my $line ( get_command_desc($i) ) {
     214            print " "x20, $line, "\n";
     215        }
     216    }
    100217    print "\n";
    101218    print "If dasscm is not yet configured, read $doc_file\n";
     
    239356        if ( "$USER" eq "root" ) {
    240357            if (    ( not $DASSCM_USERNAME )
    241                 and ( grep { m|^$command$| } @COMMANDS_REQUIRE_WRITE ) )
     358                and ( get_command_requires_write( $command ) ) )
    242359            {
    243360
     
    273390{
    274391}
     392
     393sub get_command_uniform_name( $ )
     394{
     395    my $command_abbrivation = $_[0];
     396    if( defined($COMMANDS{$command_abbrivation}) ) {
     397        return $COMMANDS{$command_abbrivation};
     398    }
     399    return;
     400}
     401
     402sub get_command_desc( $ )
     403{
     404    my $command = get_command_uniform_name($_[0]);
     405    my @desc = ();
     406    if( $command && defined($COMMAND_DEFINITIONS{$command}{'desc'}) ) {
     407        @desc = @{$COMMAND_DEFINITIONS{$command}{'desc'}};
     408    }
     409    return @desc;
     410}
     411
     412sub get_command_function( $ )
     413{
     414    my $command = get_command_uniform_name($_[0]);
     415    my $func;
     416    if( $command && defined($COMMAND_DEFINITIONS{$command}{'function'}) ) {
     417        $func = $COMMAND_DEFINITIONS{$command}{'function'};
     418    }
     419    return $func;
     420}
     421
     422sub get_command_possible_params( $ )
     423{
     424    my $command = get_command_uniform_name($_[0]);
     425    my @params = ();
     426    if( $command && defined($COMMAND_DEFINITIONS{$command}{'params'}) ) {
     427        @params = @{$COMMAND_DEFINITIONS{$command}{'params'}};
     428    }
     429    return @params;
     430}
     431
     432sub get_command_requirements( $ )
     433{
     434    my $command = get_command_uniform_name($_[0]);
     435    my @requirements = ();
     436    if( $command && defined($COMMAND_DEFINITIONS{$command}{'require'}) ) {
     437        @requirements = @{$COMMAND_DEFINITIONS{$command}{'require'}};
     438    }
     439    return @requirements;
     440}
     441
     442sub get_command_requires_write( $ )
     443{
     444    return grep( /^WRITE$/, get_command_requirements($_[0]) );
     445}
     446
    275447
    276448#
     
    780952#
    781953# functions
    782 
    783954sub help(;@)
    784955{
     
    13391510}
    13401511
     1512#
     1513# used for bash completion
     1514# prints the next possible command line parameters
     1515#
     1516sub complete(@)
     1517{
     1518    use Data::Dumper;
     1519
     1520    my $number_arguments = @_;
     1521    my $input_command = $_[0] || "";
     1522
     1523    print "args: $number_arguments\n";
     1524    if ( $number_arguments <= 1 ) {
     1525
     1526        foreach my $i ( keys %COMMANDS ) {
     1527            #print "$i: ";
     1528            #print get_command_requires_write( $i ), " ";
     1529            $_ = $i;
     1530            if( m/^$input_command/ ) {
     1531                my $command = get_command_uniform_name($i);
     1532                print $command, " ";
     1533                print join( ",", get_command_possible_params($i) ) ;
     1534                #print " (", get_command_desc( $i ), ") ";
     1535                print "\n";
     1536            }
     1537            #print "\n";
     1538        }
     1539    } else {
     1540        my $command = get_command_uniform_name($input_command);
     1541        my @params = get_command_possible_params($input_command);
     1542        print "params: ", Dumper(@params);
     1543        if( defined($params[$number_arguments-2]) && $params[$number_arguments-2] ) { 
     1544            my $param = $params[$number_arguments-2];
     1545            print "param: $param\n";
     1546            print Dumper($param);
     1547        }
     1548    }
     1549}
     1550
     1551
     1552
    13411553#####################################################################
    13421554#
     
    13501562
    13511563    # get subcommand and remove it from @ARGV
    1352     $command = $ARGV[0];
     1564    $command = get_command_uniform_name($ARGV[0]);
    13531565    shift @ARGV;
    13541566
     
    13951607    # so we can test for it later on more simply
    13961608    #
    1397     $_ = $command;
    1398     if (m/^help$/i) {
    1399         help(@ARGV);
    1400     } elsif (m/^login$/i) {
    1401         $command = "login";
    1402         login(@ARGV);
    1403     } elsif (m/^init$/i) {
    1404         $command = "init";
    1405         init(@ARGV);
    1406     } elsif (m/^ls$/i) {
    1407         $command = "ls";
    1408         ls(@ARGV);
    1409     } elsif ( (m/^update$/i) || (m/^up$/i) ) {
    1410         $command = "update";
    1411         update(@ARGV);
    1412     } elsif (m/^add$/i) {
    1413         $command = "add";
    1414         add(@ARGV);
    1415     } elsif ( (m/^commit$/i) || (m/^checkin$/i) || (m/^ci$/i) ) {
    1416         $command = "commit";
    1417         commit(@ARGV);
    1418     } elsif (m/^revert$/i) {
    1419         $command     = "revert";
    1420         $return_code = revert(@ARGV);
    1421     } elsif (m/^blame$/i) {
    1422         $command = "blame";
    1423         blame(@ARGV);
    1424     } elsif (m/^diff$/i) {
    1425         $command = "diff";
    1426         diff(@ARGV);
    1427     } elsif ( (m/^status$/i) || (m/^st$/i) ) {
    1428         $command     = "status";
    1429         $return_code = status(@ARGV);
    1430     } elsif (m/^check$/i) {
    1431         $command     = "check";
    1432         $return_code = check();
    1433     } elsif (m/^permissions$/i) {
    1434         $command     = "permissions";
    1435         $return_code = permissions();
    1436     } elsif (m/^cleanup$/i) {
    1437         $command = "cleanup";
    1438         cleanup();
     1609
     1610    # $_ = $command;
     1611    # if (m/^help$/i) {
     1612    #     help(@ARGV);
     1613    # } elsif (m/^login$/i) {
     1614    #     $command = "login";
     1615    #     login(@ARGV);
     1616    # } elsif (m/^init$/i) {
     1617    #     $command = "init";
     1618    #     init(@ARGV);
     1619    # } elsif (m/^ls$/i) {
     1620    #     $command = "ls";
     1621    #     ls(@ARGV);
     1622    # } elsif ( (m/^update$/i) || (m/^up$/i) ) {
     1623    #     $command = "update";
     1624    #     update(@ARGV);
     1625    # } elsif (m/^add$/i) {
     1626    #     $command = "add";
     1627    #     add(@ARGV);
     1628    # } elsif ( (m/^commit$/i) || (m/^checkin$/i) || (m/^ci$/i) ) {
     1629    #     $command = "commit";
     1630    #     commit(@ARGV);
     1631    # } elsif (m/^revert$/i) {
     1632    #     $command     = "revert";
     1633    #     $return_code = revert(@ARGV);
     1634    # } elsif (m/^blame$/i) {
     1635    #     $command = "blame";
     1636    #     blame(@ARGV);
     1637    # } elsif (m/^diff$/i) {
     1638    #     $command = "diff";
     1639    #     diff(@ARGV);
     1640    # } elsif ( (m/^status$/i) || (m/^st$/i) ) {
     1641    #     $command     = "status";
     1642    #     $return_code = status(@ARGV);
     1643    # } elsif (m/^check$/i) {
     1644    #     $command     = "check";
     1645    #     $return_code = check();
     1646    # } elsif (m/^permissions$/i) {
     1647    #     $command     = "permissions";
     1648    #     $return_code = permissions();
     1649    # } elsif (m/^cleanup$/i) {
     1650    #     $command = "cleanup";
     1651    #     cleanup();
     1652    # } elsif (m/^complete$/i) {
     1653    #     $command = "complete";
     1654    #     $return_code = complete(@ARGV);
     1655
     1656    if( get_command_function( $command ) ) {
     1657        &{get_command_function( $command )}( @ARGV );
    14391658    } else {
    14401659        print "unknown command: $command\n\n";
Note: See TracChangeset for help on using the changeset viewer.