Commit 7779bf6d authored by albert-github's avatar albert-github

Bug 700510 - Bibliography duplicate filenames fails

Problem in the bug report is that the bib files in the different directories have the same name and thus overwrite each other.
This patch solves this problem as well as the possibility to have spaces in the file name.
For all output formats the bib files are copied to a new numbered name: "bibTmpFile_<number>", for Latex on the LATEX_OUTPUT directory and for all other formats in the subdirectory "bibTmpDir" of the OUTPUT_DIRECTORY.
The files for Latex are retained whilst the files for the other formats are removed after usage (as it was before).
parent 070c3554
......@@ -37,6 +37,8 @@ static const char *bib2xhtml_pl =
const QCString CiteConsts::fileName("citelist");
const QCString CiteConsts::anchorPrefix("CITEREF_");
const QCString bibTmpFile("bibTmpFile_");
const QCString bibTmpDir("bibTmpDir/");
//--------------------------------------------------------------------------
......@@ -45,51 +47,6 @@ CiteDict::CiteDict(int size) : m_entries(size, FALSE)
m_entries.setAutoDelete(TRUE);
}
static QCString getListOfBibFiles(const QCString &sep,bool namesOnly)
{
QCString result;
QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
const char *bibdata = citeDataList.first();
while (bibdata)
{
int i;
QCString bibFile = bibdata;
if (namesOnly && bibFile.right(4)==".bib") // strip extension
{
bibFile = bibFile.left(bibFile.length()-4);
}
else
{
if (!namesOnly && bibFile.right(4)!=".bib") bibFile += ".bib";
}
if ((i=bibFile.findRev('/'))!=-1) // strip path
{
bibFile = bibFile.mid(i+1);
}
if (!bibFile.isEmpty())
{
if (namesOnly) // bare names
{
result+=bibFile;
}
else // add quotes for paths with spaces
{
result+="\""+bibFile+"\"";
}
bibdata = citeDataList.next();
if (bibdata)
{
result+=sep;
}
}
else
{
bibdata = citeDataList.next();
}
}
return result;
}
void CiteDict::writeLatexBibliography(FTextStream &t)
{
if (m_entries.isEmpty())
......@@ -108,7 +65,29 @@ void CiteDict::writeLatexBibliography(FTextStream &t)
"\\phantomsection\n"
"\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n"
"\\bibliographystyle{" << style << "}\n"
"\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n"
"\\bibliography{";
QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/";
int i = 0;
const char *bibdata = citeDataList.first();
while (bibdata)
{
QCString bibFile = bibdata;
// Note: file can now have multiple dots
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
QFileInfo fi(bibFile);
if (fi.exists())
{
if (!bibFile.isEmpty())
{
if (i) t << ",";
i++;
t << bibTmpFile << QString().setNum(i);
}
}
bibdata = citeDataList.next();
}
t << "}\n"
"\n";
}
......@@ -186,31 +165,30 @@ void CiteDict::generatePage() const
f.writeBlock(bstData, bstData.length());
f.close();
// 4. for html we just copy the bib files to the output so that
// bibtex can find them without path (bibtex doesn't support path's
// with spaces!)
QList<QCString> tempFiles;
tempFiles.setAutoDelete(TRUE);
QDir thisDir;
if (Config_getBool("GENERATE_HTML"))
{
// 4. for all formats we just copy the bib files to as special output directory
// s bibtex can find them without path (bibtex doesn't support paths or
// filenames with spaces!)
// Strictly not required when only latex is generated
// copy bib files to the latex output dir
QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
QCString bibOutputDir = outputDir+"/";
QFileInfo fo(bibOutputDir);
QCString bibOutputDir = outputDir+"/"+bibTmpDir;
QCString bibOutputFiles = "";
QDir thisDir;
thisDir.mkdir(bibOutputDir);
const char *bibdata = citeDataList.first();
int i = 0;
while (bibdata)
{
QCString bibFile = bibdata;
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
QFileInfo fi(bibFile);
if (fi.exists() && fi.dirPath(TRUE)!=fo.absFilePath())
if (fi.exists())
{
if (!bibFile.isEmpty())
{
QCString destFile=bibOutputDir+fi.fileName().data();
copyFile(bibFile,destFile);
tempFiles.append(new QCString(destFile));
++i;
copyFile(bibFile,bibOutputDir + bibTmpFile + QCString().setNum(i) + ".bib");
bibOutputFiles = bibOutputFiles + " " + bibTmpDir + bibTmpFile + QCString().setNum(i) + ".bib";
}
}
else if (!fi.exists())
......@@ -219,14 +197,13 @@ void CiteDict::generatePage() const
}
bibdata = citeDataList.next();
}
}
QCString oldDir = QDir::currentDirPath().utf8();
QDir::setCurrent(outputDir);
// 5. run bib2xhtml perl script on the generated file which will insert the
// bibliography in citelist.doc
portable_system("perl","\""+bib2xhtmlFile+"\" "+getListOfBibFiles(" ",FALSE)+" \""+
portable_system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+
citeListFile+"\"");
QDir::setCurrent(oldDir);
......@@ -288,17 +265,22 @@ void CiteDict::generatePage() const
// copy bib files to the latex output dir
QStrList &citeDataList = Config_getList("CITE_BIB_FILES");
QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/";
int i = 0;
const char *bibdata = citeDataList.first();
while (bibdata)
{
QCString bibFile = bibdata;
// Note: file can now have multiple dots
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
QFileInfo fi(bibFile);
if (fi.exists())
{
if (!bibFile.isEmpty())
{
copyFile(bibFile,latexOutputDir+fi.fileName().data());
// bug_700510, multile times the same name were overwriting; creating new names
// also for names with spaces
++i;
copyFile(bibFile,latexOutputDir + bibTmpFile + QCString().setNum(i) + ".bib");
}
}
else
......@@ -313,10 +295,14 @@ void CiteDict::generatePage() const
thisDir.remove(citeListFile);
thisDir.remove(doxygenBstFile);
thisDir.remove(bib2xhtmlFile);
while (!tempFiles.isEmpty())
bibdata = citeDataList.first();
// we might try to remove too many files as empty files didn't get a coresponding new file
// but the remove function does not emit an error for it and we don't catch the error return
// so no problem.
for (unsigned int j = 1; j <= citeDataList.count(); j++)
{
QCString *s=tempFiles.take(0);
thisDir.remove(*s);
thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(j) + ".bib");
}
thisDir.rmdir(bibOutputDir);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment