- Fix Non-reproducible file names in doxygen output
- Fix broken markdown links to anchors Related: RHEL-58045
This commit is contained in:
		
							parent
							
								
									e54c668cbc
								
							
						
					
					
						commit
						56f4c37ab0
					
				| @ -0,0 +1,403 @@ | |||||||
|  | commit 040cdc3acd4d417df447199eefb4af08fbbe6907 | ||||||
|  | Author: Dimitri van Heesch <doxygen@gmail.com> | ||||||
|  | Date:   Fri Sep 20 21:10:32 2024 +0200 | ||||||
|  | 
 | ||||||
|  |     issue #11138 Non-reproducible file names in doxygen output | ||||||
|  | 
 | ||||||
|  | diff --git a/src/doxygen.cpp b/src/doxygen.cpp
 | ||||||
|  | index add2af755..124b5fda4 100644
 | ||||||
|  | --- a/src/doxygen.cpp
 | ||||||
|  | +++ b/src/doxygen.cpp
 | ||||||
|  | @@ -1547,6 +1547,7 @@ static void processTagLessClasses(const ClassDef *rootCd,
 | ||||||
|  |      MemberList *ml = cd->getMemberList(MemberListType::PubAttribs()); | ||||||
|  |      if (ml) | ||||||
|  |      { | ||||||
|  | +      int pos=0;
 | ||||||
|  |        for (const auto &md : *ml) | ||||||
|  |        { | ||||||
|  |          QCString type = md->typeString(); | ||||||
|  | @@ -1559,7 +1560,7 @@ static void processTagLessClasses(const ClassDef *rootCd,
 | ||||||
|  |              if (type.find(icd->name())!=-1) // matching tag less struct/union | ||||||
|  |              { | ||||||
|  |                QCString name = md->name(); | ||||||
|  | -              if (md->isAnonymous()) name = "__unnamed" + name.right(name.length()-1)+"__";
 | ||||||
|  | +              if (md->isAnonymous()) name = "__unnamed" + QCString().setNum(pos++)+"__";
 | ||||||
|  |                if (!prefix.isEmpty()) name.prepend(prefix+"."); | ||||||
|  |                //printf("    found %s for class %s\n",qPrint(name),qPrint(cd->name())); | ||||||
|  |                ClassDefMutable *ncd = createTagLessInstance(rootCd,icd,name); | ||||||
|  | @@ -8837,7 +8838,7 @@ static void generateDocsForClassList(const std::vector<ClassDefMutable*> &classL
 | ||||||
|  |          auto ctx = std::make_shared<DocContext>(cd,*g_outputList); | ||||||
|  |          auto processFile = [ctx]() | ||||||
|  |          { | ||||||
|  | -          msg("Generating docs for compound %s...\n",qPrint(ctx->cd->name()));
 | ||||||
|  | +          msg("Generating docs for compound %s...\n",qPrint(ctx->cd->displayName()));
 | ||||||
|  |   | ||||||
|  |            // skip external references, anonymous compounds and | ||||||
|  |            // template instances | ||||||
|  | @@ -8875,7 +8876,7 @@ static void generateDocsForClassList(const std::vector<ClassDefMutable*> &classL
 | ||||||
|  |          if ( !cd->isHidden() && !cd->isEmbeddedInOuterScope() && | ||||||
|  |                cd->isLinkableInProject() && cd->templateMaster()==nullptr) | ||||||
|  |          { | ||||||
|  | -          msg("Generating docs for compound %s...\n",qPrint(cd->name()));
 | ||||||
|  | +          msg("Generating docs for compound %s...\n",qPrint(cd->displayName()));
 | ||||||
|  |   | ||||||
|  |            cd->writeDocumentation(*g_outputList); | ||||||
|  |            cd->writeMemberList(*g_outputList); | ||||||
|  | @@ -8943,7 +8944,7 @@ static void generateConceptDocs()
 | ||||||
|  |          ) && !cd->isHidden() && cd->isLinkableInProject() | ||||||
|  |         ) | ||||||
|  |      { | ||||||
|  | -      msg("Generating docs for concept %s...\n",qPrint(cd->name()));
 | ||||||
|  | +      msg("Generating docs for concept %s...\n",qPrint(cd->displayName()));
 | ||||||
|  |        cd->writeDocumentation(*g_outputList); | ||||||
|  |      } | ||||||
|  |    } | ||||||
|  | @@ -9912,7 +9913,7 @@ static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
 | ||||||
|  |                && !ctx->cdm->isHidden() && !ctx->cdm->isEmbeddedInOuterScope() | ||||||
|  |               ) | ||||||
|  |            { | ||||||
|  | -            msg("Generating docs for compound %s...\n",qPrint(ctx->cdm->name()));
 | ||||||
|  | +            msg("Generating docs for compound %s...\n",qPrint(ctx->cdm->displayName()));
 | ||||||
|  |              ctx->cdm->writeDocumentation(ctx->ol); | ||||||
|  |              ctx->cdm->writeMemberList(ctx->ol); | ||||||
|  |            } | ||||||
|  | @@ -9943,7 +9944,7 @@ static void generateNamespaceClassDocs(const ClassLinkedRefMap &classList)
 | ||||||
|  |              && !cd->isHidden() && !cd->isEmbeddedInOuterScope() | ||||||
|  |             ) | ||||||
|  |          { | ||||||
|  | -          msg("Generating docs for compound %s...\n",qPrint(cd->name()));
 | ||||||
|  | +          msg("Generating docs for compound %s...\n",qPrint(cd->displayName()));
 | ||||||
|  |   | ||||||
|  |            cdm->writeDocumentation(*g_outputList); | ||||||
|  |            cdm->writeMemberList(*g_outputList); | ||||||
|  | @@ -9982,7 +9983,7 @@ static void generateNamespaceDocs()
 | ||||||
|  |        NamespaceDefMutable *ndm = toNamespaceDefMutable(nd.get()); | ||||||
|  |        if (ndm) | ||||||
|  |        { | ||||||
|  | -        msg("Generating docs for namespace %s\n",qPrint(nd->name()));
 | ||||||
|  | +        msg("Generating docs for namespace %s\n",qPrint(nd->displayName()));
 | ||||||
|  |          ndm->writeDocumentation(*g_outputList); | ||||||
|  |        } | ||||||
|  |      } | ||||||
|  | diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
 | ||||||
|  | index 0582fc983..dd0fb6839 100644
 | ||||||
|  | --- a/src/namespacedef.cpp
 | ||||||
|  | +++ b/src/namespacedef.cpp
 | ||||||
|  | @@ -44,6 +44,10 @@ static QCString makeDisplayName(const NamespaceDef *nd,bool includeScope)
 | ||||||
|  |    { | ||||||
|  |      result = substitute(result,"::",sep); | ||||||
|  |    } | ||||||
|  | +  if (nd->isAnonymous())
 | ||||||
|  | +  {
 | ||||||
|  | +    result = removeAnonymousScopes(result);
 | ||||||
|  | +  }
 | ||||||
|  |    //printf("makeDisplayName() %s->%s lang=%d\n",qPrint(name()),qPrint(result),lang); | ||||||
|  |    return result; | ||||||
|  |  } | ||||||
|  | diff --git a/src/scanner.l b/src/scanner.l
 | ||||||
|  | index 35850404e..2a2c45b3e 100644
 | ||||||
|  | --- a/src/scanner.l
 | ||||||
|  | +++ b/src/scanner.l
 | ||||||
|  | @@ -33,7 +33,6 @@ typedef yyguts_t *yyscan_t;
 | ||||||
|  |  #include <algorithm> | ||||||
|  |  #include <vector> | ||||||
|  |  #include <utility> | ||||||
|  | -#include <atomic>
 | ||||||
|  |  #include <cstdint> | ||||||
|  |  #include <cstdio> | ||||||
|  |  #include <cstdlib> | ||||||
|  | @@ -61,9 +60,6 @@ typedef yyguts_t *yyscan_t;
 | ||||||
|  |  #define YY_NO_INPUT 1 | ||||||
|  |  #define YY_NO_UNISTD_H 1 | ||||||
|  |   | ||||||
|  | -static AtomicInt  anonCount;
 | ||||||
|  | -static AtomicInt  anonNSCount;
 | ||||||
|  | -
 | ||||||
|  |  struct scannerYY_state | ||||||
|  |  { | ||||||
|  |    OutlineParserInterface *thisParser; | ||||||
|  | @@ -213,6 +209,9 @@ struct scannerYY_state
 | ||||||
|  |   | ||||||
|  |    int              fakeNS  = 0; //<! number of file scoped namespaces in CSharp file | ||||||
|  |    TextStream       dummyTextStream; | ||||||
|  | +
 | ||||||
|  | +  int              anonCount = 0;
 | ||||||
|  | +  int              anonNSCount = 0;
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  [[maybe_unused]] static const char *stateToString(int state); | ||||||
|  | @@ -247,6 +246,7 @@ static void storeClangId(yyscan_t yyscanner,const char *id);
 | ||||||
|  |  static void startVerbatimBlock(yyscan_t yyscanner,const QCString &blockName,size_t fencedSize=0); | ||||||
|  |  static bool endVerbatimBlock(yyscan_t yyscanner,const QCString &blockName,size_t fencedSize=0); | ||||||
|  |   | ||||||
|  | +
 | ||||||
|  |  /* ----------------------------------------------------------------- */ | ||||||
|  |  #undef  YY_INPUT | ||||||
|  |  #define YY_INPUT(buf,result,max_size) result=yyread(yyscanner,buf,max_size); | ||||||
|  | @@ -4354,7 +4354,7 @@ NONLopt [^\n]*
 | ||||||
|  |                                            BEGIN(MemberSpecSkip); | ||||||
|  |                                          } | ||||||
|  |  <TypedefName>";"                        { /* typedef of anonymous type */ | ||||||
|  | -                                          yyextra->current->name.sprintf("@%d",anonCount++);
 | ||||||
|  | +                                          yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
 | ||||||
|  |                                            if (yyextra->current->section.isEnum() || yyextra->current->spec.isEnum()) | ||||||
|  |                                            { | ||||||
|  |                                              yyextra->current->program << ','; // add field terminator | ||||||
|  | @@ -4429,7 +4429,7 @@ NONLopt [^\n]*
 | ||||||
|  |                                                  { | ||||||
|  |                                                    // anonymous compound yyextra->inside -> insert dummy variable name | ||||||
|  |                                                    //printf("Adding anonymous variable for scope %s\n",qPrint(p->name)); | ||||||
|  | -                                                  yyextra->msName.sprintf("@%d",anonCount++);
 | ||||||
|  | +                                                  yyextra->msName = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
 | ||||||
|  |                                                    break; | ||||||
|  |                                                  } | ||||||
|  |                                                } | ||||||
|  | @@ -6339,12 +6339,12 @@ NONLopt [^\n]*
 | ||||||
|  |                                                } | ||||||
|  |                                                else // use invisible name | ||||||
|  |                                                { | ||||||
|  | -                                                yyextra->current->name.sprintf("@%d",anonNSCount.load());
 | ||||||
|  | +                                                yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonNSCount);
 | ||||||
|  |                                                } | ||||||
|  |                                              } | ||||||
|  |                                              else | ||||||
|  |                                              { | ||||||
|  | -                                              yyextra->current->name.sprintf("@%d",anonCount++);
 | ||||||
|  | +                                              yyextra->current->name = generateAnonymousAnchor(yyextra->fileName,yyextra->anonCount++);
 | ||||||
|  |                                              } | ||||||
|  |                                            } | ||||||
|  |                                            yyextra->curlyCount=0; | ||||||
|  | @@ -7846,7 +7846,6 @@ static void addKnRArgInfo(yyscan_t yyscanner,const QCString &type,const QCString
 | ||||||
|  |   | ||||||
|  |  //----------------------------------------------------------------------------- | ||||||
|  |   | ||||||
|  | -
 | ||||||
|  |  void fixArgumentListForJavaScript(ArgumentList &al) | ||||||
|  |  { | ||||||
|  |    for (Argument &a : al) | ||||||
|  | @@ -7859,6 +7858,7 @@ void fixArgumentListForJavaScript(ArgumentList &al)
 | ||||||
|  |    } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +//-----------------------------------------------------------------------------
 | ||||||
|  |   | ||||||
|  |  static void startCommentBlock(yyscan_t yyscanner,bool brief) | ||||||
|  |  { | ||||||
|  | @@ -8168,6 +8168,8 @@ static void parseMain(yyscan_t yyscanner,
 | ||||||
|  |    yyextra->yyLineNr      = 1 ; | ||||||
|  |    yyextra->yyBegLineNr   = 1; | ||||||
|  |    yyextra->yyBegColNr    = 0; | ||||||
|  | +  yyextra->anonCount     = 0;
 | ||||||
|  | +  yyextra->anonNSCount   = 0;
 | ||||||
|  |    yyextra->fileName = fileName; | ||||||
|  |    yyextra->clangParser = clangParser; | ||||||
|  |    setContext(yyscanner); | ||||||
|  | @@ -8222,7 +8224,7 @@ static void parseMain(yyscan_t yyscanner,
 | ||||||
|  |   | ||||||
|  |    parseCompounds(yyscanner,rt); | ||||||
|  |   | ||||||
|  | -  anonNSCount++;
 | ||||||
|  | +  yyextra->anonNSCount++;
 | ||||||
|  |   | ||||||
|  |    // add additional entries that were created during processing | ||||||
|  |    for (auto &[parent,child]: yyextra->outerScopeEntries) | ||||||
|  | diff --git a/src/sitemap.cpp b/src/sitemap.cpp
 | ||||||
|  | index 67e6c3f35..52e324261 100644
 | ||||||
|  | --- a/src/sitemap.cpp
 | ||||||
|  | +++ b/src/sitemap.cpp
 | ||||||
|  | @@ -86,7 +86,7 @@ class Crawlmap::Private
 | ||||||
|  |    public: | ||||||
|  |      std::ofstream crawlFile; | ||||||
|  |      TextStream crawl; | ||||||
|  | -    StringSet crawlLinks;
 | ||||||
|  | +    StringVector crawlLinks;
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  |  Crawlmap::Crawlmap() : p(std::make_unique<Private>()) {} | ||||||
|  | @@ -117,6 +117,8 @@ void Crawlmap::initialize()
 | ||||||
|  |   | ||||||
|  |  void Crawlmap::finalize() | ||||||
|  |  { | ||||||
|  | +  std::sort(p->crawlLinks.begin(),p->crawlLinks.end());
 | ||||||
|  | +  p->crawlLinks.erase(std::unique(p->crawlLinks.begin(),p->crawlLinks.end()),p->crawlLinks.end());
 | ||||||
|  |    for (auto &s : p->crawlLinks) | ||||||
|  |    { | ||||||
|  |      p->crawl << "<a href=\"" << s << "\"/>\n"; | ||||||
|  | @@ -132,7 +134,7 @@ void Crawlmap::addIndexFile(const QCString & fileName)
 | ||||||
|  |  { | ||||||
|  |    QCString fn = fileName; | ||||||
|  |    addHtmlExtensionIfMissing(fn); | ||||||
|  | -  p->crawl << "<a href=\"" << fn << "\"/>\n";
 | ||||||
|  | +  p->crawlLinks.push_back(fn.str());
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  void Crawlmap::addContentsItem(bool, const QCString &, const QCString & ref, | ||||||
|  | @@ -163,7 +163,7 @@ void Crawlmap::addContentsItem(bool, con
 | ||||||
|  |          link += currAnc.str(); | ||||||
|  |        } | ||||||
|  |      } | ||||||
|  | -    p->crawlLinks.insert(link);
 | ||||||
|  | +    p->crawlLinks.push_back(link);
 | ||||||
|  |    } | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | @@ -213,12 +213,12 @@ void Crawlmap::addIndexItem(const Defini
 | ||||||
|  |      QCString ref; | ||||||
|  |   | ||||||
|  |      ref = makeRef(contRef, anchor); | ||||||
|  | -    p->crawlLinks.insert(ref.str());
 | ||||||
|  | +    p->crawlLinks.push_back(ref.str());
 | ||||||
|  |    } | ||||||
|  |    else if (context) // container | ||||||
|  |    { | ||||||
|  |      QCString contRef = context->getOutputFileBase(); | ||||||
|  |      QCString ref = makeRef(contRef,sectionAnchor); | ||||||
|  | -    p->crawlLinks.insert(ref.str());
 | ||||||
|  | +    p->crawlLinks.push_back(ref.str());
 | ||||||
|  |    } | ||||||
|  |  } | ||||||
|  | diff --git a/src/util.cpp b/src/util.cpp
 | ||||||
|  | index ab30eb461..1aa6916a5 100644
 | ||||||
|  | --- a/src/util.cpp
 | ||||||
|  | +++ b/src/util.cpp
 | ||||||
|  | @@ -3877,6 +3877,27 @@ QCString convertNameToFile(const QCString &name,bool allowDots,bool allowUndersc
 | ||||||
|  |    return result; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +QCString generateAnonymousAnchor(const QCString &fileName,int count)
 | ||||||
|  | +{
 | ||||||
|  | +  QCString fn = stripFromPath(fileName)+":"+QCString().setNum(count);
 | ||||||
|  | +  const int sig_size=16;
 | ||||||
|  | +  uint8_t md5_sig[sig_size];
 | ||||||
|  | +  MD5Buffer(fn.data(),static_cast<unsigned int>(fn.length()),md5_sig);
 | ||||||
|  | +  char result[sig_size*3+2];
 | ||||||
|  | +  char *p = result;
 | ||||||
|  | +  *p++='@';
 | ||||||
|  | +  for (int i=0;i<sig_size;i++)
 | ||||||
|  | +  {
 | ||||||
|  | +    static const char oct[]="01234567";
 | ||||||
|  | +    uint8_t byte = md5_sig[i];
 | ||||||
|  | +    *p++=oct[(byte>>6)&7];
 | ||||||
|  | +    *p++=oct[(byte>>3)&7];
 | ||||||
|  | +    *p++=oct[(byte>>0)&7];
 | ||||||
|  | +  }
 | ||||||
|  | +  *p='\0';
 | ||||||
|  | +  return result;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  QCString relativePathToRoot(const QCString &name) | ||||||
|  |  { | ||||||
|  |    QCString result; | ||||||
|  | diff --git a/src/util.h b/src/util.h
 | ||||||
|  | index 64ce8e895..31b32aa25 100644
 | ||||||
|  | --- a/src/util.h
 | ||||||
|  | +++ b/src/util.h
 | ||||||
|  | @@ -253,6 +253,8 @@ QCString replaceAnonymousScopes(const QCString &s,const QCString &replacement=QC
 | ||||||
|  |   | ||||||
|  |  QCString convertNameToFile(const QCString &name,bool allowDots=FALSE,bool allowUnderscore=FALSE); | ||||||
|  |   | ||||||
|  | +QCString generateAnonymousAnchor(const QCString &fileName,int count);
 | ||||||
|  | +
 | ||||||
|  |  void extractNamespaceName(const QCString &scopeName, | ||||||
|  |                            QCString &className,QCString &namespaceName, | ||||||
|  |                            bool allowEmptyClass=FALSE); | ||||||
|  | diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
 | ||||||
|  | index 4d4913d20..8e3eebe18 100644
 | ||||||
|  | --- a/src/xmlgen.cpp
 | ||||||
|  | +++ b/src/xmlgen.cpp
 | ||||||
|  | @@ -2243,12 +2243,12 @@ void generateXML()
 | ||||||
|  |      } | ||||||
|  |      for (const auto &cd : *Doxygen::conceptLinkedMap) | ||||||
|  |      { | ||||||
|  | -      msg("Generating XML output for concept %s\n",qPrint(cd->name()));
 | ||||||
|  | +      msg("Generating XML output for concept %s\n",qPrint(cd->displayName()));
 | ||||||
|  |        generateXMLForConcept(cd.get(),t); | ||||||
|  |      } | ||||||
|  |      for (const auto &nd : *Doxygen::namespaceLinkedMap) | ||||||
|  |      { | ||||||
|  | -      msg("Generating XML output for namespace %s\n",qPrint(nd->name()));
 | ||||||
|  | +      msg("Generating XML output for namespace %s\n",qPrint(nd->displayName()));
 | ||||||
|  |        generateXMLForNamespace(nd.get(),t); | ||||||
|  |      } | ||||||
|  |      for (const auto &fn : *Doxygen::inputNameLinkedMap) | ||||||
|  | diff --git a/testing/071/namespace_a_namespace_1_1_0d0.xml b/testing/071/namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063.xml
 | ||||||
|  | similarity index 62% | ||||||
|  | rename from testing/071/namespace_a_namespace_1_1_0d0.xml | ||||||
|  | rename to testing/071/namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063.xml | ||||||
|  | index c08d49e24..4da395e35 100644
 | ||||||
|  | --- a/testing/071/namespace_a_namespace_1_1_0d0.xml
 | ||||||
|  | +++ b/testing/071/namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063.xml
 | ||||||
|  | @@ -1,27 +1,27 @@
 | ||||||
|  |  <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  |  <doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="" xml:lang="en-US"> | ||||||
|  | -  <compounddef id="namespace_a_namespace_1_1_0d0" kind="namespace" language="C++">
 | ||||||
|  | +  <compounddef id="namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063" kind="namespace" language="C++">
 | ||||||
|  |      <compoundname>ANamespace</compoundname> | ||||||
|  |      <sectiondef kind="enum"> | ||||||
|  | -      <memberdef kind="enum" id="namespace_a_namespace_1_1_0d0_1a96ab6574751fdf6a53ceec8a3896c45d" prot="public" static="no" strong="yes">
 | ||||||
|  | +      <memberdef kind="enum" id="namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063_1a80c23b2c34d4baaf4e21819ff9c3dcd6" prot="public" static="no" strong="yes">
 | ||||||
|  |          <type/> | ||||||
|  |          <name>Boolean</name> | ||||||
|  |          <qualifiedname>ANamespace::Boolean</qualifiedname> | ||||||
|  | -        <enumvalue id="namespace_a_namespace_1_1_0d0_1a96ab6574751fdf6a53ceec8a3896c45daf8320b26d30ab433c5a54546d21f414c" prot="public">
 | ||||||
|  | +        <enumvalue id="namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063_1a80c23b2c34d4baaf4e21819ff9c3dcd6af8320b26d30ab433c5a54546d21f414c" prot="public">
 | ||||||
|  |            <name>False</name> | ||||||
|  |            <briefdescription> | ||||||
|  |            </briefdescription> | ||||||
|  |            <detaileddescription> | ||||||
|  |            </detaileddescription> | ||||||
|  |          </enumvalue> | ||||||
|  | -        <enumvalue id="namespace_a_namespace_1_1_0d0_1a96ab6574751fdf6a53ceec8a3896c45daf827cf462f62848df37c5e1e94a4da74" prot="public">
 | ||||||
|  | +        <enumvalue id="namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063_1a80c23b2c34d4baaf4e21819ff9c3dcd6af827cf462f62848df37c5e1e94a4da74" prot="public">
 | ||||||
|  |            <name>True</name> | ||||||
|  |            <briefdescription> | ||||||
|  |            </briefdescription> | ||||||
|  |            <detaileddescription> | ||||||
|  |            </detaileddescription> | ||||||
|  |          </enumvalue> | ||||||
|  | -        <enumvalue id="namespace_a_namespace_1_1_0d0_1a96ab6574751fdf6a53ceec8a3896c45da2767828026039e8ba7b38973cbb701f2" prot="public">
 | ||||||
|  | +        <enumvalue id="namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063_1a80c23b2c34d4baaf4e21819ff9c3dcd6a2767828026039e8ba7b38973cbb701f2" prot="public">
 | ||||||
|  |            <name>FileNotFound</name> | ||||||
|  |            <briefdescription> | ||||||
|  |            </briefdescription> | ||||||
|  | diff --git a/testing/071_enum_in_anon_ns.cpp b/testing/071_enum_in_anon_ns.cpp
 | ||||||
|  | index 8aab15fc8..98843bff2 100644
 | ||||||
|  | --- a/testing/071_enum_in_anon_ns.cpp
 | ||||||
|  | +++ b/testing/071_enum_in_anon_ns.cpp
 | ||||||
|  | @@ -1,5 +1,5 @@
 | ||||||
|  |  // objective: test that enum values in anonymous namespaces produce no warning | ||||||
|  | -// check: namespace_a_namespace_1_1_0d0.xml
 | ||||||
|  | +// check: namespace_a_namespace_1_1_0d130315250316227335362355006121037335073327177063.xml
 | ||||||
|  |   | ||||||
|  |  namespace ANamespace { namespace { | ||||||
|  |   | ||||||
|  | diff --git a/testing/073/073__typed__enum_8cpp.xml b/testing/073/073__typed__enum_8cpp.xml
 | ||||||
|  | index 2eaeec9c4..cc7696486 100644
 | ||||||
|  | --- a/testing/073/073__typed__enum_8cpp.xml
 | ||||||
|  | +++ b/testing/073/073__typed__enum_8cpp.xml
 | ||||||
|  | @@ -75,10 +75,10 @@
 | ||||||
|  |          </inbodydescription> | ||||||
|  |          <location file="073_typed_enum.cpp" line="10" column="1" bodyfile="073_typed_enum.cpp" bodystart="10" bodyend="17"/> | ||||||
|  |        </memberdef> | ||||||
|  | -      <memberdef kind="enum" id="073__typed__enum_8cpp_1a06fc87d81c62e9abb8790b6e5713c55b" prot="public" static="no" strong="no">
 | ||||||
|  | +      <memberdef kind="enum" id="073__typed__enum_8cpp_1a28976fb6fcf15c9e79931f757d4a240a" prot="public" static="no" strong="no">
 | ||||||
|  |          <type/> | ||||||
|  |          <name/> | ||||||
|  | -        <enumvalue id="073__typed__enum_8cpp_1a06fc87d81c62e9abb8790b6e5713c55ba52c998ad250c15a855ff5559e6d0d1d6" prot="public">
 | ||||||
|  | +        <enumvalue id="073__typed__enum_8cpp_1a28976fb6fcf15c9e79931f757d4a240aa52c998ad250c15a855ff5559e6d0d1d6" prot="public">
 | ||||||
|  |            <name>Unnamed1</name> | ||||||
|  |            <briefdescription> | ||||||
|  |            </briefdescription> | ||||||
|  | @@ -93,10 +93,10 @@
 | ||||||
|  |          </inbodydescription> | ||||||
|  |          <location file="073_typed_enum.cpp" line="19" column="1" bodyfile="073_typed_enum.cpp" bodystart="19" bodyend="21"/> | ||||||
|  |        </memberdef> | ||||||
|  | -      <memberdef kind="enum" id="073__typed__enum_8cpp_1adf764cbdea00d65edcd07bb9953ad2b7" prot="public" static="no" strong="no">
 | ||||||
|  | +      <memberdef kind="enum" id="073__typed__enum_8cpp_1a3e3cdcfeacb546b98944a745f81d0492" prot="public" static="no" strong="no">
 | ||||||
|  |          <type/> | ||||||
|  |          <name/> | ||||||
|  | -        <enumvalue id="073__typed__enum_8cpp_1adf764cbdea00d65edcd07bb9953ad2b7a7b130af0c5cb18bfee8c60994fe1d5ee" prot="public">
 | ||||||
|  | +        <enumvalue id="073__typed__enum_8cpp_1a3e3cdcfeacb546b98944a745f81d0492a7b130af0c5cb18bfee8c60994fe1d5ee" prot="public">
 | ||||||
|  |            <name>Unnamed2</name> | ||||||
|  |            <briefdescription> | ||||||
|  |            </briefdescription> | ||||||
							
								
								
									
										30
									
								
								doxygen-1.12.0-regression-anchors.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								doxygen-1.12.0-regression-anchors.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | commit d408967139935bbaeae8d9eac7f0f34877d53d1c | ||||||
|  | Author: albert-github <albert.tests@gmail.com> | ||||||
|  | Date:   Fri Sep 13 16:02:25 2024 +0200 | ||||||
|  | 
 | ||||||
|  |     issue #11135 The anchors don't work | ||||||
|  |      | ||||||
|  |     Regression on 300f73d9ecd6b010a160e5f8cef14ecbabab950b: | ||||||
|  |     ``` | ||||||
|  |     commit 300f73d9ecd6b010a160e5f8cef14ecbabab950b | ||||||
|  |      | ||||||
|  |     Date:   Thu Jul 4 20:41:56 2024 +0200 | ||||||
|  |      | ||||||
|  |         issue #10970 Improvement of end of paragraph detection | ||||||
|  |     ``` | ||||||
|  |      | ||||||
|  |     attribute name is not `idname` but there are 2 attributes  possible `id` and `name` | ||||||
|  | 
 | ||||||
|  | diff --git a/src/commentscan.l b/src/commentscan.l
 | ||||||
|  | index 8520fcb58..767aa440d 100644
 | ||||||
|  | --- a/src/commentscan.l
 | ||||||
|  | +++ b/src/commentscan.l
 | ||||||
|  | @@ -591,7 +591,7 @@ DETAILEDHTMLOPTEND {ENDCODE}
 | ||||||
|  |  SUMMARY   ("summary"|"SUMMARY") | ||||||
|  |  REMARKS   ("remarks"|"REMARKS") | ||||||
|  |  AHTML     [aA]{BN}* | ||||||
|  | -ANCHTML   ("idname"|"IDNAME")"="("\""{LABELID}"\""|"'"{LABELID}"'"|{LABELID})
 | ||||||
|  | +ANCHTML   ("id"|"name"|"ID"|"NAME")"="("\""{LABELID}"\""|"'"{LABELID}"'"|{LABELID})
 | ||||||
|  |  BN        [ \t\n\r] | ||||||
|  |  BL        [ \t\r]*"\n" | ||||||
|  |  B         [ \t] | ||||||
							
								
								
									
										102
									
								
								doxygen.spec
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								doxygen.spec
									
									
									
									
									
								
							| @ -1,28 +1,19 @@ | |||||||
| %if 0%{?fedora} |  | ||||||
| %global xapian_core_support ON |  | ||||||
| %global clang_support OFF |  | ||||||
| %global build_wizard ON |  | ||||||
| %else |  | ||||||
| %global xapian_core_support OFF |  | ||||||
| %global clang_support OFF |  | ||||||
| %global build_wizard OFF |  | ||||||
| %endif |  | ||||||
| 
 |  | ||||||
| Summary: A documentation system for C/C++ | Summary: A documentation system for C/C++ | ||||||
| Name:    doxygen | Name:    doxygen | ||||||
| Epoch:   2 | Epoch:   2 | ||||||
| Version: 1.12.0 | Version: 1.12.0 | ||||||
| Release: 2%{?dist} | Release: 3%{?dist} | ||||||
| # No version is specified. | # No version is specified. | ||||||
| License: GPL-1.0-or-later | License: GPL-1.0-or-later | ||||||
| Url: https://github.com/doxygen | Url: https://github.com/doxygen | ||||||
| Source0: https://www.doxygen.nl/files/%{name}-%{version}.src.tar.gz | Source0: https://www.doxygen.nl/files/%{name}-%{version}.src.tar.gz | ||||||
| # this icon is part of kdesdk |  | ||||||
| Source1: doxywizard.desktop |  | ||||||
| # these icons are part of doxygen and converted from doxywizard.ico |  | ||||||
| Source2: doxywizard-icons.tar.xz |  | ||||||
| 
 | 
 | ||||||
| # upstream patches | # upstream patches | ||||||
|  | # Markdown links to internal anchors broken | ||||||
|  | Patch0: doxygen-1.12.0-regression-anchors.patch | ||||||
|  | 
 | ||||||
|  | # Non-reproducible file names in doxygen output | ||||||
|  | Patch1: doxygen-1.12.0-non-reproducible-file-names-in-doxygen-output.patch | ||||||
| 
 | 
 | ||||||
| BuildRequires: %{_bindir}/python3 | BuildRequires: %{_bindir}/python3 | ||||||
| BuildRequires: perl-interpreter, perl-open | BuildRequires: perl-interpreter, perl-open | ||||||
| @ -97,15 +88,8 @@ BuildRequires: flex | |||||||
| BuildRequires: bison | BuildRequires: bison | ||||||
| BuildRequires: cmake | BuildRequires: cmake | ||||||
| BuildRequires: git | BuildRequires: git | ||||||
| %if "x%{?xapian_core_support}" == "xON" |  | ||||||
| BuildRequires: xapian-core-devel |  | ||||||
| %endif |  | ||||||
| %if "x%{?clang_support}" == "xON" |  | ||||||
| BuildRequires: llvm-devel |  | ||||||
| BuildRequires: clang-devel |  | ||||||
| %else |  | ||||||
| BuildRequires: gcc-c++ gcc | BuildRequires: gcc-c++ gcc | ||||||
| %endif | 
 | ||||||
| Requires: perl-interpreter | Requires: perl-interpreter | ||||||
| Requires: graphviz | Requires: graphviz | ||||||
| 
 | 
 | ||||||
| @ -116,17 +100,6 @@ documentation is extracted directly from the sources. Doxygen can | |||||||
| also be configured to extract the code structure from undocumented | also be configured to extract the code structure from undocumented | ||||||
| source files. | source files. | ||||||
| 
 | 
 | ||||||
| %if  "x%{build_wizard}" == "xON" |  | ||||||
| %package doxywizard |  | ||||||
| Summary: A GUI for creating and editing configuration files |  | ||||||
| Requires: %{name} = %{epoch}:%{version}-%{release} |  | ||||||
| BuildRequires: qt5-qtbase-devel |  | ||||||
| 
 |  | ||||||
| %description doxywizard |  | ||||||
| Doxywizard is a GUI for creating and editing configuration files that |  | ||||||
| are used by doxygen. |  | ||||||
| %endif |  | ||||||
| 
 |  | ||||||
| %if ! 0%{?_module_build} | %if ! 0%{?_module_build} | ||||||
| %package latex | %package latex | ||||||
| Summary: Support for producing latex/pdf output from doxygen | Summary: Support for producing latex/pdf output from doxygen | ||||||
| @ -204,7 +177,7 @@ Requires: texlive-epstopdf | |||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| %prep | %prep | ||||||
| %autosetup -p1 -a2 | %autosetup -p1 | ||||||
| 
 | 
 | ||||||
| # convert into utf-8 | # convert into utf-8 | ||||||
| iconv --from=ISO-8859-1 --to=UTF-8 LANGUAGE.HOWTO > LANGUAGE.HOWTO.new | iconv --from=ISO-8859-1 --to=UTF-8 LANGUAGE.HOWTO > LANGUAGE.HOWTO.new | ||||||
| @ -212,21 +185,9 @@ touch -r LANGUAGE.HOWTO LANGUAGE.HOWTO.new | |||||||
| mv LANGUAGE.HOWTO.new LANGUAGE.HOWTO | mv LANGUAGE.HOWTO.new LANGUAGE.HOWTO | ||||||
| 
 | 
 | ||||||
| %build | %build | ||||||
| %if  "x%{build_wizard}" == "xON" |  | ||||||
| %cmake \ | %cmake \ | ||||||
|       -DPYTHON_EXECUTABLE=%{_bindir}/python3 \ |       -DPYTHON_EXECUTABLE=%{_bindir}/python3 \ | ||||||
|       -Duse_libclang=%{clang_support} \ |       -Duse_libclang=OFF \ | ||||||
|       -Dbuild_doc=OFF \ |  | ||||||
|       -Dbuild_wizard=ON \ |  | ||||||
|       -Dbuild_xmlparser=ON \ |  | ||||||
|       -Dbuild_search=%{xapian_core_support} \ |  | ||||||
|       -DMAN_INSTALL_DIR=%{_mandir}/man1 \ |  | ||||||
|       -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ |  | ||||||
|       -DBUILD_SHARED_LIBS=OFF \ |  | ||||||
| %else |  | ||||||
| %cmake \ |  | ||||||
|       -DPYTHON_EXECUTABLE=%{_bindir}/python3 \ |  | ||||||
|       -Duse_libclang=%{clang_support} \ |  | ||||||
|       -Dbuild_doc=OFF \ |       -Dbuild_doc=OFF \ | ||||||
|       -Dbuild_wizard=OFF \ |       -Dbuild_wizard=OFF \ | ||||||
|       -Dbuild_xmlparser=ON \ |       -Dbuild_xmlparser=ON \ | ||||||
| @ -234,7 +195,6 @@ mv LANGUAGE.HOWTO.new LANGUAGE.HOWTO | |||||||
|       -DMAN_INSTALL_DIR=%{_mandir}/man1 \ |       -DMAN_INSTALL_DIR=%{_mandir}/man1 \ | ||||||
|       -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ |       -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ | ||||||
|       -DBUILD_SHARED_LIBS=OFF \ |       -DBUILD_SHARED_LIBS=OFF \ | ||||||
| %endif |  | ||||||
| 
 | 
 | ||||||
| %cmake_build %{?_smp_mflags} | %cmake_build %{?_smp_mflags} | ||||||
| 
 | 
 | ||||||
| @ -243,27 +203,7 @@ mv LANGUAGE.HOWTO.new LANGUAGE.HOWTO | |||||||
| 
 | 
 | ||||||
| # install man pages | # install man pages | ||||||
| mkdir -p %{buildroot}/%{_mandir}/man1 | mkdir -p %{buildroot}/%{_mandir}/man1 | ||||||
| cp doc/*.1 %{buildroot}/%{_mandir}/man1/ | cp doc/doxygen.1 %{buildroot}/%{_mandir}/man1/ | ||||||
| 
 |  | ||||||
| %if  "x%{build_wizard}" == "xOFF" |  | ||||||
| rm -f %{buildroot}/%{_mandir}/man1/doxywizard.1* |  | ||||||
| %else |  | ||||||
| # install icons |  | ||||||
| icondir=%{buildroot}%{_datadir}/icons/hicolor |  | ||||||
| mkdir -m755 -p $icondir/{16x16,32x32,48x48,128x128}/apps |  | ||||||
| install -m644 -p -D doxywizard-6.png $icondir/16x16/apps/doxywizard.png |  | ||||||
| install -m644 -p -D doxywizard-5.png $icondir/32x32/apps/doxywizard.png |  | ||||||
| install -m644 -p -D doxywizard-4.png $icondir/48x48/apps/doxywizard.png |  | ||||||
| install -m644 -p -D doxywizard-3.png $icondir/128x128/apps/doxywizard.png |  | ||||||
| desktop-file-install --dir=%{buildroot}%{_datadir}/applications %{SOURCE1} |  | ||||||
| %endif |  | ||||||
| 
 |  | ||||||
| %if "x%{?xapian_core_support}" == "xOFF" |  | ||||||
| rm -f %{buildroot}/%{_mandir}/man1/doxyindexer.1* %{buildroot}/%{_mandir}/man1/doxysearch.1* |  | ||||||
| %endif |  | ||||||
| 
 |  | ||||||
| # remove duplicate |  | ||||||
| rm -rf %{buildroot}/%{_docdir}/packages |  | ||||||
| 
 | 
 | ||||||
| %check | %check | ||||||
| %ctest | %ctest | ||||||
| @ -271,25 +211,8 @@ rm -rf %{buildroot}/%{_docdir}/packages | |||||||
| %files | %files | ||||||
| %doc LANGUAGE.HOWTO README.md | %doc LANGUAGE.HOWTO README.md | ||||||
| %license LICENSE | %license LICENSE | ||||||
| %if ! 0%{?_module_build} |  | ||||||
| %if "x%{?xapian_core_support}" == "xON" |  | ||||||
| %{_bindir}/doxyindexer |  | ||||||
| %{_bindir}/doxysearch* |  | ||||||
| %endif |  | ||||||
| %endif |  | ||||||
| %{_bindir}/doxygen | %{_bindir}/doxygen | ||||||
| %{_mandir}/man1/doxygen.1* | %{_mandir}/man1/doxygen.1* | ||||||
| %if "x%{?xapian_core_support}" == "xON" |  | ||||||
| %{_mandir}/man1/doxyindexer.1* |  | ||||||
| %{_mandir}/man1/doxysearch.1* |  | ||||||
| %endif |  | ||||||
| %if "x%{build_wizard}" == "xON"  |  | ||||||
| %files doxywizard |  | ||||||
| %{_bindir}/doxywizard |  | ||||||
| %{_mandir}/man1/doxywizard* |  | ||||||
| %{_datadir}/applications/doxywizard.desktop |  | ||||||
| %{_datadir}/icons/hicolor/*/apps/doxywizard.png |  | ||||||
| %endif |  | ||||||
| 
 | 
 | ||||||
| %if ! 0%{?_module_build} | %if ! 0%{?_module_build} | ||||||
| %files latex | %files latex | ||||||
| @ -297,6 +220,11 @@ rm -rf %{buildroot}/%{_docdir}/packages | |||||||
| %endif | %endif | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Fri Nov 29 2024 Than Ngo <than@redhat.com> - 2:1.12.0-3 | ||||||
|  | - Fix Non-reproducible file names in doxygen output | ||||||
|  | - Fix broken markdown links to anchors | ||||||
|  | Related: RHEL-58045 | ||||||
|  | 
 | ||||||
| * Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 2:1.12.0-2 | * Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 2:1.12.0-2 | ||||||
| - Bump release for October 2024 mass rebuild: | - Bump release for October 2024 mass rebuild: | ||||||
|   Resolves: RHEL-64018 |   Resolves: RHEL-64018 | ||||||
|  | |||||||
| @ -1,6 +0,0 @@ | |||||||
| [Desktop Entry] |  | ||||||
| Type=Application |  | ||||||
| Exec=doxywizard |  | ||||||
| Name=Doxygen Wizard |  | ||||||
| Icon=doxywizard |  | ||||||
| Categories=Qt;Development; |  | ||||||
							
								
								
									
										1
									
								
								sources
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								sources
									
									
									
									
									
								
							| @ -1,2 +1 @@ | |||||||
| SHA512 (doxywizard-icons.tar.xz) = 865a86d7535e64ad92e36ba1f901d51cd6b603e762e5c68761a45bc1f965a36e6a6c8d29468ecb2ec799f0add2347537723832aff6660c76af453f80a0a370ad |  | ||||||
| SHA512 (doxygen-1.12.0.src.tar.gz) = e407e29c5e232e1f8dca291dd2d00b1dd400be709400225339408fad2cd758563b69f290cbd7c0efeb76b1335c4672fb1d6d580b9e6ed570708cf9b7d78951b1 | SHA512 (doxygen-1.12.0.src.tar.gz) = e407e29c5e232e1f8dca291dd2d00b1dd400be709400225339408fad2cd758563b69f290cbd7c0efeb76b1335c4672fb1d6d580b9e6ed570708cf9b7d78951b1 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user