Add support for fast-cq mode to webkit-patch land-safely command
[WebKit-https.git] / Source / WTF / Scripts / GeneratePreferences.rb
index 38eacc7dc352d583ba4878a88c38e2e20f9c0c9d..522ee3c506cfd4ae581f03b7dd20cb672fe173b8 100644 (file)
@@ -34,12 +34,11 @@ options = {
   :debugPreferences => nil,
   :experimentalPreferences => nil,
   :internalPreferences => nil,
-  :templateDirectory => nil,
   :outputDirectory => nil,
   :templates => []
 }
 optparse = OptionParser.new do |opts|
-  opts.banner = "Usage: #{File.basename($0)} --input file"
+  opts.banner = "Usage: #{File.basename($0)} --frontend <frontend> --base <base> --debug <debug> --experimental <experimental> --internal <internal> --template file"
 
   opts.separator ""
 
@@ -49,13 +48,12 @@ optparse = OptionParser.new do |opts|
   opts.on("--experimental input", "file to generate experimental preferences from") { |experimentalPreferences| options[:experimentalPreferences] = experimentalPreferences }
   opts.on("--internal input", "file to generate internal preferences from") { |internalPreferences| options[:internalPreferences] = internalPreferences }
   opts.on("--template input", "template to use for generation (may be specified multiple times)") { |template| options[:templates] << template }
-  opts.on("--templateDir input", "directory to look for templates in") { |templateDir| options[:templateDirectory] = templateDir }
   opts.on("--outputDir output", "directory to generate file in") { |outputDir| options[:outputDirectory] = outputDir }
 end
 
 optparse.parse!
 
-if !options[:frontend] || !options[:basePreferences] || !options[:debugPreferences] || !options[:experimentalPreferences] || !options[:internalPreferences] || !options[:templateDirectory]
+if !options[:frontend] || !options[:basePreferences] || !options[:debugPreferences] || !options[:experimentalPreferences] || !options[:internalPreferences]
   puts optparse
   exit -1
 end
@@ -102,6 +100,7 @@ class Preference
   attr_accessor :condition
   attr_accessor :hidden
   attr_accessor :defaultValues
+  attr_accessor :exposed
 
   def initialize(name, opts, frontend)
     @name = name
@@ -115,6 +114,7 @@ class Preference
     @condition = opts["condition"]
     @hidden = opts["hidden"] || false
     @defaultValues = opts["defaultValue"][frontend]
+    @exposed = !opts["exposed"] || opts["exposed"].include?(frontend)
   end
 
   def nameLower
@@ -122,7 +122,7 @@ class Preference
       @getter
     elsif @name.start_with?("VP")
       @name[0..1].downcase + @name[2..@name.length]
-    elsif @name.start_with?("CSS", "XSS", "FTP", "DOM", "DNS", "PDF", "ICE")
+    elsif @name.start_with?("CSS", "DOM", "DNS", "FTP", "ICE", "IPC", "PDF", "XSS")
       @name[0..2].downcase + @name[3..@name.length]
     elsif @name.start_with?("HTTP")
       @name[0..3].downcase + @name[4..@name.length]
@@ -192,6 +192,12 @@ class Preferences
     @experimentalFeatures.sort! { |x, y| x.name <=> y.name }.sort! { |x, y| x.humanReadableName <=> y.humanReadableName }
     @internalFeatures.sort! { |x, y| x.name <=> y.name }.sort! { |x, y| x.humanReadableName <=> y.humanReadableName }
 
+    @exposedPreferences = @preferences.select { |p| p.exposed }
+    @exposedPreferencesNotDebug = @preferencesNotDebug.select { |p| p.exposed }
+    @exposedPreferencesDebug = @preferencesDebug.select { |p| p.exposed }
+    @exposedExperimentalFeatures = @experimentalFeatures.select { |p| p.exposed }
+    @exposedInternalFeatures = @internalFeatures.select { |p| p.exposed }
+
     @preferencesBoundToSetting = @preferences.select { |p| !p.webcoreBinding }
     @preferencesBoundToDeprecatedGlobalSettings = @preferences.select { |p| p.webcoreBinding == "DeprecatedGlobalSettings" }
     @preferencesBoundToRuntimeEnabledFeatures = @preferences.select { |p| p.webcoreBinding == "RuntimeEnabledFeatures" }
@@ -203,7 +209,10 @@ class Preferences
     result = []
     if parsedPreferences
       parsedPreferences.each do |name, options|
-        if !options["exposed"] or options["exposed"].include?(@frontend)
+        if !options["webcoreBinding"] && options["defaultValue"].size != 3
+          raise "ERROR: Preferences bound to WebCore::Settings must have default values for all frontends: #{name}"
+        end
+        if options["defaultValue"].include?(@frontend)
           preference = Preference.new(name, options, @frontend)
           @preferences << preference
           result << preference
@@ -213,18 +222,25 @@ class Preferences
     result
   end
 
-  def renderTemplate(templateDirectory, template, outputDirectory)
-    templateFile = File.join(templateDirectory, template + ".erb")
+  def renderTemplate(templateFile, outputDirectory)
+    resultFile = File.join(outputDirectory, File.basename(templateFile, ".erb"))
+    tempResultFile = resultFile + ".tmp"
 
     output = ERB.new(File.read(templateFile), 0, "-").result(binding)
-    File.open(File.join(outputDirectory, template), "w+") do |f|
+    File.open(tempResultFile, "w+") do |f|
       f.write(output)
     end
+    if (!File.exist?(resultFile) || IO::read(resultFile) != IO::read(tempResultFile))
+      FileUtils.move(tempResultFile, resultFile)
+    else
+      FileUtils.remove_file(tempResultFile)
+      FileUtils.uptodate?(resultFile, [templateFile]) or FileUtils.touch(resultFile)
+    end
   end
 end
 
 preferences = Preferences.new(parsedBasePreferences, parsedDebugPreferences, parsedExperimentalPreferences, parsedInternalPreferences, options[:frontend])
 
 options[:templates].each do |template|
-  preferences.renderTemplate(options[:templateDirectory], template, options[:outputDirectory])
+  preferences.renderTemplate(template, options[:outputDirectory])
 end