# HG changeset patch # User Chris Cannam # Date 1544003050 0 # Node ID 88fa1544b4077865c42633a422aaff2e734ef260 # Parent 88061103b878d5f2a9b7bb57a5029087c812e2ce# Parent ce29dc7756508b4c7c2eb40dec00ceeeb4ac2822 Merge from branch qt5. There's much more to be done before we can make another release, but clearly it's going to be done using qt5 diff -r 88061103b878 -r 88fa1544b407 deploy/osx/Info.plist --- a/deploy/osx/Info.plist Wed Mar 23 14:49:49 2016 +0000 +++ b/deploy/osx/Info.plist Wed Dec 05 09:44:10 2018 +0000 @@ -14,5 +14,11 @@ org.easymercurial.EasyMercurial CFBundleShortVersionString EASYHG_VERSION + + + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True diff -r 88061103b878 -r 88fa1544b407 deploy/osx/build-all.sh --- a/deploy/osx/build-all.sh Wed Mar 23 14:49:49 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -#!/bin/bash - -# Carbon (10.4+ PPC/i386). -# -$HOME/qt-builds/qt-471-carbon-10.4u/bin/qmake -spec macx-g++40 || exit -make clean && make && \ - cp EasyMercurial.app/Contents/MacOS/EasyMercurial \ - EasyMercurial.carbon.app/Contents/MacOS/ && \ - bash deploy/osx/paths.sh EasyMercurial.carbon - -# Cocoa (10.6+ x86_64) -# -/usr/bin/qmake -spec macx-g++ || exit -make clean && make && \ - cp EasyMercurial.app/Contents/MacOS/EasyMercurial \ - EasyMercurial.cocoa.app/Contents/MacOS/ && \ - bash deploy/osx/paths.sh EasyMercurial.cocoa - -# Complicated lipo business -# -bash deploy/osx/combine.sh || exit 1 - -# Info.plist etc and make dmg -bash deploy/osx/deploy.sh EasyMercurial.app EasyMercurial - - - - diff -r 88061103b878 -r 88fa1544b407 deploy/osx/combine.sh --- a/deploy/osx/combine.sh Wed Mar 23 14:49:49 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -#!/bin/bash -app=EasyMercurial -if [ ! -d "$app.carbon.app" ] || [ ! -d "$app.cocoa.app" ]; then - echo Carbon or Cocoa bundle not found - exit 1 -fi -(cd "$app.cocoa.app" ; find . -type f -print) | while read f; do - d=$(dirname "$f") - mkdir -p "$app.app/$d" - case $(file "$app.cocoa.app/$f") in - *universal*x86_64*) - lipo "$app.cocoa.app/$f" -extract x86_64 -output "/tmp/$$.x86_64";; - *x86_64*) - lipo "$app.cocoa.app/$f" -create -output "/tmp/$$.x86_64";; - *) - cp "$app.cocoa.app/$f" "$app.app/$f" - continue;; - esac - case $(file "$app.carbon.app/$f") in - *x86_64*) - lipo "$app.carbon.app/$f" -remove x86_64 -output "/tmp/$$.rest" - ;; - *universal*) - cp "$app.carbon.app/$f" "/tmp/$$.rest" - ;; - *) - lipo "$app.carbon.app/$f" -create -output "/tmp/$$.rest" - ;; - esac - lipo "/tmp/$$.x86_64" "/tmp/$$.rest" -create -output "$app.app/$f" - rm "/tmp/$$".* -done - - diff -r 88061103b878 -r 88fa1544b407 deploy/osx/deploy.sh --- a/deploy/osx/deploy.sh Wed Mar 23 14:49:49 2016 +0000 +++ b/deploy/osx/deploy.sh Wed Dec 05 09:44:10 2018 +0000 @@ -1,5 +1,7 @@ #!/bin/bash +set -e + # Execute this from the top-level directory of the project (the one # that contains the .app bundle). Supply the name of the .app bundle # as argument (the target will use $app.app regardless, but we need @@ -13,6 +15,8 @@ fi app=EasyMercurial +set -u + version=`perl -p -e 's/^[^"]*"([^"]*)".*$/$1/' src/version.h` case "$version" in [0-9].[0-9]) bundleVersion="$version".0 ;; @@ -21,6 +25,36 @@ esac echo +echo "Copying in frameworks and plugins from Qt installation directory." + +deploy/osx/copy-qt.sh "$app" || exit 2 + +echo +echo "Fixing up paths." + +deploy/osx/paths.sh "$app" + +echo +echo "Copying in qt.conf to set local-only plugin paths." +echo "Make sure all necessary Qt plugins are in $source/Contents/plugins/*" +echo "You probably want platforms/, accessible/ and imageformats/ subdirectories." +cp deploy/osx/qt.conf "$source"/Contents/Resources/qt.conf + +echo "Writing version $bundleVersion in to bundle." +echo "(This should be a three-part number: major.minor.point)" + +perl -p -e "s/EASYHG_VERSION/$bundleVersion/" deploy/osx/Info.plist \ + > "$source"/Contents/Info.plist + +echo "Done: check $source/Contents/Info.plist for sanity please" + +echo +echo "Copying in helper scripts" +cp easyhg-extdiff.sh "$source"/Contents/MacOS/ +cp easyhg-merge.sh "$source"/Contents/MacOS/ +chmod +x "$source"/Contents/MacOS/easyhg-extdiff.sh "$source"/Contents/MacOS/easyhg-merge.sh + +echo echo "Making target tree." volume="$app"-"$version" @@ -31,17 +65,11 @@ ln -s /Applications "$volume"/Applications cp COPYING "$volume/COPYING.txt" -cp -RPp "$source" "$target" +cp -rp "$source" "$target" echo "Done" -echo "Writing version $bundleVersion in to bundle." -echo "(This should be a three-part number: major.minor.point)" - -perl -p -e "s/EASYHG_VERSION/$bundleVersion/" deploy/osx/Info.plist \ - > "$target"/Contents/Info.plist - -echo "Done: check $target/Contents/Info.plist for sanity please" +deploy/osx/sign.sh "$volume" || exit 1 echo echo "Making dmg..." diff -r 88061103b878 -r 88fa1544b407 deploy/osx/extract-leopard.sh --- a/deploy/osx/extract-leopard.sh Wed Mar 23 14:49:49 2016 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -mkdir -p 10.5/src -cd 10.5 -cp -a ../EasyMercurial.app . -lipo ../EasyMercurial.app/Contents/MacOS/EasyMercurial -remove x86_64 -output ./EasyMercurial.app/Contents/MacOS/EasyMercurial -cp -a ../src/version.h src/ -cp -a ../COPYING . -bash ../deploy/osx/deploy.sh EasyMercurial.app EasyMercurial_leopard -cp *_leopard*.dmg .. -cd .. -rm -r 10.5 -echo Done - - diff -r 88061103b878 -r 88fa1544b407 deploy/osx/paths.sh --- a/deploy/osx/paths.sh Wed Mar 23 14:49:49 2016 +0000 +++ b/deploy/osx/paths.sh Wed Dec 05 09:44:10 2018 +0000 @@ -1,5 +1,7 @@ #!/bin/bash +set -e + app="$1" if [ -z "$app" ]; then echo "Usage: $0 " @@ -7,28 +9,68 @@ exit 2 fi +set -u + +frameworks="QtCore QtNetwork QtGui QtWidgets QtPrintSupport QtDBus" + echo -echo "I expect you to have already copied QtCore, QtNetwork and QtGui to " -echo "$app.app/Contents/Frameworks and PyQt4/QtCore.so and PyQt4/QtGui.so to " -echo "$app.app/Contents/MacOS -- expect errors to follow if they're missing" +echo "I expect you to have already copied these frameworks from the Qt installation to" +echo "$app.app/Contents/Frameworks -- expect errors to follow if they're missing:" +echo "$frameworks" echo echo "Fixing up loader paths in binaries..." -install_name_tool -id QtCore "$app.app/Contents/Frameworks/QtCore" -install_name_tool -id QtGui "$app.app/Contents/Frameworks/QtGui" -install_name_tool -id QtNetwork "$app.app/Contents/Frameworks/QtNetwork" +for fwk in $frameworks; do + install_name_tool -id $fwk "$app.app/Contents/Frameworks/$fwk" +done -for fwk in QtCore QtGui QtNetwork; do - find "$app.app" -type f -print | while read x; do - current=$(otool -L "$x" | grep "$fwk" | grep ramework | awk '{ print $1; }') - [ -z "$current" ] && continue - echo "$x has $current" - relative=$(echo "$x" | sed -e "s,$app.app/Contents/,," \ - -e 's,[^/]*/,../,g' -e 's,/[^/]*$,/Frameworks/'"$fwk"',' ) - echo "replacing with relative path $relative" - install_name_tool -change "$current" "@loader_path/$relative" "$x" - done +find "$app.app" -name \*.dylib -print | while read x; do + install_name_tool -id "`basename \"$x\"`" "$x" +done + +for fwk in $frameworks; do + find "$app.app" -type f -print | while read x; do + + current=$(otool -L "$x" | + grep "$fwk" | grep amework | grep -v ':$' | + awk '{ print $1; }') + + [ -z "$current" ] && continue + + echo "$x has $current" + + case "$x" in + *PyQt4*) + # These are "special" Qt4 libraries used by + # the PyQt module. They need to refer to their + # own local neighbours. Ugh, but let's handle + # those manually here. + relative="$fwk.so" + ;; + *) + # The normal Qt5 case + relative=$(echo "$x" | + sed -e "s,$app.app/Contents/,," \ + -e 's,[^/]*/,../,g' \ + -e 's,/[^/]*$,/Frameworks/'"$fwk"',' ) + ;; + esac + + echo "replacing with relative path $relative" + install_name_tool -change \ + "$current" "@loader_path/$relative" "$x" + done +done + +find "$app.app" -type f -print | while read x; do + qtdep=$(otool -L "$x" | grep Qt | grep amework | grep -v ':$' | grep -v '@loader_path' | awk '{ print $1; }') + if [ -n "$qtdep" ]; then + echo + echo "ERROR: File $x depends on Qt framework(s) not apparently present in the bundle:" + echo $qtdep + exit 1 + fi done echo "Done: be sure to run the app and see that it works!" diff -r 88061103b878 -r 88fa1544b407 easyhg.pro --- a/easyhg.pro Wed Mar 23 14:49:49 2016 +0000 +++ b/easyhg.pro Wed Dec 05 09:44:10 2018 +0000 @@ -5,23 +5,7 @@ TARGET = EasyMercurial QT += widgets -QMAKE_CXXFLAGS += -DQT_DISABLE_DEPRECATED_BEFORE=0x000000 -# We use the 10.5 SDK and Carbon for all 32-bit OS/X, -# and 10.6 with Cocoa for all 64-bit. (Since EasyHg 1.2, -# we can sadly no longer build for 10.4 because we need -# the FSEvents API) -macx-g++40 { - # Note, to use the 10.4 SDK on 10.6+ you need qmake -spec macx-g++40 - QMAKE_MAC_SDK = /Developer/SDKs/MacOSX10.5.sdk - QMAKE_CFLAGS += -mmacosx-version-min=10.5 - QMAKE_CXXFLAGS += -mmacosx-version-min=10.5 - CONFIG += x86 ppc -} -macx-g++ { - QMAKE_MAC_SDK = /Developer/SDKs/MacOSX10.6.sdk - CONFIG += x86_64 -} macx-llvm { CONFIG += x86_64 QMAKE_CFLAGS += -mmacosx-version-min=10.6 diff -r 88061103b878 -r 88fa1544b407 src/changesetdetailitem.cpp --- a/src/changesetdetailitem.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/changesetdetailitem.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -65,14 +65,13 @@ void ChangesetDetailItem::paint(QPainter *paint, - const QStyleOptionGraphicsItem *option, - QWidget *w) + const QStyleOptionGraphicsItem *, + QWidget *) { paint->save(); ColourSet *colourSet = ColourSet::instance(); QColor branchColour = colourSet->getColourFor(m_changeset->branch()); - QColor userColour = colourSet->getColourFor(m_changeset->author()); QTransform t = paint->worldTransform(); float scale = std::min(t.m11(), t.m22()); @@ -105,15 +104,6 @@ pts.push_back(QPointF(0, height/3 - 5)); paint->drawPolygon(QPolygonF(pts)); -/* - paint->setBrush(branchColour); - QVector pts; - pts.push_back(QPointF(width/2 - 5, 0)); - pts.push_back(QPointF(width/2 + 5, 0)); - pts.push_back(QPointF(width/2, -10)); - pts.push_back(QPointF(width/2 - 5, 0)); - paint->drawPolygon(QPolygonF(pts)); -*/ m_doc->drawContents(paint, r); paint->restore(); diff -r 88061103b878 -r 88fa1544b407 src/changesetitem.cpp --- a/src/changesetitem.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/changesetitem.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -513,7 +513,6 @@ f.setPixelSize(ps); } - bool showText = (scale >= 0.2); bool showProperLines = (scale >= 0.1); if (!showProperLines) { diff -r 88061103b878 -r 88fa1544b407 src/common.cpp --- a/src/common.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/common.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -299,7 +299,7 @@ // chars: replace with Unicode character if (i+5 < s.length() && s[i] == '\\' && s[i+1] == 'u') { QString uni = s.mid(i+2, 4); - QByteArray ba = QByteArray::fromHex(uni.toAscii()); + QByteArray ba = QByteArray::fromHex(uni.toLatin1()); d += QChar(ba[1], ba[0]); i += 5; continue; diff -r 88061103b878 -r 88fa1544b407 src/debug.cpp --- a/src/debug.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/debug.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include @@ -41,8 +41,8 @@ prefix = new char[20]; sprintf(prefix, "[%lu]", (unsigned long)QCoreApplication::applicationPid()); QString logFileName = QDir::homePath() + "/.easyhg.log"; // the fallback - QString logDir = QDesktopServices::storageLocation - (QDesktopServices::DataLocation); + QString logDir = QStandardPaths::writableLocation + (QStandardPaths::DataLocation); if (logDir != "" && (QDir(logDir).exists() || QDir().mkpath(logDir))) { diff -r 88061103b878 -r 88fa1544b407 src/hgrunner.cpp --- a/src/hgrunner.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/hgrunner.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -22,7 +22,7 @@ #include #include -#include +#include #include #include #include @@ -411,7 +411,7 @@ emit commandCompleted(completedAction, m_stdout); } else { DEBUG << "HgRunner::finished: Command failed, exit code " - << procExitCode << ", exit status " << procExitStatus + << procExitCode << ", exit status " << int(procExitStatus) << ", stderr follows" << endl; DEBUG << m_stderr << endl; emit commandFailed(completedAction, m_stderr, m_stdout); @@ -454,8 +454,8 @@ void HgRunner::pruneOldAuthFiles() { - QString path = QDesktopServices::storageLocation - (QDesktopServices::CacheLocation); + QString path = QStandardPaths::writableLocation + (QStandardPaths::CacheLocation); QDir d(path); if (!d.exists()) return; QStringList filters; @@ -489,8 +489,8 @@ } QString fileExt16 = QString::fromLocal8Bit(fileExt.toBase64()).left(16) .replace('+', '-').replace('/', '_'); - QString path = QDesktopServices::storageLocation - (QDesktopServices::CacheLocation); + QString path = QStandardPaths::writableLocation + (QStandardPaths::CacheLocation); QDir().mkpath(path); if (path == "") { DEBUG << "HgRunner::addExtensionOptions: Failed to get cache location" << endl; diff -r 88061103b878 -r 88fa1544b407 src/historywidget.cpp --- a/src/historywidget.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/historywidget.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -219,8 +219,6 @@ setChangesetParents(); ChangesetScene *scene = new ChangesetScene(); - ChangesetItem *tipItem = 0; - QGraphicsScene *oldScene = m_panned->scene(); m_panned->setScene(0); diff -r 88061103b878 -r 88fa1544b407 src/mainwindow.cpp --- a/src/mainwindow.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/mainwindow.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -858,7 +858,7 @@ hgRefresh(); } -void MainWindow::hgUnIgnoreFiles(QStringList files) +void MainWindow::hgUnIgnoreFiles(QStringList) { // Not implemented: edit the .hgignore instead hgEditIgnore(); @@ -2048,7 +2048,7 @@ output); } -void MainWindow::commandStarting(HgAction action) +void MainWindow::commandStarting(HgAction) { m_commandSequenceInProgress = true; } @@ -2591,7 +2591,7 @@ } } -void MainWindow::commandCancelled(HgAction cancelledAction) +void MainWindow::commandCancelled(HgAction) { // Originally I had this checking whether the cancelled action was // a network one and, if so, calling hgQueryPaths to update the @@ -3115,9 +3115,6 @@ spacerBefore = spacerAfter = " "; #endif - bool spacingReqd = false; - QString spacer = ""; - m_repoToolBar = addToolBar(tr("Remote")); m_repoToolBar->setIconSize(QSize(sz, sz)); if (spacerBefore != "") { diff -r 88061103b878 -r 88fa1544b407 src/multichoicedialog.cpp --- a/src/multichoicedialog.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/multichoicedialog.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -221,14 +221,14 @@ } void -MultiChoiceDialog::urlChanged(const QString &s) +MultiChoiceDialog::urlChanged(const QString &) { updateOkButton(); updateFileComboFromURL(); } void -MultiChoiceDialog::fileChanged(const QString &s) +MultiChoiceDialog::fileChanged(const QString &) { updateOkButton(); } diff -r 88061103b878 -r 88fa1544b407 src/panned.cpp --- a/src/panned.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/panned.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -88,7 +88,7 @@ } void -Panned::drawForeground(QPainter *paint, const QRectF &) +Panned::drawForeground(QPainter *, const QRectF &) { QPointF nearpt = mapToScene(0, 0); QPointF farpt = mapToScene(width(), height()); @@ -222,6 +222,10 @@ m_dragDirection = FreeDrag; } break; + + case FreeDrag: + // stick with it + break; }; } diff -r 88061103b878 -r 88fa1544b407 src/versiontester.cpp --- a/src/versiontester.cpp Wed Mar 23 14:49:49 2016 +0000 +++ b/src/versiontester.cpp Wed Dec 05 09:44:10 2018 +0000 @@ -20,24 +20,30 @@ #include -#include +#include + +static QNetworkAccessManager nm; VersionTester::VersionTester(QString hostname, QString versionFilePath, QString myVersion) : - m_httpFailed(false), - m_myVersion(myVersion) + m_myVersion(myVersion), + m_reply(0), + m_httpFailed(false) { - QHttp *http = new QHttp(); - connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), - this, SLOT(httpResponseHeaderReceived(const QHttpResponseHeader &))); - connect(http, SIGNAL(done(bool)), - this, SLOT(httpDone(bool))); - http->setHost(hostname); - http->get(versionFilePath); + QUrl url(QString("http://%1/%2").arg(hostname).arg(versionFilePath)); + std::cerr << "VersionTester: URL is " << url << std::endl; + m_reply = nm.get(QNetworkRequest(url)); + connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), + this, SLOT(error(QNetworkReply::NetworkError))); + connect(m_reply, SIGNAL(finished()), this, SLOT(finished())); } VersionTester::~VersionTester() { + if (m_reply) { + m_reply->abort(); + m_reply->deleteLater(); + } } bool @@ -66,31 +72,35 @@ } void -VersionTester::httpResponseHeaderReceived(const QHttpResponseHeader &h) +VersionTester::error(QNetworkReply::NetworkError) { - if (h.statusCode() / 100 != 2) m_httpFailed = true; + std::cerr << "VersionTester: error: " << m_reply->errorString() << std::endl; + m_httpFailed = true; } void -VersionTester::httpDone(bool error) +VersionTester::finished() { - QHttp *http = const_cast(dynamic_cast(sender())); - if (!http) return; - http->deleteLater(); - if (error || m_httpFailed) return; + m_reply->deleteLater(); + if (m_httpFailed) return; - QByteArray responseData = http->readAll(); + int status = m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + if (status / 100 != 2) { + std::cerr << "VersionTester: error: http status = " << status << std::endl; + return; + } + + QByteArray responseData = m_reply->readAll(); QString str = QString::fromUtf8(responseData.data()); QStringList lines = str.split('\n', QString::SkipEmptyParts); if (lines.empty()) return; QString latestVersion = lines[0]; DEBUG << "Comparing current version \"" << m_myVersion - << "\" with latest version \"" << latestVersion - << "\"" << endl; + << "\" with latest version \"" << latestVersion + << "\"" << endl; if (isVersionNewerThan(latestVersion, m_myVersion)) { emit newerVersionAvailable(latestVersion); } } - diff -r 88061103b878 -r 88fa1544b407 src/versiontester.h --- a/src/versiontester.h Wed Mar 23 14:49:49 2016 +0000 +++ b/src/versiontester.h Wed Dec 05 09:44:10 2018 +0000 @@ -21,8 +21,7 @@ #include #include #include - -class QHttpResponseHeader; +#include class VersionTester : public QObject { @@ -38,12 +37,13 @@ void newerVersionAvailable(QString); protected slots: - void httpResponseHeaderReceived(const QHttpResponseHeader &); - void httpDone(bool); + void finished(); + void error(QNetworkReply::NetworkError); private: + QString m_myVersion; + QNetworkReply *m_reply; bool m_httpFailed; - QString m_myVersion; }; #endif