Add built local::lib
[catagits/Gitalist.git] / local-lib5 / bin / shasum
diff --git a/local-lib5/bin/shasum b/local-lib5/bin/shasum
new file mode 100755 (executable)
index 0000000..d7ab448
--- /dev/null
@@ -0,0 +1,271 @@
+#!/usr/bin/perl -w
+
+eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
+    if 0; # not running under some shell
+
+       # shasum: filter for computing SHA digests (analogous to sha1sum)
+       #
+       # Copyright (C) 2003-2010 Mark Shelor, All Rights Reserved
+       #
+       # Version: 5.48
+       # Mon Jan  4 16:32:52 MST 2010
+
+=head1 NAME
+
+shasum - Print or Check SHA Checksums
+
+=head1 SYNOPSIS
+
+ Usage: shasum [OPTION] [FILE]...
+    or: shasum [OPTION] --check [FILE]
+ Print or check SHA checksums.
+ With no FILE, or when FILE is -, read standard input.
+
+  -a, --algorithm    1 (default), 224, 256, 384, 512
+  -b, --binary       read files in binary mode (default on DOS/Windows)
+  -c, --check        check SHA sums against given list
+  -p, --portable     read files in portable mode
+                         produces same digest on Windows/Unix/Mac
+  -t, --text         read files in text mode (default)
+
+ The following two options are useful only when verifying checksums:
+
+  -s, --status       don't output anything, status code shows success
+  -w, --warn         warn about improperly formatted SHA checksum lines
+
+  -h, --help         display this help and exit
+  -v, --version      output version information and exit
+
+ The sums are computed as described in FIPS PUB 180-2.  When checking,
+ the input should be a former output of this program.  The default mode
+ is to print a line with checksum, a character indicating type (`*'
+ for binary, `?' for portable, ` ' for text), and name for each FILE.
+
+=head1 DESCRIPTION
+
+The I<shasum> script provides the easiest and most convenient way to
+compute SHA message digests.  Rather than writing a program, the user
+simply feeds data to the script via the command line, and waits for
+the results to be printed on standard output.  Data can be fed to
+I<shasum> through files, standard input, or both.
+
+The following command shows how easy it is to compute digests for typical
+inputs such as the NIST test vector "abc":
+
+       perl -e "print qq(abc)" | shasum
+
+Or, if you want to use SHA-256 instead of the default SHA-1, simply say:
+
+       perl -e "print qq(abc)" | shasum -a 256
+
+Since I<shasum> uses the same interface employed by the familiar
+I<sha1sum> program (and its somewhat outmoded anscestor I<md5sum>),
+you can install this script as a convenient drop-in replacement.
+
+=head1 AUTHOR
+
+Copyright (c) 2003-2010 Mark Shelor <mshelor@cpan.org>.
+
+=head1 SEE ALSO
+
+shasum is implemented using the Perl module L<Digest::SHA> or
+L<Digest::SHA::PurePerl>.
+
+=cut
+
+use strict;
+use FileHandle;
+use Getopt::Long;
+
+my $VERSION = "5.48";
+
+
+       # Try to use Digest::SHA, since it's faster.  If not installed,
+       # use Digest::SHA::PurePerl instead.
+
+my $MOD_PREFER = "Digest::SHA";
+my $MOD_SECOND = "Digest::SHA::PurePerl";
+
+my $module = $MOD_PREFER;
+eval "require $module";
+if ($@) {
+       $module = $MOD_SECOND;
+       eval "require $module";
+       die "Unable to find $MOD_PREFER or $MOD_SECOND\n" if $@;
+}
+
+
+       # Usage statement adapted from Ulrich Drepper's md5sum.
+       # Include an "-a" option for algorithm selection,
+       # and a "-p" option for portable digest computation.
+
+sub usage {
+       my($err, $msg) = @_;
+
+       $msg = "" unless defined $msg;
+       if ($err) {
+               warn($msg . "Type shasum -h for help\n");
+               exit($err);
+       }
+       print <<'END_OF_USAGE';
+Usage: shasum [OPTION] [FILE]...
+   or: shasum [OPTION] --check [FILE]
+Print or check SHA checksums.
+With no FILE, or when FILE is -, read standard input.
+
+  -a, --algorithm    1 (default), 224, 256, 384, 512
+  -b, --binary       read files in binary mode (default on DOS/Windows)
+  -c, --check        check SHA sums against given list
+  -p, --portable     read files in portable mode
+                         produces same digest on Windows/Unix/Mac
+  -t, --text         read files in text mode (default)
+
+The following two options are useful only when verifying checksums:
+  -s, --status       don't output anything, status code shows success
+  -w, --warn         warn about improperly formatted SHA checksum lines
+
+  -h, --help         display this help and exit
+  -v, --version      output version information and exit
+
+The sums are computed as described in FIPS PUB 180-2.  When checking, the
+input should be a former output of this program.  The default mode is to
+print a line with checksum, a character indicating type (`*' for binary,
+`?' for portable, ` ' for text), and name for each FILE.
+
+Report bugs to <mshelor@cpan.org>.
+END_OF_USAGE
+       exit($err);
+}
+
+
+       # Collect options from command line
+
+my ($alg, $binary, $check, $text, $status, $warn, $help, $version);
+my ($portable);
+
+eval { Getopt::Long::Configure ("bundling") };
+GetOptions(
+       'b|binary' => \$binary, 'c|check' => \$check,
+       't|text' => \$text, 'a|algorithm=i' => \$alg,
+       's|status' => \$status, 'w|warn' => \$warn,
+       'h|help' => \$help, 'v|version' => \$version,
+       'p|portable' => \$portable
+) or usage(1, "");
+
+
+       # Deal with help requests and incorrect uses
+
+usage(0)
+       if $help;
+usage(1, "shasum: Ambiguous file mode\n")
+       if scalar(grep { defined $_ } ($binary, $portable, $text)) > 1;
+usage(1, "shasum: --warn option used only when verifying checksums\n")
+       if $warn && !$check;
+usage(1, "shasum: --status option used only when verifying checksums\n")
+       if $status && !$check;
+
+
+       # Default to SHA-1 unless overriden by command line option
+
+$alg = 1 unless defined $alg;
+grep { $_ == $alg } (1, 224, 256, 384, 512)
+       or usage(1, "shasum: Unrecognized algorithm\n");
+
+
+       # Display version information if requested
+
+if ($version) {
+       print "$VERSION\n";
+       exit(0);
+}
+
+
+       # Try to figure out if the OS is DOS-like.  If it is,
+       # default to binary mode when reading files, unless
+       # explicitly overriden by command line "--text" or
+       # "--portable" options.
+
+my $isDOSish = ($^O =~ /^(MSWin\d\d|os2|dos|mint|cygwin)$/);
+if ($isDOSish) { $binary = 1 unless $text || $portable }
+
+my $modesym = $binary ? '*' : ($portable ? '?' : ' ');
+
+
+       # Read from STDIN (-) if no files listed on command line
+
+@ARGV = ("-") unless @ARGV;
+
+
+       # sumfile($file): computes SHA digest of $file
+
+sub sumfile {
+       my $file = shift;
+
+       my $mode = $portable ? 'p' : ($binary ? 'b' : '');
+       my $digest = eval { $module->new($alg)->addfile($file, $mode) };
+       if ($@) {
+               warn "shasum: $file: $!\n";
+               return;
+       }
+
+       $digest->hexdigest;
+}
+
+
+       # %len2alg: maps hex digest length to SHA algorithm
+
+my %len2alg = (40 => 1, 56 => 224, 64 => 256, 96 => 384, 128 => 512);
+
+
+       # Verify checksums if requested
+
+if ($check) {
+       my $checkfile = shift(@ARGV);
+       my ($err, $read_errs, $match_errs) = (0, 0, 0);
+       my ($num_files, $num_checksums) = (0, 0);
+       my ($fh, $sum, $fname, $rsp, $digest);
+
+       die "shasum: $checkfile: $!\n"
+               unless $fh = FileHandle->new($checkfile, "r");
+       while (<$fh>) {
+               s/\s+$//;
+               ($sum, $modesym, $fname) = /^(\S+) (.)(.*)$/;
+               ($binary, $portable, $text) =
+                       map { $_ eq $modesym } ('*', '?', ' ');
+               unless ($alg = $len2alg{length($sum)}) {
+                       warn("shasum: $checkfile: $.: improperly " .
+                               "formatted SHA checksum line\n") if $warn;
+                       next;
+               }
+               $rsp = "$fname: "; $num_files++;
+               unless ($digest = sumfile($fname)) {
+                       $rsp .= "FAILED open or read\n";
+                       $err = 1; $read_errs++;
+               }
+               else {
+                       $num_checksums++;
+                       if (lc($sum) eq $digest) { $rsp .= "OK\n" }
+                       else { $rsp .= "FAILED\n"; $err = 1; $match_errs++ }
+               }
+               print $rsp unless $status;
+       }
+       $fh->close;
+       unless ($status) {
+               warn("shasum: WARNING: $read_errs of $num_files listed " .
+                       "files could not be read\n") if $read_errs;
+               warn("shasum: WARNING: $match_errs of $num_checksums " .
+                       "computed checksums did NOT match\n") if $match_errs;
+       }
+       exit($err);
+}
+
+
+       # Compute and display SHA checksums of requested files
+
+my($file, $digest);
+
+for $file (@ARGV) {
+       if ($digest = sumfile($file)) {
+               print "$digest $modesym", "$file\n";
+       }
+}