Problem/Motivation
In order to track changes on commerce products and product variations we need revisions.
Initially we removed revisions from products and product variations when it became obvious we'd need to rewrite all of the core revision (UI) code ourselves, and because syncing revisions between a product and variations would be difficult.
The merge request here introduces basic revision support that is usable.
Warning: using the merge request or patches may cause problems when you want to revert back to a situation without revisions. Drupal core does not (yet) support entity updates which revert back to a situation without revisions. To do this you need to patch/hack core to do this, copy tables of all non revision tables, than execute entity updates, move tables back.
Proposed resolution
Implement revision support in merge request https://git.drupalcode.org/project/commerce/-/merge_requests/243
Remaining tasks
1) Review of merge request approach by Commerce maintainers
2) Decide if this is suitable for Commerce 3.x or 4.x
User interface changes
1) new revision checkbox on products and product variations
2) New revision tab on products and product variations
API changes
The product and product variation entity + their fields are changed to be revisionable.
Data model changes
Product fields are changed to be revisionable.
Release notes snippet
to be done
| Comment | File | Size | Author |
|---|
Issue fork commerce-2656896
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
bojanz commentedProducts are the entities most likely to need revisions.
We'd need to revision each variation when a product revision is created. 50 variations -> 50 new revisions.
The gain of doing that is unclear at this point, since variations are generally low on actual content.
I rediscussed this with mglaman and rszrama, and we decided not to revision variations for now. We can revisit post 2.0 if needed.
That means that we only need to make the product entity revisionable, and use Entity API to add the appropriate revision UI.
Comment #3
bojanz commentedWe'll probably need to do some work on the revision UI in Entity API:
https://www.drupal.org/node/2729889
https://github.com/fago/entity/pull/41
https://github.com/fago/entity/pull/13
Comment #4
czigor commentedComment #5
czigor commentedhttps://github.com/drupalcommerce/commerce/pull/451
Comment #6
czigor commentedComment #7
czigor commentedTests fail.
Comment #8
bojanz commentedWe have decided to punt this to RC1.
The non-revisionable to revisionable upgrade path that was supposed to land in core for 8.2.0 was postponed to 8.3.0, and we really don't want to leave existing users high and dry. Plus, there is still no generic revision UI we can just use, and it would be wasteful to write one ourselves. So let's wait 6 months.
Core issue: #2721313: Upgrade path between revisionable / non-revisionable entities.
Comment #9
replicaobscuraSo, 8.3.0 has hit, #2721313 is RTBC but not committed yet, does that mean we are still just waiting until a core release which includes that patch?
I'm curious what the state of the PR is, also--as of last year there was a comment on it that it was ready for review, but I'm assuming much has changed in Commerce since then that may have affected some of that work from so long ago.
Comment #10
bojanz commentedYeah, the core patch won't land before 8.4.0, which means we wait until then.
Comment #11
andypostWould be great to have revisions for orders as well (disabled by default)
Comment #12
bojanz commented@andypost
That won't happen. Bad experiences in 1.x (size and performance impact while being really impractical for an actual audit log due to not being able to know what actually happened). We advise using commerce_log to log changes instead.
Comment #13
niko- commentedHI @bojanz
Thanks for your reply
If on the project customer require to show not only logs, but side by side order diff we need custom module and order entity type alter there to make this fucntionality.
Not sure that custom module is good sullution for this case
Comment #14
bojanz commented@niko-
Correct. Side-by-side order diffs are not a use case that Commerce core is planning to support.
Comment #15
andypost@niko- Better to have this as contrib module
Comment #16
jacerider commentedI have taken an initial stab at adding revisioning support to products using the new functionality available in Drupal 8.4+.
Comment #17
mglamanComment #18
jacerider commentedPatch updated to support Commerce 2.9.
Comment #19
jacerider commentedAdded better permission handling.
Comment #20
bojanz commentedI was advised by core people to wait for Drupal 8.7.x and #2984782: Add an API for converting entity type schemas to (non-)revisionable/(non-)translatable, with or without data, since that will fix many potential issues in the update code.
It's important for us that the update is as risk free as possible.
Of course, that doesn't mean that we can't keep iterating on the patch until 8.7.0 is released. We can prepare the patch by March, have it tested by existing large sites with 8.7.x-dev, then commit it in April when we update the core requirement.
Comment #21
kala4ekJust updated patch (#19) according to current dev.
Comment #22
kala4ekThe same with the right hook_update and post_update numbers.
Comment #24
kala4ekAnd another one for compatibility with PHP 7.2
Comment #25
mikhailkrainiuk commentedHello!
The small fix to resolve conflicts with the new dev branch.
P.S. it works for me.
Comment #26
kala4ekThere is a lot of mentions for "Asset".
But the critical one is checking for "revert all asset revisions" and "delete all asset revisions" permissions, that missed.
So that mean, only superadmin (uid = 1), has access to operate with revisions.
Comment #27
tamarpe commentedre-roll the hook_updates to the new version of commerce, and fix the permissions issue (see interdiff).
Comment #28
jefuri commentedThere were a couple of bugs with routes of the translation revert and the way the revert form was setup and extended the entity API revert form.
Fixed this by comparing the implementation of the core node translation revert form with this and updated the patch.
Doing this I somewhat think that the Entity API version of the revert form should be updated to be more inline with the setup of the core Node version.
Comment #29
jefuri commentedSmall bug in de route name. Fixed it.
Comment #30
j. commentedWe are trying this patch out and are running into the following message in the Status Report
"Mismatched entity and/or field definitions
The following changes were detected in the entity type and field definitions.
Product
The Title field needs to be updated."
Not sure it's related to this patch, but it's what i've change recently. I've run drush updb, but still have the message. Do i need to do something different to update this field?
Comment #31
jefuri commentedYeah, that is a pain... I had a similar issue. Look into this:
https://www.drupal.org/project/devel_entity_updates
Comment #32
j. commentedI tried using that module and running drush entup, but I'm getting these messages and it's not able to complete the update.
array_intersect_key(): Expected parameter 1 to be an array, null given
SqlContentEntityStorageSchema.php:2494
[warning]
Drupal\Core\Entity\Exception\FieldStorageDefinitionUpdateForbiddenException: The SQL storage cannot change the schema for an existing field (title in commerce_product entity) with data. in
[error]
Comment #33
j. commentedThis may not be the right spot to post this, so if someone could point me in the right direction, I would be grateful.
I think I made a huge mistake. I was trying out this patch and it seemed to be working well for what i needed. I didn't notice the issue mentioned in #30 at the time, and pushed it into my Production code/env. Big oops, right?
Now, I find I can't rollback the patch without getting lots of errors (can provide if needed). I'm nervous that I will have trouble with future Commerce updates (this patch hasn't applied for me against latest Commerce dev).
Is there any direction/tutorials that can help me figure out how to "undo" this? Am I seriously in trouble?
Thank you.
Comment #34
jefuri commentedreroll against 2.19
Comment #35
jefuri commentedIssue with duplicate
Comment #36
jefuri commentedComment #38
j. commentedWith the latest patch I am getting this error:
Error: Class 'Drupal\commerce_product\Entity\LanguageInterface' not found in Drupal\commerce_product\Entity\Product->ensureTranslations() (line 380 of /app/web/modules/contrib/commerce/modules/product/src/Entity/Product.php)
I resolved it by adding the following use statement and the error went away. Is this correct?
use Drupal\Core\Language\LanguageInterface;
Comment #39
shabana.navas commentedFixed patch to address issue in #38. Patch is against latest 2.x.
Comment #40
miro_dietikerWit the recent progress, i think this should now be built with the referred core patch.
Comment #41
jefuri commentedComment #42
fadonascimento commentedI added this patch to make compatible with Drupal 9.1 and Drupal Commerce 2.24
Comment #43
jsacksick commentedWhy do we have a post update function completely commented out?
This doesn't look correct to me...
There's no
commerce_product_update_8400I haven't reviewed the rest yet, but these 2 things are weird to me.
Comment #44
kiaraz commentedHello, I am using Drupal 9.1.9 and Drupal commerce 2.24. I have tried this patch "commerce-add_product_revision-2656896-42.patch" and it is not working. After implementing this patch, there is no option coming to view product revisions in the Drupal admin.
Comment #45
sistocarta commentedHallo, I'm using Drupal 9.2.6 and commerce 2.27.
Using the patch #42. Can not run through the pending entity updates.
Product
The Author field needs to be updated.
Stock location
The User ID field needs to be installed.
Any ideas?
I always get the following errors:
Thanks for your help.
Comment #46
cola commented@sistocarta you need to install the field
Comment #47
cola commentedWe migrate our Commerce to the latest version and to Drupal 9.2.7. After this, we was not able to save a new product. Error on Log was: Drupal\Core\Entity\EntityStorageException: Field is unknown. in Drupal\Core\Entity\Sql\SqlContentEntityStorage->save() (Line 810 in XXX/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php).
The message "Field is unknown" was not meaningful, so we investigate it and found out, that the field revision_default was missing and Drupal Core search for this Field if you use revisions on an entity.
So the patch ”commerce-add_product_revision-2656896-42.patch“ will not work with the Drupal 9.2.7. Drupal Core calls the function getRevisionMetadataKey($key) which you find in ContentEntityType.php. The default value is there "revision_default" which Drupal puts, so if this is missing you became the "Field is unknown" issue.
You must add the field with the code bellow or adjust the patch with them.
Comment #48
jungkunwar commented@cola #47 works for me to resolve the revision_default field.
Still, I am having
Mismatched entity and/or field definitions
The following changes were detected in the entity type and field definitions.
Product
Could you please help me to resolve this error?
Comment #49
khiminrm commentedUpdated the patch from #42 and fixed issues with error messages about not existing fields during updating process, also fixed UI etc.
Tested on existing Drupal 9.1.13 site with some product types and products.
Comment #50
khiminrm commentedComment #51
khiminrm commentedComment #52
jsacksick commentedThis won't go into 2.x.
Comment #53
khiminrm commentedAdded revisions to product variations, but still need to fix update functions for existing site.
Comment #54
khiminrm commentedComment #56
khiminrm commentedImproved update functions to add revisions tables to existing product variations. This patch is for 2.x
Comment #57
rszrama commented@khiminrm / @jsacksick - I'm a little concerned that we're changing the base class for
ProductfromCommerceContentEntityBaseto EditorialContentEntityBase. It looks like we'll be losing functions from our custom base class that I assume might be in use elsewhere:CommerceContentEntityBase::getTranslatedReferencedEntity()CommerceContentEntityBase::getTranslatedReferencedEntities()Should we instead be making a
CommerceEditorialContentEntityBasethat extends core's and preserves these functions for our own uses?Comment #58
rszrama commentedOh, additionally, I think a
CommerceEditorialContentEntityBaseshould include a helper function for loading a referenced variation in the appropriate revision relative to the timestamp of the product revision.Don't know exactly what that should look like, but if I've loaded an older revision of a Product, I'd look for something like
$product->loadReferencedEntityRevisionByTimestamp()to load the version of a product variation that, by created time, would have been current at the given timestamp. (Understanding this may not be perfectly accurate, since the current revision may not have been the latest one ... but it would be close enough and could then theoretically be used to improve the revision view page to inject fields from the appropriate revision.)Comment #59
jsacksick commentedI haven't really tested the patch manually, but one of first things I've noticed is the product controller, can't we use the
\Drupal\entity\Controller\RevisionOverviewController? Or at the very least the trait offered by Entity API?I agree with Ryan, I don't think it's worth extending another class. The only thing we're currently missing is the
RevisionLogEntityTraitthat the product is currently not using, all we have to do is use it and add:$fields += static::revisionLogBaseFieldDefinitions.Introducing
CommerceEditorialContentEntityBaseis a nice to have, but I don't think we're gaining a lot by introducing it.@rszrama: Regarding
$product->loadReferencedEntityRevisionByTimestamp(), I'm not sure why we'd need that? We usually load a revision by its ID?Regarding the default_variation "field", it's computed and therefore shouldn't be marked as revisionable.
Also, if we really want to revision variations, then I think the product should reference a variation revision? Just afraid that'd potentially introduce bugs... A little bit hesitant to go all in with revisions as revisions are costly in terms of DB storage especially for sites with lots of products.
Do we really need these new methods on the storage?
I'm not sure the product ID should be revisionable as it shouldn't really change in theory... But perhaps we could use this to track when the reference is lost/fixed?
Comment #60
rszrama commented@khiminrm Can you look into this?
It's a convenience function, to be honest. There's no specific need, but it would be convenient for someone trying to understand what the state of a product with all its variations was in the same way we have convenience functions for loading translated referenced entities.
@khiminrm Can you adjust this?
Sorry, I may not have included the instruction above, but to avoid introducing an extra dependency, we decided to focus just on the 1.x comparable feature set of products and product variations being independently revisioned. I'm also concerned about the DB storage implications, but it should be easy enough for sites with large catalogs to disable them by default, right? And certainly to disable them within the variations inline form widget?
Speaking of which ... @khiminrm, we do need the
SingleVariationWidgetto be updated in conjunction with this patch to add the toggle for whether or not updating the referenced variation should create a new revision. This should mimic the other inline entity form widgets, which have the checkbox in their form widget settings like so:Comment #61
mdooley commentedAfter installing the patch from @khiminrm in #56 we found that the Add to cart form / button was removed from our product pages. This was due to how the
ProductVariationStorage::loadEnabledmethod was determining if a variation was enabled.When the
loadEnabledmethod is executed, it loads the variations from the product and generates and array of variation ids:But then it attempts to remove any disabled variations by doing a DB query for any variation which is in the $ids array, and has a status of 1, followed by an array_intersect_key of the $ids and the DB query results:
The issue occurs because the keys and values of the $ids array are both the variation ID, whereas the result from the DB query is an array with the variation revision ID as the key(s) and variation ID as the value.
I've attached an updated patch which changes
array_intersect_keytoarray_intersect, so that the intersection is done on the array values rather than the array keys.Comment #62
mdooley commentedComment #63
dwkitchen commentedComment #65
jsacksick commentedI've been working extensively on this today and refactored a lot of code:
ProductViewsDataandProductEntityViewsDataRevisionRouteProviderwhich provides routes for revisionable Commerce entities.CommerceRevisionableContentEntityBasewhich extendsCommerceContentEntityBaseso we don't have to duplicate the helpers that are provided by this base entity class.ProductVariationStorageand removed theProductStorageintroduced (there were helper methods for which we have no real need, additionally, these were completely copied from theNodeStorage.{commerce_product_variation_revision}and did my best to document this limitation in code (the Symfony route compiler has a limitation of 32 characters for route variables.Also, the patch was made against 2.x, but I really think that this change can't go in 2.x as it's too risky for existing installations since there are plenty of new database tables created, which means this would definitely affect data migrations for example as well as custom queries.
Additionally, these changes affect JSON API as well. I wouldn't want to risk breaking existing installations and it definitely sounds safer to commit this directly to 3.0.x.
Finally, we're missing tests coverage for the newly added logic. We are at the very least missing a functional test
ProductRevisionsTest(I bet we could steal most of the logic fromDrupal\Tests\node\Functional\NodeRevisionsTest.I haven't really thought about eventual new Kernel tests that would make sense to create, but perhaps the Kernel Entity tests?
For future iterations, providing an interdiff would definitely help following the changes, as well as a comment explaning why a particular change is made because it seems obvious that the last iteration of the patch (from comment #62) inherited a lot of code from the early patches which seems irrelevant today.
We might as well miss a setting at the product type level (similar to content types) that determines whether a revision is created by default or not (could be implemented as a followup I guess).
Comment #66
jsacksick commentedComment #68
jsacksick commentedTests were passing locally, so retried them and they passed.
Comment #69
mglaman+1 for 3.x. One concern was this patch landing and sites with millions of products having to dance around this upgrade.
Is Drupal 8 supported on 3.x? If not we can drop commerce_product_update_dependencies to remove the amount of changes.
I think Functional tests are enough over Kernel.
What would be neat is an upgrade test – we can create a small SQL dump before the changes and then run a test to do the upgrade. That'd be nice. Core has this in a few places.
I think anything missing is fine as a follow up once it lands, to match feature parity with revisions on nodes/terms/etc.
Comment #70
jsacksick commentedcommerce_product_update_dependencies()was already dropped. D8 is not supported by 3.0.x no. In fact 2.x-dev doesn't support D8 either which is as you know no longer supported.Comment #71
khiminrm commented@jsacksick I've created tests for product revisions. Could you review, it please? I haven't created for variations yet. Should be something similar, right?
Comment #72
jsacksick commented@khiminrm: That's a good start, however we're missing a few things.
As discussed on Slack, while testing the HTTP status code is good, we don't actually confirm that a product revision is properly reverted.
We need to ensure deleting a revision works as expected too:
For examples, Node does this for testing the deletion:
For testing that a revision is reverted, Node does this:
So we need to the same for products (adapted of course with the actual message that's displayed when displaying a product revision).
Also, we have no tests equivalent to
NodeRevisionsTest::testRevisionTranslationRevert()that confirms that a specific revision of a translation gets reverted.And lastly, testing revisions for product variations would be great as well.
Comment #73
khiminrm commentedI've added additional tests mentioned in previous comment. Still need to create product variations tests.
Comment #74
khiminrm commentedI've added tests for variations revisions. Also made some code changes for product revisions tests and added some fixes to the patch to fix some errors found during writing tests.
Regarding variations tests I haven't added tests for variation revision view page as there is no canonical view page for variation.
Also there are no tests for accessing revert, delete pages of revisions of different bundles variations as there are no bundle specific permissions as in products. Tested on local to access the pages with use which role has permission to revert, delete specific product bundle revisions and the user doesn't have access to revert or delete variation revision of the same bundle as product. Maybe we need additional fixes in code of the patch. Not sure yet how to fix it properly.
Comment #76
kiaraz commented@khiminrm Hi, I have used this #74 patch. I didn't get any errors which is great but I am not sure how to test this? There is no option coming in Drupal admin to revert to the previous version of the product. There is no setting in the admin panel to show product revisions.
Could you please explain the steps or process to test this patch? That would be really helpful. I believe the way we have the revert option for a normal content page, similarly, we should have that for the products as well. Please share more information on this.
Thank you
Comment #77
aaronmchale#2350939: Implement a generic revision UI has been committed.
Although might be worth waiting until #3323788: Revert and Delete actions should not be available for the current revision is resolved.
Comment #78
damienmckennaI don't think the work here needs to be paused until #3323788 is done, that's just a bug fix to one tiny part of the system.
I think it would be worthwhile to identify all of the pieces necessary in the issue summary, including each test scenario we want to cover and whether they're done.
@khiminrm: Were the bugs you fixed as part of #74 things related to the revisions change or existing functionality in Commerce?
Comment #79
damienmckennaAlso, should this go into 3.0.x instead of 8.x-2.x?
Comment #80
damienmckennaRelated: #3347483: Support product revisions from Commerce v1
Comment #81
damienmckennaFYI patch #74 still applies, but there was a little fuzz on one file so here's a clean reroll.
Comment #82
jsacksick commentedThis was initially targeting 3.x, not really sure why I changed it back to 2.x...
My main concern with revisions is the inability to disable them... On a large project I'm working on, enabling revisions would cause the DB to grow way too quickly...
Also, there's still a data loss concern... Which makes me wonder if we shouldn't instead introduce a commerce_product_revision module, which swaps the Product entity class to one that supports revisions... But... That maybe unrelastic as there's code elsewhere that still wouldn't require changes to account for revisions...
Comment #83
damienmckennaMoving to v3.
Following node's workflow, it's not assumed that a change on the node would result in a new revision, that default is controllable per content type. So why would this be any different?
Comment #84
jsacksick commentedWell, what I meant (sorry if I was unclear) is that even if you're not planning to use revisions, the data model is still affected regardless.
Which means, duplicate revision tables for fields, for the main table as well (i.e commerce_product_revision). That surely has a non neglible impact on performance.
I wouldn't like having to suddenly worry about this on the relatively large sites I'm currently maintaining.
The content type setting doesn't have any impact on any of that. (it just drives whether a new revision is created on save).
Comment #85
damienmckennaOk, ISWYM.
Comment #86
tbkot commented#74 works for me. One thing that I would like to add is the relationship of the view between revision and the actual entity. It was not covered by CommerceEntityViewsData so I've added some changes for it to work the same as it was done in the EntityViewsData.
Interdiff is not working, changes were added at the end of the patch.
Comment #87
tbkot commentedComment #88
anybody@jsacksick Re #84 wouldn't that mean that Drupal already has a by far larger issue with performance and revisions, as it uses nodes and they are revisionable?
What I read here is:
Do I get that right?
Wouldn't then any large project, using nodes, make a wrong pick with Drupal?
Just playing Devils Advocate ;) To clarify things.
Comment #89
c_archer commentedCurrently using a patch in #87 which does work but the time stamp and author is always the same.
Comment #90
tbkot commentedBased on the node behavior, this patch below adds a moderation handler to the product entity.
Comment #91
c_archer commentedPatch on #60 currently fails against latest commerce release 2.37.0
Comment #93
andriy khomych commentedI've tested locally. I think we can move it to "Needs review".
Comment #94
tbkot commentedPatch with the latest changes from MR
Comment #95
anybodyThe fork needs to be updated and conflicts needs to be resolved. Anyway, this looks quite far implemented. Thank you @tBKoT for pushing things forward.
#2350939: Implement a generic revision UI and #3323788: Revert and Delete actions should not be available for the current revision are both resolved in core. So this should be compared to what https://www.drupal.org/node/3160443 suggests.
Maybe "Needs tests" tag can be removed, I can see the MR has tests, but that needs to be checked in detail.
I think there are quite a few projects where it would be great to have revisions for products and product variations to be able to track changes and revert them if needed!
Comment #96
anybodyMade the title reflect the implementation.
Comment #98
grevil commentedRebased it. Let's see what the tests say.
Comment #99
grevil commentedOk, seems like this some test inside "ProductLayoutBuilderIntegrationTest" fails for the next major drupal release.
Back to needs work.
Comment #100
grevil commentedTests succeed again, after rebasing on current 3.0.x-dev!
Comment #101
grevil commentedThis issue just came up in Slack again: https://drupal.slack.com/archives/C1TLCCF9B/p1724339226822049
There is still no final decision, whether this issue will ever see the light of day, but it definitely won't be 3.0.x.
The current state of this issue branch add revision support for both products and product variations. There were some discussions earlier inside this issue and slack, whether to only support revisioning products, but at least for our use case, we'd need revision support for both products and product variations.
The current MR currently doesn't include the typical "Create new revision" checkbox used on most revisionable entities:
Hence, I am setting this back to needs work.
An even better approach mentioned by @jsacksick over @Slack would be to be able to opt in to revisioning when creating a product- / product-variation-type. This seems to be the way forward, if we want this feature getting merged in future 4.x / 5.x releases. But that's not straight forward, as this feature isn't currently supported by Drupal "out of the box" and (might) need a lot of work.
Comment #102
dev.drupal.lnHi tbkot #94, Patch doesn't work on latest commerce version an dev version as well
Comment #103
c_archer commentedIt would be great if we could set how many revisions are kept, sites with a large product database could end up with very large revision tables. Allowing to set a cap would be a good solution for this.
Comment #104
gaele commented@c_archer There's A Module For That, e.g. https://www.drupal.org/project/revision_cleanup or see the list of modules on this page https://www.drupal.org/project/node_revision_delete
Comment #107
arantxioI merged the branch and worked on making it able to set the default for revision for product types.
I tested this on our environment and it seems to be working as expected.
Comment #108
arantxioIt seems it doesn't save the default revision state from the settings, so it need some new logic, ill continue working on this.
Comment #109
arantxioI've worked on the setting the revisions by default and it seems to work for us now.
Comment #110
rowrowrowrow commentedPatch for the 3.0.2 tag
Comment #111
rowrowrowrow commentedComment #112
g_miric commented@rowrowrowrow The 2656896_3.2.0.patch is empty.
Comment #113
g_miric commentedComment #114
anybodyWhao, this is a heavy one. Because many files are changed, I think someone should review this asap and the Commerce Guys should decide how to proceed here. In the meantime perhaps the two tags
Needs tests, Needs issue summary updatecould be resolved?
I won't have the time in the near future, but still think this would be a very helpful option for those who need it!
Comment #115
klausiCode changes look good to me in merge request https://git.drupalcode.org/project/commerce/-/merge_requests/243 . I fixed the phpcs and phpstan fails.
The change is quite big in general, so might only be something for Commerce 4.x?
Test coverage looks ok to me and we have the basics tested here.
I also updated the issue summary.
Comment #116
anas_maw commentedAny updates on this feature?
Comment #117
djdevinFor some reason I can't merge 3.x into this branch even though it says I should be able to. Can someone do it?
It merged cleanly for me.