invalidate message index when inserting in the middle
authorOswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Mon, 27 Apr 2015 18:04:26 +0000 (20:04 +0200)
committerOswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Thu, 30 Apr 2015 09:22:43 +0000 (09:22 +0000)
subsequent offsets become invalid when a message is inserted in the
middle, so the index must be invalidated (adjusting the offsets on the
fly doesn't seem worth it).
also, there is no point in updating the index if it is already invalid.

Task-number: QTBUG-45831
Change-Id: I9733cb3235c6b8b09dee7eae4d2ecf0a0cdda528
Reviewed-by: hjk <hjk@theqtcompany.com>
src/linguist/shared/translator.cpp
tests/auto/linguist/lconvert/data/idxmerge-add.ts [new file with mode: 0644]
tests/auto/linguist/lconvert/data/idxmerge.ts [new file with mode: 0644]
tests/auto/linguist/lconvert/data/idxmerge.ts.out [new file with mode: 0644]
tests/auto/linguist/lconvert/tst_lconvert.cpp

index f976596..ad66663 100644 (file)
@@ -187,7 +187,12 @@ void Translator::extend(const TranslatorMessage &msg, ConversionData &cd)
 
 void Translator::insert(int idx, const TranslatorMessage &msg)
 {
-    addIndex(idx, msg);
+    if (m_indexOk) {
+        if (idx == m_messages.count())
+            addIndex(idx, msg);
+        else
+            m_indexOk = false;
+    }
     m_messages.insert(idx, msg);
 }
 
diff --git a/tests/auto/linguist/lconvert/data/idxmerge-add.ts b/tests/auto/linguist/lconvert/data/idxmerge-add.ts
new file mode 100644 (file)
index 0000000..bc4910a
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es_ES">
+<context>
+    <name>a</name>
+    <message>
+        <location filename="a.cpp" line="193"/>
+        <source>Second String</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="a.cpp" line="380"/>
+        <source>Duplicated String</source>
+        <translation></translation>
+    </message>
+</context>
+</TS>
diff --git a/tests/auto/linguist/lconvert/data/idxmerge.ts b/tests/auto/linguist/lconvert/data/idxmerge.ts
new file mode 100644 (file)
index 0000000..0784355
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es_ES">
+<context>
+    <name>a</name>
+    <message>
+        <location filename="a.cpp" line="93"/>
+        <source>First String</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="a.cpp" line="380"/>
+        <source>Duplicated String</source>
+        <translation></translation>
+    </message>
+</context>
+</TS>
diff --git a/tests/auto/linguist/lconvert/data/idxmerge.ts.out b/tests/auto/linguist/lconvert/data/idxmerge.ts.out
new file mode 100644 (file)
index 0000000..fa4c7dd
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="es_ES">
+<context>
+    <name>a</name>
+    <message>
+        <location filename="a.cpp" line="93"/>
+        <source>First String</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="a.cpp" line="193"/>
+        <source>Second String</source>
+        <translation></translation>
+    </message>
+    <message>
+        <location filename="a.cpp" line="380"/>
+        <source>Duplicated String</source>
+        <translation></translation>
+    </message>
+</context>
+</TS>
index d44de1e..98f92d1 100644 (file)
@@ -53,6 +53,7 @@ private slots:
     void chains_data();
     void chains();
 #endif
+    void merge();
 
 private:
     void doWait(QProcess *cvt, int stage);
@@ -327,6 +328,17 @@ void tst_lconvert::roundtrips()
     convertRoundtrip(fileName, stations, args);
 }
 
+void tst_lconvert::merge()
+{
+    QProcess cvt;
+    QStringList args;
+    args << (dataDir + "idxmerge.ts") << (dataDir + "idxmerge-add.ts");
+    cvt.start(binDir + "/lconvert", args, QIODevice::ReadWrite | QIODevice::Text);
+    doWait(&cvt, 1);
+    if (!QTest::currentTestFailed())
+        doCompare(&cvt, dataDir + "idxmerge.ts.out");
+}
+
 QTEST_APPLESS_MAIN(tst_lconvert)
 
 #include "tst_lconvert.moc"