From 29d0499725184a713e5374d899faf9403f2c874d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Moya?= Date: Tue, 9 Jul 2024 01:02:34 +0200 Subject: [PATCH] :bug: Fix embed assets in unpublish and export --- CHANGES.md | 1 + backend/src/app/binfile/common.clj | 55 ++++----------------------- backend/src/app/binfile/v1.clj | 1 - common/src/app/common/types/file.cljc | 27 +++++++------ 4 files changed, 24 insertions(+), 60 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3407cb43e..b96f3e77c 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -54,6 +54,7 @@ - Fix 'Detach instance' shortcut is not working [Taiga #8102](https://tree.taiga.io/project/penpot/issue/8102) - Fix import file message does not detect 0 as error [Taiga #6824](https://tree.taiga.io/project/penpot/issue/6824) - Image Color Library is not persisted when exporting/importing in .zip [Taiga #8131](https://tree.taiga.io/project/penpot/issue/8131) +- Fix export files including libraries [Taiga #8266](https://tree.taiga.io/project/penpot/issue/8266) ## 2.0.3 diff --git a/backend/src/app/binfile/common.clj b/backend/src/app/binfile/common.clj index bfbfe6186..d8c381174 100644 --- a/backend/src/app/binfile/common.clj +++ b/backend/src/app/binfile/common.clj @@ -15,6 +15,7 @@ [app.common.files.migrations :as fmg] [app.common.files.validate :as fval] [app.common.logging :as l] + [app.common.types.file :as ctf] [app.common.uuid :as uuid] [app.config :as cf] [app.db :as db] @@ -331,54 +332,12 @@ (defn embed-assets [cfg data file-id] - (letfn [(walk-map-form [form state] - (cond - (uuid? (:fill-color-ref-file form)) - (do - (vswap! state conj [(:fill-color-ref-file form) :colors (:fill-color-ref-id form)]) - (assoc form :fill-color-ref-file file-id)) - - (uuid? (:stroke-color-ref-file form)) - (do - (vswap! state conj [(:stroke-color-ref-file form) :colors (:stroke-color-ref-id form)]) - (assoc form :stroke-color-ref-file file-id)) - - (uuid? (:typography-ref-file form)) - (do - (vswap! state conj [(:typography-ref-file form) :typographies (:typography-ref-id form)]) - (assoc form :typography-ref-file file-id)) - - (uuid? (:component-file form)) - (do - (vswap! state conj [(:component-file form) :components (:component-id form)]) - (assoc form :component-file file-id)) - - :else - form)) - - (process-group-of-assets [data [lib-id items]] - ;; NOTE: there is a possibility that shape refers to an - ;; non-existant file because the file was removed. In this - ;; case we just ignore the asset. - (if-let [lib (get-file cfg lib-id)] - (reduce (partial process-asset lib) data items) - data)) - - (process-asset [lib data [bucket asset-id]] - (let [asset (get-in lib [:data bucket asset-id]) - ;; Add a special case for colors that need to have - ;; correctly set the :file-id prop (pending of the - ;; refactor that will remove it). - asset (cond-> asset - (= bucket :colors) (assoc :file-id file-id))] - (update data bucket assoc asset-id asset)))] - - (let [assets (volatile! [])] - (walk/postwalk #(cond-> % (map? %) (walk-map-form assets)) data) - (->> (deref assets) - (filter #(as-> (first %) $ (and (uuid? $) (not= $ file-id)))) - (d/group-by first rest) - (reduce (partial process-group-of-assets) data))))) + (let [library-ids (get-libraries cfg [file-id])] + (reduce (fn [data library-id] + (let [library (get-file cfg library-id)] + (ctf/absorb-assets data (:data library)))) + data + library-ids))) (defn- fix-version [file] diff --git a/backend/src/app/binfile/v1.clj b/backend/src/app/binfile/v1.clj index 5bad01f6d..3e1c93aa0 100644 --- a/backend/src/app/binfile/v1.clj +++ b/backend/src/app/binfile/v1.clj @@ -130,7 +130,6 @@ (.writeLong output (long data)) (swap! *position* + 8)) - (defn read-long! [^DataInputStream input] (let [v (.readLong input)] diff --git a/common/src/app/common/types/file.cljc b/common/src/app/common/types/file.cljc index d12b759df..8aeac6ada 100644 --- a/common/src/app/common/types/file.cljc +++ b/common/src/app/common/types/file.cljc @@ -633,19 +633,24 @@ "Find all assets of a library that are used in the file, and move them to the file local library." [file-data library-data] - (let [used-components (find-asset-type-usages file-data library-data :component) - used-colors (find-asset-type-usages file-data library-data :color) - used-typographies (find-asset-type-usages file-data library-data :typography)] + (let [used-components (find-asset-type-usages file-data library-data :component) + file-data (cond-> file-data + (d/not-empty? used-components) + (absorb-components used-components library-data)) + ;; Note that absorbed components may also be using colors + ;; and typographies. This is the reason of doing this first + ;; and accumulating file data for the next ones. - (cond-> file-data - (d/not-empty? used-components) - (absorb-components used-components library-data) + used-colors (find-asset-type-usages file-data library-data :color) + file-data (cond-> file-data + (d/not-empty? used-colors) + (absorb-colors used-colors)) - (d/not-empty? used-colors) - (absorb-colors used-colors) - - (d/not-empty? used-typographies) - (absorb-typographies used-typographies)))) + used-typographies (find-asset-type-usages file-data library-data :typography) + file-data (cond-> file-data + (d/not-empty? used-typographies) + (absorb-typographies used-typographies))] + file-data)) ;; Debug helpers