[SCM] ci-tooling packaging branch, master, updated. a008f7f1f85cff3ea4a3dfee1061cb86392d7c28

Harald Sitter apachelogger-guest at moszumanska.debian.org
Fri Mar 6 16:01:18 UTC 2015


Gitweb-URL: http://git.debian.org/?p=pkg-kde/ci-tooling.git;a=commitdiff;h=a008f7f

The following commit has been merged in the master branch:
commit a008f7f1f85cff3ea4a3dfee1061cb86392d7c28
Author: Harald Sitter <sitter at kde.org>
Date:   Fri Mar 6 17:01:13 2015 +0100

    split cmake parsing logit out of builder and give it some testing
    
    also expand it with a check for disabled features
---
 kci/builder.rb            | 86 ++++++++------------------------------------
 lib/cmake_parser.rb       | 91 +++++++++++++++++++++++++++++++++++++++++++++++
 test/test_cmake_parser.rb | 44 +++++++++++++++++++++++
 3 files changed, 149 insertions(+), 72 deletions(-)

diff --git a/kci/builder.rb b/kci/builder.rb
index be70c23..fb1029f 100755
--- a/kci/builder.rb
+++ b/kci/builder.rb
@@ -4,7 +4,9 @@ require 'date'
 require 'fileutils'
 require 'json'
 require 'timeout'
+
 require_relative 'lib/debian/changelog'
+require_relative 'lib/cmake_parser'
 
 =begin
 -> build_source
@@ -195,13 +197,9 @@ end
 exit 0 unless File.exist?('logs/i386.log.gz')
 
 def segmentify(data, start_marker, end_marker)
-  start_index = data.index(start_marker)
-  end_index = data.index(end_marker)
-  return [] unless start_index && end_index
-  data = data.slice(start_index..end_index).split("
")
-  data.shift # Ditch start line
-  data.pop # Ditch end line
-  data
+  warn 'Compatibility function segmentify called. BuildLogSegmenter should be' \
+       ' used instead.'
+  BuildLogSegmenter.segmentify(data, start_marker, end_marker)
 end
 
 def puts_kci(type, str)
@@ -220,72 +218,12 @@ def puts_info(str)
   puts_kci('I', str)
 end
 
-def cmake_parse_optional!(data)
-    missing = []
-    start_line = false
-    while not data.empty?
-        line = data.shift
-        if !start_line and line.empty?
-            start_line = true
-            next
-        elsif start_line and not line.empty?
-            next if line.strip.empty?
-            match = line.match(/^ *\* (.*)$/)
-            if match and match.size > 1
-                missing << match[1]
-            end
-        else
-            # Line is empty and the start conditions didn't match.
-            # Either the block is not valid or we have reached the end.
-            # In any case, break here.
-            break
-        end
-    end
-    return missing
-end
-
-def cmake_parse_package(line)
-    _package='Could not find a package configuration file provided by'
-    match = line.match(/^\s+#{_package}\s+"(.+)"/)
-    if match and match.size > 1
-        return [match[1]]
-    end
-    return []
-end
-
-def cmake_parse_warning(line)
-  return [] unless line.include?('CMake Warning')
-  # Lines coming from MacroOptionalFindPackage (from old parsing).
-  return [] if line.include?('CMake Warning at /usr/share/kde4/apps/cmake/modules/MacroOptionalFindPackage.cmake')
-  # Lines coming from find_package (from old parsing).
-  return [] if line.match(/CMake Warning at [^ :]+:\d+ \(find_package\)/)
-  # Lines coming from warnings inside the actual CMakeLists.txt as those can be arbitrary.
-  # ref: "CMake Warning at src/worker/CMakeLists.txt:33 (message):"
-  return [] if line.match(/CMake Warning at [^ :]*CMakeLists.txt:\d+ \(message\)/)
-  return [] if line.start_with?('CMake Warning (dev)')
-  return [] if line.start_with?('CMake Warning:')
-  [line]
-end
-
 def puts_cmake(data, source_name)
-  data = segmentify(data, 'dh_auto_configure', 'dh_auto_build')
-  return if data.empty?
-
-  missing = []
-  warnings = []
-  until data.empty?
-    line = data.shift
-    if line.include?('The following OPTIONAL packages have not been found')
-      missing += cmake_parse_optional!(data)
-    elsif line.include?('Could not find a package configuration file provided by')
-      missing += cmake_parse_package(line)
-    elsif line.include?('CMake Warning')
-      warnings += cmake_parse_warning(line)
-    end
-  end
-
-  missing.uniq!
-  warnings.uniq!
+  # Bit of compat code. Very lovely... NOT
+  parser = CMakeParser(data)
+  missing = parser.missing
+  warnings = parser.warnings
+  disabled_features = parser.disabled_features
 
   puts 'KCI::CMAKE'
 
@@ -318,6 +256,10 @@ def puts_cmake(data, source_name)
   warnings.each do |warning|
     puts_warning(warning)
   end
+
+  disabled_features.each do |disabled_feature|
+    puts_warning("Disabled Feature: #{disabled_feature}")
+  end
 end
 
 def puts_list_missing(data)
diff --git a/lib/cmake_parser.rb b/lib/cmake_parser.rb
new file mode 100644
index 0000000..2e91510
--- /dev/null
+++ b/lib/cmake_parser.rb
@@ -0,0 +1,91 @@
+# Split a segment out of a build log by defining a start maker and an end marker
+module BuildLogSegmenter
+  module_function
+
+  def segmentify(data, start_marker, end_marker)
+    start_index = data.index(start_marker)
+    end_index = data.index(end_marker)
+    return [] unless start_index && end_index
+    data = data.slice(start_index..end_index).split("
")
+    data.shift # Ditch start line
+    data.pop # Ditch end line
+    data
+  end
+end
+
+# Parses CMake output
+class CMakeParser
+  include BuildLogSegmenter
+
+  attr_reader :warnings
+  attr_reader :missing
+  attr_reader :disabled_features
+
+  def initialize(data)
+    @data = segmentify(data, 'dh_auto_configure', 'dh_auto_build')
+    return if @data.empty?
+
+    @missing = []
+    @warnings = []
+    @disabled_features = []
+    until @data.empty?
+      line = @data.shift
+      if line.include?('The following OPTIONAL packages have not been found')
+        @missing += cmake_parse_summary(@data)
+      elsif line.include?('The following features have been disabled')
+        @disabled_features += cmake_parse_summary(@data)
+      elsif line.include?('Could not find a package configuration file provided by')
+        @missing += cmake_parse_package(line)
+      elsif line.include?('CMake Warning')
+        @warnings += cmake_parse_warning(line)
+      end
+    end
+    @missing.uniq!
+    @warnings.uniq!
+    @disabled_features.uniq!
+  end
+
+  def cmake_parse_summary(data)
+    missing = []
+    start_line = false
+    until data.empty?
+      line = data.shift
+      if !start_line && line.empty?
+        start_line = true
+        next
+      elsif start_line && !line.empty?
+        next if line.strip.empty?
+        match = line.match(/^ *\* (.*)$/)
+        missing << match[1] if match && match.size > 1
+      else
+        # Line is empty and the start conditions didn't match.
+        # Either the block is not valid or we have reached the end.
+        # In any case, break here.
+        break
+      end
+    end
+    missing
+  end
+
+  def cmake_parse_package(line)
+    package = 'Could not find a package configuration file provided by'
+    match = line.match(/^\s+#{package}\s+"(.+)"/)
+    return [] unless match && match.size > 1
+    [match[1]]
+  end
+
+  def cmake_parse_warning(line)
+    warn 'CMake Warning Parsing is disabled at this time!'
+    return [] unless line.include?('CMake Warning')
+    # Lines coming from MacroOptionalFindPackage (from old parsing).
+    return [] if line.include?('CMake Warning at /usr/share/kde4/apps/cmake/modules/MacroOptionalFindPackage.cmake')
+    # Lines coming from find_package (from old parsing).
+    return [] if line.match(/CMake Warning at [^ :]+:\d+ \(find_package\)/)
+    # Lines coming from warnings inside the actual CMakeLists.txt as those can
+    # be arbitrary.
+    # ref: "CMake Warning at src/worker/CMakeLists.txt:33 (message):"
+    return [] if line.match(/CMake Warning at [^ :]*CMakeLists.txt:\d+ \(message\)/)
+    return [] if line.start_with?('CMake Warning (dev)')
+    [] # if line.start_with?('CMake Warning:')] ALWAYS empty, too pointless
+  end
+end
diff --git a/test/test_cmake_parser.rb b/test/test_cmake_parser.rb
new file mode 100644
index 0000000..97a97ec
--- /dev/null
+++ b/test/test_cmake_parser.rb
@@ -0,0 +1,44 @@
+require 'test/unit'
+
+require_relative '../lib/cmake_parser'
+
+# Test CMakeParser
+class CMakeParserTest < Test::Unit::TestCase
+  def setup
+    @datadir = "#{File.expand_path(File.dirname(__FILE__))}/data/#{File.basename(__FILE__, '.rb')}"
+  end
+
+  def data
+    index = 0
+    caller = ''
+    until caller.start_with?('test_')
+      caller = caller_locations(index, 1)[0].label
+      index += 1
+    end
+    File.read("#{@datadir}/#{caller}")
+  end
+
+  def test_init
+    CMakeParser.new(data)
+  end
+
+  def test_missing_package
+    parser = CMakeParser.new(data)
+    assert_equal(parser.missing, %w(KF5Package))
+  end
+
+  def test_optional
+    parser = CMakeParser.new(data)
+    assert_equal(parser.missing, %w(Qt5TextToSpeech))
+  end
+
+  def test_warning
+    parser = CMakeParser.new(data)
+    assert_equal(parser.warnings, %w())
+  end
+
+  def test_disabled_feature
+    parser = CMakeParser.new(data)
+    assert_equal(parser.disabled_features, ['XCB-CURSOR , Required for XCursor support'])
+  end
+end

-- 
ci-tooling packaging



More information about the pkg-kde-commits mailing list