add debian/watch
[id3fs.git] / bin / id3fs-index
index cff0990..7f0c17c 100755 (executable)
@@ -1,6 +1,20 @@
 #!/usr/bin/perl -w
-# Ian Beckwith <ianb@erislabs.net>
 #
+# id3fs - a FUSE-based filesystem for browsing audio metadata
+# Copyright (C) 2010  Ian Beckwith <ianb@erislabs.net>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 use lib '/home/ianb/projects/id3fs/id3fs/lib'; # FIXME: remove
 use strict;
@@ -30,15 +44,27 @@ my $optret=GetOptions(
     "list|l"         => \$list,
     );
 
+if($list && !@ARGV)
+{
+    push(@ARGV, ".");
+}
 usage() if(!@ARGV || !$optret || $help);
 $init=1 unless($list);
 
-if(@ARGV > 1 && !defined($basedir))
+unless(defined($basedir) && defined($dbpath))
 {
-    die("$me: --basedir must be specified if multiple paths are supplied\n");
+    $basedir=ID3FS::DB::find_db($me, $init, @ARGV);
+    exit unless($basedir);
+    my $absbase=Cwd::abs_path($basedir);
+    for my $dir (@ARGV)
+    {
+       if(Cwd::abs_path($dir) !~ /^\Q$absbase\E/)
+       {
+           die("$me: $dir: must be under basedir $absbase - use --basedir to specify\n");
+       }
+    }
 }
-
-my $db=ID3FS::DB->new($me, $verbose, $init, $dbpath, $basedir, $ARGV[0]);
+my $db=ID3FS::DB->new($me, $verbose, $init, $basedir, $dbpath);
 exit unless($db);
 
 if($list)
@@ -64,6 +90,8 @@ else
        print "$me: removing data from pruned files\n" if $verbose;
        $db->remove_unused();
     }
+    print "$me: analyzing db\n" if $verbose;
+    $db->analyze();
 }
 
 sub wanted
@@ -86,7 +114,10 @@ sub wanted
 sub prune
 {
     my $dir=shift;
+    $dir=Cwd::abs_path($dir);
     return unless(opendir(DIR, $dir));
+    my $base=Cwd::abs_path($db->base_dir());
+    $dir=~s/^$base\/?//;
     my @oldfiles=$db->files_in($dir);
     my @newfiles=grep { !/^\.\.?$/; } readdir(DIR);
     closedir(DIR);
@@ -98,9 +129,8 @@ sub prune
     {
        unless(exists($hash{$file}))
        {
-           # FIXME: add path, rebasify
            $files_pruned=1;
-           $db->unindex($file);
+           $db->unindex($dir, $file);
        }
     }
 }