1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #!/usr/bin/env ruby
- #
- # Run like this:
- #
- # ./find_long_lines.rb [DIR]
- #
- ###############################################################
- # Idea from the command line: #
- # #
- # > cd wherever-you-want #
- # > files=$(find . -iname "*.f90") #
- # > ruby -ne 'puts $<.filename, $_ if $_.length > 132' $files #
- ###############################################################
- # -- where to look. Default to '~/TM5'.
- if ARGV.size==1
- root=ARGV[0]
- else
- root=File.join(ENV['HOME'],'TM5')
- end
- if not File.directory?(root)
- puts "Dir #{root} does not exist! Returning..."
- exit
- end
- # -- get list of files
- f90=Dir["#{root}/**/*.[fF]90"]
- # -- build list of culprit
- flist_with_longlines=[]
- f90.each do |fname|
- lines=File.open(fname).each_with_index.select {|li,ind| li.length>132}
- if lines.any?
- fobj=Hash.new()
- fobj['name']=fname
- fobj['ind']=lines.map(&:last).map{|v| v+1}
- fobj['longuest']=lines.map{|p| p[0].length}.max
- begin
- fobj['isComment']=lines.select{|l,i| l=~/^\s*!/}.map(&:last).map{|v| v+1}
- fobj['isOMP']=lines.select{|l,i| l=~/^\s*!\$OMP/i}.map(&:last).map{|v| v+1}
- rescue Exception
- STDERR.puts "Problem with file: #{fname} (bad encoding?)"
- STDERR.puts "All lon lines considered as code."
- fobj['isComment']=[]
- fobj['isOMP']=[]
- end
- fobj['isComment']-=fobj['isOMP']
- fobj['isCode']=fobj['ind']-fobj['isComment']-fobj['isOMP']
- flist_with_longlines << fobj
- end
- end
- # -- Verbose
- total=flist_with_longlines.map {|f| f['ind'].length}.inject(:+)
- totalf=flist_with_longlines.map {|f| f['isCode'].length}.inject(:+)
- totalc=flist_with_longlines.map {|f| f['isComment'].length}.inject(:+)
- totalo=flist_with_longlines.map {|f| f['isOMP'].length}.inject(:+)
- longuest=flist_with_longlines.map {|f| f['longuest']}.max
- puts "There are #{flist_with_longlines.length} files out of #{f90.length} with too long lines,"
- puts "for a total of #{total} too long lines (Code: #{totalf}; Comment: #{totalc}; OpenMP: #{totalo})."
- puts "The longest line is #{longuest} characters long."
- print "Do you want the list of files AND all lines numbers [Y/n]? "
- res=$stdin.gets.chomp
- if res=='' or res.upcase=='Y'
- flist_with_longlines.each do |f|
- puts
- puts f['name'].sub(root,'.') +':',"--long code--",f['isCode'],"--long comment--",f['isComment']
- puts "--long OpenMP--",f['isOMP']
- end
- else
- print "Do you want the ONLY the list of files (no lines numbers) [Y/n]? "
- res2=$stdin.gets.chomp
- if res2=='' or res2.upcase=='Y'
- flist_with_longlines.each do |f|
- nlc=f['isCode'].length
- if nlc>0
- puts f['name'].sub(root,'.') +" (#{nlc})"
- end
- end
- end
- end
|