X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=bin%2Fid3fs-index;h=22cdf79610f2e24fd090e486598ef461e97620de;hb=0cd0034a3935f56a2a91e63185da84a150b20832;hp=89f6f12dc58af1f25afb6e325091c773d5cacebf;hpb=2810a098210c12971b57489131bf7e759473ca27;p=id3fs.git diff --git a/bin/id3fs-index b/bin/id3fs-index index 89f6f12..22cdf79 100755 --- a/bin/id3fs-index +++ b/bin/id3fs-index @@ -15,7 +15,9 @@ my $help=0; my $basedir=undef; my $dbpath=undef; my $list=0; +my $init=0; my @extensions=qw(mp3 flac ogg); +my $files_pruned; Configure(qw(bundling no_ignore_case)); my $optret=GetOptions( @@ -28,14 +30,29 @@ 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, $basedir, $dbpath); +exit unless($db); -my $db=ID3FS::DB->new($me, $dbpath, $basedir, $ARGV[0]); if($list) { list_tags($db); @@ -43,11 +60,24 @@ if($list) else { $db->last_update(time()); - + my $base=$db->base_dir(); + my $abs_base=Cwd::abs_path($base); while(my $path=shift) { + if(Cwd::abs_path($path) !~ /^$abs_base/) + { + print "$me: $path is outside $base, skipping\n"; + } File::Find::find( {wanted => \&wanted, follow => 1, no_chdir => 1}, $path); } + my $directories_pruned=$db->prune_directories(); + if($files_pruned || $directories_pruned) + { + print "$me: removing data from pruned files\n" if $verbose; + $db->remove_unused(); + } + print "$me: analyzing db\n" if $verbose; + $db->analyze(); } sub wanted @@ -57,6 +87,7 @@ sub wanted if(-d) { print("$_\n") if $verbose; + prune($_); } elsif(-f && scalar(grep({ $ext eq lc($_);} @extensions))) { @@ -65,6 +96,31 @@ 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); + @oldfiles=sort @oldfiles; + @newfiles=sort @newfiles; + my %hash; + @hash{@newfiles}=(); + for my $file (@oldfiles) + { + unless(exists($hash{$file})) + { + $files_pruned=1; + $db->unindex($dir, $file); + } + } +} + sub list_tags { my($db)=@_;