#!/usr/bin/perl
# 267BPZA - script written to auto backup a file into './.bak/' with a 
#   -`pt` appended before the extension or at the end if none.
# 2do:
#   handle spaces in filenames
#   use Time::PT when it's ready

my $ttyn = $ENV{'TTY'} || '';
   $ttyn = shift || '' unless(length $ttyn);
my $srcf = shift || $ENV{'EDTF'} || '';
my $dstf; 
if(length($ttyn)) {
  if   ($ttyn =~ /^(\/dev\/tty)/)   { $ttyn =~ s/^$1//;  }
  elsif($ttyn =~ /^(\/dev\/pts\/)/) { $ttyn =~ s/^$1/x/; }
  elsif(!length($srcf))             { $srcf = $ttyn;     }
}
my $ercg = $ENV{'HOME'} . '/.erc/eall';      # Global .erc/eall  filelist
my $ercl = $ENV{'HOME'} . '/.erc/e' . $ttyn; # Local  .erc/e$TTY filelist
my $cwdr = `pwd`; chomp($cwdr);
my $pktm = `pt` ; chomp($pktm); my $extn; my @tsts; my $pass;

unless(-r $srcf) {
  if(-r $ercl && open(ERCL, "<$ercl")) {
    chomp($srcf = <ERCL>);
    close(ERCL);
  }
}
unless(-r $srcf) {
  if(-r $ercg && open(ERCG, "<$ercg")) {
    chomp($srcf = <ERCG>);
    close(ERCG);
  }
}
die "!*EROR*! Please pass bak a filename to backup!\n" unless(-r $srcf);
unless(-d '.bak') { 
  mkdir('.bak') || die "!*EROR*! Couldn't create '.bak' directory!\n"; 
}
unless(-w '.bak') { 
                   die "!*EROR*! Cannot write to '.bak' directory!\n"; 
}
while($srcf) {
  if(-f $srcf && -r $srcf) { 
    $dstf = $srcf;
    $extn = '';
    if($dstf =~ s/^(.+)(\..{1,4})$/$1/) { # strip file extension
# *note* I can't think of any extensions I want to support longer than 4 chars.
      $extn  = $2;
      if($dstf =~ s/^\.tar$//) { # put -`pt` before .tar.(gz|bz2) also
        $extn  = ".tar" . $extn;
      }
    }
    if($dstf =~ /\//) {
      $dstf =~ s/(.*)\//$1\/.bak\//;
    } else {
      $dstf =~ s/^/.bak\//;
    }
    @tsts = reverse(sort(glob($dstf . "-???????" . $extn)));
    $pass = 1;
    if(@tsts) { # test last 3 backups for differences before proceeding
      @tsts = @tsts[0..2] if(@tsts > 3);
      foreach(@tsts) { 
        $pass = `diff --brief $_ $srcf`;
        unless($pass) {
          $_    =~ s/^$cwdr/\./;
          $srcf =~ s/^$cwdr/\./;
          $_    =~ s/(.*)-(.)(.)(.)(.)(.)(.)(.)/$1-\e[1;31m$2\e[0;33m$3\e[1;33m$4\e[1;32m$5\e[1;36m$6\e[1;34m$7\e[1;35m$8\e[1;32m/;
          printf("!*EROR*! File: '%-16s already bak'd up as '$_'!\n", $srcf . "'");
          last;
        }
      }
    }
    if($pass) {
      $dstf .= "-$pktm" . $extn;
      open(SRCF, "<$srcf");
      open(DSTF, ">$dstf");
      print DSTF $_ while(<SRCF>);
      close(DSTF);
      close(SRCF);
      $pass = `diff --brief $srcf $dstf`;
      if(length $pass) { $pass = 0; } 
      else             { $pass = 1; }
      $srcf =~ s/^$cwdr/\./;
      $dstf =~ s/^$cwdr/\./;
      if(-e $dstf) {
        if($pass) { # SUCCESS!
          $dstf =~ s/(.*)-(.)(.)(.)(.)(.)(.)(.)/$1-\e[1;31m$2\e[0;33m$3\e[1;33m$4\e[1;32m$5\e[1;36m$6\e[1;34m$7\e[1;35m$8\e[1;32m/;
          printf("bak'd up: '%-16s as '$dstf'\n", $srcf . "'"); 
        } else {    # FAILED `diff`
          printf("!*EROR*! File: '%-16s differs from '$dstf'!\n", $srcf . "'");
        }
      } else {      # FAILED output-file-creation or something else
        printf("!*EROR*! Couldn't bak up: '%-16s as '$dstf'\n", $srcf . "'");
      }
    }
  }
  $srcf = shift;
}
