[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