#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use IPC::Run3;
use Path::Tiny;
use Getopt::Long qw/ GetOptions /;
my %options = ();
GetOptions(
\%options,
qw{ verbose }
) or die "Error in command line arguments\n";
# There will be multiple dispatch tables, to avoid confusion the main
# one is named %dispatch & others will be named like %archive_dispatch
# & so on.
my %dispatch = (
"archive" => \&archive,
);
if ( $ARGV[0]
and $dispatch{ $ARGV[0] } ) {
$dispatch{ $ARGV[0] }->();
} elsif ( scalar @ARGV == 0 ) {
HelpMessage();
} else {
say "leo: no such option";
}
sub HelpMessage {
say qq{Usage:
archive
Create an archive.};
}
sub rsync { run3 ["openrsync", @_]; }
sub tar_create { run3 ["/bin/tar", "cf", @_]; }
sub tar_list { run3 ["/bin/tar", "tvf", @_]; }
# Creating tars of files.
sub archive {
my %archive_dispatch = (
"documents" => sub {
tar_create("/tmp/archive/documents.tar",
# Won't print "tar: Removing leading / from
# absolute path names in the archive" to
# STDERR.
"-C", "$ENV{HOME}/documents", ".");
$? # tar returns 1 on errors.
? die "Archive creation failed :: $?\n"
: say "$ENV{HOME}/documents archived.";
tar_list("/tmp/archive/documents.tar") if $options{verbose};
},
"journal" => sub {
tar_create("/tmp/archive/journal.tar",
"-C", "$ENV{HOME}/documents",
"andinus.org.gpg", "archive.org.gpg");
$?
? die "Archive creation failed :: $?\n"
: say "$ENV{HOME}/documents/andinus.org.gpg,
$ENV{HOME}/documents/archive.org.gpg archived.";
tar_list("/tmp/archive/journal.tar") if $options{verbose};
},
);
shift @ARGV;
if ( $ARGV[0]
and $archive_dispatch{ $ARGV[0] } ) {
path("/tmp/archive")->mkpath; # Create archive directory.
$archive_dispatch{ $ARGV[0] }->();
} elsif ( scalar @ARGV == 0 ) {
archive_HelpMessage();
} else {
say "leo/archive: no such option";
}
sub archive_HelpMessage {
say qq{Archive files to /tmp/archive.
Usage:
documents
Archive $ENV{HOME}/documents
journal
Archive $ENV{HOME}/documents/andinus.org.gpg,
$ENV{HOME}/documents/archive.org.gpg};
}
}