From 94dcdd65a89aa7a5880ec4decb5310c6fd3c0e5e Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Fri, 3 Jan 2020 16:45:35 +0100 Subject: [PATCH 01/10] WIP testing doc pipeline --- Documentation/doc/CMakeLists.txt | 2 +- .../doc/scripts/compare_testsuites.sh | 2 +- .../doc/scripts/documentation_parser.py | 40 ++++++++++--------- .../doc/scripts/generate_how_to_cite.py | 4 +- .../scripts/html_output_post_processing.py | 2 +- Documentation/doc/scripts/process_doc.sh | 2 +- Documentation/doc/scripts/testsuite.py | 2 +- 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index 81c78f42f15..a5a71672903 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -25,7 +25,7 @@ else() endif() find_package(Doxygen) -find_package(PythonInterp 2.6.7) +find_package(PythonInterp 3.5) if(NOT DOXYGEN_FOUND) message(WARNING "Cannot build the documentation without Doxygen!") diff --git a/Documentation/doc/scripts/compare_testsuites.sh b/Documentation/doc/scripts/compare_testsuites.sh index 1c5a594ce1b..0181e8166cc 100644 --- a/Documentation/doc/scripts/compare_testsuites.sh +++ b/Documentation/doc/scripts/compare_testsuites.sh @@ -28,7 +28,7 @@ FAILURES=() for dir in $PATH_TO_DOC/* do OUTPUT=$(basename $dir) - python ../documentation_parser.py $dir/xml > ./"$OUTPUT.txt" + python3 ../documentation_parser.py $dir/xml > ./"$OUTPUT.txt" if [ $? -eq 0 ]; then echo "$dir OK" else diff --git a/Documentation/doc/scripts/documentation_parser.py b/Documentation/doc/scripts/documentation_parser.py index 187b175bf4f..337070326b7 100644 --- a/Documentation/doc/scripts/documentation_parser.py +++ b/Documentation/doc/scripts/documentation_parser.py @@ -2,6 +2,7 @@ from pyquery import PyQuery as pq from collections import defaultdict from sys import argv import os.path as op +import codecs # if _in is part of args, return true. def check_type(_in, args): @@ -12,17 +13,17 @@ def check_type(_in, args): root_path=argv[1] d = pq(filename=op.join(op.sep, root_path,'index.xml'), parser="xml") -compounds=[p.text() for p in d('compound').items()] -types=[p.attr('kind') for p in d('compound').items()] +compounds=[p.text() for p in list(d('compound').items())] +types=[p.attr('kind') for p in list(d('compound').items())] type_map = defaultdict(list) #map dict_map = defaultdict(dict)#map > #FOREACH compounds : fill maps -for i in xrange(0,len(compounds)): +for i in range(0,len(compounds)): if check_type(types[i], "typedef"): types[i]="type" name=d('compound').children("name").eq(i).text() - members=[p.text() for p in d('compound').eq(i).children("member").items()] - m_types=[p.attr('kind') for p in d('compound').eq(i).children("member").items()] + members=[p.text() for p in list(d('compound').eq(i).children("member").items())] + m_types=[p.attr('kind') for p in list(d('compound').eq(i).children("member").items())] if (not check_type(types[i], ['example', 'file', 'dir', 'page', 'group']) and not (types[i] == "namespace" and len(members) == 0) and not (types[i] == "enum" and len(members) == 0) ): @@ -31,8 +32,9 @@ for i in xrange(0,len(compounds)): filepath='class'+compound+'.xml' total_path=op.join(op.sep, root_path,filepath) if(op.isfile(total_path)): - e = pq(filename=total_path, parser="xml") - compoundnames=[p.text() for p in e('includes').items()] + file_content = codecs.open(total_path, 'r', encoding='utf-8') + e = pq(file_content, parser="xml") + compoundnames=[p.text() for p in list(e('includes').items())] if(len(compoundnames) > 1 and compoundnames[0].find("Concept") != -1): types[i] = 'Concept '+types[i].lower() @@ -41,7 +43,7 @@ for i in xrange(0,len(compounds)): mtype_map = defaultdict(list)# map #FOREACH member : - for j in xrange(0,len(members)): + for j in range(0,len(members)): if(check_type(types[i], ['class', 'Concept class']) and m_types[j] == "function"): m_types[j]="method" @@ -62,7 +64,7 @@ for btype in type_map: out=btype if btype.endswith('s'): out+='e' - print out.title()+'s' + print(out.title()+'s') indent+=" " #FOREACH name for name in type_map[btype]: @@ -74,7 +76,7 @@ for btype in type_map: templates=[] if op.isfile(op.join(op.sep, root_path,filepath)): f=pq(filename=op.join(op.sep, root_path,filepath), parser="xml") - templateparams=f("compounddef").children("templateparamlist").eq(0).children("param").items() + templateparams=list(f("compounddef").children("templateparamlist").eq(0).children("param").items()) for param in templateparams: template_type="" template_name="" @@ -91,7 +93,7 @@ for btype in type_map: complete_template+=' = '+template_defval templates.append(complete_template) if templates==[]:#if no child was found, just take param.text() - templates=[t.text() for t in param.items()] + templates=[t.text() for t in list(param.items())] suffix="<" #as template got type, defname and declname, name is twice in template. keep only one of them. to_remove=[""] @@ -101,7 +103,7 @@ for btype in type_map: suffix="" if suffix.endswith(', '): suffix = suffix[:-2]+'>' - print indent+name+suffix + print(indent+name+suffix) indent+=" " #FOREACH mtype @@ -109,7 +111,7 @@ for btype in type_map: out=mtype if mtype.endswith('s'): out+='e' - print indent+out.title()+'s' + print(indent+out.title()+'s') indent+=" " #FOREACH member overload_map = defaultdict(int) #contains the number of times a member has appeared (to manage the overloads) @@ -123,16 +125,16 @@ for btype in type_map: if op.isfile(op.join(op.sep, root_path,filepath)): f=pq(filename=op.join(op.sep, root_path,filepath), parser="xml") index=0 - memberdefs=[m.text() for m in f("memberdef").items()] - for i in xrange(0,len(memberdefs)): - member_names=[member_name.text() for member_name in f('memberdef').eq(i).children("name").items()] + memberdefs=[m.text() for m in list(f("memberdef").items())] + for i in range(0,len(memberdefs)): + member_names=[member_name.text() for member_name in list(f('memberdef').eq(i).children("name").items())] if f('memberdef').eq(i).children("name").text() == member: if (index < overload_map[member]): index+=1 elif (index == overload_map[member]): if check_type(mtype, ['function', 'method']): args=[f('memberdef').eq(i).children("argsstring").text()] - templateparams=f('memberdef').eq(i).children("templateparamlist").children("param").items() + templateparams=list(f('memberdef').eq(i).children("templateparamlist").children("param").items()) if check_type(mtype, ['function', 'method', 'type', 'variable']): return_type=[f('memberdef').eq(i).children("type").text()] break; @@ -158,7 +160,7 @@ for btype in type_map: complete_template+=' = '+template_defval templates.append(complete_template) if templates==[]:#if no child was found, just take param.text() - templates=[t.text() for t in param.items()] + templates=[t.text() for t in list(param.items())] prefix="template <" for template in templates: @@ -171,7 +173,7 @@ for btype in type_map: prefix+=definition if(prefix != ""): prefix+=" " - print indent+prefix+member+arguments + print(indent+prefix+member+arguments) overload_map[member]+=1 #END foreach member indent=indent[:-2] diff --git a/Documentation/doc/scripts/generate_how_to_cite.py b/Documentation/doc/scripts/generate_how_to_cite.py index caad53d6392..c5faae7a5ba 100644 --- a/Documentation/doc/scripts/generate_how_to_cite.py +++ b/Documentation/doc/scripts/generate_how_to_cite.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # coding: utf8 import re @@ -157,7 +157,7 @@ def protect_upper_case(title): return title.replace("dD","{dD}").replace("2D","{2D}").replace("3D","{3D}").replace("CGAL","{CGAL}").replace("Qt","{Qt}").replace("Boost","{Boost}") def protect_accentuated_letters(authors): - res=authors.replace(u"é",r"{\'e}").replace(u"è",r"{\`e}").replace(u"É",r"{\'E}").replace(u"ä",r"{\"a}").replace(u"ö",r"{\"o}").replace(u"ñ",r"{\~n}").replace(u"ã",r"{\~a}").replace(u"ë",r"{\"e}").replace(u"ı",r"{\i}").replace(u"Ş",r"{\c{S}}").replace(u"ş",r"{\c{s}}").replace("%","") + res=authors.replace("é",r"{\'e}").replace("è",r"{\`e}").replace("É",r"{\'E}").replace("ä",r"{\"a}").replace("ö",r"{\"o}").replace("ñ",r"{\~n}").replace("ã",r"{\~a}").replace("ë",r"{\"e}").replace("ı",r"{\i}").replace("Ş",r"{\c{S}}").replace("ş",r"{\c{s}}").replace("%","") try: res.encode('ascii') except UnicodeEncodeError: diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index 30d59dbc772..b7a097383f4 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -62,7 +62,7 @@ def write_out_html(d, fn): f.close() def package_glob(target): - return filter(lambda x: not os.path.join(os.path.join('.','Manual'),'') in x, glob.glob(target)) + return [x for x in glob.glob(target) if not os.path.join(os.path.join('.','Manual'),'') in x] # remove duplicate files def clean_doc(): diff --git a/Documentation/doc/scripts/process_doc.sh b/Documentation/doc/scripts/process_doc.sh index 0b9d2e2be89..f7f442fe6f5 100644 --- a/Documentation/doc/scripts/process_doc.sh +++ b/Documentation/doc/scripts/process_doc.sh @@ -45,7 +45,7 @@ mv diff.txt diff2.txt #update overview CGAL_NAME=$(cat cgal_version) -python ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_4/doc_output/ --output-dir2 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_4/doc_log/ \ +python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_4/doc_output/ --output-dir2 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_4/doc_log/ \ --doc-log-dir2 $PWD/doc_1_8_13/doc_log/ --doc-log-dir-master $PWD/doc_master/doc_log/ \ --publish $PUBLISH_DIR --diff1 $PWD/diff1.txt --diff2 $PWD/diff2.txt --master-dir $PWD/doc_master/doc_output/ \ --cgal-version "$CGAL_NAME" --do-copy-results --version-to-keep 10 --doxygen-version1 "$DOXYGEN_1" --doxygen-version2 "$DOXYGEN_2" --master-describe "$MASTER_DESCRIBE" diff --git a/Documentation/doc/scripts/testsuite.py b/Documentation/doc/scripts/testsuite.py index 1fda305b1e0..b1c70b65b39 100755 --- a/Documentation/doc/scripts/testsuite.py +++ b/Documentation/doc/scripts/testsuite.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright (c) 2012 GeometryFactory (France). All rights reserved. # All rights reserved. # From 7373cafb7de999e4b8bca4515f8623058e011dcf Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Mon, 6 Jan 2020 16:49:08 +0100 Subject: [PATCH 02/10] keep WIPing --- .../scripts/html_output_post_processing.py | 25 +++++++++++++------ .../doc/scripts/test_doxygen_versions.sh | 5 +++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index b7a097383f4..29fda4bde8f 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -127,7 +127,8 @@ def re_replace_first_in_file(pat, s_after, fname): def is_concept_file(filename): if not path.exists(filename): return False; - d = pq(filename=filename, parser='html', encoding='utf-8') + file_content = codecs.open(filename, 'r', encoding='utf-8') + d = pq(file_content, parser="html") ident = d('#CGALConcept') return ident.size() == 1 @@ -185,7 +186,9 @@ def automagically_number_figures(): #collect the list of packages in the package overview page, #respecting the order of that page all_packages=[] - d = pq(filename="./Manual/packages.html", parser='html', encoding='utf-8') + file_content = codecs.open("./Manual/packages.html", 'r', encoding='utf-8') + d = pq(file_content, parser="html") + for el in d('a.elRef'): text = pq(el).attr('href') if text.find("index.html")!=-1: @@ -205,14 +208,16 @@ def automagically_number_figures(): all_pkg_files.remove(userman) for fname in [userman]+all_pkg_files: infos=figure_anchor_info(pkg_id, global_anchor_map) - d = pq(filename=fname, parser='html', encoding='utf-8') + file_content = codecs.open(fname, 'r', encoding='utf-8') + d = pq(file_content, parser="html") d('a.anchor').each( lambda i: collect_figure_anchors(i,infos) ) pkg_id+=1 #Figure link dev Manual for fname in glob.glob("Manual/*.html"): infos=figure_anchor_info(0, global_anchor_map) - d = pq(filename=fname, parser='html', encoding='utf-8') + file_content = codecs.open(fname, 'r', encoding='utf-8') + d = pq(file_content, parser="html") d('a.anchor').each( lambda i: collect_figure_anchors(i,infos) ) #replace each link to a figure by its unique id @@ -222,7 +227,8 @@ def automagically_number_figures(): with codecs.open(fname, encoding='utf-8') as f: if not any(re.search("fig__", line) for line in f): continue # pattern does not occur in file so we are done. - d = pq(filename=fname, parser='html', encoding='utf-8') + file_content = codecs.open(fname, 'r', encoding='utf-8') + d = pq(file_content, parser="html") d('a.el').each( lambda i: update_figure_ref(i,global_anchor_map) ) d('a.elRef').each( lambda i: update_figure_ref(i,global_anchor_map) ) write_out_html(d, fname) @@ -256,7 +262,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') re_replace_in_file("N", "N", fn) re_replace_in_file("C", "C", fn) dir_name=path.dirname(fn) - d = pq(filename=fn, parser='html', encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") tr_tags = d('table.directory tr img') tr_tags.each(lambda i: rearrange_img(i, dir_name)) span_tags = d('table.directory tr span') @@ -265,7 +272,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') class_files=list(package_glob('./*/class*.html')) class_files.extend(package_glob('./*/struct*.html')) for fn in class_files: - d = pq(filename=fn, parser='html', encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") ident = d('#CGALConcept') if ident.size() == 1: conceptify(d); @@ -279,7 +287,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') namespace_files=package_glob('./*/namespace*.html') for fn in namespace_files: - d = pq(filename=fn, parser='html', encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") ident = d('#CGALConceptNS') if ident.size() == 1: conceptify_ns(d); diff --git a/Documentation/doc/scripts/test_doxygen_versions.sh b/Documentation/doc/scripts/test_doxygen_versions.sh index e65e0546140..a5f55d3a194 100644 --- a/Documentation/doc/scripts/test_doxygen_versions.sh +++ b/Documentation/doc/scripts/test_doxygen_versions.sh @@ -94,7 +94,9 @@ echo "done." #add post-processing cd ./build_doc echo "Adding postprocessing..." -make -j$NB_CORES doc_with_postprocessing &> /dev/null + +make -j$NB_CORES doc_with_postprocessing #& > /dev/null + echo "done." cd .. #scripts mv ./build_doc/* $BUILD_DIR_2 @@ -126,6 +128,7 @@ if [ "$HAS_REF" -ne "1" ]; then CGAL_NAME="$(cat $ROOT/VERSION)" cd $ROOT/doc/scripts fi + echo "CGAL_NAME = $CGAL_NAME" echo "$CGAL_NAME">cgal_version else echo "There is already a reference. Not re-building." From 991a1d1b207dbb1fa32f48dcfa55c8c1e05c0928 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 7 Jan 2020 13:23:46 +0100 Subject: [PATCH 03/10] Fix last python script for documentation --- .../doc/scripts/html_output_post_processing.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index 29fda4bde8f..602e16d00df 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -56,7 +56,8 @@ def write_out_html(d, fn): # this is the normal doxygen doctype, which is thrown away by pyquery f.write('\n') f.write('') - f.write(d.html()) + if d.html() is not None: + f.write(d.html()) f.write('\n') f.write('\n') f.close() @@ -298,14 +299,16 @@ removes some unneeded files, and performs minor repair on some glitches.''') # in a group we only need to change the nested-classes group_files=package_glob('./*/group*Concepts*.html') for fn in group_files: - d = pq(filename=fn, parser='html',encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") conceptify_nested_classes(d) write_out_html(d, fn) # fix up Files files_files=package_glob('./*/files.html') for fn in files_files: - d = pq(filename=fn, parser='html',encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") table = d("table.directory") row_id=table("td.entry").filter(lambda i: pq(this).text() == 'Concepts').parent().attr('id') if row_id != None: @@ -334,7 +337,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') relationship_pages.extend(package_glob('./*/generalizes.html')) relationship_pages.extend(package_glob('./*/refines.html')) for fn in relationship_pages: - d = pq(filename=fn, parser='html',encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") dts=d(".textblock .reflist dt") # no contents() on pyquery, do it the hard way # Note that in the following regular expression, the Struct did not appear in doxygen version 1.8.3 @@ -346,7 +350,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') # throw out nav-sync all_pages=glob.glob('./*/*.html') for fn in all_pages: - d = pq(filename=fn, parser='html',encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") d('#nav-sync').hide() # TODO count figures write_out_html(d, fn) @@ -369,7 +374,8 @@ removes some unneeded files, and performs minor repair on some glitches.''') # remove class name in Definition section if there is no default template # parameter documented for fn in class_and_struct_files: - d = pq(filename=fn, parser='html',encoding='utf-8') + file_content = codecs.open(fn, 'r', encoding='utf-8') + d = pq(file_content, parser="html") for el in d('h3'): text = pq(el).text() if text[0:9]=="template<" and text.find('=')==-1: From b48fd2d1b9cf1798ab0f5cc03e26652b8885ffdc Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 7 Jan 2020 14:29:46 +0100 Subject: [PATCH 04/10] clean-up --- Documentation/doc/scripts/test_doxygen_versions.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Documentation/doc/scripts/test_doxygen_versions.sh b/Documentation/doc/scripts/test_doxygen_versions.sh index a5f55d3a194..fc2bb5f7e42 100644 --- a/Documentation/doc/scripts/test_doxygen_versions.sh +++ b/Documentation/doc/scripts/test_doxygen_versions.sh @@ -95,7 +95,7 @@ echo "done." cd ./build_doc echo "Adding postprocessing..." -make -j$NB_CORES doc_with_postprocessing #& > /dev/null +make -j$NB_CORES doc_with_postprocessing & > /dev/null echo "done." cd .. #scripts @@ -128,7 +128,6 @@ if [ "$HAS_REF" -ne "1" ]; then CGAL_NAME="$(cat $ROOT/VERSION)" cd $ROOT/doc/scripts fi - echo "CGAL_NAME = $CGAL_NAME" echo "$CGAL_NAME">cgal_version else echo "There is already a reference. Not re-building." From 949428b64394d6f7589fd119fe3bf7cefceed1ad Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Fri, 2 Oct 2020 15:21:19 +0200 Subject: [PATCH 05/10] Fix pyquery usage, and update html to new versions --- .../scripts/html_output_post_processing.py | 27 ++++++++++--------- Documentation/doc/scripts/process_doc.sh | 26 ++++++++++-------- Documentation/doc/scripts/testsuite.py | 10 +++---- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/Documentation/doc/scripts/html_output_post_processing.py b/Documentation/doc/scripts/html_output_post_processing.py index 602e16d00df..eb44e68a265 100755 --- a/Documentation/doc/scripts/html_output_post_processing.py +++ b/Documentation/doc/scripts/html_output_post_processing.py @@ -129,7 +129,7 @@ def is_concept_file(filename): if not path.exists(filename): return False; file_content = codecs.open(filename, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(),parser="html") ident = d('#CGALConcept') return ident.size() == 1 @@ -187,8 +187,9 @@ def automagically_number_figures(): #collect the list of packages in the package overview page, #respecting the order of that page all_packages=[] + file_content = codecs.open("./Manual/packages.html", 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(),parser="html") for el in d('a.elRef'): text = pq(el).attr('href') @@ -210,7 +211,7 @@ def automagically_number_figures(): for fname in [userman]+all_pkg_files: infos=figure_anchor_info(pkg_id, global_anchor_map) file_content = codecs.open(fname, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") d('a.anchor').each( lambda i: collect_figure_anchors(i,infos) ) pkg_id+=1 @@ -218,7 +219,7 @@ def automagically_number_figures(): for fname in glob.glob("Manual/*.html"): infos=figure_anchor_info(0, global_anchor_map) file_content = codecs.open(fname, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(),parser="html") d('a.anchor').each( lambda i: collect_figure_anchors(i,infos) ) #replace each link to a figure by its unique id @@ -229,7 +230,7 @@ def automagically_number_figures(): if not any(re.search("fig__", line) for line in f): continue # pattern does not occur in file so we are done. file_content = codecs.open(fname, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") d('a.el').each( lambda i: update_figure_ref(i,global_anchor_map) ) d('a.elRef').each( lambda i: update_figure_ref(i,global_anchor_map) ) write_out_html(d, fname) @@ -264,7 +265,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') re_replace_in_file("C", "C", fn) dir_name=path.dirname(fn) file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") tr_tags = d('table.directory tr img') tr_tags.each(lambda i: rearrange_img(i, dir_name)) span_tags = d('table.directory tr span') @@ -274,7 +275,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') class_files.extend(package_glob('./*/struct*.html')) for fn in class_files: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") ident = d('#CGALConcept') if ident.size() == 1: conceptify(d); @@ -289,7 +290,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') namespace_files=package_glob('./*/namespace*.html') for fn in namespace_files: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") ident = d('#CGALConceptNS') if ident.size() == 1: conceptify_ns(d); @@ -300,7 +301,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') group_files=package_glob('./*/group*Concepts*.html') for fn in group_files: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") conceptify_nested_classes(d) write_out_html(d, fn) @@ -308,7 +309,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') files_files=package_glob('./*/files.html') for fn in files_files: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") table = d("table.directory") row_id=table("td.entry").filter(lambda i: pq(this).text() == 'Concepts').parent().attr('id') if row_id != None: @@ -338,7 +339,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') relationship_pages.extend(package_glob('./*/refines.html')) for fn in relationship_pages: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") dts=d(".textblock .reflist dt") # no contents() on pyquery, do it the hard way # Note that in the following regular expression, the Struct did not appear in doxygen version 1.8.3 @@ -351,7 +352,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') all_pages=glob.glob('./*/*.html') for fn in all_pages: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") d('#nav-sync').hide() # TODO count figures write_out_html(d, fn) @@ -375,7 +376,7 @@ removes some unneeded files, and performs minor repair on some glitches.''') # parameter documented for fn in class_and_struct_files: file_content = codecs.open(fn, 'r', encoding='utf-8') - d = pq(file_content, parser="html") + d = pq(file_content.read(), parser="html") for el in d('h3'): text = pq(el).text() if text[0:9]=="template<" and text.find('=')==-1: diff --git a/Documentation/doc/scripts/process_doc.sh b/Documentation/doc/scripts/process_doc.sh index f7f442fe6f5..5e043378461 100644 --- a/Documentation/doc/scripts/process_doc.sh +++ b/Documentation/doc/scripts/process_doc.sh @@ -7,16 +7,16 @@ if [ "$1" == '--help' ]; then exit 0 fi -mkdir -p doc_1_8_4 +mkdir -p doc_1_8_18 mkdir -p doc_1_8_13 mkdir -p doc_master -PATH_TO_1_8_4="$1" -PATH_TO_1_8_13="$2" +PATH_TO_1_8_13="$1" +PATH_TO_1_8_18="$2" PUBLISH_DIR="$3" -DOXYGEN_1=$($PATH_TO_1_8_4 --version) -DOXYGEN_2=$($PATH_TO_1_8_13 --version) +DOXYGEN_1=$($PATH_TO_1_8_13 --version) +DOXYGEN_2=$($PATH_TO_1_8_18 --version) ####################################### @@ -35,22 +35,26 @@ cd ../.. #scripts PATH_TO_MASTER="$PWD/doxygen_master/build/bin/doxygen" echo "done." -echo "comparing versions 1.8.4 and 1.8.13" -bash -$- test_doxygen_versions.sh $PATH_TO_1_8_4 $PATH_TO_1_8_13 $PWD/doc_1_8_4 $PWD/doc_1_8_13 $PUBLISH_DIR +echo "comparing versions 1.8.18 and 1.8.13" +bash -$- test_doxygen_versions.sh $PATH_TO_1_8_13 $PATH_TO_1_8_18 $PWD/doc_1_8_13 $PWD/doc_1_8_18 $PUBLISH_DIR +if [ ! -d $PWD/doc_1_8_18/doc_log ]; then + echo "NO DOC LOGS." + exit 1 +fi mv diff.txt diff1.txt -echo "comparing versions 1.8.4 and master" -bash -$- test_doxygen_versions.sh $PATH_TO_1_8_4 $PATH_TO_MASTER $PWD/doc_1_8_4 $PWD/doc_master $PUBLISH_DIR +echo "comparing versions 1.8.13 and master" +bash -$- test_doxygen_versions.sh $PATH_TO_1_8_13 $PATH_TO_MASTER $PWD/doc_1_8_13 $PWD/doc_master $PUBLISH_DIR mv diff.txt diff2.txt #update overview CGAL_NAME=$(cat cgal_version) -python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_4/doc_output/ --output-dir2 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_4/doc_log/ \ +python3 ${PWD}/testsuite.py --output-dir2 $PWD/doc_1_8_18/doc_output/ --output-dir1 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_18/doc_log/ \ --doc-log-dir2 $PWD/doc_1_8_13/doc_log/ --doc-log-dir-master $PWD/doc_master/doc_log/ \ --publish $PUBLISH_DIR --diff1 $PWD/diff1.txt --diff2 $PWD/diff2.txt --master-dir $PWD/doc_master/doc_output/ \ --cgal-version "$CGAL_NAME" --do-copy-results --version-to-keep 10 --doxygen-version1 "$DOXYGEN_1" --doxygen-version2 "$DOXYGEN_2" --master-describe "$MASTER_DESCRIBE" #clean-up -rm -rf ./doc_1_8_4 ./doc_1_8_13 ./doc_master ./doxygen_master +rm -rf ./doc_1_8_18 ./doc_1_8_13 ./doc_master ./doxygen_master rm ./diff1.txt ./diff2.txt ./cgal_version diff --git a/Documentation/doc/scripts/testsuite.py b/Documentation/doc/scripts/testsuite.py index b1c70b65b39..12c4a4ef186 100755 --- a/Documentation/doc/scripts/testsuite.py +++ b/Documentation/doc/scripts/testsuite.py @@ -71,7 +71,7 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;}

Doxygen Manual Results

''' page_footer=''' - + @@ -85,16 +85,16 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;}
Doxygen 1.8.4Doxygen 1.8.13(official)Doxygen master
Doxygen 1.8.13(official)Doxygen 1.8.18Doxygen master
Package Name Logs Errors
''' - + if args.publish and args.do_copy_results: suffix='' if args.doxygen_version1: suffix = ""+args.doxygen_version1 - link1="Documentation built with our fork of Doxygen {_suffix}\n".format(_suffix=suffix) + link1="Documentation built with our fork of Doxygen {_suffix} (used for the official CGAL documentation)\n".format(_suffix=suffix) suffix = '' if args.doxygen_version2: suffix = args.doxygen_version2 - link2="\n
Documentation built with our fork of Doxygen {_suffix} (used for the official CGAL documentation)\n".format(_suffix=suffix) + link2="\n
Documentation built with Doxygen {_suffix}\n".format(_suffix=suffix) suffix = '' if args.master_describe: suffix=args.master_describe @@ -258,7 +258,7 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;} Manual Testsuite Overview

Overviewpage of the Doxygen Manual Testsuite

- +
Doxygen 1.8.4Doxygen 1.8.13Doxygen master
Doxygen 1.8.13Doxygen 1.8.18Doxygen master
RevisionDateWarnings ErrorsWarnings ErrorsWarnings Errors Diff with doxygen masterDiff with doxygen 1.8.13
''') From 6baa27c7eb3a7a6d69c3be8d1c7c1a95d5a8d244 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Tue, 31 Aug 2021 10:17:07 +0200 Subject: [PATCH 06/10] Fix documentation_parser.py --- Documentation/doc/scripts/documentation_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/scripts/documentation_parser.py b/Documentation/doc/scripts/documentation_parser.py index 69b256ecaa2..f1b02b8adfa 100644 --- a/Documentation/doc/scripts/documentation_parser.py +++ b/Documentation/doc/scripts/documentation_parser.py @@ -35,7 +35,7 @@ for i in range(0,len(compounds)): total_path=op.join(op.sep, root_path,filepath) if(op.isfile(total_path)): file_content = codecs.open(total_path, 'r', encoding='utf-8') - e = pq(file_content, parser="xml") + e = pq(file_content.read(), parser="xml") compoundnames=[p.text() for p in list(e('includes').items())] if(len(compoundnames) > 1 and compoundnames[0].find("Concept") != -1): From 3cf9007f5b0f7e712311f0efe3e6852e4bd9a68f Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Wed, 1 Sep 2021 09:14:39 +0200 Subject: [PATCH 07/10] Fix xml decoding --- Documentation/doc/scripts/documentation_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Documentation/doc/scripts/documentation_parser.py b/Documentation/doc/scripts/documentation_parser.py index f1b02b8adfa..ce117b098db 100644 --- a/Documentation/doc/scripts/documentation_parser.py +++ b/Documentation/doc/scripts/documentation_parser.py @@ -34,7 +34,7 @@ for i in range(0,len(compounds)): filepath='class'+compound+'.xml' total_path=op.join(op.sep, root_path,filepath) if(op.isfile(total_path)): - file_content = codecs.open(total_path, 'r', encoding='utf-8') + file_content = codecs.open(total_path, 'rb') e = pq(file_content.read(), parser="xml") compoundnames=[p.text() for p in list(e('includes').items())] From 713467e952cd05e3ec619866b8334e24be6adf35 Mon Sep 17 00:00:00 2001 From: Maxime Gimeno Date: Fri, 3 Sep 2021 10:31:15 +0200 Subject: [PATCH 08/10] revert Doxygen changes --- Documentation/doc/scripts/process_doc.sh | 26 +++++++++---------- .../doc/scripts/test_doxygen_versions.sh | 2 +- Documentation/doc/scripts/testsuite.py | 8 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Documentation/doc/scripts/process_doc.sh b/Documentation/doc/scripts/process_doc.sh index fb8fb8b0830..32584596f8a 100644 --- a/Documentation/doc/scripts/process_doc.sh +++ b/Documentation/doc/scripts/process_doc.sh @@ -7,16 +7,16 @@ if [ "$1" == '--help' ]; then exit 0 fi -mkdir -p doc_1_8_18 +mkdir -p doc_1_8_4 mkdir -p doc_1_8_13 mkdir -p doc_master -PATH_TO_1_8_13="$1" -PATH_TO_1_8_18="$2" +PATH_TO_1_8_4="$1" +PATH_TO_1_8_13="$2" PUBLISH_DIR="$3" -DOXYGEN_1=$($PATH_TO_1_8_13 --version) -DOXYGEN_2=$($PATH_TO_1_8_18 --version) +DOXYGEN_1=$($PATH_TO_1_8_4 --version) +DOXYGEN_2=$($PATH_TO_1_8_13 --version) DO_COMPARE=TRUE PATH_TO_SCRIPTS=${PWD} @@ -52,17 +52,17 @@ cd $PATH_TO_SCRIPTS #scripts PATH_TO_MASTER="$PWD/doxygen_master/build/bin/doxygen" echo "done." -echo "comparing versions 1.8.18 and 1.8.13" -bash -$- test_doxygen_versions.sh $PATH_TO_1_8_13 $PATH_TO_1_8_18 $PWD/doc_1_8_13 $PWD/doc_1_8_18 $PUBLISH_DIR -if [ ! -d $PWD/doc_1_8_18/doc_log ]; then +echo "comparing versions 1.8.4 and 1.8.13" +bash -$- test_doxygen_versions.sh $PATH_TO_1_8_4 $PATH_TO_1_8_13 $PWD/doc_1_8_4 $PWD/doc_1_8_13 $PUBLISH_DIR +if [ ! -d $PWD/doc_1_8_13/doc_log ]; then echo "NO DOC LOGS." exit 1 fi mv diff.txt diff1.txt -echo "comparing versions 1.8.13 and master" +echo "comparing versions 1.8.4 and master" if [ "$DO_COMPARE" = "TRUE" ]; then - bash -$- test_doxygen_versions.sh $PATH_TO_1_8_13 $PATH_TO_MASTER $PWD/doc_1_8_13 $PWD/doc_master $PUBLISH_DIR + bash -$- test_doxygen_versions.sh $PATH_TO_1_8_4 $PATH_TO_MASTER $PWD/doc_1_8_4 $PWD/doc_master $PUBLISH_DIR fi if [ $? -ne 0 ] || [ "$DO_COMPARE" = "FALSE" ]; then DO_COMPARE=FALSE @@ -80,13 +80,13 @@ if [ "$DO_COMPARE" = "TRUE" ]; then --cgal-version "$CGAL_NAME" --do-copy-results --version-to-keep 10 --doxygen-version1 "$DOXYGEN_1" --doxygen-version2 "$DOXYGEN_2" --master-describe "$MASTER_DESCRIBE" else echo "NO MASTER" - python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_13/doc_output/ --output-dir2 $PWD/doc_1_8_18/doc_output/ --doc-log-dir1 $PWD/doc_1_8_13/doc_log/ \ - --doc-log-dir2 $PWD/doc_1_8_18/doc_log/ --doc-log-dir-master $PWD/doc_master/ \ + python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_4/doc_output/ --output-dir2 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_4/doc_log/ \ + --doc-log-dir2 $PWD/doc_1_8_13/doc_log/ --doc-log-dir-master $PWD/doc_master/ \ --publish $PUBLISH_DIR --diff1 $PWD/diff1.txt \ --cgal-version "$CGAL_NAME" --do-copy-results --version-to-keep 10 --doxygen-version1 "$DOXYGEN_1" --doxygen-version2 "$DOXYGEN_2" fi #clean-up -rm -rf ./doc_1_8_18 ./doc_1_8_13 ./doc_master #./doxygen_master +rm -rf ./doc_1_8_4 ./doc_1_8_13 ./doc_master #./doxygen_master rm ./diff1.txt ./cgal_version if [ -f ./diff2.txt ]; then rm ./diff2.txt diff --git a/Documentation/doc/scripts/test_doxygen_versions.sh b/Documentation/doc/scripts/test_doxygen_versions.sh index f19f7730eda..f8c3ec31ab9 100644 --- a/Documentation/doc/scripts/test_doxygen_versions.sh +++ b/Documentation/doc/scripts/test_doxygen_versions.sh @@ -94,7 +94,7 @@ echo "done." #add post-processing cd ./build_doc echo "Adding postprocessing..." -make -j$NB_CORES doc_with_postprocessing & >> ./build_logs +make -j$NB_CORES doc_with_postprocessing &>> ./build_logs echo "done." cd .. #scripts mv ./build_doc/* $BUILD_DIR_2 diff --git a/Documentation/doc/scripts/testsuite.py b/Documentation/doc/scripts/testsuite.py index bf4bc370723..89819f1e591 100755 --- a/Documentation/doc/scripts/testsuite.py +++ b/Documentation/doc/scripts/testsuite.py @@ -74,7 +74,7 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;}

Doxygen Manual Results

''' page_footer=''' - + @@ -93,11 +93,11 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;} suffix='' if args.doxygen_version1: suffix = ""+args.doxygen_version1 - link1="Documentation built with our fork of Doxygen {_suffix} (used for the official CGAL documentation)\n".format(_suffix=suffix) + link1="Documentation built with our fork of Doxygen {_suffix}\n".format(_suffix=suffix) suffix = '' if args.doxygen_version2: suffix = args.doxygen_version2 - link2="\n
Documentation built with Doxygen {_suffix}\n".format(_suffix=suffix) + link2="\n
Documentation built with our fork of Doxygen {_suffix} (used for the official CGAL documentation)\n".format(_suffix=suffix) suffix = '' if args.master_describe: suffix=args.master_describe @@ -267,7 +267,7 @@ body {color: black; background-color: #C0C0D0; font-family: sans-serif;} Manual Testsuite Overview

Overviewpage of the Doxygen Manual Testsuite

Doxygen 1.8.13(official)Doxygen 1.8.18Doxygen master
Doxygen 1.8.4Doxygen 1.8.13(official)Doxygen master
Package Name Logs
- +
Doxygen 1.8.13Doxygen 1.8.18Doxygen master
Doxygen 1.8.4Doxygen 1.8.13Doxygen master
RevisionDateWarnings ErrorsWarnings ErrorsWarnings Errors Diff with doxygen masterDiff with doxygen 1.8.13
''') From c83057a7dc0418851e89b59d790570aef5fa50f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Tue, 21 Sep 2021 14:40:45 +0200 Subject: [PATCH 09/10] use new way to find python3 since cmake 3.12 and do not use old python path --- Documentation/doc/CMakeLists.txt | 16 ++++++++-------- Scripts/developer_scripts/run_doxygen_testsuite | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Documentation/doc/CMakeLists.txt b/Documentation/doc/CMakeLists.txt index 1caabcdddcc..e069d2eb4e8 100644 --- a/Documentation/doc/CMakeLists.txt +++ b/Documentation/doc/CMakeLists.txt @@ -27,7 +27,7 @@ else() endif() find_package(Doxygen) -find_package(PythonInterp 3.5) +find_package(Python3 COMPONENTS Interpreter) if(NOT DOXYGEN_FOUND) message(WARNING "Cannot build the documentation without Doxygen!") @@ -322,9 +322,9 @@ endif() set(CGAL_DOC_VERSION ${CGAL_CREATED_VERSION_NUM}) ## generate how_to_cite files -if(PYTHONINTERP_FOUND) +if(Python3_Interpreter_FOUND) execute_process( - COMMAND ${PYTHON_EXECUTABLE} ${CGAL_DOC_SCRIPT_DIR}/generate_how_to_cite.py + COMMAND ${Python3_EXECUTABLE} ${CGAL_DOC_SCRIPT_DIR}/generate_how_to_cite.py ${CGAL_ROOT} ${CMAKE_BINARY_DIR} "${CGAL_BRANCH_BUILD}" RESULT_VARIABLE GENERATE_HOW_TO_CITE_RESULT) if(NOT GENERATE_HOW_TO_CITE_RESULT EQUAL "0") @@ -436,25 +436,25 @@ add_dependencies(Documentation_copy_doc_tags doc_pre) #total level doc dependencies add_dependencies(doc doc_post) -if(PYTHONINTERP_FOUND) +if(Python3_Interpreter_FOUND) set(CGAL_DOC_TESTSUITE_SCRIPT "${CGAL_DOC_SCRIPT_DIR}/testsuite.py") add_custom_target( doc_with_postprocessing - ${PYTHON_EXECUTABLE} ${CGAL_DOC_SCRIPT_DIR}/html_output_post_processing.py + ${Python3_EXECUTABLE} ${CGAL_DOC_SCRIPT_DIR}/html_output_post_processing.py --output ${CGAL_DOC_OUTPUT_DIR} --resources ${CGAL_DOC_RESOURCE_DIR}) add_dependencies(doc_with_postprocessing doc) if(CGAL_DOC_CREATE_LOGS) add_custom_target( Documentation_test - ${PYTHON_EXECUTABLE} ${CGAL_DOC_TESTSUITE_SCRIPT} --output-dir + ${Python3_EXECUTABLE} ${CGAL_DOC_TESTSUITE_SCRIPT} --output-dir ${CGAL_DOC_OUTPUT_DIR} --doc-log-dir ${CGAL_DOC_LOG_DIR}) add_dependencies(Documentation_test doc) add_custom_target( Documentation_test_publish - ${PYTHON_EXECUTABLE} + ${Python3_EXECUTABLE} ${CGAL_DOC_TESTSUITE_SCRIPT} --output-dir ${CGAL_DOC_OUTPUT_DIR} @@ -467,7 +467,7 @@ if(PYTHONINTERP_FOUND) add_custom_target( doc_and_publish_testsuite - ${PYTHON_EXECUTABLE} + ${Python3_EXECUTABLE} ${CGAL_DOC_TESTSUITE_SCRIPT} --output-dir ${CGAL_DOC_OUTPUT_DIR} diff --git a/Scripts/developer_scripts/run_doxygen_testsuite b/Scripts/developer_scripts/run_doxygen_testsuite index 62e1a5d2eeb..a796d4dfde5 100755 --- a/Scripts/developer_scripts/run_doxygen_testsuite +++ b/Scripts/developer_scripts/run_doxygen_testsuite @@ -58,8 +58,6 @@ if [ ! -d "${CGAL_DOC_BUILD}/${CGAL_RELEASE_ID}" ]; then fi cd "${CGAL_RELEASE_ID}" -PYTHONPATH=/home/cgal-testsuite/.local/lib/python2.6/site-packages -export PYTHONPATH PATH=/home/cgal-testsuite/local/bin:$PATH export PATH cd "$PWD/doc/scripts" From 72c3607780472ba00681a24981eb1577a0ee5d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loriot?= Date: Wed, 22 Sep 2021 09:34:37 +0200 Subject: [PATCH 10/10] undo version change --- Documentation/doc/scripts/process_doc.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Documentation/doc/scripts/process_doc.sh b/Documentation/doc/scripts/process_doc.sh index 32584596f8a..a41940ee2fd 100644 --- a/Documentation/doc/scripts/process_doc.sh +++ b/Documentation/doc/scripts/process_doc.sh @@ -74,8 +74,8 @@ fi #update overview CGAL_NAME=$(cat cgal_version) if [ "$DO_COMPARE" = "TRUE" ]; then - python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_13/doc_output/ --output-dir2 $PWD/doc_1_8_18/doc_output/ --doc-log-dir1 $PWD/doc_1_8_13/doc_log/ \ - --doc-log-dir2 $PWD/doc_1_8_18/doc_log/ --doc-log-dir-master $PWD/doc_master/doc_log/ \ + python3 ${PWD}/testsuite.py --output-dir1 $PWD/doc_1_8_4/doc_output/ --output-dir2 $PWD/doc_1_8_13/doc_output/ --doc-log-dir1 $PWD/doc_1_8_4/doc_log/ \ + --doc-log-dir2 $PWD/doc_1_8_13/doc_log/ --doc-log-dir-master $PWD/doc_master/doc_log/ \ --publish $PUBLISH_DIR --diff1 $PWD/diff1.txt --diff2 $PWD/diff2.txt --master-dir $PWD/doc_master/doc_output/ \ --cgal-version "$CGAL_NAME" --do-copy-results --version-to-keep 10 --doxygen-version1 "$DOXYGEN_1" --doxygen-version2 "$DOXYGEN_2" --master-describe "$MASTER_DESCRIBE" else