summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-12-28 02:03:53 +0100
committerPetr Mrázek <peterix@gmail.com>2013-12-28 04:23:48 +0100
commit7652b3d64a63c587f520633364412345083210d4 (patch)
tree12d98c301aa931f20aee0875242bc762cf4d22d1
parent30d4f5981d3220386bd320534048594fc364d0e9 (diff)
downloadMultiMC-7652b3d64a63c587f520633364412345083210d4.tar
MultiMC-7652b3d64a63c587f520633364412345083210d4.tar.gz
MultiMC-7652b3d64a63c587f520633364412345083210d4.tar.lz
MultiMC-7652b3d64a63c587f520633364412345083210d4.tar.xz
MultiMC-7652b3d64a63c587f520633364412345083210d4.zip
Various updater fixes
Updater tests for path utils The updater now doesn't use splitpath on Windows (fixes problems with Windows XP) Fix up paths for the OSX updater - should now install the updates into the right place Fix translations install path - translation isntall and deploy should be fixed
-rw-r--r--CMakeLists.txt6
-rw-r--r--logic/updater/DownloadUpdateTask.cpp36
-rw-r--r--logic/updater/DownloadUpdateTask.h16
-rw-r--r--mmc_updater/src/FileUtils.cpp44
-rw-r--r--mmc_updater/src/tests/CMakeLists.txt19
-rw-r--r--mmc_updater/src/tests/TestFileUtils.cpp33
-rw-r--r--mmc_updater/src/tests/TestParseScript.cpp2
-rw-r--r--mmc_updater/src/tests/test.manifest27
-rw-r--r--mmc_updater/src/tests/test.rc28
-rw-r--r--tests/tst_DownloadUpdateTask.cpp19
10 files changed, 171 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7b371aa9..7c8087cc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -662,8 +662,12 @@ ELSE()
ENDIF()
add_custom_target (translations DEPENDS ${QM_FILES})
+IF(APPLE AND UNIX) ## OSX
+ install(FILES ${QM_FILES} DESTINATION MultiMC.app/Contents/MacOS/translations)
+ELSE()
+ install(FILES ${QM_FILES} DESTINATION translations)
+ENDIF()
-install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/translations)
# Tests
add_subdirectory(tests)
diff --git a/logic/updater/DownloadUpdateTask.cpp b/logic/updater/DownloadUpdateTask.cpp
index 057ca436..0b09ad2a 100644
--- a/logic/updater/DownloadUpdateTask.cpp
+++ b/logic/updater/DownloadUpdateTask.cpp
@@ -66,7 +66,7 @@ void DownloadUpdateTask::processChannels()
if (channel.id == channelId)
{
QLOG_INFO() << "Found matching channel.";
- m_cRepoUrl = preparePath(channel.url);
+ m_cRepoUrl = fixPathForTests(channel.url);
break;
}
}
@@ -207,8 +207,17 @@ bool DownloadUpdateTask::parseVersionInfo(const QByteArray &data, VersionFileLis
{
QJsonObject fileObj = fileValue.toObject();
+ QString file_path = fileObj.value("Path").toString();
+#ifdef Q_OS_MAC
+ // On OSX, the paths for the updater need to be fixed.
+ // basically, anything that isn't in the .app folder is ignored.
+ // everything else is changed so the code that processes the files actually finds
+ // them and puts the replacements in the right spots.
+ if(!fixPathForOSX(file_path))
+ continue;
+#endif
VersionFileEntry file{
- fileObj.value("Path").toString(), fileObj.value("Perms").toVariant().toInt(),
+ file_path , fileObj.value("Perms").toVariant().toInt(),
FileSourceList(), fileObj.value("MD5").toString(), };
QLOG_DEBUG() << "File" << file.path << "with perms" << file.mode;
@@ -221,12 +230,12 @@ bool DownloadUpdateTask::parseVersionInfo(const QByteArray &data, VersionFileLis
if (type == "http")
{
file.sources.append(
- FileSource("http", preparePath(sourceObj.value("Url").toString())));
+ FileSource("http", fixPathForTests(sourceObj.value("Url").toString())));
}
else if (type == "httpc")
{
file.sources.append(FileSource("httpc",
- preparePath(sourceObj.value("Url").toString()),
+ fixPathForTests(sourceObj.value("Url").toString()),
sourceObj.value("CompressionType").toString()));
}
else
@@ -491,7 +500,7 @@ bool DownloadUpdateTask::writeInstallScript(UpdateOperationList &opsList, QStrin
return true;
}
-QString DownloadUpdateTask::preparePath(const QString &path)
+QString DownloadUpdateTask::fixPathForTests(const QString &path)
{
if(path.startsWith("$PWD"))
{
@@ -502,6 +511,23 @@ QString DownloadUpdateTask::preparePath(const QString &path)
return path;
}
+bool DownloadUpdateTask::fixPathForOSX(QString &path)
+{
+ if(path.startsWith("MultiMC.app/"))
+ {
+ // remove the prefix and add a new, more appropriate one.
+ path.remove(0,12);
+ path = QString("../../") + path;
+ return true;
+ }
+ else
+ {
+ QLOG_ERROR() << "Update path not within .app: " << path;
+ return false;
+ }
+}
+
+
void DownloadUpdateTask::fileDownloadFinished()
{
emitSucceeded();
diff --git a/logic/updater/DownloadUpdateTask.h b/logic/updater/DownloadUpdateTask.h
index 79d73af3..d82b044f 100644
--- a/logic/updater/DownloadUpdateTask.h
+++ b/logic/updater/DownloadUpdateTask.h
@@ -198,7 +198,21 @@ protected:
* Filters paths
* Path of the format $PWD/path, it is converted to a file:///$PWD/ URL
*/
- static QString preparePath(const QString &path);
+ static QString fixPathForTests(const QString &path);
+
+ /*!
+ * Filters paths
+ * This fixes destination paths for OSX.
+ * The updater runs in MultiMC.app/Contents/MacOs by default
+ * The destination paths are such as this: MultiMC.app/blah/blah
+ *
+ * Therefore we chop off the 'MultiMC.app' prefix and prepend ../..
+ *
+ * Returns false if the path couldn't be fixed (is invalid)
+ *
+ * Has no effect on systems that aren't OSX
+ */
+ static bool fixPathForOSX(QString &path);
protected slots:
void vinfoDownloadFinished();
diff --git a/mmc_updater/src/FileUtils.cpp b/mmc_updater/src/FileUtils.cpp
index 10435e49..712c0c5d 100644
--- a/mmc_updater/src/FileUtils.cpp
+++ b/mmc_updater/src/FileUtils.cpp
@@ -10,6 +10,8 @@
#include <string.h>
#include <fstream>
#include <iostream>
+// this actually works with mingw32, which we use.
+#include <libgen.h>
#ifdef PLATFORM_UNIX
#include <unistd.h>
@@ -19,7 +21,6 @@
#include <sys/time.h>
#include <sys/stat.h>
#include <errno.h>
-#include <libgen.h>
#endif
FileUtils::IOException::IOException(const std::string& error)
@@ -249,59 +250,18 @@ void FileUtils::removeFile(const char* src) throw (IOException)
std::string FileUtils::fileName(const char* path)
{
-#ifdef PLATFORM_UNIX
char* pathCopy = strdup(path);
std::string basename = ::basename(pathCopy);
free(pathCopy);
return basename;
-#else
- char baseName[MAX_PATH];
- char extension[MAX_PATH];
- _splitpath_s(path,
- 0, /* drive */
- 0, /* drive length */
- 0, /* dir */
- 0, /* dir length */
- baseName,
- MAX_PATH, /* baseName length */
- extension,
- MAX_PATH /* extension length */
- );
- return std::string(baseName) + std::string(extension);
-#endif
}
std::string FileUtils::dirname(const char* path)
{
-#ifdef PLATFORM_UNIX
char* pathCopy = strdup(path);
std::string dirname = ::dirname(pathCopy);
free(pathCopy);
return dirname;
-#else
- char drive[3];
- char dir[MAX_PATH];
-
- _splitpath_s(path,
- drive, /* drive */
- 3, /* drive length */
- dir,
- MAX_PATH, /* dir length */
- 0, /* filename */
- 0, /* filename length */
- 0, /* extension */
- 0 /* extension length */
- );
-
- std::string result;
- if (drive[0])
- {
- result += std::string(drive);
- }
- result += dir;
-
- return result;
-#endif
}
void FileUtils::touch(const char* path) throw (IOException)
diff --git a/mmc_updater/src/tests/CMakeLists.txt b/mmc_updater/src/tests/CMakeLists.txt
index 1d62214e..79402245 100644
--- a/mmc_updater/src/tests/CMakeLists.txt
+++ b/mmc_updater/src/tests/CMakeLists.txt
@@ -29,13 +29,18 @@ endforeach()
# Add unit test binaries
macro(ADD_UPDATER_TEST CLASS)
- set(TEST_TARGET updater_${CLASS})
- add_executable(${TEST_TARGET} ${CLASS}.cpp)
- target_link_libraries(${TEST_TARGET} updatershared)
- add_test(NAME ${TEST_TARGET} COMMAND ${TEST_TARGET})
- if (APPLE)
- set_target_properties(${TEST_TARGET} PROPERTIES LINK_FLAGS "-framework Security -framework Cocoa")
- endif()
+ set(TEST_TARGET updater_${CLASS})
+ unset(srcs)
+ list(APPEND srcs ${CLASS}.cpp)
+ if (WIN32)
+ list(APPEND srcs ${CMAKE_CURRENT_SOURCE_DIR}/test.rc)
+ endif()
+ add_executable(${TEST_TARGET} ${srcs})
+ target_link_libraries(${TEST_TARGET} updatershared)
+ add_test(NAME ${TEST_TARGET} COMMAND ${TEST_TARGET})
+ if (APPLE)
+ set_target_properties(${TEST_TARGET} PROPERTIES LINK_FLAGS "-framework Security -framework Cocoa")
+ endif()
endmacro()
add_updater_test(TestParseScript)
diff --git a/mmc_updater/src/tests/TestFileUtils.cpp b/mmc_updater/src/tests/TestFileUtils.cpp
index 709acc5c..f8535a28 100644
--- a/mmc_updater/src/tests/TestFileUtils.cpp
+++ b/mmc_updater/src/tests/TestFileUtils.cpp
@@ -5,10 +5,39 @@
void TestFileUtils::testDirName()
{
+ std::string dirName;
+ std::string fileName;
+
#ifdef PLATFORM_WINDOWS
- std::string dirName = FileUtils::dirname("E:/Some Dir/App.exe");
- TEST_COMPARE(dirName,"E:/Some Dir/");
+ // absolute paths
+ dirName = FileUtils::dirname("E:/Some Dir/App.exe");
+ TEST_COMPARE(dirName,"E:/Some Dir");
+ fileName = FileUtils::fileName("E:/Some Dir/App.exe");
+ TEST_COMPARE(fileName,"App.exe");
+
+ dirName = FileUtils::dirname("C:/Users/kitteh/AppData/Local/Temp/MultiMC5-yidaaa/MultiMC.exe");
+ TEST_COMPARE(dirName,"C:/Users/kitteh/AppData/Local/Temp/MultiMC5-yidaaa");
+ fileName = FileUtils::fileName("C:/Users/kitteh/AppData/Local/Temp/MultiMC5-yidaaa/MultiMC.exe");
+ TEST_COMPARE(fileName,"MultiMC.exe");
+
+#else
+ // absolute paths
+ dirName = FileUtils::dirname("/home/tester/foo bar/baz");
+ TEST_COMPARE(dirName,"/home/tester/foo bar");
+ fileName = FileUtils::fileName("/home/tester/foo bar/baz");
+ TEST_COMPARE(fileName,"baz");
#endif
+ // current directory
+ dirName = FileUtils::dirname("App.exe");
+ TEST_COMPARE(dirName,".");
+ fileName = FileUtils::fileName("App.exe");
+ TEST_COMPARE(fileName,"App.exe");
+
+ // relative paths
+ dirName = FileUtils::dirname("Foo/App.exe");
+ TEST_COMPARE(dirName,"Foo");
+ fileName = FileUtils::fileName("Foo/App.exe");
+ TEST_COMPARE(fileName,"App.exe");
}
void TestFileUtils::testIsRelative()
diff --git a/mmc_updater/src/tests/TestParseScript.cpp b/mmc_updater/src/tests/TestParseScript.cpp
index f4453957..e8087b33 100644
--- a/mmc_updater/src/tests/TestParseScript.cpp
+++ b/mmc_updater/src/tests/TestParseScript.cpp
@@ -10,7 +10,7 @@ void TestParseScript::testParse()
{
UpdateScript script;
- script.parse("file_list.xml");
+ script.parse("mmc_updater/src/tests/file_list.xml");
TEST_COMPARE(script.isValid(),true);
}
diff --git a/mmc_updater/src/tests/test.manifest b/mmc_updater/src/tests/test.manifest
new file mode 100644
index 00000000..8b4dbb98
--- /dev/null
+++ b/mmc_updater/src/tests/test.manifest
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
+ <assemblyIdentity name="MultiMC.Test.0" type="win32" version="5.0.0.0" />
+ <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
+ <security>
+ <requestedPrivileges>
+ <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
+ </requestedPrivileges>
+ </security>
+ </trustInfo>
+ <dependency>
+ <dependentAssembly>
+ <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>
+ </dependentAssembly>
+ </dependency>
+ <description>Custom Minecraft launcher for managing multiple installs.</description>
+ <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+ <application>
+ <!--The ID below indicates app support for Windows Vista -->
+ <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
+ <!--The ID below indicates app support for Windows 7 -->
+ <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+ <!--The ID below indicates app support for Windows Developer Preview / Windows 8 -->
+ <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+ </application>
+ </compatibility>
+</assembly> \ No newline at end of file
diff --git a/mmc_updater/src/tests/test.rc b/mmc_updater/src/tests/test.rc
new file mode 100644
index 00000000..a288dba6
--- /dev/null
+++ b/mmc_updater/src/tests/test.rc
@@ -0,0 +1,28 @@
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+
+1 RT_MANIFEST "test.manifest"
+
+VS_VERSION_INFO VERSIONINFO
+FILEVERSION 1,0,0,0
+FILEOS VOS_NT_WINDOWS32
+FILETYPE VFT_APP
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "000004b0"
+ BEGIN
+ VALUE "CompanyName", "MultiMC Contributors"
+ VALUE "FileDescription", "Testcase"
+ VALUE "FileVersion", "1.0.0.0"
+ VALUE "ProductName", "MultiMC Testcase"
+ VALUE "ProductVersion", "5"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0000, 0x04b0 // Unicode
+ END
+END
diff --git a/tests/tst_DownloadUpdateTask.cpp b/tests/tst_DownloadUpdateTask.cpp
index f47552fe..3b2c6793 100644
--- a/tests/tst_DownloadUpdateTask.cpp
+++ b/tests/tst_DownloadUpdateTask.cpp
@@ -245,6 +245,25 @@ slots:
QVERIFY(succeededSpy.wait());
}
+
+ void test_OSXPathFixup()
+ {
+ QString path, pathOrig;
+ bool result;
+ // Proper OSX path
+ pathOrig = path = "MultiMC.app/Foo/Bar/Baz";
+ qDebug() << "Proper OSX path: " << path;
+ result = DownloadUpdateTask::fixPathForOSX(path);
+ QCOMPARE(path, QString("../../Foo/Bar/Baz"));
+ QCOMPARE(result, true);
+
+ // Bad OSX path
+ pathOrig = path = "translations/klingon.lol";
+ qDebug() << "Bad OSX path: " << path;
+ result = DownloadUpdateTask::fixPathForOSX(path);
+ QCOMPARE(path, pathOrig);
+ QCOMPARE(result, false);
+ }
};
QTEST_GUILESS_MAIN_MULTIMC(DownloadUpdateTaskTest)