diff --git a/.gitattributes b/.gitattributes index 746b59d5d..22a4a68aa 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,7 +4,6 @@ # Explicitly declare text files we want to always be normalized and converted # to native line endings on checkout. -*.properties *.conf text *.config text diff --git a/utilities/licenser/licenser.rb b/utilities/licenser/licenser.rb index 4bcc4ca77..1d507b2d6 100644 --- a/utilities/licenser/licenser.rb +++ b/utilities/licenser/licenser.rb @@ -49,7 +49,6 @@ class Licenser # def sanity_checks_on_parameters() # Check that all necessary properties are here. - raise("Properties file must contain a value for 'scan_only'") if @scan_only_string == nil raise("Properties file must contain a value for 'source_dir'") if @source_dir == nil raise("Properties file must contain a value for 'known_exceptions'") if @known_exceptions_file == nil raise("Properties file must contain a value for 'skip_directories'") if @skip_directories_list == nil @@ -63,43 +62,6 @@ class Licenser if !File.exist?(@known_exceptions_file) raise "Known exceptions file does not exist: #{@known_exceptions_file}" end - - if !@scan_only - raise("Properties file must contain a value for 'target_dir'") if @target_dir == nil - raise("Properties file must contain a value for 'license_file'") if @license_file == nil - - if File.exist?(@target_dir) - raise "Target directory already exists: #{@target_dir}" - end - - target_parent = File.dirname(@target_dir) - if !File.exist?(target_parent) - raise "Path to target directory doesn't exist: #{target_parent}" - end - - if !File.exist?(@license_file) - raise "License file does not exist: #{@license_file}" - end - end - end - - # Prepare the license as an array of lines of text, - # with the current year substituted in for ${year} - # - def prepare_license_text(license_file) - if (license_file == nil) - return [] - end - - year_string = DateTime.now.year.to_s - - text = [] - File.open(license_file) do |file| - file.each do |line| - text << line.gsub('${year}', year_string) - end - end - return text end # The globs in the exceptions file are assumed to be @@ -126,8 +88,6 @@ class Licenser def scan_dir(source_dir, target_dir) @stats.enter_directory(source_dir) - Dir.mkdir(File.expand_path(target_dir, @target_dir)) if !@scan_only - Dir.foreach(File.join(@source_dir, source_dir)) do |filename| source_path_relative = File.join(source_dir, filename) source_path = File.join(@source_dir, source_path_relative) @@ -162,27 +122,12 @@ class Licenser elsif is_directory scan_dir(source_path_relative, target_path_relative) elsif is_match - if @scan_only - @stats.record_scan_matching(filename) - scan_file(source_path, filename) - else - @stats.record_copy_matching(filename) - copy_file_with_license(source_path, target_path, filename) - end + @stats.record_scan_matching(filename) + scan_file(source_path, filename) elsif is_exception @stats.record_known_exception(filename) - if @scan_only - # do nothing - else - copy_file_without_license(source_path, target_path) - end else # not a match - if @scan_only - @stats.record_scan_non_matching(filename) - else - @stats.record_copy_non_matching(filename) - copy_file_without_license(source_path, target_path) - end + @stats.record_scan_non_matching(filename) end end end @@ -215,7 +160,7 @@ class Licenser return false end - # This file would be eligible for licensing if we weren't in scan-only mode. + # This file should contain a license tag. # def scan_file(source_path, filename) found = 0 @@ -236,57 +181,6 @@ class Licenser end end - # This file matches at least one of the file-matching strings, and does not - # match any exceptions. Replace the magic string with the license text. - # - def copy_file_with_license(source_path, target_path, filename) - found = 0 - File.open(source_path) do |source_file| - File.open(target_path, "w") do |target_file| - source_file.each do |line| - if line.include?(MAGIC_STRING) - found += 1 - insert_license_text(target_file, line) - else - target_file.print line - end - end - end - end - - if found == 0 - @stats.record_no_tag(filename, source_path) - elsif found == 1 - @stats.record_tag(filename) - else - raise("File contains #{found} license lines: #{source_path}") - end - end - - # Figure out the comment characters and write the license text to the file. - # - def insert_license_text(target_file, line) - ends = line.split(MAGIC_STRING) - if ends.size != 2 - raise ("Can't parse this license line: #{line}") - end - - target_file.print "#{ends[0].strip}\n" - - @license_text.each do |text| - target_file.print "#{text.rstrip}\n" - end - - target_file.print "#{ends[1].strip}\n" - end - - # This file either doesn't match any of the file-matching strings, or - # matches an exception - # - def copy_file_without_license(source_path, target_path) - FileUtils.cp(source_path, target_path) - end - # ------------------------------------------------------------------------------------ public # ------------------------------------------------------------------------------------ @@ -296,9 +190,6 @@ class Licenser # * properties is a map of keys to values, probably parsed from a properties file. # def initialize(properties) - @scan_only_string = properties['scan_only'] - @scan_only = 'false' != @scan_only_string - @file_match_list = properties['file_matchers'] @skip_directories_list = properties['skip_directories'] @report_level_string = properties['report_level'] @@ -319,7 +210,6 @@ class Licenser @short_report = @report_level_string === 'short' @file_matchers = @file_match_list.strip.split(/,\s*/) @skip_directories = @skip_directories_list.strip.split(/,\s*/) - @license_text = prepare_license_text(@license_file) @known_exceptions = prepare_exception_globs(@known_exceptions_file, @source_dir) @stats = LicenserStats.new(@source_dir, @file_matchers, @full_report) @@ -332,25 +222,24 @@ class Licenser # Report the summary statistics def report(properties) - verb = @scan_only ? "scanned" : "copied" if (@short_report) - subs = 0 - @stats.substitutions.each {|line| subs += line[1] } + tags = 0 + @stats.tagged_files.each {|line| tags += line[1] } known = 0 @stats.known_exceptions.each {|line| known += line[1] } missing = 0 @stats.missing_tags.each {|line| missing += line[1] } - puts "Licenser: #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." - printf(" Substitutions: %5d\n", subs) + puts "Licenser: scanned #{@stats.file_count} files in #{@stats.dir_count} directories." + printf(" Licensed files: %5d\n", tags) printf(" Known exceptions: %5d\n", known) printf(" Missing tags: %5d\n", missing) else puts "Licenser: run completed at #{DateTime.now.strftime("%H:%M:%S on %b %d, %Y")}" - puts " #{verb} #{@stats.file_count} files in #{@stats.dir_count} directories." + puts " scanned #{@stats.file_count} files in #{@stats.dir_count} directories." puts - puts 'Substitutions' - @stats.substitutions.sort.each do |line| + puts 'Licensed files' + @stats.tagged_files.sort.each do |line| printf("%5d %s\n", line[1], line[0]) end puts diff --git a/utilities/licenser/licenser_stats.rb b/utilities/licenser/licenser_stats.rb index c2b1a259f..d379b919e 100644 --- a/utilities/licenser/licenser_stats.rb +++ b/utilities/licenser/licenser_stats.rb @@ -7,7 +7,7 @@ Collect the statistics of a licenser run. =end class LicenserStats - attr_reader :substitutions + attr_reader :tagged_files attr_reader :missing_tags attr_reader :known_exceptions attr_reader :file_count @@ -33,10 +33,10 @@ class LicenserStats @file_matchers = file_matchers @full = full - # keep track of how many substitutions for all file types - @substitutions = Hash.new() + # keep track of how many tags are found in all file types + @tagged_files = Hash.new() file_matchers.each do |matcher| - @substitutions[matcher] = 0 + @tagged_files[matcher] = 0 end # keep track of missing tags, only in file types that have missing tags @@ -84,8 +84,8 @@ class LicenserStats end def record_tag(filename) - puts " Substituted license text into #{filename}" if @full - @substitutions[which_match(filename)] += 1 + puts " Found license tag into #{filename}" if @full + @tagged_files[which_match(filename)] += 1 end def record_no_tag(filename, source_path) diff --git a/webapp/config/licenser/licenser.properties b/webapp/config/licenser/licenser.properties index 7d98dd3cd..0fab7f165 100644 --- a/webapp/config/licenser/licenser.properties +++ b/webapp/config/licenser/licenser.properties @@ -1,37 +1,35 @@ -# -------------------------------------------------------------------------- -# Properties for running the licenser utility in Vitro core. -# -------------------------------------------------------------------------- - -# The path to the top level directory to be scanned or copied -# (if relative, then relative to this file) -source_dir = ../../../ - -# The path to the top level directory to copy into (ignored if only scanning) -# (if relative, then relative to this file) -target_dir = - -# A list of filename globs that match the files we want to license, -# delimited by commas with optional white-space. -file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml - -# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. -# (relative to the source_dir) -skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build - -# The path to a file containing filename/path globs that match the files that -# we know should have no license tags in them. -# The file contains one glob per line; blank lines and comments ("#") are ignored. -# (if relative, then relative to the source directory) -known_exceptions = webapp/config/licenser/known_exceptions.txt - -# The path to the text of the license agreement (ignored if only scanning) -# If the agreement contains a ${year} token, the current year will be substituted. -# (if relative, then relative to the source directory) -license_file = doc/license.txt - -# Set to 'full' for a full report, 'short' for a brief statment, or to anything -# else for a medium-length summary. -report_level = short - -# if true, we are just scanning, not copying. -scan_only = true +# -------------------------------------------------------------------------- +# Properties for running the licenser utility in Vitro core. +# -------------------------------------------------------------------------- + +# The path to the top level directory to be scanned or copied +# (if relative, then relative to this file) +source_dir = ../../../ + +# The path to the top level directory to copy into (ignored if only scanning) +# (if relative, then relative to this file) +target_dir = + +# A list of filename globs that match the files we want to license, +# delimited by commas with optional white-space. +file_matchers = *.java, *.jsp, *.tld, *.xsl, *.xslt, *.css, *.js, *.ftl, *.xml + +# "globs" that describe paths that we won't follow for scanning OR FOR COPYING. +# (relative to the source_dir) +skip_directories = ./bin, ./.svn, ./**/.svn, ./webapp/.build + +# The path to a file containing filename/path globs that match the files that +# we know should have no license tags in them. +# The file contains one glob per line; blank lines and comments ("#") are ignored. +# (if relative, then relative to the source directory) +known_exceptions = webapp/config/licenser/known_exceptions.txt + +# The path to the text of the license agreement (ignored if only scanning) +# If the agreement contains a ${year} token, the current year will be substituted. +# (if relative, then relative to the source directory) +license_file = doc/license.txt + +# Set to 'full' for a full report, 'short' for a brief statment, or to anything +# else for a medium-length summary. +#report_level = short +report_level = medium