KUrl to QUrl port

Milian Wolff mail at milianw.de
Sat Sep 13 14:29:20 UTC 2014


Hello all!

At Akademy, I spent the last 2 days or so porting our code from KUrl to QUrl. 
This is pretty tricky as we use URLs in (too) many places of our API. Locally, 
I have it now compiling and it even seems to work OK. I'll rebase it on the 
recent changes today and then push it. Some notes below, please read.

NOTE: I won't have time to port all external plugins! Please take care of this 
if you maintain a plugin. If you need help, please ask here on the list.

Porting notes:

The most important thing is to make the QUrl <=> QString() conversion 
explicit. That can be done via add_definitions(-DQT_NO_URL_CAST_FROM_STRING).

Second step then is to use kde/kdesdk/kde-dev-scripts/kf5/convert-kurl.pl on 
your files. This will do the most tedious porting work for you. But it's by 
far not enough. You'll have to review all changes.

In general, if you do not have to interact with QUrl API, prefer 
KDevelop::Path if possible. This is trivial to port to, as it mimicks the KUrl 
API nearly 1-to-1.

If you are only interested in local files, QDir and QFileInfo are also good 
options to use.

When you do need QUrl's, then here are some remarks:

Never do QUrl(IndexedString(...).str()). Always use IndexedString.toUrl().

Nearly use QUrl(QString). Only do this if you want to create a relative URL 
which you then pass to QUrl::resolved or similar. Otherwise e.g. a 
QUrl("/foo/bar") would create a relative URL, not an absolute local file URL. 
I've added checks for that in many central places, so if you do something 
wrong, you'll hopefully get an assertion. In general, prefer 
QUrl::fromLocalFile where appropriate, or QUrl::fromUserInput otherwise.

Never use QUrl::resolved with a ".." to emulate KUrl::cdUp. Either use 
KIO::upUrl or use QUrl::adjusted(QUrl::RemoveFilename | 
QUrl::StripTrailingSlash).

During the port I noticed that we abuse QUrl in far too many places of our 
API. A long-term goal will be to refactor these places. The VCS subsystem e.g. 
uses QUrl to represent file paths, which is overkill and easy to get wrong 
(see above). KDevelop::Path would be a better choice here. In contrast, we'll 
need to refactor the WorkingSets code to use QUrl instead of QString for the 
"specifier" which gets stored there a lot. Finally, I really want to see an 
IndexedPath in our DUChain code to make that code more typesafe and explicit.

Bye
-- 
Milian Wolff
mail at milianw.de
http://milianw.de


More information about the KDevelop-devel mailing list