From 0b3c92d19e9d1ffe6bc09c7e901dd654c2b87154 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Fri, 24 Nov 2023 11:49:11 +0100 Subject: [PATCH 01/10] dtmm: Fetch mod image from Nexus Closes #129. --- crates/dtmm/src/controller/import.rs | 56 ++++++++++++++++++++-------- crates/dtmm/src/state/data.rs | 2 + lib/nexusmods/src/lib.rs | 12 +++++- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/crates/dtmm/src/controller/import.rs b/crates/dtmm/src/controller/import.rs index 131d01f..68c54a5 100644 --- a/crates/dtmm/src/controller/import.rs +++ b/crates/dtmm/src/controller/import.rs @@ -27,6 +27,16 @@ fn find_archive_file( path } +fn image_data_to_buffer(data: impl AsRef<[u8]>) -> Result { + // Druid somehow doesn't return an error compatible with eyre, here. + // So we have to wrap through `Display` manually. + ImageBuf::from_data(data.as_ref()).map_err(|err| { + Report::msg(err.to_string()) + .wrap_err("Invalid image data") + .suggestion("Supported formats are: PNG, JPEG, Bitmap and WebP") + }) +} + // Runs the content of a `.mod` file to extract what data we can get // from legacy mods. // 1. Create a global function `new_mod` that stores @@ -420,6 +430,9 @@ pub(crate) async fn import_mod(state: ActionState, info: FileInfo) -> Result Result img, - Err(err) => { - let err = Report::msg(err.to_string()) - .wrap_err("Invalid image data") - .note("Supported formats are: PNG, JPEG, Bitmap and WebP") - .suggestion("Contact the mod author to fix this"); - return Err(err); - } - }; - + let img = image_data_to_buffer(buf)?; Some(img) + } else if let Some((nexus, _)) = &nexus { + let api = NexusApi::new(state.nexus_api_key.to_string())?; + let url = nexus.picture_url.as_ref(); + let data = api + .picture(url) + .await + .wrap_err_with(|| format!("Failed to download Nexus image from '{}'", url))?; + + let img = image_data_to_buffer(&data)?; + + let name = "image.bin"; + let path = dest.join(name); + match fs::write(&path, &data).await { + Ok(_) => { + mod_cfg.image = Some(name.into()); + Some(img) + } + Err(err) => { + let err = Report::new(err).wrap_err(format!( + "Failed to write Nexus picture to file '{}'", + path.display() + )); + tracing::error!("{:?}", err); + None + } + } } else { None }; tracing::trace!(?image); - let mod_dir = state.data_dir.join(state.mod_dir.as_ref()); - let dest = mod_dir.join(&mod_cfg.id); - tracing::trace!("Creating mods directory {}", dest.display()); fs::create_dir_all(&dest) .await diff --git a/crates/dtmm/src/state/data.rs b/crates/dtmm/src/state/data.rs index 64fdd28..e5b70c4 100644 --- a/crates/dtmm/src/state/data.rs +++ b/crates/dtmm/src/state/data.rs @@ -78,6 +78,7 @@ pub(crate) struct NexusInfo { pub author: String, pub summary: Arc, pub description: Arc, + pub picture_url: Arc, } impl From for NexusInfo { @@ -89,6 +90,7 @@ impl From for NexusInfo { author: value.author, summary: Arc::new(value.summary), description: Arc::new(value.description), + picture_url: Arc::new(value.picture_url.into()), } } } diff --git a/lib/nexusmods/src/lib.rs b/lib/nexusmods/src/lib.rs index 145435d..1407fca 100644 --- a/lib/nexusmods/src/lib.rs +++ b/lib/nexusmods/src/lib.rs @@ -4,7 +4,7 @@ use std::convert::Infallible; use lazy_static::lazy_static; use regex::Regex; use reqwest::header::{HeaderMap, HeaderValue, InvalidHeaderValue}; -use reqwest::{Client, RequestBuilder, Url}; +use reqwest::{Client, IntoUrl, RequestBuilder, Url}; use serde::Deserialize; use thiserror::Error; @@ -102,6 +102,16 @@ impl Api { self.send(req).await } + #[tracing::instrument(skip(self))] + pub async fn picture(&self, url: impl IntoUrl + std::fmt::Debug) -> Result> { + let res = self.client.get(url).send().await?.error_for_status()?; + + res.bytes() + .await + .map(|bytes| bytes.to_vec()) + .map_err(From::from) + } + pub fn parse_file_name>( name: S, ) -> Option<(String, u64, String, OffsetDateTime)> { From edd363c3a621d705776ac8b8eeb9b97920504b5d Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 27 Nov 2023 15:40:03 +0100 Subject: [PATCH 02/10] Add changelog entry --- CHANGELOG.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 4d1861c..ee02b6c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -16,6 +16,7 @@ - dtmt: add utility to migrate mod projects - dtmm: reset dtkit-patch installations - sdk: implement decompiling Lua files +- dtmm: fetch cover image for Nexus mods === Fixed From 316a5aaa33cc650fb8fce8e3be10b20229d586d9 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 27 Nov 2023 16:12:11 +0100 Subject: [PATCH 03/10] ci: Fix undefined variable --- .ci/tasks/build.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.ci/tasks/build.sh b/.ci/tasks/build.sh index 5e60d7f..bb96775 100755 --- a/.ci/tasks/build.sh +++ b/.ci/tasks/build.sh @@ -19,7 +19,9 @@ install_artifact() { cd "repo" -if [ -n "${PR:-}" ]; then +PR=${PR:-} + +if [ -n "$PR" ]; then title "PR: $(echo "$PR" | jq '.number') - $(echo "$PR" | jq '.title')" ref="pr-$(echo "$PR" | jq '.number')-$(git rev-parse --short "$(cat .git/ref || echo "HEAD")" 2>/dev/null || echo 'manual')" else From b64ff9043c661c690bf23e5e8f7c89c793bcd8cb Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Mon, 27 Nov 2023 16:12:41 +0100 Subject: [PATCH 04/10] ci: Create build artifacts for commits on master --- .ci/pipelines/base-pipeline.yml | 43 ------- .ci/pipelines/base.yml | 204 ++++++++++++++++++++++++++++++++ Justfile | 4 +- 3 files changed, 206 insertions(+), 45 deletions(-) delete mode 100644 .ci/pipelines/base-pipeline.yml create mode 100644 .ci/pipelines/base.yml diff --git a/.ci/pipelines/base-pipeline.yml b/.ci/pipelines/base-pipeline.yml deleted file mode 100644 index f231fb7..0000000 --- a/.ci/pipelines/base-pipeline.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- - -# The base pipeline that runs continuously, checks for branches and -# creates a new pipeline instance for each of them. - -resource_types: -- name: gitea-pr - type: registry-image - source: - repository: registry.local:5000/gitea-pr - -resources: -- name: repo-pr - type: gitea-pr - source: - access_token: ((gitea_api_key)) - owner: ((owner)) - repo: ((repo)) - url: https://git.sclu1034.dev -- name: repo - type: git - source: - uri: https://git.sclu1034.dev/bitsquid_dt/dtmt - -jobs: - - name: set-pipelines - plan: - - in_parallel: - - get: repo-pr - trigger: true - - get: repo - - load_var: prs - file: repo-pr/prs.json - - across: - - var: pr - values: ((.:prs)) - set_pipeline: dtmt-pr - file: repo/.ci/pipelines/pr.yml - vars: - pr: ((.:pr)) - gitea_api_key: ((gitea_api_key)) - instance_vars: - number: ((.:pr.number)) diff --git a/.ci/pipelines/base.yml b/.ci/pipelines/base.yml new file mode 100644 index 0000000..a731222 --- /dev/null +++ b/.ci/pipelines/base.yml @@ -0,0 +1,204 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/cappyzawa/concourse-pipeline-jsonschema/master/concourse_jsonschema.json#/definitions/Config +--- + +# The actual CI pipeline that is run per branch +resource_types: +- name: gitea-package + type: registry-image + source: + repository: registry.local:5000/gitea-package + +- name: gitea-status + type: registry-image + source: + repository: registry.local:5000/gitea-status + +- name: gitea-pr + type: registry-image + source: + repository: registry.local:5000/gitea-pr + + +resources: +- name: repo + type: git + source: + uri: http://forgejo:3000/bitsquid_dt/dtmt + branch: master + +- name: repo-pr + type: gitea-pr + source: + access_token: ((gitea_api_key)) + owner: ((owner)) + repo: ((repo)) + url: https://git.sclu1034.dev + +- name: gitea-package + type: gitea-package + source: + access_token: ((gitea_api_key)) + url: http://forgejo:3000 + owner: bitsquid_dt + type: generic + name: dtmt + + +- name: status-build-msvc + type: gitea-status + source: + access_token: ((gitea_api_key)) + url: http://forgejo:3000 + owner: bitsquid_dt + repo: dtmt + context: build/msvc + description: "Build for the target platform: msvc" + +- name: status-build-linux + type: gitea-status + source: + access_token: ((gitea_api_key)) + url: http://forgejo:3000 + owner: bitsquid_dt + repo: dtmt + context: build/linux + description: "Build for the target platform: linux" + + +jobs: +- name: set-pipelines + plan: + - in_parallel: + - get: repo-pr + trigger: true + + - get: repo + + - load_var: prs + file: repo-pr/prs.json + + - across: + - var: pr + values: ((.:prs)) + set_pipeline: dtmt-pr + file: repo/.ci/pipelines/pr.yml + vars: + pr: ((.:pr)) + gitea_api_key: ((gitea_api_key)) + instance_vars: + number: ((.:pr.number)) + + +- name: build-msvc + on_success: + put: state-success + resource: status-build-msvc + no_get: true + params: + state: success + sha: ((.:git_sha)) + + on_failure: + put: state-failure + resource: status-build-msvc + no_get: true + params: + state: failure + sha: ((.:git_sha)) + + plan: + - get: repo + trigger: true + + - load_var: git_sha + file: repo/.git/ref + + - put: state-pending + resource: status-build-msvc + no_get: true + params: + state: pending + sha: ((.:git_sha)) + + - task: build + file: repo/.ci/tasks/build.yml + vars: + target: msvc + gitea_url: http://forgejo:3000 + gitea_api_key: ((gitea_api_key)) + + - load_var: version_number + reveal: true + file: artifact/version + + - put: package + resource: gitea-package + no_get: true + inputs: + - artifact + params: + version: ((.:version_number)) + fail_fast: true + override: true + globs: + - artifact/dtmt + - artifact/dtmm + - artifact/*.exe + - artifact/*.sha256 + +- name: build-linux + on_success: + put: state-success + resource: status-build-linux + no_get: true + params: + state: success + sha: ((.:git_sha)) + + on_failure: + put: state-failure + resource: status-build-linux + no_get: true + params: + state: failure + sha: ((.:git_sha)) + + plan: + - get: repo + trigger: true + + - load_var: git_sha + file: repo/.git/ref + + - put: state-pending + resource: status-build-linux + no_get: true + params: + state: pending + sha: ((.:git_sha)) + + - task: build + file: repo/.ci/tasks/build.yml + vars: + target: linux + gitea_url: http://forgejo:3000 + gitea_api_key: ((gitea_api_key)) + + - load_var: version_number + reveal: true + file: artifact/version + + - put: package + resource: gitea-package + no_get: true + inputs: + - artifact + params: + version: ((.:version_number)) + fail_fast: true + override: true + globs: + - artifact/dtmt + - artifact/dtmm + - artifact/*.exe + - artifact/*.sha256 diff --git a/Justfile b/Justfile index 70af61a..12fde29 100644 --- a/Justfile +++ b/Justfile @@ -30,8 +30,8 @@ ci-image-linux: set-base-pipeline: fly -t {{fly_target}} set-pipeline \ - --pipeline dtmt-prs \ - --config .ci/pipelines/base-pipeline.yml \ + --pipeline dtmt \ + --config .ci/pipelines/base.yml \ -v gitea_api_key=${GITEA_API_KEY} \ -v owner=bitsquid_dt \ -v repo=dtmt From d95f5dfe1f26ae2c2f81d588ad358ea82cb0d405 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Tue, 28 Nov 2023 21:51:29 +0100 Subject: [PATCH 05/10] ci: Improve caching setup for image building The `RUN --mount` flag is much easier to maintain than having to set up all the crates. --- .ci/Dockerfile.linux | 34 +++------------------------------- 1 file changed, 3 insertions(+), 31 deletions(-) diff --git a/.ci/Dockerfile.linux b/.ci/Dockerfile.linux index 9e93e44..b46f7ff 100644 --- a/.ci/Dockerfile.linux +++ b/.ci/Dockerfile.linux @@ -1,35 +1,7 @@ FROM dtmt-ci-base-linux -# Create dummy crates and copy their Cargo.toml, so that dependencies can be cached -RUN set -e; \ - cargo new --bin crates/dtmt; \ - cargo new --bin crates/dtmm; \ - cargo new --lib lib/dtmt-shared; \ - cargo new --lib lib/nexusmods; \ - cargo new --lib lib/sdk; \ - cargo new --lib lib/serde_sjson; \ - cargo new --lib lib/ansi-parser - -COPY Cargo.toml Cargo.lock /src/dtmt/ -COPY crates/dtmt/Cargo.toml /src/dtmt/crates/dtmt/ -COPY crates/dtmm/Cargo.toml /src/dtmt/crates/dtmm/ -COPY lib/dtmt-shared/Cargo.toml /src/dtmt/lib/dtmt-shared/ -COPY lib/nexusmods/Cargo.toml /src/dtmt/lib/nexusmods/ -COPY lib/sdk/Cargo.toml /src/dtmt/lib/sdk/ -COPY lib/serde_sjson/Cargo.toml /src/dtmt/lib/serde_sjson/ -COPY lib/ansi-parser/Cargo.toml /src/dtmt/lib/ansi-parser/ - -# Crates with build scripts cannot be split that way, but they shouldn't change too often -COPY lib/luajit2-sys /src/dtmt/lib/luajit2-sys -COPY lib/oodle /src/dtmt/lib/oodle -# color-eyre needs to be copied, too, then, as it's used by `oodle` -COPY lib/color-eyre /src/dtmt/lib/color-eyre -COPY --from=dtmt-ci-base-linux /src/*.lib /src/dtmt/lib/oodle/ - -RUN cargo build --release --locked -RUN rm -r crates lib - COPY . /src/dtmt COPY --from=dtmt-ci-base-linux /src/*.lib /src/*.so /src/dtmt/lib/oodle/ - -RUN cargo build --release --locked +RUN --mount=type=cache,id=cargo-registry,target=/cargo/registry \ + --mount=type=cache,id=cargo-target,target=/src/dtmt/target \ + cargo build --release --locked From 227dff03efa67006393614bcd0fa1a7b1fbdd3f5 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Tue, 28 Nov 2023 21:52:55 +0100 Subject: [PATCH 06/10] ci: Fix base pipeline Concourse doesn't allow variables to be undefined. --- .ci/pipelines/base.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.ci/pipelines/base.yml b/.ci/pipelines/base.yml index a731222..474c090 100644 --- a/.ci/pipelines/base.yml +++ b/.ci/pipelines/base.yml @@ -123,6 +123,7 @@ jobs: - task: build file: repo/.ci/tasks/build.yml vars: + pr: "" target: msvc gitea_url: http://forgejo:3000 gitea_api_key: ((gitea_api_key)) @@ -180,6 +181,7 @@ jobs: - task: build file: repo/.ci/tasks/build.yml vars: + pr: "" target: linux gitea_url: http://forgejo:3000 gitea_api_key: ((gitea_api_key)) From 3555fc83d227052eda16bfbb6f81aa4c7aeede97 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Tue, 28 Nov 2023 21:53:33 +0100 Subject: [PATCH 07/10] ci: Rework MSVC image building This moves process of downloading and setting up the Windows libraries to a separate build step, freeing up the layers of the final image. --- .ci/image/Dockerfile.linux | 6 ++--- .ci/image/Dockerfile.msvc | 51 ++++++++++++++++++++++++++------------ Justfile | 6 ++--- 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/.ci/image/Dockerfile.linux b/.ci/image/Dockerfile.linux index df10059..5cbaf5d 100644 --- a/.ci/image/Dockerfile.linux +++ b/.ci/image/Dockerfile.linux @@ -8,9 +8,9 @@ RUN set -eux; \ git \ gpg \ jq \ - libatk1.0-dev \ + libatk1.0-dev \ libclang-13-dev \ - libglib2.0-dev \ + libglib2.0-dev \ libgtk-3-dev \ libpango1.0-dev \ libssl-dev \ @@ -22,4 +22,4 @@ RUN set -eux; \ WORKDIR /src/dtmt -COPY *.so *.a /src/ +COPY lib/oodle/*.so lib/oodle/*.a /src/ diff --git a/.ci/image/Dockerfile.msvc b/.ci/image/Dockerfile.msvc index a9eab62..864dc73 100644 --- a/.ci/image/Dockerfile.msvc +++ b/.ci/image/Dockerfile.msvc @@ -1,13 +1,40 @@ # https://jake-shadle.github.io/xwin/ -FROM dtmt-ci-base-linux +FROM debian:bullseye-slim as xwin + +ARG XWIN_VERSION=0.5.0 +ARG XWIN_PREFIX="xwin-$XWIN_VERSION-x86_64-unknown-linux-musl" +ADD https://github.com/Jake-Shadle/xwin/releases/download/$XWIN_VERSION/$XWIN_PREFIX.tar.gz /root/$XWIN_PREFIX.tar.gz + +RUN set -eux; \ + apt-get update; \ + apt-get install --no-install-recommends -y \ + tar \ + ; \ + # Install xwin to cargo/bin via github release. Note you could also just use `cargo install xwin`. + tar -xzv -f /root/$XWIN_PREFIX.tar.gz -C /usr/bin --strip-components=1 $XWIN_PREFIX/xwin; \ + apt-get remove -y --auto-remove; \ + rm -rf \ + /var/lib/apt/lists/* \ + /root/$XWIN_PREFIX.tar.gz; + +RUN set -eux; \ + # Splat the CRT and SDK files to /xwin/crt and /xwin/sdk respectively + xwin \ + --log-level debug \ + --cache-dir /root/.xwin-cache \ + --manifest-version 16 \ + --accept-license \ + splat \ + --output /xwin; \ + rm -rf \ + /root/.xwin-cache; + +FROM dtmt-ci-base-linux as final ENV KEYRINGS /usr/local/share/keyrings -ARG XWIN_VERSION=0.2.11 -ARG XWIN_PREFIX="xwin-$XWIN_VERSION-x86_64-unknown-linux-musl" ADD https://apt.llvm.org/llvm-snapshot.gpg.key /root/llvm-snapshot.gpg.key ADD https://dl.winehq.org/wine-builds/winehq.key /root/winehq.key -ADD https://github.com/Jake-Shadle/xwin/releases/download/$XWIN_VERSION/$XWIN_PREFIX.tar.gz /root/$XWIN_PREFIX.tar.gz RUN set -eux; \ mkdir -p $KEYRINGS; \ @@ -26,7 +53,7 @@ RUN set -eux; \ llvm-13 \ lld-13 \ winehq-staging \ - tar; \ + ; \ # ensure that clang/clang++ are callable directly ln -s clang-13 /usr/bin/clang && ln -s clang /usr/bin/clang++ && ln -s lld-13 /usr/bin/ld.lld; \ # We also need to setup symlinks ourselves for the MSVC shims because they aren't in the debian packages @@ -44,19 +71,15 @@ RUN set -eux; \ update-alternatives --install /usr/bin/ld ld /usr/bin/ld.lld 100; \ rustup target add x86_64-pc-windows-msvc; \ rustup component add rust-src; \ - # Install xwin to cargo/bin via github release. Note you could also just use `cargo install xwin`. - tar -xzv -f /root/$XWIN_PREFIX.tar.gz -C /usr/local/cargo/bin --strip-components=1 $XWIN_PREFIX/xwin; \ - # Splat the CRT and SDK files to /xwin/crt and /xwin/sdk respectively - xwin --accept-license splat --output /xwin; \ # Remove unneeded files to reduce image size apt-get remove -y --auto-remove; \ rm -rf \ - .xwin-cache \ - /usr/local/cargo/bin/xwin \ - /root/$XWIN_PREFIX.tar.gz \ /var/lib/apt/lists/* \ /root/*.key; +COPY lib/oodle/*.lib /src +COPY --from=xwin /xwin /xwin + # Note that we're using the full target triple for each variable instead of the # simple CC/CXX/AR shorthands to avoid issues when compiling any C/C++ code for # build dependencies that need to compile and execute in the host environment @@ -83,7 +106,3 @@ ENV CFLAGS_x86_64_pc_windows_msvc="$CL_FLAGS" \ # Run wineboot just to setup the default WINEPREFIX so we don't do it every # container run RUN wine wineboot --init - -WORKDIR /src/dtmt - -COPY *.lib /src diff --git a/Justfile b/Justfile index 12fde29..967619b 100644 --- a/Justfile +++ b/Justfile @@ -18,13 +18,13 @@ build-image-linux: ci-image: ci-image-msvc ci-image-linux -ci-image-msvc: ci-image-linux - docker build -t dtmt-ci-base-msvc -f .ci/image/Dockerfile.msvc .ci/image +ci-image-msvc: + docker build -t dtmt-ci-base-msvc -f .ci/image/Dockerfile.msvc . docker tag dtmt-ci-base-msvc registry.sclu1034.dev/dtmt-ci-base-msvc docker push registry.sclu1034.dev/dtmt-ci-base-msvc ci-image-linux: - docker build -t dtmt-ci-base-linux -f .ci/image/Dockerfile.linux .ci/image + docker build -t dtmt-ci-base-linux -f .ci/image/Dockerfile.linux . docker tag dtmt-ci-base-linux registry.sclu1034.dev/dtmt-ci-base-linux docker push registry.sclu1034.dev/dtmt-ci-base-linux From 4be37f6e5e89640c4bca763fb216d6a9f21753ae Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Tue, 28 Nov 2023 23:23:09 +0100 Subject: [PATCH 08/10] ci: Combine Dockerfiles into multi-stage build Closes #134. --- .ci/image/{Dockerfile.msvc => Dockerfile} | 34 +++++++++++++++++++++-- .ci/image/Dockerfile.linux | 25 ----------------- Justfile | 15 +++++----- 3 files changed, 38 insertions(+), 36 deletions(-) rename .ci/image/{Dockerfile.msvc => Dockerfile} (85%) delete mode 100644 .ci/image/Dockerfile.linux diff --git a/.ci/image/Dockerfile.msvc b/.ci/image/Dockerfile similarity index 85% rename from .ci/image/Dockerfile.msvc rename to .ci/image/Dockerfile index 864dc73..4e3433b 100644 --- a/.ci/image/Dockerfile.msvc +++ b/.ci/image/Dockerfile @@ -26,10 +26,38 @@ RUN set -eux; \ --accept-license \ splat \ --output /xwin; \ - rm -rf \ - /root/.xwin-cache; + # Even though this build step only exists temporary, to copy the + # final data out of, it still generates a cache entry on the Docker host. + # And to keep that to a minimum, we still delete the stuff we don't need. + rm -rf /root/.xwin-cache; -FROM dtmt-ci-base-linux as final +FROM rust:slim-bullseye as linux + +RUN set -eux; \ + apt-get update; \ + apt-get install --no-install-recommends -y \ + build-essential \ + curl \ + git \ + gpg \ + jq \ + libatk1.0-dev \ + libclang-13-dev \ + libglib2.0-dev \ + libgtk-3-dev \ + libpango1.0-dev \ + libssl-dev \ + libzstd-dev \ + pkg-config; \ + apt-get remove -y --auto-remove; \ + rm -rf /var/lib/apt/lists/*; \ + rustup default nightly + +WORKDIR /src/dtmt + +COPY lib/oodle/*.so lib/oodle/*.a /src/ + +FROM linux as msvc ENV KEYRINGS /usr/local/share/keyrings diff --git a/.ci/image/Dockerfile.linux b/.ci/image/Dockerfile.linux deleted file mode 100644 index 5cbaf5d..0000000 --- a/.ci/image/Dockerfile.linux +++ /dev/null @@ -1,25 +0,0 @@ -FROM rust:slim-bullseye - -RUN set -eux; \ - apt-get update; \ - apt-get install --no-install-recommends -y \ - build-essential \ - curl \ - git \ - gpg \ - jq \ - libatk1.0-dev \ - libclang-13-dev \ - libglib2.0-dev \ - libgtk-3-dev \ - libpango1.0-dev \ - libssl-dev \ - libzstd-dev \ - pkg-config; \ - apt-get remove -y --auto-remove; \ - rm -rf /var/lib/apt/lists/*; \ - rustup default nightly - -WORKDIR /src/dtmt - -COPY lib/oodle/*.so lib/oodle/*.a /src/ diff --git a/Justfile b/Justfile index 967619b..f9b37bc 100644 --- a/Justfile +++ b/Justfile @@ -16,16 +16,15 @@ build-image-msvc: build-image-linux: docker build -f .ci/Dockerfile.linux . -ci-image: ci-image-msvc ci-image-linux - -ci-image-msvc: - docker build -t dtmt-ci-base-msvc -f .ci/image/Dockerfile.msvc . +ci-image: + # The MSVC image depends on the Linux image. So by building that first, + # we actually build both, and cache them, so that "building" the + # Linux image afterwards merely needs to pull the cache. + docker build --target msvc -t dtmt-ci-base-msvc -f .ci/image/Dockerfile . + docker build --target linux -t dtmt-ci-base-linux -f .ci/image/Dockerfile . docker tag dtmt-ci-base-msvc registry.sclu1034.dev/dtmt-ci-base-msvc - docker push registry.sclu1034.dev/dtmt-ci-base-msvc - -ci-image-linux: - docker build -t dtmt-ci-base-linux -f .ci/image/Dockerfile.linux . docker tag dtmt-ci-base-linux registry.sclu1034.dev/dtmt-ci-base-linux + docker push registry.sclu1034.dev/dtmt-ci-base-msvc docker push registry.sclu1034.dev/dtmt-ci-base-linux set-base-pipeline: From b3305e87b8231a42f1e70faa29e1db9d9ef7e996 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Wed, 29 Nov 2023 15:21:07 +0100 Subject: [PATCH 09/10] dtmm: Fix importing from `.mod` file --- crates/dtmm/src/controller/import.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/dtmm/src/controller/import.rs b/crates/dtmm/src/controller/import.rs index 68c54a5..c5bbce7 100644 --- a/crates/dtmm/src/controller/import.rs +++ b/crates/dtmm/src/controller/import.rs @@ -244,6 +244,8 @@ fn extract_mod_config(archive: &mut ZipArchive) -> Result<(Mo None }; + tracing::debug!(?legacy_mod_data); + if let Some(name) = find_archive_file(archive, "dtmt.cfg") { let mut f = archive .by_name(&name) @@ -276,6 +278,24 @@ fn extract_mod_config(archive: &mut ZipArchive) -> Result<(Mo Ok((cfg, root)) } + } else if let Some((mod_id, resources, root)) = legacy_mod_data { + let cfg = ModConfig { + bundled: false, + dir: PathBuf::new(), + id: mod_id.clone(), + name: mod_id, + summary: "A mod for the game Warhammer 40,000: Darktide".into(), + version: "N/A".into(), + description: None, + author: None, + image: None, + categories: Vec::new(), + packages: Vec::new(), + resources, + depends: Vec::new(), + }; + + Ok((cfg, root)) } else { eyre::bail!( "Mod needs a config file or `.mod` file. \ From 61e78e97185907e4300c7bb4fd399a37e62dcc86 Mon Sep 17 00:00:00 2001 From: Lucas Schwiderski Date: Wed, 29 Nov 2023 15:21:34 +0100 Subject: [PATCH 10/10] dtmm: Fix writing Nexus image to disk --- crates/dtmm/src/controller/import.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/crates/dtmm/src/controller/import.rs b/crates/dtmm/src/controller/import.rs index c5bbce7..5ca4068 100644 --- a/crates/dtmm/src/controller/import.rs +++ b/crates/dtmm/src/controller/import.rs @@ -434,6 +434,8 @@ pub(crate) async fn import_mod(state: ActionState, info: FileInfo) -> Result Result Result