From a4538a2532582f4bb1b6e85ed1e125f9c68bb251 Mon Sep 17 00:00:00 2001
From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
Date: Wed, 27 Jan 2010 18:48:26 +0100
Subject: don't falsely complain about mismatched codecfortr

normalize the user input first
---
 .../testdata/good/codecfortr3/expectedoutput.txt   |  1 +
 .../lupdate/testdata/good/codecfortr3/main.cpp     | 45 ++++++++++++++++++++++
 .../lupdate/testdata/good/codecfortr3/project.pro  |  4 ++
 .../testdata/good/codecfortr3/project.ts.before    | 13 +++++++
 .../testdata/good/codecfortr3/project.ts.result    | 12 ++++++
 .../testdata/good/codecfortr4/expectedoutput.txt   |  0
 .../lupdate/testdata/good/codecfortr4/main.cpp     | 45 ++++++++++++++++++++++
 .../lupdate/testdata/good/codecfortr4/project.pro  |  4 ++
 .../testdata/good/codecfortr4/project.ts.before    | 13 +++++++
 .../testdata/good/codecfortr4/project.ts.result    | 13 +++++++
 tools/linguist/lupdate/main.cpp                    | 26 ++++++-------
 tools/linguist/shared/translator.h                 |  1 +
 12 files changed, 164 insertions(+), 13 deletions(-)
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr3/expectedoutput.txt
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr3/main.cpp
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.pro
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.before
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.result
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr4/expectedoutput.txt
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr4/main.cpp
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.pro
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.before
 create mode 100644 tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.result

diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr3/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/expectedoutput.txt
new file mode 100644
index 0000000..feecdda
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/expectedoutput.txt
@@ -0,0 +1 @@
+lupdate warning: Codec for tr\(\) 'ISO-8859-1' disagrees with existing file's codec 'UTF-8'\. Expect trouble\.
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr3/main.cpp b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/main.cpp
new file mode 100644
index 0000000..e4210c5
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/main.cpp
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+int main(int argc, char **argv)
+{
+    QObject::tr("hi");
+}
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.pro b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.pro
new file mode 100644
index 0000000..00a4dc4
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.pro
@@ -0,0 +1,4 @@
+SOURCES += main.cpp
+
+TRANSLATIONS = project.ts
+CODECFORTR = latin1
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.before
new file mode 100644
index 0000000..07ad79b
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.before
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<defaultcodec>UTF-8</defaultcodec>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="main.cpp" line="44"/>
+        <source>hi</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.result
new file mode 100644
index 0000000..b6899c1
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr3/project.ts.result
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="main.cpp" line="44"/>
+        <source>hi</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr4/expectedoutput.txt b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/expectedoutput.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr4/main.cpp b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/main.cpp
new file mode 100644
index 0000000..e4210c5
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/main.cpp
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+int main(int argc, char **argv)
+{
+    QObject::tr("hi");
+}
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.pro b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.pro
new file mode 100644
index 0000000..4fddb02
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.pro
@@ -0,0 +1,4 @@
+SOURCES += main.cpp
+
+TRANSLATIONS = project.ts
+CODECFORTR = latin2
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.before b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.before
new file mode 100644
index 0000000..e18e34e
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.before
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<defaultcodec>ISO-8859-2</defaultcodec>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="main.cpp" line="44"/>
+        <source>hi</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.result b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.result
new file mode 100644
index 0000000..e18e34e
--- /dev/null
+++ b/tests/auto/linguist/lupdate/testdata/good/codecfortr4/project.ts.result
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<defaultcodec>ISO-8859-2</defaultcodec>
+<context>
+    <name>QObject</name>
+    <message>
+        <location filename="main.cpp" line="44"/>
+        <source>hi</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+</TS>
diff --git a/tools/linguist/lupdate/main.cpp b/tools/linguist/lupdate/main.cpp
index a50c97a..b2bfd7c 100644
--- a/tools/linguist/lupdate/main.cpp
+++ b/tools/linguist/lupdate/main.cpp
@@ -136,7 +136,7 @@ static void printUsage()
 }
 
 static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFileNames,
-    const QByteArray &codecForTr, const QString &sourceLanguage, const QString &targetLanguage,
+    bool setCodec, const QString &sourceLanguage, const QString &targetLanguage,
     UpdateOptions options, bool *fail)
 {
     QDir dir;
@@ -154,10 +154,10 @@ static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFil
             }
             tor.resolveDuplicates();
             cd.clearErrors();
-            if (!codecForTr.isEmpty() && codecForTr != tor.codecName())
+            if (setCodec && fetchedTor.codec() != tor.codec())
                 qWarning("lupdate warning: Codec for tr() '%s' disagrees with "
                          "existing file's codec '%s'. Expect trouble.",
-                         codecForTr.constData(), tor.codecName().constData());
+                         fetchedTor.codecName().constData(), tor.codecName().constData());
             if (!targetLanguage.isEmpty() && targetLanguage != tor.languageCode())
                 qWarning("lupdate warning: Specified target language '%s' disagrees with "
                          "existing file's language '%s'. Ignoring.",
@@ -167,8 +167,8 @@ static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFil
                          "existing file's language '%s'. Ignoring.",
                          qPrintable(sourceLanguage), qPrintable(tor.sourceLanguageCode()));
         } else {
-            if (!codecForTr.isEmpty())
-                tor.setCodecName(codecForTr);
+            if (setCodec)
+                tor.setCodec(fetchedTor.codec());
             if (!targetLanguage.isEmpty())
                 tor.setLanguageCode(targetLanguage);
             else
@@ -190,8 +190,8 @@ static void updateTsFiles(const Translator &fetchedTor, const QStringList &tsFil
         if (tor.locationsType() == Translator::NoLocations) // Could be set from file
             theseOptions |= NoLocations;
         Translator out = merge(tor, fetchedTor, theseOptions, err);
-        if (!codecForTr.isEmpty())
-            out.setCodecName(codecForTr);
+        if (setCodec)
+            out.setCodec(fetchedTor.codec());
 
         if ((options & Verbose) && !err.isEmpty()) {
             printOut(err);
@@ -374,17 +374,17 @@ static void processProjects(
                 continue;
             }
             Translator tor;
-            QByteArray codecForTr;
+            bool setCodec = false;
             QStringList tmp = visitor.values(QLatin1String("CODEC"))
                               + visitor.values(QLatin1String("DEFAULTCODEC"))
                               + visitor.values(QLatin1String("CODECFORTR"));
             if (!tmp.isEmpty()) {
-                codecForTr = tmp.last().toLatin1();
-                tor.setCodecName(codecForTr);
+                tor.setCodecName(tmp.last().toLatin1());
+                setCodec = true;
             }
             processProject(false, pfi, visitor, options, codecForSource,
                            targetLanguage, sourceLanguage, &tor, fail);
-            updateTsFiles(tor, tsFiles, codecForTr, sourceLanguage, targetLanguage, options, fail);
+            updateTsFiles(tor, tsFiles, setCodec, sourceLanguage, targetLanguage, options, fail);
             continue;
         }
       noTrans:
@@ -657,7 +657,7 @@ int main(int argc, char **argv)
         cd.m_allCSources = allCSources;
         fetchedTor.setCodecName(codecForTr);
         processSources(fetchedTor, sourceFiles, cd);
-        updateTsFiles(fetchedTor, tsFileNames, codecForTr,
+        updateTsFiles(fetchedTor, tsFileNames, !codecForTr.isEmpty(),
                       sourceLanguage, targetLanguage, options, &fail);
     } else {
         if (!sourceFiles.isEmpty() || !includePath.isEmpty()) {
@@ -669,7 +669,7 @@ int main(int argc, char **argv)
             fetchedTor.setCodecName(codecForTr);
             processProjects(true, true, proFiles, options, QByteArray(),
                             targetLanguage, sourceLanguage, &fetchedTor, &fail);
-            updateTsFiles(fetchedTor, tsFileNames, codecForTr,
+            updateTsFiles(fetchedTor, tsFileNames, !codecForTr.isEmpty(),
                           sourceLanguage, targetLanguage, options, &fail);
         } else {
             processProjects(true, false, proFiles, options, QByteArray(),
diff --git a/tools/linguist/shared/translator.h b/tools/linguist/shared/translator.h
index 0fcd598..0b88c07 100644
--- a/tools/linguist/shared/translator.h
+++ b/tools/linguist/shared/translator.h
@@ -153,6 +153,7 @@ public:
     void reportDuplicates(const Duplicates &dupes, const QString &fileName, bool verbose);
 
     void setCodecName(const QByteArray &name);
+    void setCodec(QTextCodec *codec) { m_codec = codec; }
     QByteArray codecName() const;
     QTextCodec *codec() const { return m_codec; }
 
-- 
cgit v0.12