Index: trunk/DataStore/scripts/dsleech
===================================================================
--- trunk/DataStore/scripts/dsleech	(revision 8726)
+++ trunk/DataStore/scripts/dsleech	(revision 8727)
@@ -3,5 +3,5 @@
 # Copyright (C) 2006  Joshua Hoblitt
 #
-# $Id: dsleech,v 1.2 2006-08-31 23:04:53 jhoblitt Exp $
+# $Id: dsleech,v 1.3 2006-09-01 21:18:30 jhoblitt Exp $
 
 use strict;
@@ -9,13 +9,14 @@
 
 use vars qw( $VERSION );
-$VERSION = '0.01';
+$VERSION = '0.02';
 
 use DataStore;
 use File::Spec;
+use YAML ();
 
 use Getopt::Long qw( GetOptions :config auto_help auto_version gnu_getopt );
 use Pod::Usage qw( pod2usage );
 
-my ($dir, $uri, $last_fileset, $verbose);
+my ($dir, $uri, $last_fileset, $recall, $remember, $verbose);
 
 GetOptions(
@@ -23,5 +24,7 @@
     'uri|u=s'           => \$uri,
     'last_fileset|l=s'  => \$last_fileset,
-    'verbose|v'           => \$verbose,
+    'recall'            => \$recall,
+    'remember'          => \$remember,
+    'verbose|v'         => \$verbose,
 ) or pod2usage( 2 );
 
@@ -36,5 +39,22 @@
 );
 
+# rc file path
+my $rcfilename = File::Spec->catfile($ENV{'HOME'}, '.dsleechrc');
+
+# load rc file
+my $rc = load_rc($rcfilename) or die "failed to load rcfile";
+
 $p{last_fileset} = $last_fileset if defined $last_fileset; 
+if ($recall) {
+    # if --last_fileset was specified it's value should override --recall
+    if (defined $last_fileset) {
+        warn "--last_fileset overriding --recall" if defined $verbose;
+    } elsif (defined $rc->{$uri}) {
+        $p{last_fileset} = $rc->{$uri};
+    } else {
+        warn "--recall couldn't find a previous fileset ID"
+            if defined $verbose;
+    }
+}
 
 my $response = DataStore::Product->new(%p)->request;
@@ -52,4 +72,15 @@
 
 process_filesets($filesets, $dir, $verbose) or die "failed to process filesets";
+
+# if we got this far we're assuming that the downloads completed and we can
+# save the last fileset 
+if ($remember) {
+    my $lowest_fileset = $filesets->[-1];
+    if (defined $lowest_fileset) {
+        $rc->{$uri} = $lowest_fileset->fileset;
+    }
+
+    save_rc($rcfilename, $rc) or die "failed to save rcfile";
+}
 
 sub process_filesets
@@ -127,4 +158,34 @@
 }
 
+sub load_rc {
+    my $rcfilename = shift;
+
+    # initalize $sums with an empty hash so if there isn't a pre-existing
+    # database we still end up with a hashref instead of an undef scalar
+    my $rc;
+    if (-e $rcfilename) {
+        if (-f $rcfilename) {
+            $rc = YAML::LoadFile($rcfilename) or die "failed to load rc file";
+        } else {
+            warn "$rcfilename is not a plain file";
+            return;
+        }
+    }
+
+    # if the rcfile exists but is empty YAML will return undef
+    $rc ||= {};
+
+    return $rc;
+}
+
+sub save_rc {
+    my ($rcfilename, $rc) = @_;
+
+    my $yaml = YAML::DumpFile($rcfilename, $rc)
+            or die "failed to write rc file";
+
+    return 1;
+}
+
 __END__
 
@@ -138,5 +199,5 @@
 
     dsproductls --uri <uri> [--dir <dir>] [--last_fileset <filesetid>]
-                [--verbose]
+                [--recall] [--remember] [--verbose]
 
 =head1 DESCRIPTION
@@ -159,4 +220,16 @@
 
 The FileSet ID of the last FileSet that you've seen.  Only filesets registered after C<filesetid> will be polled for files to retreive.
+
+This flag is optional.
+
+=item * --recall
+
+Load the last fileset ID seen for C<--uri> from the I<rcfile>, if it exists.
+
+This flag is optional.
+
+=item * --remember
+
+Store the last fileset ID seen for C<--uri> in the I<rcfile>.
 
 This flag is optional.
