#!/usr/bin/env ruby # Suggested execution is mixing find / xargs with the parallel (P) parameters: # find test/fixture/ -type f | xargs -P 5 -n 10 ./bin/czindexer # will fire 5 czindexer each with 10 files to process... require 'optparse' options={} optparse= OptionParser.new do |opts| opts.banner="Usage: czindexer [options] [file1] [file2]..." options[:verbose] = false opts.on( '-v', '--verbose', 'Output more information' ) do options[:verbose] = true end options[:reindex]=false opts.on( '-f', '--force-reindex', 'Force Reindex (default:false)') do options[:reindex]=true end opts.on( '-h', '--help', 'Display this screen' ) do puts opts exit end #TODO ADD REMOVE ALL option end optparse.parse! require 'code_zauker' def processElement(l,fs,options) #Remove trailing / from l before proceeding if l[-1]=="/" l=l.chop end if Dir.exists?(l) #puts "Processing Dir #{l}" if options[:verbose] Dir["#{l}/*"].each do |elem| processElement(elem,fs,options) end # puts "Processing via find+xargs" if options[:verbose] # if options[:reindex]==false # system("find #{l} -type f -print0 | xargs -0 -P 7 -n 5 #{$0}") # else # system("find #{l} -type f -print0 | xargs -0 -P 7 -n 5 #{$0} -f ") # end else # avoid processing bad guys... toExclude=false CodeZauker::DEFAULT_EXCLUDED_EXTENSION.each do | ext | if l.downcase().end_with?(ext) toExclude=true break end end if !toExclude && !l.include?("/.hg/") && !l.include?("/CVS/") && !l.include?("/.svn/") && !l.include?("/.git/") #puts "Processing File #{l}" if options[:verbose] startTime=Time.now if options[:reindex] == true fs.reindex([l]) else fs.load(l,noReload=true) end timeTaken=Time.now-startTime $PROCESSED_FILES+=1 $CUMULATED_TIME +=timeTaken $FILES_PER_SEC= $PROCESSED_FILES/$CUMULATED_TIME if options[:verbose] and (( $PROCESSED_FILES % 75 ) == 0 ) puts "#{$PROCESSED_FILES} files processed so far... Files per sec:#{$FILES_PER_SEC} Last:#{timeTaken}" end else #puts "SKIPPED binary file: #{l}" if options[:verbose] end end end begin $CUMULATED_TIME=0 # Allocated here to recycle connection fs=CodeZauker::FileScanner.new() $PROCESSED_FILES=0 puts "Code Zauker v#{CodeZauker::VERSION}" if options[:verbose] puts "Reindexing..." if options[:verbose]==true and options[:reindex]==true ARGV.each do | l | processElement(l,fs,options) end ensure fs.disconnect puts "End:#{$PROCESSED_FILES} files Files per sec:#{$FILES_PER_SEC}" end