#226 | 2569805-226-reroll-219.patch | 114.98 KB | joelpittet |
|
#219 | interdiff.txt | 1.2 KB | quietone |
#219 | 2569805-219.patch | 114.14 KB | quietone |
|
#215 | 2569805-215.patch | 114.13 KB | quietone |
|
#210 | interdiff.txt | 1.91 KB | quietone |
#210 | 2569805-210.patch | 114.09 KB | quietone |
|
#207 | interdiff.txt | 7.8 KB | quietone |
#207 | 2569805-207.patch | 114.05 KB | quietone |
|
#206 | interdiff.txt | 1.03 KB | quietone |
#206 | 2569805-206.patch | 115.88 KB | quietone |
|
#204 | interdiff.txt | 1.28 KB | quietone |
#204 | 2569805-204.patch | 115.5 KB | quietone |
|
#202 | interdiff.txt | 426 bytes | quietone |
#202 | 2569805-202.patch | 115.5 KB | quietone |
|
#200 | interdiff.txt | 11.79 KB | quietone |
#200 | 2569805-200.patch | 115.5 KB | quietone |
|
#199 | interdiff.txt | 12.46 KB | quietone |
#199 | 2569805-199.patch | 117.62 KB | quietone |
|
#198 | interdiff.txt | 515 bytes | quietone |
#198 | 2569805-198.patch | 121.86 KB | quietone |
|
#196 | interdiff.txt | 7.42 KB | quietone |
#196 | 2569805-196.patch | 121.22 KB | quietone |
|
#194 | interdiff.txt | 794 bytes | quietone |
#194 | 2569805-194.patch | 115.21 KB | quietone |
|
#192 | 2569805-192.patch | 115.12 KB | quietone |
|
#190 | 2569805-190.patch | 114.91 KB | jofitz |
|
#190 | interdiff-187-190.txt | 1.41 KB | jofitz |
#187 | interdiff.txt | 6.23 KB | quietone |
#187 | 2569805-187.patch | 114.9 KB | quietone |
|
#186 | interdiff.txt | 577 bytes | quietone |
#186 | 2569805-186.patch | 111.37 KB | quietone |
|
#184 | interdiff.txt | 26.48 KB | quietone |
#184 | 2569805-184.patch | 110.65 KB | quietone |
|
#180 | 2569805-180.patch | 135.42 KB | jofitz |
|
#178 | interdiff.txt | 81.24 KB | quietone |
#178 | 2569805-178.patch | 114.75 KB | quietone |
|
#168 | 2569805-168.patch | 89.14 KB | jofitz |
|
#168 | interdiff-166-168.txt | 774 bytes | jofitz |
#166 | 2569805-166.patch | 89.15 KB | jofitz |
|
#166 | interdiff-163-166.txt | 1.53 KB | jofitz |
#163 | interdiff.txt | 4.77 KB | quietone |
#163 | 2569805-163.patch | 89.15 KB | quietone |
|
#161 | 2569805-161.patch | 89.53 KB | jofitz |
|
#161 | interdiff-159-161.txt | 1.55 KB | jofitz |
#159 | interdiff.txt | 5.84 KB | quietone |
#159 | identify-source-2569805-160.patch | 89.53 KB | quietone |
|
#155 | interdiff-145-153.txt | 17.63 KB | quietone |
#155 | identify-source-2569805-153.patch | 90.56 KB | quietone |
|
#138 | identify-source-2569805-138.patch | 89.31 KB | Ada Hernandez |
|
#138 | interdiff.txt | 1.38 KB | Ada Hernandez |
#136 | new_after.png | 130.08 KB | maxocub |
#134 | interdiff.txt | 4.09 KB | quietone |
#134 | identify-source-2569805-134.patch | 89.23 KB | quietone |
|
#134 | identify-source-2569805-134-test-only.patch | 84.55 KB | quietone |
|
#133 | migrate_after.png | 58.39 KB | maxocub |
#133 | migrate_before.png | 51.66 KB | maxocub |
#131 | identify-source-2569805-127-reroll.patch | 85.75 KB | joelpittet |
|
#127 | interdiff.txt | 2.17 KB | quietone |
#127 | identify-source-2569805-127.patch | 84.47 KB | quietone |
|
#124 | interdiff.txt | 2.41 KB | quietone |
#124 | identify-source-2569805-124.patch | 85.62 KB | quietone |
|
#121 | interdiff-108-121.patch | 3.87 KB | quietone |
|
#121 | identify-source-2569805-121.patch | 85.62 KB | quietone |
|
#119 | 2569805-119.patch | 83.61 KB | heddn |
|
#119 | interdiff_117-119.txt | 649 bytes | heddn |
#116 | 2569805-116.patch | 83.59 KB | heddn |
|
#116 | interdiff_108_116.txt | 2.36 KB | heddn |
#108 | interdiff.txt | 9.13 KB | quietone |
#108 | identify-source-2569805-108.patch | 84.37 KB | quietone |
|
#106 | interdiff.txt | 9.14 KB | quietone |
#106 | identify-source-2569805-106.patch | 82.36 KB | quietone |
|
#103 | interdiff.txt | 724 bytes | quietone |
#103 | identify-source-2569805-103.patch | 77.41 KB | quietone |
|
#97 | identify-source-2569805-97--reroll.patch | 76.94 KB | joelpittet |
|
#96 | interdiff.txt | 4.17 KB | quietone |
#96 | for_drupal_migration-2569805-96.patch | 76.27 KB | quietone |
|
#89 | for_drupal_migration-2569805-89.patch | 71.06 KB | jofitz |
|
#86 | interdiff.txt | 2.98 KB | quietone |
#86 | for_drupal_migration-2569805-86.patch | 71.07 KB | quietone |
|
#76 | Selection_004.png | 12.49 KB | quietone |
#75 | for_drupal_migration-2569805-75.patch | 70.53 KB | quietone |
|
#69 | interdiff_67-69.txt | 3.59 KB | jofitz |
#69 | for_drupal_migration-2569805-69.patch | 70.29 KB | jofitz |
|
#67 | interdiff.txt | 34.59 KB | quietone |
#67 | for_drupal_migration-2569805-67.patch | 70.33 KB | quietone |
|
#66 | for_drupal_migration-2569805-65.patch | 107.62 KB | quietone |
|
#62 | interdiff.txt | 420 bytes | quietone |
#62 | for_drupal_migration-2569805-62.patch | 107.65 KB | quietone |
|
#61 | for_drupal_migration-2569805-61.patch | 107.65 KB | quietone |
|
#53 | interdiff.txt | 3.42 KB | mikeryan |
#53 | for_drupal_migration-2569805-53.patch | 106.54 KB | mikeryan |
|
#50 | for_drupal_migration-2569805-50-do_not_test.txt | 22.58 KB | heddn |
#48 | for_drupal_migration-2569805-48.patch | 107.17 KB | mikeryan |
|
#47 | for_drupal_migration-2569805-47.patch | 107.82 KB | mikeryan |
|
#41 | Selection_017.png | 26.24 KB | juancasantito |
#39 | for_drupal_migration-2569805-39.patch | 107.21 KB | mikeryan |
|
#38 | interdiff.txt | 24.49 KB | quietone |
#38 | mi-identify-source-2569805-38.patch | 106.99 KB | quietone |
|
#37 | mi-identify-source-2569805-37.patch | 83.2 KB | quietone |
|
#35 | mi-identify-source-2569805-35.patch | 84.08 KB | iMiksu |
|
#34 | mi-identify-source-2569805-34.patch | 84.08 KB | quietone |
|
#32 | mi-identify-source-2569805-32-test-only.patch | 106.19 KB | quietone |
|
#16 | mi-identify-sourcemodule.patch | 80.13 KB | tvb |
|
#14 | for_drupal_migration-2569805-14.patch | 80.87 KB | quietone |
|
#13 | for_drupal_migration-2569805-4.patch | 80.88 KB | quietone |
|
#13 | interdiff-for_drupal_migration-4-14.txt | 358 bytes | quietone |
#10 | for_drupal_migration-2569805-4.patch | 80.88 KB | Miguel.kode |
- 8.0.x:
- PHP 5.5 & MySQL 5.5 14,241 pass, 292 fail
- PHP 5.3 & MySQL 5.5 CI error
- PHP 5.4 & MySQL 5.5 CI error
- PHP 5.6 & MySQL 5.5 14,241 pass, 292 fail
- PHP 7 & MySQL 5.5 14,231 pass, 292 fail
- PHP 5.5 & SQLite 3.8 14,228 pass, 292 fail
- PHP 7 & SQLite 3.14 14,218 pass, 292 fail
- PHP 5.5 & PostgreSQL 9.1 14,231 pass, 292 fail
|
#3 | for_drupal_migration-2569805-3.patch | 80.83 KB | mikeryan |
|
#2 | for_drupal_migration-2569805-2.patch | 78.4 KB | mikeryan |
|
#145 | interdiff.txt | 925 bytes | Ada Hernandez |
#145 | identify-source-2569805-145.patch | 89.4 KB | Ada Hernandez |
|
Comments
Comment #2
mikeryanWell, I went through the exercise of simply adding the module to source and destination keys in all the migration templates, which works great for the real-life purpose, but of course the tests with strict config schema checking want to see 'module' in the schema, and I'm not seeing a good way to do that - for the source side, at least, 'module' is relevant only to Drupal sources, but I don't see a way to specify that as schema that's only relevant to source plugins when used in a Drupal-to-Drupal migration context.
I'm having a vague idea that #2559345: Document source_provider and minimum_schema_version annotation properties might be relevant here - right now the 'source_provider' annotation is only used in practice for Drupal source plugins, but it is named that way to account for other use cases (e.g., WordPress plugins). We can't justify adding 'module' to the generic migrate.source.* schema, but we could add 'provider', which would override the annotation-provided provider if present, and achieve what we want here (at least on the source side).
Comment #3
mikeryanMaking 'provider' a general source and destination property, seems to work locally... This will need further refinement
Comment #4
mikeryanLet's see how it does with the tests (passed locally for me, but that means next to nothing...)
Comment #5
mikeryanTagged for review at Barcelona sprints.
Comment #6
ultimikeMinor typo fix.
-mike
Comment #7
ultimikeI'm not sure I'm qualified to review this patch - I don't understand annotations well enough to explain them to someone else...
Regardless, looking at the patch, I noticed that it looks like you removed some "provider" schema? I don't get it:
-mike
Comment #8
quietone CreditAttribution: quietone commented@ultimike, I guess that is removed because it is for an 'empty source'?
Comment #9
mikeryanYes, that was removed because it makes no sense for the empty source.
Comment #10
Miguel.kode CreditAttribution: Miguel.kode commentedThis is a re-rolling for this patch. I solved some conflicts in :
- core/modules/contact/migration_templates/contact_category.yml
- core/modules/file/migration_templates/d6_file.yml
- core/modules/file/migration_templates/d7_file.yml
- core/modules/migrate/config/schema/migrate.data_types.schema.yml
- core/modules/node/migration_templates/d6_node_revision.yml
- core/modules/search/migration_templates/d7_search_settings.yml
- core/modules/user/migration_templates/user_profile_entity_form_display.yml
- core/modules/aggregator/migration_templates/d6_aggregator_item.yml
- core/modules/aggregator/migration_templates/d6_aggregator_feed.yml
Comment #13
quietone CreditAttribution: quietone commented@Miguel.kode, thx for the reroll.
Looks like those errors are because a 'provider:' entry was in the migration_dependencies of user_profile_entity_form_display.yml. But as, always, lets see what testbot has to say.
Comment #14
quietone CreditAttribution: quietone commentedOh, that's the wrong patch. This is the correct one.
Comment #16
tvb CreditAttribution: tvb commentedThere were 2 conflicts in the previous patch.
Comment #17
Miguel.kode CreditAttribution: Miguel.kode commentedthanks @quietone . It works for me.
Comment #18
catchThis seems like something we could collect during discovery?
Comment #19
chx CreditAttribution: chx commentedI do not think I understand this issue. Why is this necessary. Plugins have providers. If the UI needs them, then get it. What's the problem?
Comment #20
quietone CreditAttribution: quietone commentedBecause of the configuration-only migrations. They use the 'variable' source plugin but the provider can be any module.
Comment #21
chx CreditAttribution: chx commentedWell then yes perhaps the variable source plugin needs a provider key. But the config destination plugin carries the destination provider in the first part: action.settings belongs to action. And why did we patch things like aggregator_feed?
Comment #22
quietone CreditAttribution: quietone commentedI see what you mean about the destination provider. So I looked at all the migration templates that use the variable source plugin. There are two that don't use the config destination plugin, d6_date_formats.yml and search_page.yml. Instead they use entity:date_format and entity:search_page respectively. Not sure how to get the provider information from that.
And if the source provider were to be taken from the destination plugin doesn't that limit the source provider to always being the same as the destination provider?
Not sure I understand the question.
Comment #23
mikeryanThat.
Anyway, this exists so the UI can present to the upgrader detailed info on what is being migrated to what. Had some discussions last week with webchick and xjm and we're leaning towards stripping down the review page of the UI (TMI), so this issue is not a priority atm.
Comment #24
benjy CreditAttribution: benjy at PreviousNext commentedDon't we already have source_provider on the source itself providing something pretty similar to part of this? Also, it would be nice if we could source_provider in the annotation with a default so no need to put them in every migration? We could then just override it for the variable migrations?
Comment #25
mikeryanYes, ideally the configuration provider would only need to be set where the plugin lacks one (or for some reason you want to override the plugin's default provider).
Comment #26
xjmComment #27
xjmComment #29
benjy CreditAttribution: benjy at PreviousNext commentedI still think we should use source_provider here. That mean all the content sources are already correct? And then we can just set the source_provider in the migration yml for config migrations.
Comment #32
quietone CreditAttribution: quietone commentedYes, simplifying it would be helpful.
This patch is a reroll. And it include benjy's idea (#29) of using the source_provider for content migrations and adding provider to config migrations. And chx's idea (#21) of getting the destination provider from the config destination plugin. But does not (yet?) add a provider key to the variable source plugin as chx suggested.
It also includes a modified MigrateUpgradeForm which uses this information. (I really want to get rid of that big array.) During testing I added some error messages to help find the migrations that lacked a provider or had one defined in the migration and the source plugin. Since this is a test patch, I have left that in. Actually checking all the migrations was a bit fiddly and I need to get outside!
Comment #34
quietone CreditAttribution: quietone as a volunteer commentedHopefully, this fixes all the typos.
Comment #35
iMiksuChecked if patch needed a reroll. Some offset spotted. Updating patch.
Comment #36
mikeryanComment #37
quietone CreditAttribution: quietone as a volunteer commentedRerolling because #2549839: Removed unused variables from D6 search settings migration was committed.
Comment #38
quietone CreditAttribution: quietone as a volunteer commentedNeeds updating since #2669978: Migrate D7 Menu Links removed menu_links.yml and menu.yml and created d6 and d7 versions of those migrations. Added MigrateUpgradeForm, which was useful as it reported problems with the providers in the user migrations. But I'm not sure how best to present these problem to users of the UI.
Comment #39
mikeryanI had assigned this to myself for review, but having contributed the original patch here it's not appropriate for me to RTBC. I have, however, run an upgrade with this patch applied (after rerolling, as attached) and confirmed that it works properly for reals.
Comment #40
heddnTaking some notes for my review. I will need to look at:
Comment #41
juancasantito CreditAttribution: juancasantito at MTech, LLC commentedThe wording is confusing. I'd prefer to see something more explicit, like 'missing upgrade path'. That make it clear that the path doesn't exist. I'd also like some explanation why the path doesn't exist. Taxonomy originally was on the list. I enabled that module and then it disappeared from the missing list. So, part of a solution is that the destination module might not be enabled. But it could also just be that an upgrade doesn't exist. For example, color module is enabled in D7 & D8, but there is no migrate templates so no path exists.
Lastly, there's a problem with config only changes for things like contrib modules. Screenshot attached. We need to also handle that either by altering something in this patch to it moves out of the missing or explicitly state that the list is a best effort aggregation and it might be lying. Because a migration path does exist for google analytics.
Comment #42
juancasantito CreditAttribution: juancasantito at MTech, LLC commentedComment #43
quietone CreditAttribution: quietone as a volunteer commented@juancasantito, thanks for the review. Yes, work needs to be done on the UI to make these things clearer to users. But that needs to be addressed in a separate issue. Here we are just making it possible to identify the source and destination provider automatically.
I was just looking at the existing issues concerning the UI and there isn't one addressing this specific points you raise. I suggest making a new issue that includes your ideas of how to resolve the problems.
Therefor setting back to NR to see what else people have to say.
Comment #44
mikeryanContrib modules will, as core migrations do, add 'provider' to be included in the list in the UI.
There needs to be a change record, assigning to myself to add. Juan, can you open the follow-up for the UI side?
Comment #46
mikeryanComment #47
mikeryanRerolled
Comment #48
mikeryanAdd a draft change record. Also rerolled for the md_entity patch, and fixed a few newline issues. This is now ready for hopefully-final review, testbots willing.
Comment #49
mikeryan@heddn: Could you review this one?
Thanks.
Comment #50
heddnAdding a review only patch. It has only the changes apart from the provider/source_provider changes.
Comment #51
heddnNeeds work for two points of clarification.
I'm not sure this is enterable code. How can there not be a source module and there be one of these?
This comment doesn't help. We are dealing with destination at this point. Not source.
Comment #52
heddnComment #53
mikeryanOK, I've streamlined the logic in that area, and eliminated the error for having both providers specified (seems to me configuration should override annotation).
Comment #54
heddnThat looks a lot better. What about #51.2?
Comment #55
mikeryanThat comment was removed.
Comment #56
heddnSorry, I didn't see that in the interdiff. Ready for prime time.
Comment #57
alexpottI don't see why the destination needs to have the provider in the template - this should be able to be determined by the plugin. The image style entity type is provided by the image module.
Comment #58
alexpottAlso do we have test coverage that the UI is displaying the correct information?
Comment #60
mikeryanHmm, at one point this was going to go into this patch but somehow we forgot it...
I had thought we had it - and since the output of the UI should be exactly the same as it was before, the tests wouldn't need changing - but it seems #2647470: Write tests skipped right over them. I've added #2834450: Tests needed for migrate_drupal_ui confirmation form to address this (we don't really want to add them as part of this patch, which seems quite large enough already - right?).
Comment #61
quietone CreditAttribution: quietone as a volunteer commentedReroll
Comment #62
quietone CreditAttribution: quietone as a volunteer commentedCorrect the destination provider for d7_user_role.yml.
How? For example for d6_comment_field.yml and d7_comment_field.yml
Comment #63
mikeryanComment #64
mikeryanNot sure why I assigned it to myself for review, my fingerprints are all over this patch...
True, it's necessary for configuration entities - but content entities can determine the provider automatically.
Comment #65
phenaproximaSelf-assigning for review.
Comment #66
quietone CreditAttribution: quietone as a volunteer commentedOK. Patch no longer applies to 8.3 so this is a reroll.
Comment #67
quietone CreditAttribution: quietone as a volunteer commentedNow get the destination provider from the plugin and remove the key from the migration yml files as needed.
Comment #68
phenaproximaDo we still need this variable?
Can this be refactored a bit so we're not repeatedly calling getSourceConfiguration() and getPluginDefinition()? I think it will be a little more readable that way.
Same here. Too many calls to getDestinationConfiguration(). Maybe we could just call $migration->getDestinationPlugin() and use its getConfiguration() and getPluginDefinition() methods.
Comment #69
jofitz CreditAttribution: jofitz at ComputerMinds commented$moduleUpgradePaths
- it only ever has values assigned, but never read.getSourceConfiguration()
andgetPluginDefinition()
getDestinationConfiguration()
(andgetDestinationPlugin
)Comment #70
phenaproximaGorgeous, dahhlink. RTBC.
Comment #72
xjmInteresting that these are provided by Migrate itself; why is that? Other than these additions, all the changes are to the two alpha experimental modules.
If a module fails to include this key, what happens? E.g., many contrib modules will not have them. I don't see the fallback if any described on the change record: https://www.drupal.org/node/2831566
I'm assuming it means the information can't be used by Migrate UI, but what are the actual implications of that? What actually happens? Can someone test manually and provide screenshots of that situation?
For now, I'm moving this back to 8.3.x with an RC deadline, but only because of the changed expectation and the few small changes to sources provided by Migrate itself. It might still be safe to backport this in a patch release even with Migrate in beta, especially given the indirect nature of the change, but on the other hand this is also the kind of thing that's good to ship in minors anyway. So leaving tagged with rc deadline for now, and we can re-evaluate when RC comes around as needed.
Thanks everyone! I'm also adding updated test runs against both branches.
Comment #73
xjmAlso, the issue summary should be updated with the answers to those questions. Thanks!
Comment #75
quietone CreditAttribution: quietone as a volunteer commentedNeeds a reroll.
Comment #76
quietone CreditAttribution: quietone as a volunteer commentedThere are also changes to these source plugins as well.
Attached a screen shot of what happens when source_provider is not in the annotation of d6_user_role and provider is not in the migration template for taxonomy_settings.
Comment #77
phenaproximaSelf-assigning for review.
Comment #78
xjmSince 8.3.x is now in commit freeze for its release candidate phase and Migrate is in beta, this disruptive change should now be targeted for 8.4.x. Thanks!
Comment #79
mikeryanThese migrate_drupal-based source plugins are provided by the user module.
If a module does not indicate its provider, then the UI does not know that that provider (source module) has a migration path and will incorrectly claim that the migration path is missing for that module (which is what is happening now). The migration will actually run - only the reporting will be off (@quietone provided a screenshot).
This patch does not touch the beta-experimental migrate API, it only affects the Drupal-to-Drupal migration path, which is still alpha experimental. I don't see anything disruptive here - modules previously mistakenly shown as not having migration paths will continue to be shown the same way, except now they actually have the capability of indicating their source providers.
Comment #80
mikeryanUpdated the issue summary.
I think this is a blocker for Drupal-to-Drupal beta stability - marking migrate-critical.
Comment #81
joelpittetLikely needs a re-roll after #2724903: Migrated custom block body field is hidden on form and display
Comment #82
mikeryanComment #83
phenaproximaLooks quite good. +1 what @mikeryan said -- this is not API disruptive, but it fixes some very annoying stuff in the UI. I love the fact that we can finally remove that big stupid mapping array.
I found only a few little points:
This should be using $this->t().
Why don't we do something similar to this when determining the source module? If there's a reason for that, we should probably add a comment as to why.
Should be using $this->t().
Comment #84
quietone CreditAttribution: quietone as a volunteer commentedI think that is an understatement!
The source provider for the d6 field migrations is 'content'. Surely that is not right.
Comment #85
mikeryanThe actual machine name of the D6 module we all know and love as "CCK" is, actually, "content". So... it is right, and don't call me Shirley...
Comment #86
quietone CreditAttribution: quietone as a volunteer commentedHah, I don't think I ever looked at the .info file before. Thanks.
Fixed #83.1 and #83.3. For #83.2, I hope the added comments are sufficient.
Comment #87
phenaproximaVery thorough. I'm happy with this.
Comment #89
jofitz CreditAttribution: jofitz at ComputerMinds commentedJust a bit of fuzz in d6_file.yml.
Comment #90
jofitz CreditAttribution: jofitz at ComputerMinds commentedI think such a simple re-roll can be returned to RTBC.
Comment #92
jofitz CreditAttribution: jofitz at ComputerMinds commentedTests are green again, back to RTBC.
Comment #93
alexpottThere's no test coverage of these messages. Also is the lack of a source provider really an error? Doesn't just mean the module is not installed on the source?
Comment #94
quietone CreditAttribution: quietone as a volunteer commentedHow to write the tests? I'm not familiar with WebTestBase.
Comment #95
quietone CreditAttribution: quietone as a volunteer commentedComment #96
quietone CreditAttribution: quietone as a volunteer commentedTests added.
Yes, it really is an error. This is saying that the source provider is not defined, either in the migration or the source plugin annotation. It is that definition which lets us know what module on the source site is/was responsible for the data.
Comment #97
joelpittetHere's a quick re-roll. The changes were in that huge
$moduleUpgradePaths
array, which may need to be reviewed and the testMigrateUpgradeTestBase
the modules array was made multiline and missing the addition of'provider_test'
Comment #98
quietone CreditAttribution: quietone as a volunteer commentedSurprised to see the provider_test was missing, considering the test shouldn't pass without it. So I looked and I do see it the patch from #96.
It was there.
Just a sanity check....
Comment #99
joelpittetOh not missing from the patch, just needing to be added manually back during reroll . Those were the only two merge conflicts I addressed
Comment #100
quietone CreditAttribution: quietone as a volunteer commentedOh, right.
Comment #101
phenaproximaLooks to me like @alexpott's feedback is addressed.
Comment #102
alexpottSo #2724903: Migrated custom block body field is hidden on form and display added to \Drupal\migrate_drupal_ui\Form\MigrateUpgradeForm::$moduleUpgradePaths - are we sure that we're not undoing that change here... asked in another way - how does core/modules/block_content/migration_templates/block_content_entity_form_display.yml get the right source provider?
Comment #103
quietone CreditAttribution: quietone as a volunteer commentedYes, this needs to be updated.
Comment #104
alexpott@quietone do you think we should have a test that ensures somehow that all migrations have the expected source provider since #97 didn't fail?
Comment #105
quietone CreditAttribution: quietone as a volunteer commented@alexpott, ha ha, I was thinking about that too. And trying not to think about (because I just want this patch in and that big array gone). Still it would be useful. A followup?
Comment #106
quietone CreditAttribution: quietone as a volunteer commentedBut then I kept thinking about such a test. So, here it is. I pulled the logic out into a new class, MigrateProviders.
Comment #107
heddnAny chance this could be a service and injected into the form?
Is there any way to auto-discover all the core modules? So this is more dynamic?
Not sure if either of these comments make sense, so leaving at NR.
Comment #108
quietone CreditAttribution: quietone as a volunteer commented1.Yes, there is chance. It is in this patch.
2. I had a look at KernelTestBase and didn't see any existing way to say 'load all modules'. But yes, we need to find a way to do that.
Comment #109
heddnAll actionable feedback addressed. LGTM.
Comment #110
alexpottThis can be dynamically generated - see \Drupal\KernelTests\Config\DefaultConfigTest()
Should be typehinted. But this class looks unnecessary to me.
Looking at MigrationProviders - I'm pondering if this should be on MigrationInterface as getSourceProvider() and getDestinationProvider() - so we don't have to introduce a whole new class etc... because this seems useful knowledge for a migration to have about itself.
There's part of me that would just expect getting the source provider should be:
$migration->getSourcePlugin()->getSourceProvider()
And all of this could be
$migration->getDestinationPlugin()->getDestinationProvider()
Or something like that.
I'm not sure but I think we could make this stuff easier to get and more API complete.
Comment #111
quietone CreditAttribution: quietone as a volunteer commented@alexpott, thanks for the tip on getting the list of all modules.
I pondered that as well. But decided against it since the providers are only used by migrate_drupal_ui. Maybe a better place would be in migrate_drupal? Would be good to hear what mikeryan, heddn or phenaproxima think.
Comment #112
phenaproximaI think I'm in favor of adding a getProvider() method to both
MigrateSourceInterface and MigrateDestinationInterfaceSourcePluginBase and DestinationBase. Obviously we cannot add them to the relevant interfaces because it would be a BC break. But I'm OK with having TODOs about moving those methods to the interfaces.Comment #113
heddnAfter sitting here in the sprint room chatting about this for the last hour, we cannot think of any other user of the source/destination provider data. Drush doesn't use it. Only the UI needs this. So the code seems to be in the right place.
Comment #114
tstoecklerStill needs work for auto-generating the list of modules per #110, no?
Comment #115
heddnGonna take a crack at #110.1.
Sorry I missed that point in my eagerness to get this in.
Comment #116
heddnIs it this simple? Let's see.
Comment #117
heddnIs it this simple? Let's see.
Comment #119
heddnComment #120
quietone CreditAttribution: quietone as a volunteer commentedThanks for moving this along. One thing that strikes me about the modified test is that it is running the test for every module, which is far more than we need. We only need to run it once, for all migrations at once. And, on a quick look, this isn't picking up the test modules which are needed.
I took a different approach but didn't finish. I'll go look for it now.
system and user are installed by MigrateDrupalTestBase
Comment #121
quietone CreditAttribution: quietone as a volunteer commentedI ran patch #119 with the debugger and confirmed that is is not loading the test modules.
Here is the approach I took.
Comment #122
quietone CreditAttribution: quietone as a volunteer commentedArg, named the interdiff as a patch. Sorry, testbot.
Comment #124
quietone CreditAttribution: quietone as a volunteer commentedFix coding standards errors.
Comment #125
heddn#110 is now addressed and tests pass. Back to RTBC.
Comment #126
alexpottHmmm but this means that that MigrateProviders has to reach into the source plugin and destination plugin and get all the configuration out and then make assumptions about random keys. It feels like this break encapsulation. If the source plugins don't need this information then why do they have it. The only reason why drush doesn't need it is because its not validating or checking what's there - the user is picking migrations. If there was a drush command to do what migrate UI does then it would need it. I guess my question is: are you really sure?
This should only enable core modules. That's why I pointed you at \Drupal\KernelTests\FileSystemModuleDiscoveryDataProviderTrait
Comment #127
quietone CreditAttribution: quietone as a volunteer commented@alexpott, yea I got that wrong. This should fix the module discovery.
Comment #128
timodwhit CreditAttribution: timodwhit commentedAdded manual testing steps.
Comment #129
timodwhit CreditAttribution: timodwhit commentedTest d6 and d7 standard installs in the upgrade path, both were showing proper modules in source/dest. Marking as RTCB.
Comment #131
joelpittetThe only diff in the reroll that made it not apply:
So I added the
provider: system
tocore/modules/system/migration_templates/d7_theme_settings.yml
Comment #132
mikeryanThere is one -
drush migrate-upgrade
(in the migrate_upgrade module).Comment #133
maxocub CreditAttribution: maxocub commentedI'm really sorry for putting this back to NW as I was about to RTBC it, but I have 2 nitpicks and 1 concern.
1. Blank line missing.
2. 'migrate_drupal_ui' is not needed, it is already provided by coreModuleListDataProvider().
And for the concern, it's about the 'Available upgrade paths' table. After applying the patch, I see a few 'migrate' in the 'destination' column that were not there before, and it's a bit confusing. Is that because of plugins provided by the migrate plugin?
Before:
After:
Comment #134
quietone CreditAttribution: quietone as a volunteer commented@maxocub, thanks for testing this and spotting that problem. The nitpicks are fixed. As for the 'migrate' destinations, the test has been modified to check for invalid destinations and a provider of 'core' has been added to the destinations in the migrate module.
Comment #136
maxocub CreditAttribution: maxocub commentedScreenshot after applying latest patch:
Comment #137
Gábor HojtsyI get that this used to be implemented in migrate_drupal_ui only, but is this not a kind of information that other uses could be built on top of, command line or other UIs? Why are we putting this in migrate_drupal_ui? I see this was discussed in #111, #113, etc. @heddn posted in conclusion in #113 that the migrate team did think this was the right place, but did not indicate who was part of the discussion. Other than this the rest two are minor notes:
The method documentation seems to be on the class(?).
provider (at the end)
Comment #138
Ada Hernandez CreditAttribution: Ada Hernandez at MTech, LLC commented@Gábor Hojtsy #2 and #3 fixed
Comment #139
Ada Hernandez CreditAttribution: Ada Hernandez at MTech, LLC commentedComment #140
heddnre #137.1: the conversation was with @phenaproxima, myself and maxocub. mikeryan unforunately wasn't at the table at the time. He brings up a good point in #132 that migrate_upgrade is the equivilent to migrate_upgrade_ui for drush.
@mikeryan any thoughts on moving this to MigrateSourceInterface and MigrateDestinationInterface? While migrate_upgrade *could* use it, do you plan to do that?
Comment #141
mikeryanActually, I wasn't thinking it through - drush migrate-upgrade isn't going to be reporting on providers the way the UI does, so I think this can stick to migrate_drupal_ui.
Comment #142
heddnI think #138 can be marked RTBC then. No non-migrate_drupal_ui modules seem to need the source or destination interface changes. All feedback from #137 is addressed.
Comment #143
tstoecklerThis commenting is strange/incorrect.
Can probably fixed on commit, but would also be nice to make less work for committers, I guess ;-)
Comment #144
Gábor HojtsyIndeed, the formatting of this is wrong.
"And"?
Since we need to fix this anyway, let's elaborate on the structure of the array. I would say something like:
"An indexed array containing the source and destination provider module names as strings. If either cannot be determined, NULL will be used in its place."
(Or some better English :)
Comment #145
Ada Hernandez CreditAttribution: Ada Hernandez at MTech, LLC commentedthis patch change the wrong formatting, and I changed the commentary for @return
Comment #146
Ada Hernandez CreditAttribution: Ada Hernandez at MTech, LLC commentedComment #147
heddnDocs only changes. Back to RTBC.
Comment #148
alexpottfwiw I'm still not happy with the decisions taken with respect to API design. The way in which MigrationProviders reaches into a migration and gets the configuration out of its source and destination plugins is for me completely the wrong way around. It's not just about use-case it is about ensure that the right parts of the system has access to the right things. What we have here is a reliance on an ArrayPI (the plugin definition). We know from experience that this causes problems when we want to refactor and make changes further down the line because there is no contract (interface) between the migration and its plugins to be able to provide this information to the MigrationProviders class.
Comment #149
phenaproximaI propose the following solution, if we're adamant about getting rid of MigrationProviders:
...and ditto for the destination.
How does that sound? I'll write the patch if we have general buy-in from everybody.
Comment #150
heddn+1 on #149
Comment #151
mikeryan+1 for me as well. I haven't looked closely at this patch in a while, but yes, only the source and destination plugins should be interpreting their own configuration...
Comment #152
quietone CreditAttribution: quietone as a volunteer commentedI'd like to have a go at implementing #149.
Comment #153
quietone CreditAttribution: quietone as a volunteer commentedWhat directory does MigrationProviderInterface go in?
Comment #154
mikeryanComment #155
quietone CreditAttribution: quietone as a volunteer commentedDuring the migrate call we agreed on the directory, and I didn't write it down. And I don't remember either! So, to keep this moving along here is a patch.
Comment #156
mikeryansrc/Plugin was what we decided - and it's what you did here, so we're good.
Comment #157
heddnThis solves the slight dilema of where to put the provider logic. Its an interface, so it has to go in migrate_drupal. Tests are basically the same, just moved into a new location. We're using the approach outlined in #149. This looks good to go again.
Comment #158
phenaproximaThis is really close, but not quite RTBC. There are some implementation details that need to be corrected...
This will need a doc comment.
Should be string|null, and maybe we should explain the return value a little more.
The destination does not need to reach into the migration anymore. It should just use $this->configuration.
I think this should first call parent::getProvider(), and then compute the provider from the config name if the parent did not specify a provider.
Should be @inheritdoc.
All this should be ripped out of here. This logic only applies to the Config destination, so it should be living only in Config::getProvider(). And it's already there, so this can just flat-out be removed.
Comment #159
quietone CreditAttribution: quietone as a volunteer commented1-2. Fixed
3,5,6. Arg, I thought I fixed that! Clearly, I was thinking ahead to my weekend away.
4. Fixed. But what strikes me about this is that it will be possible to have a destination provider key that refers to a different module than what is referred to in the config_name field. For example,
The provider key takes precedence and 'mymodule' will be the destination.
I also found 5 config migrations with a destination provider key. Since that is not necessary, I have removed them.
Comment #160
quietone CreditAttribution: quietone as a volunteer commentedComment #161
jofitz CreditAttribution: jofitz at ComputerMinds commentedMinor coding standards tweaks.
Comment #162
alexpottThis is looking really nice.
This can be just
$system_data = $form_state->get('system_data');
extension? I.e. could this be a theme?
in_array - let's use the third param and make it TRUE.
You can have a bit less logic here if you do:
Could be:
I think this might be neater like:
Less logic to hold in one's head. Also should be trust provider or source_provider first?
Comment #163
quietone CreditAttribution: quietone as a volunteer commented1. Fixed
2.
Not sure.
3. Fixed
4. Fixed
5. Fixed, with a slightly modified solution.
6. Fixed
Comment #164
quietone CreditAttribution: quietone as a volunteer commentedComment #165
heddnNit: extra paren around !empty isn't necessary.
For #162.2, it was discussed by @phenaproxima and @alexpott in IRC that 'extension' in place of module would suffice.
So close. I'm itching to RTBC this thing.
Comment #166
jofitz CreditAttribution: jofitz at ComputerMinds commentedLet's get this finished...
Comment #167
heddn@Jo Fitzgerald that only caught one of my parenthesis nits. Can you grab the other too in DestinationBase?
Comment #168
jofitz CreditAttribution: jofitz at ComputerMinds commentedWhoops! Rushed that one, sorry. #Embarrassed
Comment #169
phenaproximaAll appears to be right with the universe. Or at least, with this patch.
Comment #170
neclimdulPassing on my thoughts from IRC, this breaks the plugin interface so badly I would suggest another method.
Additionally I can't put together why so many of the plugins are explicitly listing their provider when its autogenerated?
Comment #171
quietone CreditAttribution: quietone as a volunteer commentedIt is because the Variable source plugin and the Config destination plugin are a bit different and they are widely used. The auto generated provider for Config is 'migrate' and for Variable it is 'migrate_drupal'. But for say, the d6_dblog_settings migration, the source as far as the UI is concerned is dblog and the destination is also dblog.
Comment #172
neclimdulSo... sounds like provider isn't the right property to be using the UI. Because as far as Plugins are concerned migrate and migrate_drupal are the providers.
Comment #173
quietone CreditAttribution: quietone as a volunteer commentedOk, so the providers, as used here, are trying to identify the modules that need to be installed so that the data exists (as in the case of the source_provider) and what modules needs to be installed so the data can be saved. Then we can rename the source_provider key to source_module and destination_provider key to destination_module. These names are already in use in the logic, and no one objected, so is likely agreeable to all.
Comment #174
heddnSo, I've looked at this a while, trying to figure it out. A few things play into answering what is the "plugin, core or component". Is it the destination, which is a plugin. Is it the source, which is also a plugin, or is it the process, which is also a plugin. Or lastly, is it the entire thing which wraps everything together (migrate plugin). Because if it is the source or destination, those /are/ owned by the dblog and user modules of the world. If it is the process plugin, that's just a pass through and so let's just ignore that argument. Is it the whole thing "migrate container plugin"? Maybe. It isn't cut and dry. Over in #2711099: Categorize migrations according to their type, we are reaching into the destination to pull out the category. So the destination has some place in directing the identity of the migration. Should we argue the same here?
Who is the user of this provider data? The user is the UI's of the world. Primarily speaking, migrate_drupal_ui. If we don't use provider, we'd be stuck with coming up with another name for /arguably/ the same thing. So, given this isn't an easy problem to identify the provider, let's not bikeshed on what function should return the data for migrate_drupal_ui. If it needs to change, can we /please/ punt that to a follow-up? We're already at 175+ comments on an 80K+ patch that is a pain to re-roll. Let's just commit this thing. Please.
Comment #175
phenaproximaI +1 @quietone's approach in #173 so we can finally, finally, FINALLY slam this stupid bike shed shut forever. Please, let's just do this. source_module and destination_module are fine by me. They make sense.
A source plugin that retrieves theme settings from D6/7 will almost certainly be pulling data from the variables table. That comes from the System module. Therefore its source_module will be system, and that's that. Nice and simple.
For Cthulhu's sake, let's finish this. I believe I speak for my fellow maintainers when I say that as thoroughly sick of this issue as I am, I'm equally sick of the Array of Doom that only exists to provide information to the UI.
Comment #176
quietone CreditAttribution: quietone as a volunteer commentedHave mostly completed the conversion to source_module and destination_module. But have hit a snag with d6_field_instance and d7_field_instance. When I change those ProvidersExistTest reports. Anyone know what is causing this?
Comment #177
joelpittet@quietone, just a stab but
field_config_instance
table doesn't exist in D6 only in D7, could that be it?Comment #178
quietone CreditAttribution: quietone as a volunteer commentedThis is not yet finished. I'm uploading a patch so see what testbot finds. Locally, MigrateUpgrate[6-7]Test doesn't complete and I've get a mysql has gone away message.
Comment #180
jofitz CreditAttribution: jofitz at ComputerMinds commentedThe patch in #178 did not apply so re-rolled.
Comment #181
quietone CreditAttribution: quietone as a volunteer commented@Jo Fitzgerald, thx. I wasn't working from HEAD.
Comment #182
jofitz CreditAttribution: jofitz at ComputerMinds commented@quietone It seemed like you were making good progress so I wanted to help keep the momentum going (and I'm curious to see what the testbot makes of it).
Comment #184
quietone CreditAttribution: quietone as a volunteer commentedHopefully, this pass tests.
However, the method name for getting the source or destination module is still getProvider(). That should probably be changed to avoid confusion with the plugin provider. Any suggestions? I've not come up with any thing that seems remotely useful.
Comment #186
quietone CreditAttribution: quietone as a volunteer commentedMigrationProviderInterface was omitted from the patch. Restored so lets try again,
Comment #187
quietone CreditAttribution: quietone as a volunteer commentedChanged getProviders to getMigrationProviders to help indicate that these providers are specific to migration and have a different meaning that the plugin provider.
Comment #189
maxocub CreditAttribution: maxocub commentedYou just forgot to change those two getProvider(), and this will get back to green.
Comment #190
jofitz CreditAttribution: jofitz at ComputerMinds commentedCorrections highlighted by @maxocub in #189.
Comment #191
quietone CreditAttribution: quietone as a volunteer commentedThx guys. A couple of things. The first was the patch didn't apply for me. I fixed that and tested by going to /upgrade. I notice that image, field, file, profile and shortcut are not found. That needs to be addressed. And I also wonder if there is a way we can check that a source or destination is not being overlooked?
And I'm thinking the logic for determining the migration provider should change to be more explicit. Like, If the migration provider exists in the migration configuration use that, then if it exists in the plugin definition use that, and if not in either of those places use the plugin provider. And keep the existing special case for the config destination.
Assigning to myself since I've got a working patch for that, I just need to run a few more tests tonight.
Comment #192
quietone CreditAttribution: quietone as a volunteer commentedThis is just a reroll.
Testing at /upgrade results in a failure on d7_file_private. "Source module not found for d7_file_private." . I didn't correct that because I want to see if the testbot detects the errors in MigrateUpgrade7Test.php. A test which takes a long time to run, so I'm letting the testbot do it for me.
Comment #194
quietone CreditAttribution: quietone as a volunteer commentedAs expected it failed on the new tests MigrationProvidersExistTest. But I think it should have also failed in MigrateUpgrade7Test as well. So I have added a test there checking if the text 'module not found' is detected. Let's see if that fails this time.
Note I tried to run it locally this time but I just get the 'MySQL server has gone away' msg on both MigrateUpgrade6Test and MigrateUpgrade7Test.
Comment #196
quietone CreditAttribution: quietone as a volunteer commentedTurns out the test module were accidentally removed in patch 178. Yes, that was me and here I am cleaning up after myself.
Another factor is that modules/migrate_drupal_ui/src/Tests/MigrateUpgradeTestBase.php has been deprecated, replaced by modules/migrate_drupal_ui/tests/src/Functional/MigrateUpgradeTestBase.php and the test code wasn't moved there.
So, this patch should tidy all that up. A few assertions have been added to make sure the test module is actually installed and to check for any 'module not found' errors. Now, hopefully, the error on d7_private_file will be found in MigrationProvidersExistTest and MigrateUpgrade7Test.
Comment #198
quietone CreditAttribution: quietone as a volunteer commentedNow add source_module to d7_private_file.yml.
Comment #199
quietone CreditAttribution: quietone as a volunteer commentedReviewed all usages of source_module and found it was not used consistently, sometimes is was in the migration yml and sometimes in the source plugin. Here, the preference is to assign source_module in the source plugin, not the migration. There are a couple of exceptions, such as the variable and embedded source plugin where the source_module must be declared in the migration.
Still need to do the same for the destination_module.
Comment #200
quietone CreditAttribution: quietone as a volunteer commentedThis has a few changes to the source_module declarations. An annotation for destination_module has been added. The destination provider 'core' has been removed in favor of obtaining the destination_module from, firstly, the plugin configuration, then the plugin definition. And if not found in either of those, from the migration provider. Config destinations are a bit different. For config destinations, if the destination_module is not in the plugin configuration or the plugin definition, it is then checked if this is a translation destination. If it is, the destination_module is set to 'config_translation'. And if not a translation, then the destination_module is taken from the config_name in the configuration.
Comment #202
quietone CreditAttribution: quietone as a volunteer commentedFix the test.
Comment #203
neclimdulThis freaking awesome work. I want to dig into the part where we're hooking into provider still a little bit but seriously awesome work breaking out the explicit annotations.
Comment #204
quietone CreditAttribution: quietone as a volunteer commentedFixing the coding standard errors.
Comment #205
neclimdulCould we document why Config has a different implementation. The code is different but I couldn't figure out why.
So, I'm not sure if the MigrationProviderInterface makes sense but maybe it does so lets talk it through. These aren't providers anymore or even really connected so the name doesn't help us. Could we just have "getSourceModule" and "getDestinationModule" and call it a day? What does the generalization and sharing it between the plugin types buy us?
Comment #206
quietone CreditAttribution: quietone as a volunteer commentedOne step at a time here. Adding comments in response to #1 above.
Comment #207
quietone CreditAttribution: quietone as a volunteer commentedAnd now for #2. I probably did this a bit quickly but I've got some other stuff to attend to now.
Personally, this is clearer about what is going on. But I'd like the others to chime in on your questions in #2.
So, MigrationProviderInterface has been removed. And getMigrationProvider is split to getSourceModule, in MigrateSourceInterface.php, and getDestinationModule, in MigrateDestinationInterface.php.
Comment #208
neclimdulThis reads so much better!
I'm happy with it but there's a lot of changes so going to let someone else take a look.
Comment #209
heddnSuper nice work here. Hopefully my feedback is easy to address.
Type or value? The word 'Type' is overloaded. Maybe "object type" is better. I'll discuss this type more later in my review so hold on.
This can be anything? String, class, array?
Same nit here. Any object type seems better.
perhaps 'source_provider to be the string name of a module that...'.
Again, any object type.
Here's my promised further notes on 'type'. In MigrateDestinationInterface and MigrateSource we state that this can be any object type. But if we say that the value in 'destination_module' can be any object type, but then assume that it is a string everywhere, that seems really strange. We either need to require it to be a string in the doxygen or comment somehow that we assume a string value.
Hmm, ok. I don't like this one off logic here, but cannot think of a better option.
Comment #210
quietone CreditAttribution: quietone as a volunteer commented@neclimdul, Thanks for the timely response.
@heddn, changed source_module and destination_module to be string, and adjusted the docs.
However, having a single source and destination module is not quite right. There were times I wanted it to be an array. For example, translations require more than one module to be enabled on the source destination. But do we need the extra accuracy? We could open a followup to decide on that.
Comment #211
heddnIf we want to list an array of source modules, we can do that later, no? Migrate Drupal is still in experimental, right? Yes it is, but the annotations are in migrate, which is in beta. Can we punt to later or do we need to decide that now? I think we can punt because there wouldn't need to be an API changes for it to work.
LGTM.
Comment #212
star-szrJust gliding by but I have a couple questions, mostly related to the change record and issue summary and one code question:
Is this code still relevant since it seems like all 'provider' info is being removed? Is it here for BC?
Comment #213
quietone CreditAttribution: quietone as a volunteer commented@Cottser, thanks for the review. I'm very keen to get this in.
1. The Change record has been updated.
2. This is getting the destination_module from the destination plugin provider if it is not defined elsewhere. In core this will give expected results, i.e, node is the plugin provider for the node migrate destination plugin.
Comment #214
quietone CreditAttribution: quietone as a volunteer commentedThis is blocking tests in commerce_migrate. One example is #2899672: Commerce 1 Test "All The Things".
Comment #215
quietone CreditAttribution: quietone as a volunteer commentedNeeded a reroll. Some indexes changed.
Comment #217
quietone CreditAttribution: quietone as a volunteer commentedOops, did mean to test the patch in 215 again 8.3. It is for 8.4 and 8.5.
Comment #218
quietone CreditAttribution: quietone as a volunteer commentedBack to Needs Review after the reroll for 8.4.x and 8.5.x.
What remains to review is that the questions in #212 have been answered in #213.
Comment #219
quietone CreditAttribution: quietone as a volunteer commentedThis shouldn't be camelCase.
I've only made a patch for 8.4.
Comment #221
joelpittetComment #223
quietone CreditAttribution: quietone as a volunteer commentedPatch for 8.4 passed tests. Back to NR.
Comment #224
maxocub CreditAttribution: maxocub commentedThe change record has been updated and the question from #212 has been answered, back to RTBC.
Comment #225
neclimdulI'm not sure this actually got address because it didn't get a number in the list but I'll address it real quick and leave it RTBC. Providers where being overloaded to mean a couple things and their being split into explicit annotations. Providers still exists though because they are a Plugin concept and being used here is the internal Plugin provider and its being used as a sane fallback/default option.
Comment #226
joelpittetLeaving as RTBC, this reroll had two conflicts that were entirely context related, one an extra indent space in the annotation and the other is an extends which changed.
Comment #227
catchFixed this on commit:
Committed/pushed to 8.5.x and cherry-picked to 8.4.x. Thanks!
Comment #230
maxocub CreditAttribution: maxocub for Acquia commentedComment #231
heddnTagging for release notes. The values for source/destination are required for contrib and will become more required with #2908282: Throw exception for source plugins without a source_module property
Comment #232
maxocub CreditAttribution: maxocub as a volunteer and for Acquia commented