diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 97916f17b..e8466d330 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -426,10 +426,10 @@ jobs: merge-multiple: true - name: Repackage xswiftbus run: | - 7z x -y xswiftbus-windows-64-*.7z - 7z x -y xswiftbus-linux-64-*.7z - 7z x -y xswiftbus-macos-64-*.7z - 7z a -y -mx=9 xswiftbus-fat-allos-${{ needs.preBuild.outputs.version }}.7z xswiftbus + unzip -o xswiftbus-windows-64-*.zip + unzip -o xswiftbus-linux-64-*.zip + unzip -o xswiftbus-macos-64-*.zip + zip -r -9 xswiftbus-fat-allos-${{ needs.preBuild.outputs.version }}.zip xswiftbus - name: Upload xswiftbus-fat uses: actions/upload-artifact@v4 with: diff --git a/cmake/install.cmake b/cmake/install.cmake index bea0fc40e..71b811dab 100644 --- a/cmake/install.cmake +++ b/cmake/install.cmake @@ -7,15 +7,6 @@ set(GENERAL_FILES ) install(FILES ${GENERAL_FILES} DESTINATION bin) -# 7za -if(SWIFT_WIN32) - install(FILES ${swift_SOURCE_DIR}/third_party/externals/win32-msvc/32/bin/7za.exe DESTINATION bin) -elseif(SWIFT_WIN64) - install(FILES ${swift_SOURCE_DIR}/third_party/externals/win32-msvc/64/bin/7za.exe DESTINATION bin) -elseif(APPLE) - install(FILES ${swift_SOURCE_DIR}/third_party/externals/macx-clang/64/bin/7za DESTINATION bin) -endif() - # Crashpad if(UNIX AND NOT APPLE) set(crashpad_handler_path ${swift_SOURCE_DIR}/third_party/externals/linux-g++/64/bin/swift_crashpad_handler) diff --git a/installer/installbuilder/swift-externals.xml b/installer/installbuilder/swift-externals.xml index 45931957c..0abae7f87 100644 --- a/installer/installbuilder/swift-externals.xml +++ b/installer/installbuilder/swift-externals.xml @@ -31,10 +31,6 @@ 1 ../../dist/bin/*opus*.dll - - 1 - ../../dist/bin/*7za.exe - @@ -50,11 +46,6 @@ ${installdir}/bin bin_osx osx - - - ../../dist/bin/7za - - lib diff --git a/scripts/build.py b/scripts/build.py index a36f43d04..0c891f3ea 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -14,6 +14,7 @@ import datastore import tarfile from lib.util import get_vs_env import utils +import zipfile class Builder: @@ -120,10 +121,19 @@ class Builder: build_path = self._get_swift_build_path() os.chdir(build_path) os_map = {'Linux': 'linux', 'Darwin': 'macos', 'Windows': 'windows'} - archive_name = '-'.join(['xswiftbus', os_map[platform.system()], self.word_size, self.version]) + '.7z' + archive_name = '-'.join(['xswiftbus', os_map[platform.system()], self.word_size, self.version]) + '.zip' archive_path = path.abspath(path.join(os.pardir, archive_name)) - content_path = path.abspath(path.join(utils.get_swift_source_path(), 'dist', 'xswiftbus')) - subprocess.check_call(['7z', 'a', '-mx=9', archive_path, content_path, "-xr!*.debug", "-xr!*.dSYM"], env=dict(os.environ)) + base_path = path.abspath(path.join(utils.get_swift_source_path(), 'dist')) + content_path = path.join(base_path, 'xswiftbus') + with zipfile.ZipFile(archive_path, 'w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zip_file: + for root, dirs, files in os.walk(content_path): + dirs[:] = [d for d in dirs if not d.endswith('.debug') and not d.endswith(".dSYM")] + for file in files: + if file.endswith(".debug") or file.endswith(".dSYM"): + continue + content_file_path = os.path.join(root, file) + arcname = os.path.join(os.path.relpath(os.path.dirname(content_file_path), base_path), file) + zip_file.write(content_file_path, arcname) def symbols(self, upload_symbols): """ diff --git a/src/gui/components/installxswiftbuscomponent.cpp b/src/gui/components/installxswiftbuscomponent.cpp index 6a4e23abd..40e9c3344 100644 --- a/src/gui/components/installxswiftbuscomponent.cpp +++ b/src/gui/components/installxswiftbuscomponent.cpp @@ -173,7 +173,7 @@ namespace swift::gui::components // if possible we will unzip QStringList stdOutAndError; - if (CCompressUtils::zip7Uncompress(destFile.absoluteFilePath(), xSwiftBusDirectory, &stdOutAndError)) + if (CCompressUtils::zipUncompress(destFile.absoluteFilePath(), xSwiftBusDirectory, &stdOutAndError)) { // capture values by copy! const CStatusMessage msg = diff --git a/src/misc/compressutils.cpp b/src/misc/compressutils.cpp index e6b93b2d5..aa9caa540 100644 --- a/src/misc/compressutils.cpp +++ b/src/misc/compressutils.cpp @@ -26,86 +26,54 @@ namespace swift::misc return lengthHeader; } - //! Returns the platform specific 7za command - QString getZip7Executable() - { - QString executable; - if (CBuildConfig::isRunningOnMacOSPlatform()) - { - executable += CSwiftDirectories::binDirectory(); - executable += '/'; - } - executable += QStringLiteral("7za"); - return executable; - } - - bool CCompressUtils::zip7Uncompress(const QString &file, const QString &directory, QStringList *stdOutAndError) + bool CCompressUtils::zipUncompress(const QString &file, const QString &directory, QStringList *stdOutAndError) { const QFileInfo fi(file); if (!fi.exists()) { return false; } - if (!CCompressUtils::hasZip7(stdOutAndError)) { return false; } + if (fi.suffix() != "zip") + { + if (stdOutAndError) { stdOutAndError->push_back("Not a zip file"); } + return false; + } const bool win = CBuildConfig::isRunningOnWindowsNtPlatform(); const QString d = directory.isEmpty() ? directory : win ? CFileUtils::toWindowsLocalPath(directory) : directory; const QString f = win ? CFileUtils::toWindowsLocalPath(file) : file; - // 7za.exe x -o"P:\Temp\XPlane" c:\Users\Foo\Downloads\xswiftbus-allos-0.8.4.802111947.7z - - QStringList args; - args << "x"; - args << "-aoa"; - if (!d.isEmpty()) { args << "-o" + d; } - args << f; - QProcess zipProcess; - zipProcess.setProgram(getZip7Executable()); - zipProcess.setArguments(args); - return runZip7Process(&zipProcess, stdOutAndError); - } - bool CCompressUtils::hasZip7(QStringList *stdOutAndError) - { - // just display info - if (CBuildConfig::isRunningOnLinuxPlatform()) { return CCompressUtils::whichZip7(stdOutAndError); } - - QStringList args; - args << "i"; - QProcess zipProcess; - zipProcess.setProgram(getZip7Executable()); - zipProcess.setArguments(args); - return runZip7Process(&zipProcess, stdOutAndError); - } - - bool CCompressUtils::whichZip7(QStringList *stdOutAndError) - { - const QString cmd("which 7za"); - QProcess zipProcess; - zipProcess.start(cmd); - if (!zipProcess.waitForStarted()) { return false; } - if (!zipProcess.waitForFinished()) { return false; } - - const QString pStdout = zipProcess.readAllStandardOutput(); - const QString pStderr = zipProcess.readAllStandardError(); - if (stdOutAndError) + if constexpr (CBuildConfig::isRunningOnWindowsNtPlatform()) { - stdOutAndError->clear(); - stdOutAndError->push_back(pStdout); - stdOutAndError->push_back(pStderr); + zipProcess.setProgram("powershell"); + QStringList args; + args << "-Command"; + args << "Expand-Archive"; + args << "-Path" << f; + if (!d.isEmpty()) { args << "-DestinationPath" << d; } + args << "-Force"; + zipProcess.setArguments(args); } - const int r = zipProcess.exitCode(); - return r == 0 && pStdout.contains("7za", Qt::CaseInsensitive); + else + { + zipProcess.setProgram("unzip"); + QStringList args; + args << f; + if (!d.isEmpty()) { args << "-d" << d; } + zipProcess.setArguments(args); + } + return runZipProcess(&zipProcess, stdOutAndError); } - bool CCompressUtils::runZip7Process(QProcess *zipProcess, QStringList *stdOutAndError) + bool CCompressUtils::runZipProcess(QProcess *zipProcess, QStringList *stdOutAndError) { zipProcess->start(); - // If process does not even start, e.g. because no 7za exe found. + // If process does not even start, e.g. because unzip program found. if (!zipProcess->waitForStarted()) { if (stdOutAndError) { - stdOutAndError->push_back("7za"); + stdOutAndError->push_back("unzip"); stdOutAndError->push_back("Command not found"); } return false; @@ -116,7 +84,7 @@ namespace swift::misc { if (stdOutAndError) { - stdOutAndError->push_back("7za"); + stdOutAndError->push_back("unzip"); stdOutAndError->push_back("Process did not finish."); } return false; @@ -131,6 +99,6 @@ namespace swift::misc stdOutAndError->push_back(pStderr); } - return zipProcess->exitStatus() == QProcess::NormalExit; + return zipProcess->exitStatus() == QProcess::NormalExit && zipProcess->exitCode() == 0; } } // namespace swift::misc diff --git a/src/misc/compressutils.h b/src/misc/compressutils.h index 9fcfb122a..c76c26969 100644 --- a/src/misc/compressutils.h +++ b/src/misc/compressutils.h @@ -25,21 +25,11 @@ namespace swift::misc //! \remark 4 bytes -> 32bit static QByteArray lengthHeader(qint32 size); - //! Unzip my using 7zip - //! \remark relies on external 7zip command line - static bool zip7Uncompress(const QString &file, const QString &directory, - QStringList *stdOutAndError = nullptr); - - //! External program existing? - //! \remark relies on external 7zip command line - static bool hasZip7(QStringList *stdOutAndError = nullptr); - - //! Uses which to determine if 7Zip exists - //! \remark for UNIX systems, using which - static bool whichZip7(QStringList *stdOutAndError = nullptr); + //! Unzip file + static bool zipUncompress(const QString &file, const QString &directory, QStringList *stdOutAndError = nullptr); private: - static bool runZip7Process(QProcess *zipProcess, QStringList *stdOutAndError); + static bool runZipProcess(QProcess *zipProcess, QStringList *stdOutAndError); }; } // namespace swift::misc diff --git a/tests/misc/testcompress/testcompress.cpp b/tests/misc/testcompress/testcompress.cpp index 6e300a9de..dd975dd71 100644 --- a/tests/misc/testcompress/testcompress.cpp +++ b/tests/misc/testcompress/testcompress.cpp @@ -49,26 +49,14 @@ namespace MiscTest tempDir.setAutoRemove(true); QVERIFY2(tempDir.isValid(), "Invalid directory"); - const bool win = CBuildConfig::isRunningOnWindowsNtPlatform(); - const bool zip7Exists = CCompressUtils::hasZip7(); - if (!win && !zip7Exists) - { - QSKIP("No 7zip, skipping"); - return; - } - - QVERIFY2(zip7Exists, "No 7zip"); - const QString td = tempDir.path(); - const QString compressedFile( - CFileUtils::appendFilePaths(CSwiftDirectories::shareTestDirectory(), "countries.json.gz")); - const QString unCompressedFile(CFileUtils::appendFilePaths(td, "countries.json")); - const bool c = CCompressUtils::zip7Uncompress(compressedFile, td); + const QString compressedFile(CFileUtils::appendFilePaths(CSwiftDirectories::shareTestDirectory(), "test.zip")); + const QString unCompressedFile(CFileUtils::appendFilePaths(td, "1.txt")); + const bool c = CCompressUtils::zipUncompress(compressedFile, td); QVERIFY2(c, "Uncompressing failed"); const QFileInfo check(unCompressedFile); - QVERIFY2(check.size() > 1000, "Uncompressing yielded not data"); QVERIFY2(check.exists(), "Uncompressed file does not exist"); QVERIFY2(check.isReadable(), "Not readable");