From 1d2a430b807191e6b43fb3b44efb5b8afe747ccd Mon Sep 17 00:00:00 2001 From: Morten Borup Petersen Date: Sat, 2 Nov 2024 18:23:59 +0100 Subject: [PATCH 1/4] Slight refactor of DAN parse code Mostly NFC; this commit is mainly to get familiar with the codebase and to meet the people who will review these changes. I hope to make some changes to the DAN parsing code to eventually extract more metainfo from my aqualung divecomputer's `.zxu` formatted logs. To do so, and for me to be able to work on this efficiently, I've refactored the DAN parsing code using a bit more modern C++-style, as well as being more true-to-spec wrt. the (...ancient) DAN file format documentation that i could dig up... hopefully that's an alright tradeoff for the project. This more true-to-spec parsing also fixed a bug with the number being parsed from the incorrect index in the ZDH vector (or, atleast i consider it a bug - the "Export sequence" number was being used as the dive number, instead of the "Internal Dive Sequence" number. The latter, described in the spec as: `The sequence number assigned to the dive by the recording computer`). Also contains some unrelated formatting changes; i tried to keep these minimal (i presume these files haven't been touched in a while by `clang-format`). Signed-off-by: Morten Borup Petersen --- core/import-csv.cpp | 348 ++++++++++++++++++++++++++++---------------- core/xmlparams.cpp | 9 +- core/xmlparams.h | 3 +- dives/DL7.zxu | 6 +- tests/testparse.cpp | 9 +- 5 files changed, 238 insertions(+), 137 deletions(-) diff --git a/core/import-csv.cpp b/core/import-csv.cpp index 281653d6d..dcb43baad 100644 --- a/core/import-csv.cpp +++ b/core/import-csv.cpp @@ -1,21 +1,21 @@ -#include -#include #include #include +#include +#include +#include #include "dive.h" -#include "errorhelper.h" -#include "subsurface-string.h" #include "divelist.h" #include "divelog.h" +#include "errorhelper.h" #include "file.h" #include "format.h" -#include "parse.h" -#include "sample.h" -#include "divelist.h" #include "gettext.h" #include "import-csv.h" +#include "parse.h" #include "qthelper.h" +#include "sample.h" +#include "subsurface-string.h" #include "xmlparams.h" #define MATCH(buffer, pattern) \ @@ -107,18 +107,205 @@ static char *parse_dan_new_line(char *buf, const char *NL) } static int try_to_xslt_open_csv(const char *filename, std::string &mem, const char *tag); + +static int parse_csv_line(char *&ptr, const char *NL, char delim, std::vector &fields) +{ + char *line_end = strstr(ptr, NL); // Find the end of the line using the newline string + bool withNL = line_end; + + if (!line_end) { + // EOF - set line_end to end of 'ptr' + line_end = ptr + strlen(ptr); + } + + // Create a temporary pointer to traverse the line + char *field_start = ptr; + char *field_end = nullptr; + + // Skip leading delimiter + if (*field_start == delim) { + field_start++; + } else { + return report_error("DEBUG: No leading delimiter found"); + } + + while (field_start < line_end) { + // Find the next delimiter or end of line + field_end = static_cast(memchr(field_start, delim, line_end - field_start)); + + if (field_end) { + // If we found a delimiter, extract the field + fields.emplace_back(field_start, field_end - field_start); + // Move to the next character after the delimiter + field_start = field_end + 1; + } else { + // If no more delimiters, add the last field + fields.emplace_back(field_start, line_end - field_start); + break; + } + } + + // Update the pointer to point to the next line + ptr = line_end; + if (withNL) + ptr += strlen(NL); + return 0; +} + + +// Parses a line of DAN data fields (| separated). The provided 'fields' mapping +// will get filled with as many fields as are found in the line. +static int parse_dan_fields( + const char *NL, + std::map &fields, + char *&ptr) +{ + std::vector csv_fields; + if (parse_csv_line(ptr, NL, '|', csv_fields) < 0) + return -1; + + if (csv_fields.size() > fields.size()) { + report_info("DEBUG: More DAN fields than expected"); + return -1; + } + + for (size_t i = 0; i < csv_fields.size(); i++) { + fields[i] = csv_fields[i]; + } + + return 0; +} + + +// Parses the DAN ZDH dive header. +static int parse_dan_zdh(const char *NL, struct xml_params *params, char *&ptr) +{ + // Skip the leading 'ZDH' + ptr += 3; + + std::string temp; + + // Parse all fields - we only use a subset of them, but parse all for code maintain- and debugability. + enum ZDH_FIELD { + EXPORT_SEQUENCE, + INTERNAL_DIVE_SEQUENCE, + RECORD_TYPE, + RECORDING_INTERVAL, + LEAVE_SURFACE, + AIR_TEMPERATURE, + TANK_VOLUME, + O2_MODE, + REBREATHER_DILUENT_GAS, + ALTITUDE, + }; + std::map fields = { + {EXPORT_SEQUENCE, ""}, + {INTERNAL_DIVE_SEQUENCE, ""}, + {RECORD_TYPE, ""}, + {RECORDING_INTERVAL, ""}, + {LEAVE_SURFACE, ""}, + {AIR_TEMPERATURE, ""}, + {TANK_VOLUME, ""}, + {O2_MODE, ""}, + {REBREATHER_DILUENT_GAS, ""}, + {ALTITUDE, ""}, + }; + + if (parse_dan_fields(NL, fields, ptr) < 0) + return -1; + + // Add relevant fields to the XML parameters. + + // Parse date. 'leaveSurface' should (per the spec) be provided in + // the format "YYYYMMDDHHMMSS", but old code used to allow for just parsing + // the date... so we'll do that here as well. + auto &leaveSurface = fields[LEAVE_SURFACE]; + if (leaveSurface.length() >= 8) { + xml_params_add(params, "date", leaveSurface.substr(0, 8)); + } + + // Parse time with "1" prefix + if (leaveSurface.length() >= 14) { + std::string time_str = "1" + leaveSurface.substr(8, 6); + xml_params_add(params, "time", time_str); + } + + xml_params_add(params, "airTemp", fields[AIR_TEMPERATURE]); + xml_params_add(params, "diveNro", fields[INTERNAL_DIVE_SEQUENCE]); + + return 0; +} + +// Parse the DAN ZDT dive trailer. +static int parse_dan_zdt(const char *NL, struct xml_params *params, char *&ptr) +{ + // Skip the leading 'ZDT' + ptr += 3; + + enum ZDT_FIELD { + EXPORT_SEQUENCE, + INTERNAL_DIVE_SEQUENCE, + MAX_DEPTH, + REACH_SURFACE, + MIN_WATER_TEMP, + PRESSURE_DROP, + }; + + std::map fields = { + {EXPORT_SEQUENCE, ""}, + {INTERNAL_DIVE_SEQUENCE, ""}, + {MAX_DEPTH, ""}, + {REACH_SURFACE, ""}, + {MIN_WATER_TEMP, ""}, + {PRESSURE_DROP, ""}, + }; + + if (parse_dan_fields(NL, fields, ptr) < 0) + return -1; + + // Add relevant fields to the XML parameters. + xml_params_add(params, "waterTemp", fields[MIN_WATER_TEMP]); + + return 0; +} + +static int parse_dan_zdp(const char *NL, const char *filename, struct xml_params *params, char *&ptr, std::string &mem_csv) +{ + if (strncmp(ptr, "ZDP{", 4) != 0) + return report_error("DEBUG: Failed to find start of ZDP"); + + if (ptr && ptr[4] == '}') + return report_error(translate("gettextFromC", "No dive profile found from '%s'"), filename); + + ptr = parse_dan_new_line(ptr, NL); + if (!ptr) + return -1; + + // We're now in the ZDP segment. Look for the end of it. + char *end_ptr = strstr(ptr, "ZDP}"); + if (!end_ptr) { + return report_error("DEBUG: failed to find end of ZDP"); + } + + /* Copy the current dive data to start of mem_csv buffer */ + mem_csv = std::string(ptr, end_ptr - ptr); + + // Skip the trailing 'ZDP}' line. + ptr = end_ptr; + ptr = parse_dan_new_line(end_ptr, NL); + return 0; +} + static int parse_dan_format(const char *filename, struct xml_params *params, struct divelog *log) { - int ret = 0, i; - size_t end_ptr = 0; - char tmpbuf[MAXCOLDIGITS]; + int ret = 0; int params_orig_size = xml_params_count(params); char *ptr = NULL; const char *NL = NULL; - char *iter = NULL; auto [mem, err] = readfile(filename); + const char *end = mem.data() + mem.size(); if (err < 0) return report_error(translate("gettextFromC", "Failed to read '%s'"), filename); @@ -132,133 +319,36 @@ static int parse_dan_format(const char *filename, struct xml_params *params, str return -1; } - while ((end_ptr < mem.size()) && (ptr = strstr(mem.data() + end_ptr, "ZDH"))) { - xml_params_resize(params, params_orig_size); // restart with original parameter block - char *iter_end = NULL; - iter = ptr + 4; - iter = strchr(iter, '|'); - if (iter) { - memcpy(tmpbuf, ptr + 4, iter - ptr - 4); - tmpbuf[iter - ptr - 4] = 0; - xml_params_add(params, "diveNro", tmpbuf); - } + // Iteratively parse ZDH, ZDP and ZDT fields, which together comprise a list of dives. + while (ptr < end) { + xml_params_resize(params, params_orig_size); // Restart with original parameter block - //report_info("DEBUG: BEGIN end_ptr %d round %d <%s>", end_ptr, j++, ptr); - iter = ptr + 1; - for (i = 0; i <= 4 && iter; ++i) { - iter = strchr(iter, '|'); - if (iter) - ++iter; - } - - if (!iter) { - report_info("DEBUG: Data corrupt"); - return -1; - } - - /* Setting date */ - memcpy(tmpbuf, iter, 8); - tmpbuf[8] = 0; - xml_params_add(params, "date", tmpbuf); - - /* Setting time, gotta prepend it with 1 to - * avoid octal parsing (this is stripped out in - * XSLT */ - tmpbuf[0] = '1'; - memcpy(tmpbuf + 1, iter + 8, 6); - tmpbuf[7] = 0; - xml_params_add(params, "time", tmpbuf); - - /* Air temperature */ - memset(tmpbuf, 0, sizeof(tmpbuf)); - iter = strchr(iter, '|'); - - if (iter) { - iter = iter + 1; - iter_end = strchr(iter, '|'); - - if (iter_end) { - memcpy(tmpbuf, iter, iter_end - iter); - xml_params_add(params, "airTemp", tmpbuf); - } - } - - /* Search for the next line */ - if (iter) - iter = parse_dan_new_line(iter, NL); - if (!iter) - return -1; - - /* We got a trailer, no samples on this dive */ - if (strncmp(iter, "ZDT", 3) == 0) { - end_ptr = iter - mem.data(); - - /* Water temperature */ - memset(tmpbuf, 0, sizeof(tmpbuf)); - for (i = 0; i < 5 && iter; ++i) - iter = strchr(iter + 1, '|'); - - if (iter) { - iter = iter + 1; - iter_end = strchr(iter, '|'); - - if (iter_end) { - memcpy(tmpbuf, iter, iter_end - iter); - xml_params_add(params, "waterTemp", tmpbuf); - } - } - ret |= parse_xml_buffer(filename, "", 11, log, params); - continue; - } - - /* After ZDH we should get either ZDT (above) or ZDP */ - if (strncmp(iter, "ZDP{", 4) != 0) { - report_info("DEBUG: Input appears to violate DL7 specification"); - end_ptr = iter - mem.data(); - continue; - } - - if (ptr && ptr[4] == '}') - return report_error(translate("gettextFromC", "No dive profile found from '%s'"), filename); - - if (ptr) + // Locate the ZDH header. + while (strncmp(ptr, "ZDH", 3) != 0) { ptr = parse_dan_new_line(ptr, NL); - if (!ptr) - return -1; + if (!ptr) + return report_error("Expected ZDH header not found"); + } - end_ptr = ptr - mem.data(); + if (int ret = parse_dan_zdh(NL, params, ptr); ret < 0) + return ret; - /* Copy the current dive data to start of mem_csv buffer */ - std::string mem_csv(ptr, mem.size() - (ptr - mem.data())); + // Attempt to parse the ZDP field (optional) + std::string mem_csv; + if (strncmp(ptr, "ZDP", 3) == 0) { + if (int ret = parse_dan_zdp(NL, filename, params, ptr, mem_csv); ret < 0) + return ret; + } - ptr = strstr(mem_csv.data(), "ZDP}"); - if (ptr) { - *ptr = 0; + // Parse the mandatorty ZDT field + if (strncmp(ptr, "ZDT", 3) == 0) { + if (int ret = parse_dan_zdt(NL, params, ptr); ret < 0) + return ret; } else { - report_info("DEBUG: failed to find end ZDP"); - return -1; + return report_error("Expected ZDT trailer not found"); } - mem_csv.resize(ptr - mem_csv.data()); - end_ptr += ptr - mem_csv.data(); - iter = parse_dan_new_line(ptr + 1, NL); - if (iter && strncmp(iter, "ZDT", 3) == 0) { - /* Water temperature */ - memset(tmpbuf, 0, sizeof(tmpbuf)); - for (i = 0; i < 5 && iter; ++i) - iter = strchr(iter + 1, '|'); - - if (iter) { - iter = iter + 1; - iter_end = strchr(iter, '|'); - - if (iter_end) { - memcpy(tmpbuf, iter, iter_end - iter); - xml_params_add(params, "waterTemp", tmpbuf); - } - } - } if (try_to_xslt_open_csv(filename, mem_csv, "csv")) return -1; diff --git a/core/xmlparams.cpp b/core/xmlparams.cpp index 3ab6f1c4c..ca9c0fb52 100644 --- a/core/xmlparams.cpp +++ b/core/xmlparams.cpp @@ -18,12 +18,17 @@ void xml_params_resize(struct xml_params *params, int count) void xml_params_add(struct xml_params *params, const char *key, const char *value) { - params->items.push_back({ std::string(key), std::string(value) }); + xml_params_add(params, std::string(key), std::string(value)); +} + +void xml_params_add(struct xml_params *params, const std::string &key, const std::string &value) +{ + params->items.push_back({key, value}); } void xml_params_add_int(struct xml_params *params, const char *key, int value) { - params->items.push_back({ std::string(key), std::to_string(value) }); + params->items.push_back({std::string(key), std::to_string(value)}); } int xml_params_count(const struct xml_params *params) diff --git a/core/xmlparams.h b/core/xmlparams.h index e91a30ce0..146f9ca3e 100644 --- a/core/xmlparams.h +++ b/core/xmlparams.h @@ -18,9 +18,10 @@ extern struct xml_params *alloc_xml_params(); extern void free_xml_params(struct xml_params *params); extern void xml_params_resize(struct xml_params *params, int count); extern void xml_params_add(struct xml_params *params, const char *key, const char *value); +extern void xml_params_add(struct xml_params *params, const std::string &key, const std::string &value); extern void xml_params_add_int(struct xml_params *params, const char *key, int value); extern int xml_params_count(const struct xml_params *params); -extern const char *xml_params_get_key(const struct xml_params *params, int idx); // not stable +extern const char *xml_params_get_key(const struct xml_params *params, int idx); // not stable extern const char *xml_params_get_value(const struct xml_params *params, int idx); // not stable extern void xml_params_set_value(struct xml_params *params, int idx, const char *value); extern const char **xml_params_get(const struct xml_params *params); // not stable diff --git a/dives/DL7.zxu b/dives/DL7.zxu index 49700fcc7..4f6499651 100644 --- a/dives/DL7.zxu +++ b/dives/DL7.zxu @@ -9,6 +9,6 @@ ZDP{ |3300|10||||| |3600|0||||| ZDP} -ZDT|2|2|10.0|20180102110000|25|| -ZDH|3|3|I|QS|20180103101000|28|11|FO2||| -ZDT|3|3|10.0|20180103102000|26|| +ZDT|1|2|10.0|20180102110000|25|| +ZDH|1|3|I|QS|20180103101000|28|11|FO2||| +ZDT|1|3|10.0|20180103102000|26|| diff --git a/tests/testparse.cpp b/tests/testparse.cpp index c75a8bb49..4afa0b42c 100644 --- a/tests/testparse.cpp +++ b/tests/testparse.cpp @@ -5,12 +5,12 @@ #include "core/divelog.h" #include "core/divesite.h" #include "core/errorhelper.h" -#include "core/trip.h" #include "core/file.h" #include "core/import-csv.h" #include "core/parse.h" #include "core/qthelper.h" #include "core/subsurface-string.h" +#include "core/trip.h" #include "core/xmlparams.h" #include @@ -224,7 +224,8 @@ void TestParse::testParseNewFormat() "/dives/") .append(files.at(i)) .toLatin1() - .data(), &divelog), + .data(), + &divelog), 0); QCOMPARE(divelog.dives.size(), i + 1); } @@ -452,7 +453,11 @@ void TestParse::parseDL7() QCOMPARE(parse_csv_file(SUBSURFACE_TEST_DATA "/dives/DL7.zxu", ¶ms, "DL7", &divelog), 0); + QCOMPARE(divelog.dives.size(), 3); + QCOMPARE(divelog.dives[0]->number, 1); + QCOMPARE(divelog.dives[1]->number, 2); + QCOMPARE(divelog.dives[2]->number, 3); QCOMPARE(save_dives("./testdl7out.ssrf"), 0); FILE_COMPARE("./testdl7out.ssrf", From 407beefad6cd8668c3891947e6225b8c152312e1 Mon Sep 17 00:00:00 2001 From: Morten Borup Petersen Date: Mon, 11 Nov 2024 16:58:34 +0100 Subject: [PATCH 2/4] fix default mem_csv value Signed-off-by: Morten Borup Petersen --- core/import-csv.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/import-csv.cpp b/core/import-csv.cpp index dcb43baad..36d7e5d94 100644 --- a/core/import-csv.cpp +++ b/core/import-csv.cpp @@ -350,8 +350,12 @@ static int parse_dan_format(const char *filename, struct xml_params *params, str } + if (mem_csv.empty()) { + mem_csv = ""; + } else { if (try_to_xslt_open_csv(filename, mem_csv, "csv")) return -1; + } ret |= parse_xml_buffer(filename, mem_csv.data(), mem_csv.size(), log, params); } From 015ac0e45960fccf967e8a8f629ec7923310bf95 Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Sat, 23 Nov 2024 10:31:16 +1300 Subject: [PATCH 3/4] CICD: Build Release Versions on Push. Change the builds on push (i.e. pull request merges) to build release versions. This seems to be the correct way to build these, as they are now distributed as the official builds on https://subsurface-divelog.org/. For users wanting to help with debugging, build artifacts on pull requests are available, and these are debug builds. Also adding the option to manually trigger builds, so if needed debug builds can be run on `master`. Signed-off-by: Michael Keller --- .github/workflows/android.yml | 9 ++++++++- .github/workflows/ios.yml.disabled | 9 ++++++++- .github/workflows/linux-debian-generic.yml | 8 +++++++- .github/workflows/linux-debian-trixie-5.15.yml | 1 + .github/workflows/linux-fedora-35-qt6.yml | 9 ++++++++- .../workflows/linux-ubuntu-20.04-qt5-appimage.yml | 9 ++++++++- .github/workflows/linux-ubuntu-20.04-qt5.yml | 1 + .github/workflows/linux-ubuntu-22.04-qt5.yml | 1 + .github/workflows/linux-ubuntu-24.04-qt5.yml | 1 + .github/workflows/mac.yml | 8 +++++++- .github/workflows/windows.yml | 8 +++++++- packaging/windows/in-container-build.sh | 12 ++++++++++-- packaging/windows/mxe-based-build.sh | 8 +++----- packaging/windows/smtk2ssrf-mxe-build.sh | 4 +--- 14 files changed, 71 insertions(+), 17 deletions(-) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 2458489c4..e7570f5db 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: build: @@ -49,6 +50,12 @@ jobs: VERSION: ${{ steps.version_number.outputs.version }} VERSION_4: ${{ steps.version_number.outputs.version_4 }} run: | + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} release" + fi + # this is rather awkward, but it allows us to use the preinstalled # Android and Qt versions with relative paths cd .. @@ -65,7 +72,7 @@ jobs: git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer # get the build number via curl so this works both for a pull request as well as a push export OUTPUT_DIR="$GITHUB_WORKSPACE" - bash -x ./subsurface/packaging/android/qmake-build.sh -buildnr $BUILDNR -canonicalversion $VERSION -canonicalversion_4 $VERSION_4 + bash -x ./subsurface/packaging/android/qmake-build.sh ${BUILD_EXTRA_ARGS} -buildnr $BUILDNR -canonicalversion $VERSION -canonicalversion_4 $VERSION_4 - name: delete the keystore if: github.event_name == 'push' diff --git a/.github/workflows/ios.yml.disabled b/.github/workflows/ios.yml.disabled index e84f9b351..a895cd86d 100644 --- a/.github/workflows/ios.yml.disabled +++ b/.github/workflows/ios.yml.disabled @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: build: @@ -45,12 +46,18 @@ jobs: env: VERSION: ${{ steps.version_number.outputs.version }} run: | + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + cd .. git config --global --add safe.directory $GITHUB_WORKSPACE git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer export IOS_QT=$GITHUB_WORKSPACE/qt-ios echo "build for simulator" - bash -x $GITHUB_WORKSPACE/packaging/ios/build.sh -simulator + bash -x $GITHUB_WORKSPACE/packaging/ios/build.sh -simulator ${BUILD_EXTRA_ARGS} # We need this in order to be able to access the file and publish it mv build-Subsurface-mobile-Qt_5_14_1_for_iOS-Release/Release-iphonesimulator/Subsurface-mobile.app $GITHUB_WORKSPACE/Subsurface-mobile-$VERSION.app diff --git a/.github/workflows/linux-debian-generic.yml b/.github/workflows/linux-debian-generic.yml index 741896134..980ee36ed 100644 --- a/.github/workflows/linux-debian-generic.yml +++ b/.github/workflows/linux-debian-generic.yml @@ -71,9 +71,15 @@ jobs: echo "--------------------------------------------------------------" echo "building desktop" + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + # now build for the desktop version (including WebKit) cd .. - bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit + bash -e -x subsurface/scripts/build.sh -desktop -build-with-webkit ${BUILD_EXTRA_ARGS} - name: test desktop build run: | diff --git a/.github/workflows/linux-debian-trixie-5.15.yml b/.github/workflows/linux-debian-trixie-5.15.yml index 987576f7a..d14254ddd 100644 --- a/.github/workflows/linux-debian-trixie-5.15.yml +++ b/.github/workflows/linux-debian-trixie-5.15.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: do-build-test: diff --git a/.github/workflows/linux-fedora-35-qt6.yml b/.github/workflows/linux-fedora-35-qt6.yml index 8c2780472..2e93f2adb 100644 --- a/.github/workflows/linux-fedora-35-qt6.yml +++ b/.github/workflows/linux-fedora-35-qt6.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: build: @@ -52,12 +53,18 @@ jobs: echo "--------------------------------------------------------------" echo "building desktop" + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + # now build for the desktop version (without WebKit) cd .. git config --global --add safe.directory $GITHUB_WORKSPACE git config --global --add safe.directory $GITHUB_WORKSPACE/libdivecomputer git config --global --get-all safe.directory - bash -e -x subsurface/scripts/build.sh -desktop -build-with-qt6 + bash -e -x subsurface/scripts/build.sh -desktop -build-with-qt6 ${BUILD_EXTRA_ARGS} - name: test desktop build run: | diff --git a/.github/workflows/linux-ubuntu-20.04-qt5-appimage.yml b/.github/workflows/linux-ubuntu-20.04-qt5-appimage.yml index 7fdbb71d0..163b83705 100644 --- a/.github/workflows/linux-ubuntu-20.04-qt5-appimage.yml +++ b/.github/workflows/linux-ubuntu-20.04-qt5-appimage.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: build: @@ -60,9 +61,15 @@ jobs: echo "--------------------------------------------------------------" echo "building desktop" + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + # now build the appimage cd .. - bash -e -x subsurface/scripts/build.sh -desktop -create-appdir -build-with-webkit + bash -e -x subsurface/scripts/build.sh -desktop -create-appdir -build-with-webkit ${BUILD_EXTRA_ARGS} - name: test desktop build run: | diff --git a/.github/workflows/linux-ubuntu-20.04-qt5.yml b/.github/workflows/linux-ubuntu-20.04-qt5.yml index 6116ce003..6a2efef38 100644 --- a/.github/workflows/linux-ubuntu-20.04-qt5.yml +++ b/.github/workflows/linux-ubuntu-20.04-qt5.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: do-build-test: diff --git a/.github/workflows/linux-ubuntu-22.04-qt5.yml b/.github/workflows/linux-ubuntu-22.04-qt5.yml index c89770038..e737ccba8 100644 --- a/.github/workflows/linux-ubuntu-22.04-qt5.yml +++ b/.github/workflows/linux-ubuntu-22.04-qt5.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: do-build-test: diff --git a/.github/workflows/linux-ubuntu-24.04-qt5.yml b/.github/workflows/linux-ubuntu-24.04-qt5.yml index ddbc27768..a1fead73b 100644 --- a/.github/workflows/linux-ubuntu-24.04-qt5.yml +++ b/.github/workflows/linux-ubuntu-24.04-qt5.yml @@ -11,6 +11,7 @@ on: - scripts/docker/** branches: - master + workflow_dispatch: jobs: do-build-test: diff --git a/.github/workflows/mac.yml b/.github/workflows/mac.yml index 632606a56..46f237365 100644 --- a/.github/workflows/mac.yml +++ b/.github/workflows/mac.yml @@ -44,6 +44,12 @@ jobs: env: CANONICALVERSION: ${{ steps.version_number.outputs.version }} run: | + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + cd ${GITHUB_WORKSPACE}/.. export QT_ROOT=${GITHUB_WORKSPACE}/qt-mac/Qt5.15.15 export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins @@ -51,7 +57,7 @@ jobs: export CMAKE_PREFIX_PATH=$QT_ROOT/lib/cmake # now setup Subsurface with WebKit and build the dependencies, using the generic build script - bash -e -x ./subsurface/scripts/build.sh -desktop -build-with-webkit -release -build-deps -ftdi -prep-only + bash -e -x ./subsurface/scripts/build.sh -desktop -build-with-webkit -build-deps -ftdi -prep-only ${BUILD_EXTRA_ARGS} echo "finished initial cmake setup of Subsurface - next build the package" cd subsurface/build diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 06b17dc1d..2416c4c6c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -47,9 +47,15 @@ jobs: CANONICALVERSION: ${{ steps.version_number.outputs.version }} CANONICALVERSION_4: ${{ steps.version_number.outputs.version_4 }} run: | + BUILD_EXTRA_ARGS="" + if [ "${GITHUB_EVENT_NAME}" = "push" ]; then + echo "Building a release version" + BUILD_EXTRA_ARGS="${BUILD_EXTRA_ARGS} -release" + fi + export OUTPUT_DIR="$GITHUB_WORKSPACE" cd /win - bash -x subsurface/packaging/windows/in-container-build.sh 2>&1 | tee build.log + bash -x subsurface/packaging/windows/in-container-build.sh ${BUILD_EXTRA_ARGS} 2>&1 | tee build.log grep "Built target installer" build.log - name: publish pull request artifacts diff --git a/packaging/windows/in-container-build.sh b/packaging/windows/in-container-build.sh index c4601f118..1c84c42cb 100755 --- a/packaging/windows/in-container-build.sh +++ b/packaging/windows/in-container-build.sh @@ -13,9 +13,17 @@ set -e mkdir -p win32 cd win32 +BUILD_EXTRA_ARGS="debug" +SMTK2SSRF_EXTRA_ARGS="-b debug" +if [[ "$1" == "-release" ]]; then + BUILD_EXTRA_ARGS="" + SMTK2SSRF_BUILD_EXTRA_ARGS="-b release" + shift +fi + # build Subsurface export MXEBUILDTYPE=x86_64-w64-mingw32.shared -bash -ex ../subsurface/packaging/windows/mxe-based-build.sh installer +bash -ex ../subsurface/packaging/windows/mxe-based-build.sh ${BUILD_EXTRA_ARGS} installer # the strange two step move is in order to get predictable names to use # in the publish step of the GitHub Action @@ -27,7 +35,7 @@ mv subsurface/"$fullname" ${OUTPUT_DIR}/"${fullname%.exe}-installer.exe" bash -ex ../subsurface/packaging/windows/mxe-based-build.sh -noftdi -nolibraw subsurface -bash -ex ../subsurface/packaging/windows/smtk2ssrf-mxe-build.sh -a -i +bash -ex ../subsurface/packaging/windows/smtk2ssrf-mxe-build.sh ${SMTK2SSRF_BUILD_EXTRA_ARGS} -a -i # the strange two step move is in order to get predictable names to use # in the publish step of the GitHub Action diff --git a/packaging/windows/mxe-based-build.sh b/packaging/windows/mxe-based-build.sh index 9da78dec6..0fc52fbd7 100755 --- a/packaging/windows/mxe-based-build.sh +++ b/packaging/windows/mxe-based-build.sh @@ -131,7 +131,6 @@ if [[ "$1" == "debug" ]] ; then RELEASE="Debug" RELEASE_MAIN="Debug" RELEASE_GM="debug" - DLL_SUFFIX="d" shift if [[ -f Release ]] ; then rm -rf * @@ -141,7 +140,6 @@ else RELEASE="Release" RELEASE_MAIN="RelWithDebInfo" RELEASE_GM="release" - DLL_SUFFIX="" if [[ -f Debug ]] ; then rm -rf * fi @@ -281,9 +279,9 @@ done # for some reason we aren't installing Qt5Xml.dll and Qt5Location.dll # I need to figure out why and fix that, but for now just manually copy that as well -EXTRA_MANUAL_DEPENDENCIES="$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5Xml$DLL_SUFFIX.dll \ -$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5Location$DLL_SUFFIX.dll \ -$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5QmlWorkerScript$DLL_SUFFIX.dll" +EXTRA_MANUAL_DEPENDENCIES="$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5Xml.dll \ +$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5Location.dll \ +$BASEDIR/"$MXEDIR"/usr/"$MXEBUILDTYPE"/qt5/bin/Qt5QmlWorkerScript.dll" for f in $EXTRA_MANUAL_DEPENDENCIES do diff --git a/packaging/windows/smtk2ssrf-mxe-build.sh b/packaging/windows/smtk2ssrf-mxe-build.sh index 2edf6b45e..491428e32 100755 --- a/packaging/windows/smtk2ssrf-mxe-build.sh +++ b/packaging/windows/smtk2ssrf-mxe-build.sh @@ -124,12 +124,10 @@ else fi case "$RELEASE" in debug|Debug) RELEASE=Debug - DLL_SUFFIX="d" [[ -f Release ]] && rm -rf ./* touch Debug ;; release|Release) RELEASE=Release - DLL_SUFFIX="" [[ -f Debug ]] && rm -rf ./* touch Release ;; @@ -175,7 +173,7 @@ $BASEDIR/mxe/usr/x86_64-w64-mingw32.shared/qt5/plugins/platforms" # This comes from subsurface's mxe-based-build.sh. I'm not sure it is necessary # but, well, it doesn't hurt. -EXTRA_MANUAL_DEPENDENCIES="$BASEDIR/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin/Qt5Xml$DLL_SUFFIX.dll" +EXTRA_MANUAL_DEPENDENCIES="$BASEDIR/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin/Qt5Xml.dll" STAGING_DIR=$BUILDDIR/smtk-import/staging From 46c439c44346f72b624c6f1fb715e726dc5f7117 Mon Sep 17 00:00:00 2001 From: rmultan Date: Mon, 25 Nov 2024 22:51:21 +0100 Subject: [PATCH 4/4] Bluetooth: Add Mares Sirius to known devices The app already supports Mares Sirius, but user has to allow scanning for unknown devices in app settings. This adds Mares Sirius to known devices. Signed-off-by: rmultan --- core/btdiscovery.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/core/btdiscovery.cpp b/core/btdiscovery.cpp index 6cddd2191..7e947fb0d 100644 --- a/core/btdiscovery.cpp +++ b/core/btdiscovery.cpp @@ -78,6 +78,7 @@ static struct namePattern name[] = { { "Luna 2.0", "Scubapro", "Luna 2.0" }, // Mares dive computers { "Mares Genius", "Mares", "Genius" }, + { "Sirius", "Mares", "Sirius" }, { "Mares", "Mares", "Quad" }, // we actually don't know and just pick a common one - user needs to fix in UI // Cress dive computers { "CARESIO_", "Cressi", "Cartesio" },