? tests/module_enabling_with_dependencies.test
Index: geshifilter.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.admin.inc,v
retrieving revision 1.16
diff -u -u -p -r1.16 geshifilter.admin.inc
--- geshifilter.admin.inc	1 May 2008 20:26:14 -0000	1.16
+++ geshifilter.admin.inc	10 Jul 2008 23:33:24 -0000
@@ -237,15 +237,36 @@ function geshifilter_admin_per_language_
   $add_checkbox = TRUE;
   $add_tag_option = (!geshifilter_use_format_specific_options());
   $form['language_settings'] = geshifilter_per_language_settings(NULL, $view, $add_checkbox, $add_tag_option);
-  $form['rescan_languages'] = array(
-    '#type' => 'markup',
-    '#value' => '<p>'. l(t('Flush cache of available languages'), 'geshifilter/clearavailablelanguagescache', array('query' => drupal_get_destination())) .'</p>',
-  );
+
   // Make it a system settings form.
   $form = system_settings_form($form);
+
   // set custom validate and submit handlers
   $form['#validate'][] = 'geshifilter_per_language_settings_validate';
   $form['#submit'][] = 'geshifilter_admin_per_language_settings_submit';
+
+  // Add button for flushing the GeSHi language definition files cache.
+  $form['geshi_caching'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('GeSHi language definition caching'),
+    '#description' => t('The GeSHi library uses languages definition files to define the properties and highlight rules of the supported languages. In most scenarios these language definition files do not change and a lot of data can be cached for efficiency reasons. However, sometimes it can be needed to flush this cache because you upgraded your version of the GeSHi library for example or you added/edited some language definition files.')
+  );
+  // Non-submitting button for flushing the GeSHi definition file cache.
+  $form['geshi_caching']['flush_geshi_cache'] = array(
+    '#type' => 'button',
+    '#value' => t('Flush the GeSHi language definition cache'),
+  );
+  // Handle the button for flushing the GeSHi cache.
+  // This is done here instead of in a submit handler because the button is
+  // not a submitting button.
+  if (isset($form_state['post']['op']) && $form_state['post']['op'] == t('Flush the GeSHi language definition cache')) {
+    // Forced regeneration of the CSS file
+    _geshifilter_generate_languages_css_file(TRUE);
+    // Flush cache of available languages
+    variable_del('geshifilter_available_languages_cache');
+    drupal_set_message('Flushed cache of available languages.');
+  }
+
   return $form;
 }
 
@@ -465,15 +486,6 @@ function _geshifilter_clear_filter_cache
 }
 
 /**
- * callback function for clearing the available languages cache
- */
-function geshifilter_clear_available_languages_cache() {
-  variable_del('geshifilter_available_languages_cache');
-  drupal_set_message('Flushed cache of available languages.');
-  drupal_goto();
-}
-
-/**
  * Helper function for generating the CSS rules
  *
  * @return string with the CSS rules
@@ -502,26 +514,29 @@ function _geshifilter_generate_languages
 
 /**
  * Function for generating the external stylesheet.
+ *
+ * @param $force force the regeneration of the CSS file
  */
-function _geshifilter_generate_languages_css_file() {
+function _geshifilter_generate_languages_css_file($force=FALSE) {
   $languages = _geshifilter_get_enabled_languages();
-  // create files/geshifilter directory if not already available
-  $path = file_directory_path() .'/geshifilter';
-  file_check_directory($path, FILE_CREATE_DIRECTORY);
-  // Make stylesheet file name (depends on enabled languages).
-  $stylesheet_file = $path .'/geshifilter-languages-'. substr(md5(serialize($languages)), 0, 8) .'.css';
-  if (!file_exists($stylesheet_file)) {
-    // build stylesheet
+  // Serialize the array of enabled languages as sort of hash.
+  $languages_hash = serialize($languages);
+
+  // Check if generation of the CSS file is needed
+  if ($force || $languages_hash != variable_get('geshifilter_cssfile_languages', '')) {
+    // Build stylesheet.
     $stylesheet = _geshifilter_generate_languages_css_rules();
-    // save stylesheet
-    $ret = file_save_data($stylesheet, $stylesheet_file, FILE_EXISTS_REPLACE);
+    // Save stylesheet.
+    $stylesheet_filename = file_directory_path() .'/geshifilter-languages.css';
+    $ret = file_save_data($stylesheet, $stylesheet_filename, FILE_EXISTS_REPLACE);
     if ($ret) {
-      variable_set('geshifilter_languages_css', $ret);
-      drupal_set_message(t('Generated external CSS file %file.', array('%file' => $ret)));
+      drupal_set_message(t('(Re)generated external CSS file %file.', array('%file' => $ret)));
     }
     else {
       drupal_set_message(t('Could not generate external CSS file. Check the settings of your !filesystem.',
         array('!filesystem' => l(t('file system'), 'admin/settings/file-system'))), 'error');
     }
+    // Remember for which list of languages the CSS file was generated
+    variable_set('geshifilter_cssfile_languages', $languages_hash);
   }
 }
Index: geshifilter.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/geshifilter/geshifilter.module,v
retrieving revision 1.39
diff -u -u -p -r1.39 geshifilter.module
--- geshifilter.module	1 May 2008 20:26:14 -0000	1.39
+++ geshifilter.module	10 Jul 2008 23:33:24 -0000
@@ -130,21 +130,14 @@ function geshifilter_menu() {
     'type' => MENU_LOCAL_TASK,
     'weight' => 6,
   );
-  // clear available languages cache
-  $items['geshifilter/clearavailablelanguagescache'] = array(
-    'title' => t('Clear available languages cache'),
-    'file' => 'geshifilter.admin.inc',
-    'page callback' => 'geshifilter_clear_available_languages_cache',
-    'access arguments' => array('administer site configuration'),
-    'type' => MENU_CALLBACK,
-  );
-  // callback for generating CSS rules
+  // Callback for generating CSS rules.
   $items['admin/settings/geshifilter/generate_css'] = array(
     'page callback' => 'geshifilter_generate_language_css_rules',
     'access arguments' => array('administer site configuration'),
     'type' => MENU_CALLBACK,
   );
- return $items;
+
+  return $items;
 }
 
 
@@ -155,9 +148,7 @@ function geshifilter_init() {
   // Since the filtered content is cached, it is not possible to know on which
   // pages the css file is actually needed. Thus it is included on all pages.
   if (variable_get('geshifilter_css_mode', GESHIFILTER_CSS_INLINE) == GESHIFILTER_CSS_CLASSES_AUTOMATIC) {
-    if ($stylesheet_file = variable_get('geshifilter_languages_css', NULL)) {
-      drupal_add_css($stylesheet_file);
-    }
+    drupal_add_css(file_directory_path() .'/geshifilter-languages.css');
   }
   drupal_add_css(drupal_get_path('module', 'geshifilter') .'/geshifilter.css');
 }
