DX: Add hook_modules to act on other module status changes

aaron - May 1, 2008 - 15:54
Project:Drupal
Version:7.x-dev
Component:install system
Category:feature request
Priority:normal
Assigned:Dave Reid
Status:closed
Description

i need to add data to a table when another module has been enabled/disabled, if that module invokes a hook.

here's a patch to add the functionality.

creates hook_enableapi and hook_disableapi.

invoked like:

<?php
hook_enableapi
($module);
hook_disableapi($module);
?>

agentrickard suggested also including the $invoke_modules array in the call, but not sure that's wise. first, would only work from module_enable: the complementary array in module_disable has not been filtered for bona fide modules as it has in module_enable. also, not sure how important that would be for folks, since there's no way to control what modules a user is enabling at any one time.

i personally don't like the name of that function hook, but it's consistent with nodeapi (which i also don't like), so developers will grok it more easily.

just doing like this for now. feel free to chime in if you feel differently.

aaron winborn

AttachmentSizeStatusTest resultOperations
module.inc_.enableapi.patch835 bytesIgnoredNoneNone

#1

aaron - May 1, 2008 - 15:55
Status:active» needs review

oops, forgot the status

#2

aaron - May 1, 2008 - 16:02

obviously, i wrote the invocation incorrect. was writing quickly. a better example:

<?php
function my_module_enableapi($module) {
  if (
module_implements($module, 'my_module_api')) {
   
// do stuff here
 
}
}

function
my_module_disableapi($module) {
  if (
module_implements($module, 'my_module_api')) {
   
// undo stuff here
 
}
}
?>

there might be a better name for the hook as well, to integrate the functionality (using $op), but might be confusing. this makes the most sense to me, considering we have hook_enable and hook_disable already, and hook_node/hook_nodeapi have set a precedent.

#3

moshe weitzman - May 3, 2008 - 16:07
Status:needs review» needs work

This is sorely needed.

I think it has to be a little smarter when multiple modules are enabled/disabled at same time. The 'enableapi' calls should happen after all modules are enabled so that the new modules may also react accordingly. Hope that makes sense.

#4

aaron - May 5, 2008 - 13:23

ah yes, i see what you're saying. we'll just need to run through the loop after they're all enabled. i'll rewrite the patch with that in mind today or tomorrow.

thanks,
aaron

#5

aaron - May 7, 2008 - 15:26
Status:needs work» needs review

this creates a new loop after enabling all new modules for enableapi. disableapi is the same.

AttachmentSizeStatusTest resultOperations
module.inc_.enableapi.patch815 bytesIgnoredNoneNone

#6

moshe weitzman - June 20, 2008 - 02:11
Status:needs review» reviewed & tested by the community

tested and this breaks nothing while adding sorely needed functionality. modules really do want to take action when their neighbors are enabled/disabled.

#7

Dries - August 3, 2008 - 18:37
Status:reviewed & tested by the community» needs work

We shouldn't use the word 'api' in the name of a function/hook. It's not consistent with core and redundant information.

#8

moshe weitzman - August 28, 2008 - 07:16

Anyone have a naming suggestion?

#9

chx - August 29, 2008 - 09:19

hook_module_(en|dis)able

#10

moshe weitzman - August 29, 2008 - 11:44

we already have those hooks. the problem is that all those hooks will suddenly start getting called. perhaps thats not a big concern. we could make sure that the module being disabled gets called first? what do people think?

#11

yched - August 29, 2008 - 11:48

CCK currently also has a use case for hook_module_uninstall().

We recently fixed #292872: fields and data are deleted when a content-type module is disabled, which was not cool when people were simply disabling modules say, when preparing for a D5-D6 upgrade.
But that was the only chance we ever got to clear that information. Right now, you uninstall a module and you have stale CCK information that sits here until you manually remove it.

#12

moshe weitzman - August 29, 2008 - 11:56

Ah, now I understand the name chx proposed. sounds good.

#13

aaron - September 4, 2008 - 00:13

chx's naming convention sounds good. i'm neutral to the name, so long as we have the functionality. i'll reroll a patch in the next day or two.

#14

Dave Reid - September 5, 2008 - 03:52

I'm also seeing a need for this hook so I can add a setting to FCKeditor to help disable a certain textfield in my module.

Another idea would to have hook_module($module, $op) where $op would be 'install', 'uninstall', 'enable', or 'disable'.

#15

Dave Reid - September 5, 2008 - 18:45
Status:needs work» needs review

Here's my patch for hook_module($module_name, $op) against HEAD. Tested and ready for review. Also added a documentation patch against HEAD docs.

AttachmentSizeStatusTest resultOperations
253569.patch1.91 KBIgnoredNoneNone
253569.doc_.patch1.14 KBIgnoredNoneNone

#16

System Message - September 5, 2008 - 05:22

Patch failed to apply. More information can be found at http://testing.drupal.org/node/14069. If you need help with creating patches please look at http://drupal.org/patch/create

#17

Dave Reid - September 5, 2008 - 18:44

Note that the TestBot error is for the documentation patch.

#18

Dave Reid - September 8, 2008 - 14:19
Title:Act on other modules enabling» Add hook_module to act on other module status changes

Renaming for better description.

#19

greggles - September 9, 2008 - 18:26

hook_module($module, $op) seemed backwards to me while hook_module($op, $module) makes more sense.

I thought, well, let's be consistent. So, I did a review of the hooks in core for 6.x and 7.x and here is what I found:

$op not first:
hook_comment
hook_nodeapi
hook_node_grants

$op first:
hook_block
hook_filter
hook_search
hook_taxonomy
hook_user

So...I feel like the $op should come first and that we should standardize on putting the $op first. $op has been second/last in some cases for a pretty long time so I was unable to find any discussion about changing the function signature.

For this patch the only question is whether $op should come first. If folks agree it should come first then moving it around in other hooks could be a separate issue.

#20

Dave Reid - September 9, 2008 - 20:27

I think I agree with you greggles. Having $op first is starting to grow on me. Re-patched for parameter change. It would be wonderful to get this in so we could work on #306151: Automatically install/uninstall schema!

AttachmentSizeStatusTest resultOperations
253569.hook_module.patch1.91 KBIgnoredNoneNone

#21

Dave Reid - September 9, 2008 - 20:55

Also, landing this hook would be essential to begin work on #306151: Automatically install/uninstall schema.

#22

agentrickard - September 9, 2008 - 21:22
Status:needs review» reviewed & tested by the community

Patch applies cleanly and works as advertised. Speaking as a contrib developer, this patch is a Good Thing (tm), as it allows all kinds of goodness. It also, as mentioned, will make #306151: Automatically install/uninstall schema fairly simple.

#23

Dave Reid - September 9, 2008 - 22:02
Assigned to:Anonymous» Dave Reid

#24

webchick - September 10, 2008 - 04:38
Status:reviewed & tested by the community» needs work

Talked some with chx about this in #drupal. A few things:

1. There aren't any clear use cases that I see here, just a lot of "Yeah! This would be great!" It'd be helpful to get more info as to /why/ this would be so great. ;)

2. The registry needs hooks to be like hook_thingy_thinger_op(...) rather than hook_thingy_thinger($op, ...). So we'll need to rename the functions (again).

3. There aren't tests. Seems like it would be pretty easy to write a little .test module that implements these hooks and verifies things are working properly.

#25

Dave Reid - September 10, 2008 - 07:54
Status:needs work» needs review

As was recommended, I split the hook_module($op, $module) into it's four different hooks:
- hook_module_install($module)
- hook_module_enable($module)
- hook_module_disable($module)
- hook_module_uninstall($module)

Attached is the patch for the hooks as well as a hook for the core hook documentation (which will fail TestingBot). I have also modified the EnableDisableCoreTestCase in system.test to test for these hooks being called correctly. The test passes 100% for me and is ready for review.

AttachmentSizeStatusTest resultOperations
253569.hook_module.patch5.39 KBIgnoredNoneNone
253569.hook_module.doc_.patch2.48 KBIgnoredNoneNone

#26

System Message - September 10, 2008 - 08:02
Status:needs review» needs work

Patch failed to apply. More information can be found at http://testing.drupal.org/node/14238. If you need help with creating patches please look at http://drupal.org/patch/create

#27

Dave Reid - September 10, 2008 - 08:18
Status:needs work» needs review

As for use cases, the biggest use case for this change is the proposal found in #306151: Automatically install/uninstall schema.

The filter module should remove filters from modules that are uninstalled:

function filter_module_uninstall($module) {
  if (module_hook($module, 'filter')) {
    db_delete('filters')->condition('module', $module)->execute();
  }
}

Similar cases can be made for removing module-provided user permissions, blocks, actions, menus (move current menu code from drupal_uninstall_module), etc. This will keep module-specific uninstall code out of drupal_uninstall_module and help prevent stale records in the database that will never be referenced again.

I'm sure that there are smaller use cases for these new hooks that modules would find useful and helpful to have, as shown already by #292872: fields and data are deleted when a content-type module is disabled.

#28

yched - September 10, 2008 - 12:30

re webchick #27
1. There aren't any clear use cases that I see here, just a lot of "Yeah! This would be great!" It'd be helpful to get more info as to /why/ this would be so great. ;)

#292872: fields and data are deleted when a content-type module is disabled : CCK shouldn't delete field and field data when a module defining a content type is *disabled*, but then has no way to do it when the module is *uninstalled*, so stale fields and data tables rot in the db.

#29

agentrickard - September 10, 2008 - 14:06

@webchick

This approach is a better, more Drupal approach to solving the problem defined here -- #306027: user_modules_uninistalled() is missing -- and leads to allowing the types of data cleanup that yched mentions. See #306151: Automatically install/uninstall schema for some further examples -- block cleanup, permission removal, etc. There are a number of things that developers might have to do in hook_uninstall() that we can (and should) do automatically in core.

We would also move the menu-specific code out of drupal_uninstall_module and into menu.inc. Think of it this way -- core modules should all have a chance to clean up after themselves after a module is uninstalled.

See Dave's notes here -- http://drupal.org/files/issues/306151.module_uninstall.txt

Adding the other operations adds additional flexibility. In the case of Domain Access, I would love to be able to act based on module activation, so I can test to see if a new node access module has been activated.

/me goes to test the new patch.

#30

earnie - September 10, 2008 - 19:35

subscribe

#31

agentrickard - September 11, 2008 - 22:37

Patch http://drupal.org/files/issues/253569.hook_module_0.patch applies cleanly.

Tests pass and hook fires as expected.

#32

webchick - September 12, 2008 - 02:19
Status:needs review» needs work

Summary of discussion on IRC:
- My eye was drawn to the foreach loop in module_enable, since we already have a foreach loop up above. Some back and forth later, chx came up with the idea to pass the entire array of modules being enabled/disabled rather than just one at a time. This is much more powerful: check to see if a conflicting module is in the list, etc.
- (anal) Put some Doxygen on the hook implementations in system_test.module.

#33

moshe weitzman - September 12, 2008 - 02:33

We had it that way before and it is less powerful. See my comment in #3. The new modules that are enabled need a chance to react as well. You really have to properly install the new modules and THEN fire the hooks. What is the point of saving a foreach loop? This is extremely infrequent code and we are talking about a millisecond here.

#34

chx - September 12, 2008 - 02:39

Moshe, your comment in #3 is not too clear. I interpreted it as you do not want module_invoke to happen inside the main module_enable foreach loop but outside. There is absolutely no point in iterating module_implements here, we want a module_invoke_all just the question is -- inside or outside?

#35

Dave Reid - September 12, 2008 - 02:42
Status:needs work» needs review

I think I agree with webchick and chx with regards to passing hook_module_enable or hook_module_disable an array of the enabled/disabled modules. It would be easier to check for incompatibilities between more than just two modules. This has the same functionality as #3 (performing after all the modules have been enabled/disabled), but the parameter is now just an array form.

Revised patch with 100% system test pass.

#36

moshe weitzman - September 12, 2008 - 02:57

I thought webchick proposed to collapse the two loops into one. Sorry about that. Just changing the arguments on the second loop is fine.

I should say though that you can't do much if you see a module that is incompatible in the list. The module is already enabled, and rightfully so. The right time to object is during form validation, not during the enable API.

#37

Dave Reid - September 12, 2008 - 03:02

Lost the last patch upload...

AttachmentSizeStatusTest resultOperations
253569.hook_module.patch5.67 KBIgnoredNoneNone

#38

Dave Reid - September 12, 2008 - 03:14

Here's another thought: It would be easy to have hook_module_install($module) to return a boolean. If that boolean is true, do not install the module specified by $module. Not sure if I like that or not... It would make hook_module_install special from the rest.

#39

agentrickard - September 12, 2008 - 14:38

Dave, I don't quite get the last patch. It looks like _install and _uininstall are passing strings and _enable and _disable are passing arrays.

Don't we want consistency there? Or am I just missing the point of the last bit of discussion.

#40

webchick - September 12, 2008 - 15:06

Consider if I am ImageAPI module.

I have a requirement that *either* ImageGD or ImageMagick module are /also/ enabled, but not both. Because it could be either of these modules, the requirements line in the .info file is useless to me.

I don't see any possible way to do this if the only context in hook_module_enable() I have is *one* of the modules that were enabled. I need the full list, so I can check to see if the modules I care about are in it.

#41

moshe weitzman - September 12, 2008 - 15:12

@webchick et al - i personally don't think we want to do validation in this hook. thats gonna be terribly messy interacting with the dependancy validation. a rejection of a given module has to then reject the dependants. the module can do a dsm() or a runtime requirements error if it wants.

#42

agentrickard - September 12, 2008 - 15:13

Wouldn't that mean we need a pre-enable check? We could throw a hook during the form validate step.

Psuedo-code:

// validating the module list form...
  module_invoke_all('module_validate', $form_state);

#43

webchick - September 12, 2008 - 15:16

Hm. Then I guess I'm not clear on what the point of hook_module_enable/disable is, if it's not for validation?

#44

agentrickard - September 12, 2008 - 15:19

It's for performing actions/cleanups based on what your module (or core) knows about other modules.

The menu wipe is the obvious core implementation, but it can apply to lots of things in the contrib world. In my modules, there are certain settings that I may want to enable if OG is enabled, for instance.

That's why I think this is a DX (Developer Experience) patch, in line with bjaspan's notes on the subject.

#45

aaron - September 13, 2008 - 03:32

@webchick: my original use case was to add a table to the db if another specific module had been installed (and to remove that table in turn if the module is uninstalled). I agree with moshe that this shouldn't be a step for validation.

without this hook, i'm stuck having to insert myself into form_alter on the modules admin page, which can get a bit hairy. from other comments on this thread, seems as though there are other use cases as well. in fact when i needed the functionality, i was surprised it wasn't already there, as it seems to me an easy call that can have many valid uses.

#46

webchick - September 13, 2008 - 03:36

Ok cool. Then the only question remaining is whether hook_enable() / hook_disable() are more useful when passed in the entire array of enabled/disabled modules, or whether they should only pass them in one at a time, for consistency with hook_install() and hook_uninstall()?

#47

aaron - September 13, 2008 - 03:48

#37 applies cleanly. looks sound to me. it also takes care of my filtered modules on disable concern, so i'm now agnostic about whether to include the entire array or not. personally, i like consistency, and most cases i could think of just want to act on a single module's status. plus it's slightly easier to deal with a single string than an array. however, if there are some edge cases that could use them, then sure, throw the whole array at them.

#48

agentrickard - September 13, 2008 - 16:19

Also agnostic on the string v. array debate. I suppose it presents the most flexibility if the hook passes as an array, so that the responding functions can deal with the entire data set at once. On the other hand, strings are easier to deal with for me.

But we usually come done on the side of "more flexibility in the API," so I suppose that's a vote for passing the whole array of status changes to each hook. The only warning there is that the target modules still need to be in memory so their functions can be accessed during each phase -- loading hook_perm() from a disabled module, for instance.

#49

Dave Reid - September 13, 2008 - 16:51

Another good use case that arose in #drupal was if your module (mymodule) needs to have a higher or lower weight than a conflicting module (lousymodule), there's really no good place to check for that currently besides when your module is being installed with mymodule_install().

With this patch, mymodule could implement:

function mymodule_module_install($module) {
  if ($module == 'lousymodule') {
    // Set mymodule weight
  }
}

#50

Pasqualle - September 15, 2008 - 20:39

another use case: bulletproof Admin Role module
automatically enable permissions when "other modules" are enabled..

#51

agentrickard - September 15, 2008 - 22:49

I think we're good on use-cases (see http://drupal.org/node/253569#comment-1008955).

We just need a new patch that settles the string/array question.

#52

DanielTheViking - September 20, 2008 - 01:05

+1 for extra flexibility (array)

#53

agentrickard - September 22, 2008 - 14:59

Revised patch attached that uses arrays for all four hook implementations. Tests pass.

It looks to me like there is some redundant code in system_modules_submit and in _drupal_install_modules, both of which try to check if a module has been installed previously.

Since the routine in system_modules_submit effectively filters out modules that need installation from those that need to be enabled, this patch simply fires the new hooks straight from the submit function.

Also note that hook_module_disable fires _before_ we flush the registry, in case we need to access any hooks from the modules being disabled (such as hook_menu) in order to perform actions.

AttachmentSizeStatusTest resultOperations
253569.hook_module_new.patch6 KBIgnoredNoneNone

#54

webchick - September 22, 2008 - 15:11
Status:needs review» needs work

Ah, sorry. -1 to doing this in submit functions. This means that an install profile, for example, calling drupal_uninstall_modules() wouldn't fire the proper hook.

#55

agentrickard - September 22, 2008 - 16:15

@webcheck -- that also explains what I took to be redundant code.

drupal_uninstall_module($module) accepts a string, not an array, which seems pretty odd, so that needs to be cleaned up. Bringing that in line with drupal_install_modules() should allow us to use arrays in all cases.

#56

agentrickard - September 22, 2008 - 18:10
Status:needs work» needs review

New patch changes drupal_uninstall_module($module) to drupal_uninstall_modules($module_list).

AttachmentSizeStatusTest resultOperations
253569.hook_module_56.patch9.47 KBIgnoredNoneNone

#57

agentrickard - September 22, 2008 - 18:14

#58

Dave Reid - September 22, 2008 - 19:40

1. Changing drupal_uninstall_module($module) to drupal_uninstall_modules($module_list) would be a great change for consistency with drupal_install_modules($module_list). I did a core search for calls to drupal_uninstall_module (besides the call in system_modules_uninstall_submit), but there were no other results, so everything looks good to change this.
2. Since we're always going to be using module name arrays, should we change the hook name from hook_module_action to hook_modules_action?
3. I disagree with relocating the hook_module_install until after module_enable is called, because now hook_module_enable is called before hook_module_install.
4. Ran tests and passed.

A quick note, when we get the documentation for hook_modules_action written, we'll need to make a note that hook_module_install and hook_module_enable will need to call drupal_load('module', $module) if they need to get information from the modules being installed/enabled (registry hasn't been rebuilt). Maybe the registry needs to be rebuilt after all the modules have been installed in drupal_install_modules instead of when each module is enabled?

Patch below fixes the order of hook_module_install and hook_module_enable.

AttachmentSizeStatusTest resultOperations
hook_modules.patch9.08 KBIgnoredNoneNone

#59

agentrickard - September 22, 2008 - 19:51

Part of the logic to running hook_modules_install() after module_enable was so we don't have to load the code twice. But it is probably best to run that routine first.

#60

Dries - September 23, 2008 - 11:40

I think this patch adds useful functionality, however, we now have both foo_install and foo_module_install and I think that is a little confusing. Same with foo_uninstall and foo_module_uninstall. The difference is subtle and might confuse developers, and could result in inconsistent code. I wonder if there are things we could do to make the difference more prominent, and to better document those hooks. What might be a little better is to use foo_module_installed vs foo_module_install?

It is a minor point but I wanted to bring it up to see if we have any ideas. Ah, semantics!

#61

agentrickard - September 23, 2008 - 13:56

Some ideas:

- hook_modules_installed($module_list)
- hook_modules_uninstalled($module_list)
- hook_modules_enabled($module_list)
- hook_modules_disabled($module_list)

-Or-

- hook_install_batch($module_list)
- hook_uninstall_batch($module_list)
- hook_enable_batch($module_list)
- hook_disable_batch($module_list)

[The above could be reversed to hook_batch_install($module_list)]

-Or-

- hook_install_all($module_list)
- hook_uninstall_all($module_list)
- hook_enable_all($module_list)
- hook_disable_all($module_list)

This mirrors module_invoke_all() but could cause confusion because developers might assume it means "enalbe all the modules available on my site."

-Or-

- hook_install_respond($module_list)
- hook_uninstall_respond($module_list)
- hook_enable_respond($module_list)
- hook_disable_respond($module_list)

_respond here could also be _response or _reply or _react.

I also thought about hook_install_alter($module_list), but I don't think that is consistent with the user of _alter() hooks elsewhere.

I think my favorite is:

- hook_process_install($module_list)
- hook_process_uninstall($module_list)
- hook_process_enable($module_list)
- hook_process_disable($module_list)

Where 'process' clearly indicates that we are acting on provided information, as in drupal_process_form().

#62

Dave Reid - September 23, 2008 - 14:14

I think hook_modules_(installed|past-tense-verb) has enough distinction from hook_(install|etc) but yet still close enough to an accurate description of the hook that it isn't confusing. I provided an initial docs patch in #25 that I'm working on updating to distinguish these new hooks from hook_(install|etc).

#63

agentrickard - September 23, 2008 - 15:23

Works for me.

#64

webchick - September 23, 2008 - 15:37

+1 to hook_modules_(past-tense verb)

#65

Dave Reid - September 23, 2008 - 15:47

Updated patch with the change to hook names to hook_modules_past-tense-verb. Ran all system tests and had 100% pass.

AttachmentSizeStatusTest resultOperations
hook_modules.patch9.14 KBIgnoredNoneNone

#66

agentrickard - September 23, 2008 - 19:25

Hm, I think that if:

function drupal_uninstall_modules($module_list = array()) {
  foreach ($module_list as $module) {

Then you have to use an opt-out empty.

function drupal_uninstall_modules($module_list = array()) {
  if (empty($module_list)) {
    return;
  }
  foreach ($module_list as $module) {

This function should never be called with an empty array, but I understand that the array() is there for symmetry with module_install_modules().

#67

catch - September 23, 2008 - 19:28

The past tense verb version seems like a sensible choice i.e. hook_modules_enabled - things to do when modules are enabled etc.

#68

Dave Reid - September 23, 2008 - 20:36
Title:Add hook_module to act on other module status changes» Add hook_modules to act on other module status changes

Found a logic error that would fire hook_modules_installed for an enabled module that has been previously installed, enabled, then disabled. Also added a check for an empty array in drupal_uninstall_modules (thanks agentrickard).

AttachmentSizeStatusTest resultOperations
hook_modules.patch9.31 KBIgnoredNoneNone

#69

agentrickard - September 24, 2008 - 15:43

Patch had a typo on line 488 of install.inc. New patch corrects. Test implementations of the hooks fire as expected. System tests pass.

AttachmentSizeStatusTest resultOperations
hook_modules_new.patch9.38 KBIgnoredNoneNone

#70

agentrickard - September 27, 2008 - 23:02
Title:Add hook_modules to act on other module status changes» DX: Add hook_modules to act on other module status changes

#71

Dave Reid - October 10, 2008 - 15:45
Status:needs review» reviewed & tested by the community

Re-rolled from #69 and added some test documentation. The tests pass and I firmly believe this is RTBC. I can haz thiz in unstable-2?

AttachmentSizeStatusTest resultOperations
hook-modules-253569-D7.patch10.29 KBIgnoredNoneNone

#72

webchick - October 11, 2008 - 22:15
Status:reviewed & tested by the community» needs work

No longer applies with the other crazy stuff that went in today. Probably needs a quick re-roll.

#73

Dave Reid - October 11, 2008 - 22:28
Status:needs work» reviewed & tested by the community

Re-rolled patch, tests pass. No major changes from last patch, so marking as RTBC.

AttachmentSizeStatusTest resultOperations
hook-modules-253569-D7.patch10.29 KBIgnoredNoneNone

#74

webchick - October 11, 2008 - 22:46
Status:reviewed & tested by the community» needs work

Ok, looked this over one last time, and I believe it has Dries's stamp of approval as well, so committed to HEAD. :)

Docs, please! :D

#75

Dave Reid - October 11, 2008 - 22:49

YAY! :D Will get docs posted shortly. I assume we'd like a note in 6.x -> 7.x module upgrade doc?

#76

webchick - October 11, 2008 - 23:33

Yes please! Also some API docs for api.drupal.org.

#77

Dave Reid - October 12, 2008 - 02:03
Status:needs work» fixed

api.drupal.org docs and module upgrade docs finished. The links to the api docs on the module upgrade page currently do not exist. Just waiting for the api to regenerate.

#78

agentrickard - October 12, 2008 - 17:06

Yay!

The following patches follow from this hook and need work

#306027: user_modules_uninistalled() is missing
#306151: Automatically install/uninstall schema

--project followup subject--

Anonymous (not verified) - October 26, 2008 - 17:16

Automatically closed -- issue fixed for two weeks with no activity.

#79

Anonymous (not verified) - October 26, 2008 - 17:24
Status:fixed» closed

Automatically closed -- issue fixed for two weeks with no activity.

#80

dbabbage - January 9, 2009 - 10:47

Subscribing—it's closed but I want to come back and get my head around this one and haven't got time to read it all now. :)

 
 

Drupal is a registered trademark of Dries Buytaert.