The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package VCS::SaVeS::Help;

sub general {<<END;

  SaVeS is the Standalone Version System

  "svs" is the primary command line tool for SaVeS

  For more detailed help, try:
    svs help usage                # svs command usage
    svs help overview             # Overview of svs and SaVeS XXX
    svs help basics               # Basic svs usage XXX
    svs help commands             # List of all svs commands
    svs help <command-name>       # Complete description of an svs command
    svs help switches             # Command line switches for svs XXX

END
}

sub usage {
    <<USAGE;

usage: svs [generic-switches] command [command-switches] [command-arguments]

SEE:
    svs help
    perldoc svs
    perldoc saves

USAGE
}

sub commands {<<END
Use 'svs help <command-name>' for complete help on a specific command.

add      - Add files to the MANIFEST
archive  - Create an archive of the repository XXX
break    - Mark directory as a SaVeS breakpoint
config   - Change configuration options XXX
delete   - Delete the revision history a file from the repository
diff     - Show differences between file revisions
export   - Export a repository to another VCS (such as CVS) XXX
find     - Find repository files based on certain criteria
help     - Get help about the SaVeS system and svs commands
history  - Show the revision history of a file
import   - Create a new repository
log      - Show a view of the SaVeS log XXX
manifest - List or change the contents of the .saves/MANIFEST
merge    - Merge a nested repository into the current one XXX
message  - Change the message of a file revision XXX
remove   - Remove a file from the MANIFEST
restore  - Restore file(s) to a certain revision
save     - Checkin a new revision of files
status   - Show the current status of files
tag      - Mark a set of revisions with a symbolic tag XXX
undo     - Attempt to undo a change XXX
split    - Turn a subdirectory of the repository into its own repository XXX

END
}

sub add { grep_pod(); }
sub archive { grep_pod(); }
sub break { grep_pod(); }
sub config { grep_pod(); }
sub delete { grep_pod(); }
sub diff { grep_pod(); }
sub export { grep_pod(); }
sub find { grep_pod(); }
sub help { grep_pod(); }
sub history { grep_pod(); }
sub import { grep_pod(); }
sub log { grep_pod(); }
sub manifest { grep_pod(); }
sub merge { grep_pod(); }
sub message { grep_pod(); }
sub remove { grep_pod(); }
sub restore { grep_pod(); }
sub save { grep_pod(); }
sub status { grep_pod(); }
sub tag { grep_pod(); }
sub undo { grep_pod(); }
sub split { grep_pod(); }

sub grep_pod {
    my $svs_bin = '';
    for $path (split /[:;]/, $ENV{PATH}) {
        $svs_bin = "$path/svs", last
          if -f "$path/svs";
    }    
    die "Can't find svs binary\n"
      unless $svs_bin;
    open SVSBIN, $svs_bin
      or die $!;
    (my $command = (caller(1))[3]) =~ s/.*::(\w+?)_?$/$1/;
    local $/;
    my $pod = <SVSBIN>;
    close SVSBIN;
    $pod =~ /^(=head2\s$command.*?)^=(?:head|cut)/ms
      or die "Can't find pod section for '$command'\n";
    my $cmd_pod = $1;
    open POD, "> /tmp/$command-help.pod"
      or die $!; 
    print POD $cmd_pod;
    close POD;
    open POD2TEXT, "pod2text /tmp/$command-help.pod |"
      or die "Can't run pod2text on this system\n";
    my $cmd_text = <POD2TEXT>;
    close POD2TEXT;
    return $cmd_text;
}

sub AUTOLOAD {
    (my $section = $VCS::SaVeS::Help::AUTOLOAD) =~ s/.*:://;
    die "'$section' is an invalid 'svs help' option\n";
}

1;