Problem/Motivation
Only the default revision gets exported. It should be possible to export (and import) all revisions.
Steps to reproduce
- Create a node with multiple revisions.
- Export the node.
Expected behavior: with revisioning support enabled, all revisions should be exported.
Actual behavior: there's no revisioning support, therefore only the default revision gets exported.
Proposed resolution
Add a submodule that also exports revisions, so it's easy to enable/disable revisioning support as needed.
Remaining tasks
Review, merge, release. Possibly contemplate upon the impossibility of properly exporting/importing paragraphs.
User interface changes
None.
API changes
None. Actually, the submodule is possible by using the already-existing API.
Data model changes
Just like with translations, there should be a revisions entry in the exported YAML.
| Comment | File | Size | Author |
|---|---|---|---|
| #4 | after-patch.mov | 3.8 MB | Rangaswini |
| #4 | before-patch.mov | 1.5 MB | Rangaswini |
| #4 | node-revisions.png | 89.57 KB | Rangaswini |
| #4 | patch-success.png | 99.13 KB | Rangaswini |
| #2 | single_content_sync-3421812-2.patch | 6.72 KB | boobaa |
Issue fork single_content_sync-3421812
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #2
boobaaThe attached patch adds a single_content_sync_revisions submodule, which adds this feature.
Comment #3
Rangaswini commentedComment #4
Rangaswini commentedReviewed patch #2 and works fine with version 1.4. Please refer screenshot
Step:
Created a node with multiple revisions.
Exported the node.
Result: All revisions are exported now.
Comment #5
abrammHi Boobaa,
Thank you for your effort!
A few thoughts here.
1) We definitely don't want to have
accessCheck(FALSE). The current user may not have permissions to view all revisions; this code will give them read access. This is a security/data disclosure issue.2) The core version requirement should be
core_version_requirement: ^9.3 || ^10, same as in root info.yml.3) The following line will produce a warning if there are no revisions in YML file:
if ($content['revisions']) {4) The revision creation time should be import/exported the same way we do for created/changed timestamps.
5) We'd likely need a test for this; also, please create the merge request to run automated tests.
Thanks!
Comment #6
abrammComment #7
nitish kumar pandey commentedHi,
I have tried to using this patch it is getting exported with revision but as I a paragraph field when i am import it i am getting as
Call to undefined method Drupal\paragraphs\Entity\Paragraph::setRevisionCreationTime() in Drupal\single_content_sync_revisions\ImportSubscriber->onImportEvent() (line 52 )... please look to this issue as well
Comment #9
boobaaFixed.
Fixed.
Fixed.
The revision creation time is imported the same way it is done for the created/changed timestamps: although the exported zip only contain the created data, the current timestamp is used during the import. Changed timestamps are completely ignored, even during export. Please refer to ContentImporter::doImport().
Tests to be written in a later phase.
Thank you for reporting this; turns out Paragraph entities do not have proper revisioning support: as Paragraph items are referenced not only by their entity ID, but also their revision ID, and revisions do not have UUIDs, there is no way to properly import references to Paragraphs' revisions. Because of that, even exporting Paragraph revisions is useless.
Note this also means that the parent entity (eg. node) might have its revisions exported, but ALL those revisions would have the same content in the paragraph fields' revisions: the one belonging to the latest revision. Other, non-paragraph fields of the parent have proper revisioned content.
Therefore the MR just skips Paragraph revisions, even during export.
Comment #10
boobaaComment #11
mxr576(It looks like UUID vs revisioning supported is tracked under this Drupal core issue: #1812202: Add UUID support for entity revisions. Bumped that with a quote from comment 9.)
Comment #12
mxr576But still in this issue, am I right?
Comment #13
mxr576Comment #14
boobaaAll concerns from @mxr576 have been addressed and the MR got updated accordingly.
Comment #15
ludo.rI have a content type with 150+ custom fields and some nodes that have dozens of revisions.
When loading revisions when exporting, this causes memory issues and also a long time to export.
Changing this (in
modules/single_content_sync_revisions/src/ExportSubscriber.php):to:
solves the memory issues and makes the process much faster.
Comment #16
mxr576Good catch and regular issue, although the fix leads to the infamous N+1 problem of ORMs
I would rather recommend implementing something like I did in an other module, load multiple with a maximum amount:
https://git.drupalcode.org/project/view_usernames_node_author/-/blob/1.0...
(tricks like this is necessary until a stable solution lands in Core for #2577417: Add an entity iterator to load entities in chunks)
Comment #17
mxr576Comment #18
aaronchristian commentedI just realized there is a sub-module now for this called
single_content_sync_revisions.