The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package VIM::Uploader;
use WWW::Mechanize;
use File::Spec;
use warnings;
use strict;

=head1 NAME

VIM::Uploader - upload your vim script to vim.org

=cut

our $VERSION = '0.07';

=head1 SYNOPSIS

    use VIM::Uploader;

    my $uploader = VIM::Uploader->new();

    $uploader->login( )

or 

    $uploader->login( 
        user => 'xxx',
        pass => 'xxx',
    );

    $uploader->upload_new( ... );

    my $ok = $uploader->upload( 
        script_id => 1234,
        script_file => '/path/to/your/file',
        vim_version => '7.0',               # valid values:  7.0 , 6.0 , 5.7
        script_version => '0.2',            # your vim script version
        version_comment => 'release note'   # your vim script release note.
    );

    print "DONE" if $ok;

=head1 DESCRIPTIONS

L<VIM::Uploader> provides F<vim-upload> script for you to upload vim scripts. 
it creates a upload form template for you.

    # in /path/to/script.vim/ directory
    $ vim-upload script.vim

    $ vim-upload script-2.04.tar.gz

then the file L<script.vim.upload> will be created after the first upload. just edit the file , update script_id 
and the next time you can upload script easily.

    $ vim-upload script.vim

=head1 FUNCTIONS

=cut

sub new {
    my $self = bless {} , shift;
    my %args = @_;
    $self->{mech} = WWW::Mechanize->new();
    $|++;
    return $self;
}

sub mech {
    my $self = shift;
    return $self->{mech};
}

use constant config_file  => File::Spec->join($ENV{HOME},".vim-uploader");

sub read_config {
    my $path = config_file;
    return unless -e $path;
    open FH , "<" , $path;
    my $line = <FH>;
    close FH;
    $line =~ s/\n$//;
    my ($user,$pass) = split /:/,$line;
    return {
        user => $user,
        pass => $pass,
    };
}

sub login {
    my $self = shift;
    my $config;
    $config = { @_ } if @_;
    $config ||= $self->read_config();

    unless( $config ) {
        print "Seems you dont have " . config_file . ". create one ? (Y/n) : ";
        my $ans = <STDIN>;
        chomp $ans;
        $ans ||= 'Y';
        if( $ans =~ /y/i ) {
            print "User: ";
            my $user = <STDIN>;
            
            print "Password: ";
            my $pass = <STDIN>;

            chomp $user;
            chomp $pass;

            open FH , ">" , config_file;
            print FH "$user:$pass\n";
            close FH;

            print "Created.\n";
            $config = $self->read_config();
        }
    }

    print "Login\n";
    $self->mech->get( "http://www.vim.org/login.php" );
    $self->mech->form_name( 'login' );
    $self->mech->field( userName => $config->{user} );
    $self->mech->field( password => $config->{pass} );
    $self->mech->click_button( value => 'Login');

    die "Authentication Failed" 
        if $self->mech->content =~ /Authentication failed/;

    print "Sucessed\n";

}



=head2 upload_new( %args )

script_name

script_file 

script_type: 'color scheme' , 'ftplugin' , 'game' , 'indent' , 'syntax' , 'utility' , 'patch'

vim_version:  5.7 , 6.0 , 7.0 , 7.2

script_version: 

summary

description

install_details

=cut

sub upload_new {
    my $self = shift;
    my %args = @_;
    my $new_script_url = 'http://www.vim.org/scripts/add_script.php';

    $args{ACTION} = 'UPLOAD_NEW';
    $args{MAX_FILE_SIZE} = '10485760';

    my @undefs;
    my @fields = qw(script_name script_file script_type vim_version script_version summary description install_details);
    for( @fields ){
        push @undefs, $_ unless $args{$_};
    }
    die "Field " . join(',',@undefs) . " is undefined." if @undefs;

    $self->mech->get( $new_script_url );
    $self->mech->form_name('script');

    for ( @fields ) {
        $self->mech->field( $_ => $args{$_} );
    }

    $self->mech->click_button( value => 'upload' );
    die "ERROR" if $self->mech->content =~ /Vim Online Error/;
    print "DONE\n";
}



sub upload {
    my $self = shift;
    my %args = @_;
    my $script_id = $args{ script_id };

    my $new_version_url
        = sprintf(
        'http://www.vim.org/scripts/add_script_version.php?script_id=%d',
        $script_id );

    print "Reading upload form\n";

    $self->mech->get( $new_version_url );

    die "ERROR" if $self->mech->content =~ /Vim Online Error/;

    $self->mech->form_name( 'script' );
    for ( keys %args ) {
        $self->mech->field( $_ => $args{$_} );
    }

    $self->mech->click_button( value => 'upload');

    die "ERROR" if $self->mech->content =~ /Vim Online Error/;

    print "DONE\n";

    $self->mech->get( 'http://www.vim.org/scripts/script.php?script_id=' . $script_id );

    my $html = $self->mech->content;
    return index($html, $args{version_comment});
}

=head1 AUTHOR

Cornelius, C<< <cornelius.howl at gmail.com> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-vim-uploader at rt.cpan.org>, or through
the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=VIM-Uploader>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc VIM::Uploader


You can also look for information at:

=over 4

=item * RT: CPAN's request tracker

L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=VIM-Uploader>

=item * AnnoCPAN: Annotated CPAN documentation

L<http://annocpan.org/dist/VIM-Uploader>

=item * CPAN Ratings

L<http://cpanratings.perl.org/d/VIM-Uploader>

=item * Search CPAN

L<http://search.cpan.org/dist/VIM-Uploader/>

=back


=head1 ACKNOWLEDGEMENTS


=head1 COPYRIGHT & LICENSE

Copyright 2009 Cornelius.

This program is released under the following license: MIT


=cut

1; # End of VIM::Uploader