X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fmodules%2Fcontrib%2Fhacked%2Fhacked.module;fp=web%2Fmodules%2Fcontrib%2Fhacked%2Fhacked.module;h=274f7bd1fe967c78f87cee6de1fde4f178832918;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/modules/contrib/hacked/hacked.module b/web/modules/contrib/hacked/hacked.module new file mode 100644 index 000000000..274f7bd1f --- /dev/null +++ b/web/modules/contrib/hacked/hacked.module @@ -0,0 +1,178 @@ + [ + 'variables' => ['data' => NULL], + 'file' => 'hacked.report.inc', + ], + 'hacked_project_summary' => [ + 'variables' => ['project' => NULL], + 'file' => 'hacked.report.inc', + ], + 'hacked_detailed_report' => [ + 'variables' => ['project' => NULL], + 'file' => 'hacked.details.inc', + ], + 'hacked_file_status' => [ + 'variables' => ['file' => NULL], + 'file' => 'hacked.details.inc', + ], + ]; +} + +/** + * Sort callback for sorting the projects in the report. + */ +function _hacked_project_report_sort_by_status($a, $b) { + if ($a['status'] == $b['status']) { + return strcmp($a['name'], $b['name']); + } + else { + return $a['status'] - $b['status']; + } +} + +/** + * Determine if a file is a binary file. + * + * Taken from: http://www.ultrashock.com/forums/server-side/checking-if-a-file-is-binary-98391.html + * and then tweaked in: http://drupal.org/node/760362. + */ +function hacked_file_is_binary($file) { + if (file_exists($file)) { + if (!is_file($file)) { + return 0; + } + if (!is_readable($file)) { + return 1; + } + + $fh = fopen($file, "r"); + $blk = fread($fh, 512); + fclose($fh); + clearstatcache(); + + return ( + 0 or substr_count($blk, "^\r\n") / 512 > 0.3 + or substr_count($blk, "^ -~") / 512 > 0.3 + or substr_count($blk, "\x00") > 0 + ); + } + return 0; +} + +/** + * Hacked! version of the core function, can return hidden files too. + * + * @param $dir + * @param $mask + * @param array $nomask + * @param int $callback + * @param bool|TRUE $recurse + * @param string $key + * @param int $min_depth + * @param int $depth + * @return array + * + * @see file_scan_directory(). + */ +function hacked_file_scan_directory($dir, $mask, $nomask = ['.', '..', 'CVS'], $callback = 0, $recurse = TRUE, $key = 'filename', $min_depth = 0, $depth = 0) { + $key = (in_array($key, ['filename', 'basename', 'name']) ? $key : 'filename'); + $files = []; + + if (is_dir($dir) && $handle = opendir($dir)) { + while (FALSE !== ($file = readdir($handle))) { + if (!in_array($file, $nomask)) { + if (is_dir("$dir/$file") && $recurse) { + // Give priority to files in this folder by merging them in after any subdirectory files. + $files = array_merge(hacked_file_scan_directory("$dir/$file", $mask, $nomask, $callback, $recurse, $key, $min_depth, $depth + 1), $files); + } + elseif ($depth >= $min_depth && preg_match($mask, $file)) { + // Always use this match over anything already set in $files with the same $$key. + $filename = "$dir/$file"; + $basename = basename($file); + $name = substr($basename, 0, strrpos($basename, '.')); + $files[$$key] = new stdClass(); + $files[$$key]->filename = $filename; + $files[$$key]->basename = $basename; + $files[$$key]->name = $name; + if (is_callable($callback)) { + $callback($filename); + } + } + } + } + + closedir($handle); + } + + return $files; +} + +/** + * Return the file hasher that is currently selected by the user. + */ +function hacked_get_file_hasher($name = NULL) { + if (is_null($name)) { + $name = \Drupal::config('hacked.settings')->get('selected_file_hasher'); + } + $hashers = hacked_get_file_hashers(); + $class_name = $hashers[$name]['class']; + return new $class_name; +} + +/** + * Gets all the file hashers defined. + */ +function hacked_get_file_hashers() { + $hashers = &drupal_static(__FUNCTION__); + if (is_null($hashers)) { + $hashers = \Drupal::moduleHandler()->invokeAll('hacked_file_hashers_info'); + \Drupal::moduleHandler()->alter('hacked_file_hashers_info', $hashers); + } + return $hashers; +} + +/** + * Implements hook_hacked_file_hashers_info(). + */ +function hacked_hacked_file_hashers_info() { + $hashers = []; + + $hashers['hacked_ignore_line_endings'] = [ + 'class' => '\Drupal\hacked\hackedFileIgnoreEndingsHasher', + 'name' => t('Ignore line endings'), + 'description' => t('When hashing files differences in line endings will be ignored. This might be useful if projects have been edited on a different platform than of the original author\'s. E.g. if a file has been opened and saved on Windows.'), + ]; + + $hashers['hacked_include_line_endings'] = [ + 'class' => '\Drupal\hacked\hackedFileIncludeEndingsHasher', + 'name' => t('Include line endings'), + 'description' => t('When hashing files differences in line endings will be included.'), + ]; + + return $hashers; +}