[kde-doc-english] [releaseme/fix-documentation] /: initial support for multi-documention fetching

Harald Sitter sitter at kde.org
Fri Jan 23 13:16:40 UTC 2015


Git commit c9c64efcd530946e534761cc3aa5abfc557e2d2b by Harald Sitter.
Committed on 23/01/2015 at 09:56.
Pushed by sitter into branch 'fix-documentation'.

initial support for multi-documention fetching

this is where doc/ contains multiple dirs rather than a flat structure with
one index.docbook.

there are a number of restrictions on this
a) it's either or, you can't have both
b) multi-dir doc directories *MUST* use optional_add_subdir, this in
   particular is necessary because the CMakeLists will be replicated into
   translations as to allow the use of branching based on available cmake
   packages for example
c) a doc folder that is not in the source will also not be included from
   the translations (kinda obvious)
d) all subdirectories are auto-supplied with CMakeLists.txt

M  +74   -44   lib/documentation.rb
A  +0    -0    test/data/cmakeeditor/test_create_handbook_complex/de/doc1/index.docbook
A  +1    -0    test/data/cmakeeditor/test_create_handbook_complex/en_US/CMakeLists.txt
A  +0    -0    test/data/cmakeeditor/test_create_handbook_complex/en_US/doc1/index.docbook
A  +0    -0    test/data/cmakeeditor/test_create_handbook_complex/en_US/doc2/index.docbook
A  +0    -0    test/data/cmakeeditor/test_create_handbook_complex/fr/doc2/index.docbook
A  +0    -0    test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid1/index.docbook
A  +0    -0    test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/doc-valid2.1.1/index.docbook
A  +0    -0    test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/index.docbook
A  +0    -0    test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/index.docbook
A  +0    -0    test/data/multi-doc/CMakeLists.txt
M  +174  -89   test/test_cmakeeditor.rb
M  +53   -0    test/test_l10n.rb

http://commits.kde.org/releaseme/c9c64efcd530946e534761cc3aa5abfc557e2d2b

diff --git a/lib/documentation.rb b/lib/documentation.rb
index 12ebc71..7b55fd6 100644
--- a/lib/documentation.rb
+++ b/lib/documentation.rb
@@ -93,76 +93,106 @@ class DocumentationL10n < Source
     end
 
     def get(sourceDirectory)
-        previous_pwd = Dir.pwd
         dir = "#{Dir.pwd}/#{sourceDirectory}/doc"
         temp_dir = "#{Dir.pwd}/#{sourceDirectory}/l10n"
         Dir.mkdir(dir) unless File.exists?(dir)
 
         availableLanguages = vcs.cat("subdirs").split("\n")
-        docs = Array.new
-
-        # On git a layout doc/{file,file,file} may appear, in this case we move stuff
-        # to en_US.
-        # A more complicated case would be doc/{dir,dir}/{file,file} which can happen for
-        # multisource repos such as plasma-workspace.
-        # FIXME: multi-source documentation is not tested
-        #        need new data set with something like
-        #        doc/foo/index.docbook
-        #        doc/bar/index.docbook
-        #        doc/foobar/meow.txt
-        unless Dir.glob("#{dir}/**/index.docbook").empty? or File.exists?("#{dir}/en_US") then
-            files = Dir.glob("#{dir}/*").uniq
-            p files
-            Dir.mkdir("#{dir}/en_US")
-            FileUtils.mv(files, "#{dir}/en_US")
-            docs << "en_US" # We placed an en_US, make sure it is in the docs list.
+        docs = []
+
+        # On git a layout doc/{file,file,file} may appear, in this case we move
+        # stuff to en_US.
+        # A more complicated case would be doc/{dir,dir}/{file,file} which can
+        # happen for multisource repos such as plasma-workspace.
+        unless Dir.glob("#{dir}/**/index.docbook").empty? ||
+               File.exist?("#{dir}/en_US")
+          files = Dir.glob("#{dir}/*").uniq
+          Dir.mkdir("#{dir}/en_US")
+          FileUtils.mv(files, "#{dir}/en_US")
+          docs << 'en_US' # We created an en_US, make sure it is in the list.
         end
 
         # No documentation avilable -> leave me alone
-        if not File.exists?("#{dir}/en_US") then
-            puts("There is no en_US documentation :(")
-            puts("Leave me alone :(")
-            return
+        unless File.exist?("#{dir}/en_US")
+          puts 'There is no en_US documentation :('
+          puts 'Leave me alone :('
+          return
         end
 
         CMakeEditor::create_language_specific_doc_lists!("#{dir}/en_US", "en_US", project_name)
-        for language in availableLanguages
+        availableLanguages.each do |language|
+          p language
             language.chomp!
             next if language == "x-test" or language == "en_US"
 
             puts "Downloading #{language} documentation translations for #{sourceDirectory}"
-
             FileUtils.rm_rf(temp_dir)
-            vcs.get(temp_dir, vcs_l10n_path(language))
-            unless FileTest.exists?("#{temp_dir}/index.docbook") # without index the translation is not worth butter
-                puts '  no valid documentation translation found, skipping.'
-                next
+
+            doc_dirs = Dir.chdir("#{dir}/en_US") do
+              Dir.glob("*").select { |f| File.directory?(f) }
             end
 
             dest_dir = "#{dir}/#{language}"
-            puts("Copying #{language}'s #{@project_name} documentation over...")
-            FileUtils.mv(temp_dir, dest_dir)
+            done = false
+
+            puts "  Trying to copy..."
+            if !doc_dirs.empty?
+              # FIXME: recyle for single-get?
+              # FIXME: check cmake file for add_subdir that are not optional and warn if there are any
+              vcs.get(temp_dir, "#{language}/docs/#{@i18n_path}")
+              not_translated_doc_dirs = doc_dirs.clone
+              doc_selection = Dir.glob("#{temp_dir}/*").select do |d|
+                basename = File.basename(d)
+                if doc_dirs.include?(basename)
+                  not_translated_doc_dirs.delete(basename)
+                  next true
+                end
+                next false
+              end
+              p not_translated_doc_dirs
+              p doc_selection
+              if doc_selection.empty?
+                next
+              end
+              Dir.mkdir(dest_dir) # Important otherwise first copy is dir itself...
+              doc_selection.each do |d|
+                FileUtils.mv(d, dest_dir, verbose: true)
+              end
+              puts `ls -lah #{dest_dir}`
+              CMakeEditor::create_language_specific_doc_lists!(dest_dir, language, project_name)
+              docs += [language]
+              done = true
+            end
+            unless done
+              # FIXME this also needs to act as fallback
+              puts vcs.get(temp_dir, vcs_l10n_path(language))
+              unless FileTest.exists?("#{temp_dir}/index.docbook") # without index the translation is not worth butter
+                puts '  no valid documentation translation found, skipping.'
+                next
+              end
 
-            CMakeEditor::create_language_specific_doc_lists!("#{dir}/#{language}", language, project_name)
+              FileUtils.mv(temp_dir, dest_dir)
 
-            # add to SVN in case we are tagging
-            # FIXME: direct svn access
-            `svn add #{dir}/#{language}/CMakeLists.txt`
-            docs += [language]
+              CMakeEditor.create_language_specific_doc_lists!("#{dir}/#{language}", language, project_name)
+
+              # add to SVN in case we are tagging
+              # FIXME: direct svn access
+              `svn add #{dir}/#{language}/CMakeLists.txt`
+              docs += [language]
+            end
 
-            puts( "done.\n" )
+            puts 'done.'
+            puts
         end
 
-        if not docs.empty?
-            CMakeEditor::create_doc_meta_lists!(dir)
-            CMakeEditor::append_optional_add_subdirectory!(sourceDirectory, 'doc')
+        if !docs.empty?
+          CMakeEditor.create_doc_meta_lists!(dir)
+          CMakeEditor.append_optional_add_subdirectory!(sourceDirectory, 'doc')
         else
-            puts "no docs found :'<"
-            FileUtils::rm_rf(dir)
+          puts 'no docs found !!!'
+          FileUtils.rm_rf(dir)
         end
 
-        FileUtils::rm_rf(temp_dir)
-    ensure
-        Dir.chdir(previous_pwd)
+        FileUtils.rm_rf(temp_dir)
     end
 end
diff --git a/test/data/cmakeeditor/test_create_handbook_complex/de/doc1/index.docbook b/test/data/cmakeeditor/test_create_handbook_complex/de/doc1/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/cmakeeditor/test_create_handbook_complex/en_US/CMakeLists.txt b/test/data/cmakeeditor/test_create_handbook_complex/en_US/CMakeLists.txt
new file mode 100644
index 0000000..821cc64
--- /dev/null
+++ b/test/data/cmakeeditor/test_create_handbook_complex/en_US/CMakeLists.txt
@@ -0,0 +1 @@
+ecm_optional_add_subdirectory(doc1)
diff --git a/test/data/cmakeeditor/test_create_handbook_complex/en_US/doc1/index.docbook b/test/data/cmakeeditor/test_create_handbook_complex/en_US/doc1/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/cmakeeditor/test_create_handbook_complex/en_US/doc2/index.docbook b/test/data/cmakeeditor/test_create_handbook_complex/en_US/doc2/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/cmakeeditor/test_create_handbook_complex/fr/doc2/index.docbook b/test/data/cmakeeditor/test_create_handbook_complex/fr/doc2/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid1/index.docbook b/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid1/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/doc-valid2.1.1/index.docbook b/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/doc-valid2.1.1/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/index.docbook b/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/doc-valid2.1/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/index.docbook b/test/data/l10nrepo/trunk/l10n-kf5/de/docs/kde-workspace/doc-valid2/index.docbook
new file mode 100644
index 0000000..e69de29
diff --git a/test/data/multi-doc/CMakeLists.txt b/test/data/multi-doc/CMakeLists.txt
new file mode 100644
index 0000000..e69de29
diff --git a/test/test_cmakeeditor.rb b/test/test_cmakeeditor.rb
index c0d9dbc..c28baac 100644
--- a/test/test_cmakeeditor.rb
+++ b/test/test_cmakeeditor.rb
@@ -25,104 +25,189 @@ require_relative "lib/testme"
 require_relative "../lib/cmakeeditor"
 
 class TestCMakeEditor < Testme
-    attr_accessor :dir
-    attr_accessor :file
-    attr_accessor :lang
-
-    def setup
-        @dir = Dir.pwd + "/tmp_cmakeeditor_" + (0...16).map{ ('a'..'z').to_a[rand(26)] }.join
-        Dir.mkdir(@dir)
-        @file = @dir + "/CMakeLists.txt"
-        @lang = 'xx'
-    end
+  attr_accessor :dir
+  attr_accessor :file
+  attr_accessor :lang
 
-    def teardown
-        FileUtils.rm_rf(@dir)
-    end
+  def setup
+    @dir = Dir.pwd + "/tmp_cmakeeditor_" + (0...16).map{ ('a'..'z').to_a[rand(26)] }.join
+    Dir.mkdir(@dir)
+    @file = @dir + "/CMakeLists.txt"
+    @lang = 'xx'
+  end
 
-    def assert_has_terminal_newline(data)
-        assert(data.end_with?("\n"))
-    end
+  def teardown
+    FileUtils.rm_rf(@dir)
+  end
 
-    def test_create_language_specific_handbook_lists
-        # Internally create attempts to find the most meaningful creation which
-        # involves checking whether the doc dir even is valid and possibly
-        # refusing to write anything when not, so make the doc dir the least bit
-        # valid by creating index.docbook.
-        FileUtils.touch('index.docbook')
-        CMakeEditor::create_language_specific_doc_lists!(dir, lang, "yolo")
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(data.downcase.include?('kdoctools_create_handbook(index.docbook install_destination ${html_install_dir}/xx subdir yolo)'))
-        assert_has_terminal_newline(data)
-    end
+  def assert_has_terminal_newline(data)
+    assert(data.end_with?("\n"))
+  end
 
-    def test_create_doc_meta_lists
-        Dir.mkdir("#{dir}/aa")
-        Dir.mkdir("#{dir}/bb")
-        Dir.mkdir("#{dir}/cc")
-        CMakeEditor::create_doc_meta_lists!(dir)
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(!data.downcase.include?("find_package(gettext")) # PO-only!
-        assert(data.downcase.include?("add_subdirectory(aa)"))
-        assert(data.downcase.include?("add_subdirectory(bb)"))
-        assert(data.downcase.include?("add_subdirectory(cc)"))
-        assert_has_terminal_newline(data)
-    end
+  def assert_valid_kdoctools(file)
+    p file
+    parts = file.split('/')
+    language = parts.first
+    dir = parts[-2]
+    expected_line = CMakeEditor.create_handbook(language, dir)
+    assert_equal(expected_line, File.read(file))
+  end
 
-    def create_cmakelists!
-        f = File.new(@file, File::CREAT | File::RDWR | File::TRUNC)
-        f << "#FOO_SUBDIR\n"
-        f.close
+  def assert_equal_valid_meta_cmakelists(dir, file = 'CMakeLists.txt')
+    Dir.chdir(dir) do
+      dirs = Dir.glob('*').select { |f| File.directory?(f) }
+      # FIXME: this again a variation of assert unordered nonesense lists
+      # see below
+      expected_subdirs = []
+      dirs.each do |d|
+        expected_subdirs << CMakeEditor.add_subdirectory(d).strip
+      end
+      present_subdirs = File.read(file).split($RS)
+      missing_subdirs = []
+      expected_subdirs.each do |f|
+        missing_subdirs << f unless present_subdirs.include?(f)
+        present_subdirs.delete(f)
+      end
+      assert(missing_subdirs.empty?, "missing dir(S): #{missing_subdirs}")
+      assert(present_subdirs.empty?, "unexpected dir(s): #{present_subdirs}")
     end
+  end
 
-    def test_append_po_install_instructions_append
-        create_cmakelists!
-        CMakeEditor::append_po_install_instructions!(dir, 'po')
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(data.include?("#FOO_SUBDIR\n"))
-        assert(data.include?("ki18n_install(po)"))
-        assert_has_terminal_newline(data)
-        # Make sure the editor doesn't append if it is already there...
-        CMakeEditor::append_po_install_instructions!(dir, 'po')
-        data = File.read(file)
-        assert(data.scan('ki18n_install(po)').count == 1)
+  def test_create_handbook_complex
+    # tmpdir now conflicts with testme...
+    FileUtils.rm_rf(@dir)
+    origin_dir = "#{@datadir}/cmakeeditor/#{__method__}"
+    FileUtils.cp_r(Dir.glob("#{origin_dir}/*"), '.', verbose: true)
+    %w(en_US de fr).each do |lang|
+      CMakeEditor.create_language_specific_doc_lists!("#{Dir.pwd}/#{lang}", lang, 'yolo')
     end
-
-    def test_append_po_install_instructions_substitute
-        create_cmakelists!
-        CMakeEditor::append_po_install_instructions!(dir, 'foo')
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(!data.include?("#FOO_SUBDIR\n"))
-        assert(data.include?("ki18n_install(foo)"))
-        assert_has_terminal_newline(data)
+    # FIXME: put in testme as assert_files_exist
+    expected_files = %w(
+      CMakeLists.txt
+      fr
+      fr/CMakeLists.txt
+      fr/doc2
+      fr/doc2/CMakeLists.txt
+      fr/doc2/index.docbook
+      en_US
+      en_US/CMakeLists.txt
+      en_US/doc1
+      en_US/doc1/CMakeLists.txt
+      en_US/doc1/index.docbook
+      en_US/doc2
+      en_US/doc2/CMakeLists.txt
+      en_US/doc2/index.docbook
+      de
+      de/CMakeLists.txt
+      de/doc1
+      de/doc1/CMakeLists.txt
+      de/doc1/index.docbook
+    )
+    present_files = Dir.glob('**/**')
+    missing_files = []
+    expected_files.each do |f|
+      missing_files << f unless present_files.include?(f)
+      present_files.delete(f)
     end
+    assert(missing_files.empty?, "missing file(S): #{missing_files}")
+    assert(present_files.empty?, "unexpected file(s): #{present_files}")
+    assert_equal_valid_meta_cmakelists('.')
+    assert_equal(File.read('en_US/CMakeLists.txt'),
+                 File.read('fr/CMakeLists.txt'))
+    assert_valid_kdoctools('fr/doc2/CMakeLists.txt')
+    assert_valid_kdoctools('en_US/doc1/CMakeLists.txt')
+    assert_valid_kdoctools('en_US/doc2/CMakeLists.txt')
+    assert_equal(File.read('en_US/CMakeLists.txt'),
+                 File.read('de/CMakeLists.txt'))
+    assert_valid_kdoctools('de/doc1/CMakeLists.txt')
+  end
 
-    def test_append_optional_add_subdirectory_append
-        create_cmakelists!
-        CMakeEditor::append_optional_add_subdirectory!(dir, 'append')
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(data.include?("#FOO_SUBDIR\n"))
-        assert(data.include?("add_subdirectory(append)"))
-        assert_has_terminal_newline(data)
-        # Make sure the editor doesn't append if it is already there...
-        CMakeEditor::append_optional_add_subdirectory!(dir, 'po')
-        data = File.read(file)
-        assert(data.scan('add_subdirectory(append)').count == 1)
-    end
+  def test_create_language_specific_handbook_lists
+    # Internally create attempts to find the most meaningful creation which
+    # involves checking whether the doc dir even is valid and possibly
+    # refusing to write anything when not, so make the doc dir the least bit
+    # valid by creating index.docbook.
+    FileUtils.touch("#{dir}/index.docbook")
+    CMakeEditor.create_language_specific_doc_lists!(dir, lang, 'yolo')
+    assert(File.exist?(file))
+    data = File.read(file)
+    assert_equal(CMakeEditor.create_handbook(lang, 'yolo'), data)
+    assert_has_terminal_newline(data)
+  end
 
-    def test_append_optional_add_subdirectory_substitute
-        create_cmakelists!
-        CMakeEditor::append_optional_add_subdirectory!(dir, 'foo')
-        assert(File::exists?(file))
-        data = File.read(file)
-        assert(!data.include?("#FOO_SUBDIR\n"))
-        assert(data.include?("ECMOptionalAddSubdirectory"))
-        assert(data.include?("ecm_optional_add_subdirectory(foo"))
-        assert_has_terminal_newline(data)
-    end
+  def test_create_handbook_uses_basename
+    lang = 'fr'
+    with_path = CMakeEditor.create_handbook(lang, '/tmp/kittens')
+    with_name = CMakeEditor.create_handbook(lang, 'kittens')
+    assert_equal(with_path, with_name)
+  end
+
+  def test_create_doc_meta_lists
+    Dir.mkdir("#{dir}/aa")
+    Dir.mkdir("#{dir}/bb")
+    Dir.mkdir("#{dir}/cc")
+    CMakeEditor.create_doc_meta_lists!(dir)
+    assert(File.exist?(file))
+    data = File.read(file)
+    assert(!data.downcase.include?("find_package(gettext")) # PO-only!
+    assert(data.downcase.include?("add_subdirectory(aa)"))
+    assert(data.downcase.include?("add_subdirectory(bb)"))
+    assert(data.downcase.include?("add_subdirectory(cc)"))
+    assert_has_terminal_newline(data)
+  end
+
+  def create_cmakelists!
+    f = File.new(@file, File::CREAT | File::RDWR | File::TRUNC)
+    f << "#FOO_SUBDIR\n"
+    f.close
+  end
+
+  def test_append_po_install_instructions_append
+    create_cmakelists!
+    CMakeEditor::append_po_install_instructions!(dir, 'po')
+    assert(File::exists?(file))
+    data = File.read(file)
+    assert(data.include?("#FOO_SUBDIR\n"))
+    assert(data.include?("ki18n_install(po)"))
+    assert_has_terminal_newline(data)
+    # Make sure the editor doesn't append if it is already there...
+    CMakeEditor::append_po_install_instructions!(dir, 'po')
+    data = File.read(file)
+    assert(data.scan('ki18n_install(po)').count == 1)
+  end
+
+  def test_append_po_install_instructions_substitute
+    create_cmakelists!
+    CMakeEditor::append_po_install_instructions!(dir, 'foo')
+    assert(File::exists?(file))
+    data = File.read(file)
+    assert(!data.include?("#FOO_SUBDIR\n"))
+    assert(data.include?("ki18n_install(foo)"))
+    assert_has_terminal_newline(data)
+  end
+
+  def test_append_optional_add_subdirectory_append
+    create_cmakelists!
+    CMakeEditor::append_optional_add_subdirectory!(dir, 'append')
+    assert(File::exists?(file))
+    data = File.read(file)
+    assert(data.include?("#FOO_SUBDIR\n"))
+    assert(data.include?("add_subdirectory(append)"))
+    assert_has_terminal_newline(data)
+    # Make sure the editor doesn't append if it is already there...
+    CMakeEditor::append_optional_add_subdirectory!(dir, 'po')
+    data = File.read(file)
+    assert(data.scan('add_subdirectory(append)').count == 1)
+  end
+
+  def test_append_optional_add_subdirectory_substitute
+    create_cmakelists!
+    CMakeEditor::append_optional_add_subdirectory!(dir, 'foo')
+    assert(File::exists?(file))
+    data = File.read(file)
+    assert(!data.include?("#FOO_SUBDIR\n"))
+    assert(data.include?("ECMOptionalAddSubdirectory"))
+    assert(data.include?("ecm_optional_add_subdirectory(foo"))
+    assert_has_terminal_newline(data)
+  end
 end
diff --git a/test/test_l10n.rb b/test/test_l10n.rb
index 5a5eabe..2cdfdd6 100644
--- a/test/test_l10n.rb
+++ b/test/test_l10n.rb
@@ -154,4 +154,57 @@ class TestL10n < Testme
         assert(!File::exists?("#{@dir}/doc/de/index.docbook"))
         assert(!File::exists?("#{@dir}/doc/de/CMakeLists.txt"))
     end
+
+    def test_get_doc_multi_doc
+      d = DocumentationL10n.new(DocumentationL10n::TRUNK, "plasma-desktop", 'kde-workspace')
+      d.initRepoUrl("file://#{Dir.pwd}/#{@svnTemplateDir}")
+      FileUtils.rm_rf(@dir)
+      FileUtils.cp_r(data("multi-doc"), @dir)
+      d.get(@dir)
+      # fr mustn't appear, it's empty
+      # FIXME: I am actually not sure CMakeLists ought to be generated
+      # recursively through 2->2.1->2.1.1 at all.
+      expected_files = %w(
+        CMakeLists.txt
+        en_US
+        en_US/CMakeLists.txt
+        en_US/doc-valid2
+        en_US/doc-valid2/CMakeLists.txt
+        en_US/doc-valid2/index.docbook
+        en_US/doc-valid2/doc-valid2.1
+        en_US/doc-valid2/doc-valid2.1/CMakeLists.txt
+        en_US/doc-valid2/doc-valid2.1/index.docbook
+        en_US/doc-valid2/doc-valid2.1/doc-valid2.1.1
+        en_US/doc-valid2/doc-valid2.1/doc-valid2.1.1/CMakeLists.txt
+        en_US/doc-valid2/doc-valid2.1/doc-valid2.1.1/index.docbook
+        en_US/doc-invalid1
+        en_US/doc-valid1
+        en_US/doc-valid1/CMakeLists.txt
+        en_US/doc-valid1/index.docbook
+        de
+        de/CMakeLists.txt
+        de/doc-valid2
+        de/doc-valid2/CMakeLists.txt
+        de/doc-valid2/index.docbook
+        de/doc-valid2/doc-valid2.1
+        de/doc-valid2/doc-valid2.1/CMakeLists.txt
+        de/doc-valid2/doc-valid2.1/index.docbook
+        de/doc-valid2/doc-valid2.1/doc-valid2.1.1
+        de/doc-valid2/doc-valid2.1/doc-valid2.1.1/CMakeLists.txt
+        de/doc-valid2/doc-valid2.1/doc-valid2.1.1/index.docbook
+        de/doc-valid1
+        de/doc-valid1/CMakeLists.txt
+        de/doc-valid1/index.docbook
+      )
+      present_files = Dir.chdir("#{@dir}/doc/") { Dir.glob('**/**') }
+      missing_files = []
+      expected_files.each do |f|
+        missing_files << f unless present_files.include?(f)
+        present_files.delete(f)
+      end
+      assert(missing_files.empty?, "missing file(S): #{missing_files}")
+      assert(present_files.empty?, "unexpected file(s): #{present_files}")
+
+      # FIXME: check contents?
+    end
 end



More information about the kde-doc-english mailing list