[kdiff3] /: Fix behavior of preprocessor for sigle quotes
Michael Reeves
null at kde.org
Mon Jul 9 06:17:27 BST 2018
Git commit 311bf4ea4b5b4ee4b3c3b7fd46553cf60b3a45aa by Michael Reeves.
Committed on 09/07/2018 at 03:13.
Pushed by mreeves into branch 'master'.
Fix behavior of preprocessor for sigle quotes
The distinction between single and double quotes is purly a command
shell issue. So silently convert to double quotes.
Also change escaping to QTs non-standard form for double quotes if
contained in single quotes.
BUG: 209885
FIXED-IN: 1.7
M +0 -2 doc/en/index.docbook
M +23 -2 src/pdiff.cpp
https://commits.kde.org/kdiff3/311bf4ea4b5b4ee4b3c3b7fd46553cf60b3a45aa
diff --git a/doc/en/index.docbook b/doc/en/index.docbook
index 0437893..5770710 100644
--- a/doc/en/index.docbook
+++ b/doc/en/index.docbook
@@ -1130,8 +1130,6 @@ Note that the following examples assume that the <command>sed</command>-command
directory in the PATH-environment variable. If this is not the case, you have to specify the full absolute
path for the command.
</para>
-<note><para>Also note that the following examples use the single quotation mark (') which won't work for Windows.
-On Windows you should use the double quotation marks (") instead.</para></note>
<para>
In this context only the <command>sed</command>-substitute-command is used:
<screen>
diff --git a/src/pdiff.cpp b/src/pdiff.cpp
index 060a246..a19be99 100644
--- a/src/pdiff.cpp
+++ b/src/pdiff.cpp
@@ -2287,11 +2287,32 @@ void KDiff3App::slotNoRelevantChangesDetected()
//KMessageBox::information( this, "No relevant changes detected", "KDiff3" );
if(!m_pOptions->m_IrrelevantMergeCmd.isEmpty())
{
- QString cmd = m_pOptions->m_IrrelevantMergeCmd + " \"" + m_sd1.getAliasName() + "\" \"" + m_sd2.getAliasName() + "\" \"" + m_sd3.getAliasName();
+ QString cmd = m_pOptions->m_IrrelevantMergeCmd;
+ /*
+ QProcess doesn't check for single quotes and uses non-standard escaping syntax for double quotes.
+ The distinction between single and double quotes is purly a command shell issue. So
+ Silently convert quotes to what QProcess understands. Also convert '\"' to '"""'
+ */
+ //arg and arg1 can never both match but qt's pcre2 engine insists on unique naming anyway
+ const QRegularExpression argRe("(?<!\\\\)\"(?<arg>(?:[^\"]|(?<=\\\\)\")*)(?<!\\\\)\"|'(?<arg1>[^']*)'");
+ QRegularExpressionMatchIterator i = argRe.globalMatch(cmd);
+ QRegularExpressionMatch match;
+ QStringList args;
+
+ while(i.hasNext())
+ {
+ match = i.next();
+ args += match.captured("arg").replace("\\\"", "\"\"\"").replace("\\\\", "\\")
+ + match.captured("arg1");
+ }
+ args += m_sd1.getAliasName();
+ args += m_sd2.getAliasName();
+ args += m_sd3.getAliasName();
+ cmd = cmd.left(cmd.indexOf('"')).trimmed();
+
QProcess process;
process.start(cmd);
process.waitForFinished(-1);
- //::system( cmd.local8Bit() );
}
}
}
More information about the kde-doc-english
mailing list