diff options
author | Brion Vibber <brion@pobox.com> | 2010-10-13 16:58:28 -0700 |
---|---|---|
committer | Brion Vibber <brion@pobox.com> | 2010-10-13 16:58:28 -0700 |
commit | a421dd934aeb4a1064608bdeca44b5b5986e7358 (patch) | |
tree | 94df9be6d479e548082e81cb68d1593b09450920 | |
parent | 4f4b0a26128ebee13439ea1ce5f0063b502e301e (diff) |
Nicer diff display for schema dump
-rw-r--r-- | scripts/dumpschema.php | 82 |
1 files changed, 60 insertions, 22 deletions
diff --git a/scripts/dumpschema.php b/scripts/dumpschema.php index fcf2430d8..cab02d910 100644 --- a/scripts/dumpschema.php +++ b/scripts/dumpschema.php @@ -24,14 +24,15 @@ $helptext = <<<END_OF_CHECKSCHEMA_HELP Attempt to pull a schema definition for a given table. --all run over all defined core tables - --diff do a raw text diff between the expected and live table defs + --diff show differences between the expected and live table defs + --raw skip compatibility filtering for diffs --update dump SQL that would be run to update or create this table --build dump SQL that would be run to create this table fresh END_OF_CHECKSCHEMA_HELP; -$longoptions = array('diff', 'all', 'build', 'update'); +$longoptions = array('diff', 'all', 'build', 'update', 'raw'); require_once INSTALLDIR.'/scripts/commandline.inc'; function indentOptions($indent) @@ -110,6 +111,7 @@ function dumpTable($tableName, $live) $def = getCoreSchema($tableName); } prettyDumpArray($def, $tableName); + print "\n"; } function dumpBuildTable($tableName) @@ -144,21 +146,65 @@ function dumpEnsureTable($tableName) } } -function showDiff($a, $b) +function dumpDiff($tableName, $filter) { - $fnameA = tempnam(sys_get_temp_dir(), 'defined-diff-a'); - file_put_contents($fnameA, $a); + $schema = Schema::get(); + $def = getCoreSchema($tableName); + try { + $old = $schema->getTableDef($tableName); + } catch (Exception $e) { + // @fixme this is a terrible check :D + if (preg_match('/no such table/', $e->getMessage())) { + return dumpTable($tableName, false); + } else { + throw $e; + } + } - $fnameB = tempnam(sys_get_temp_dir(), 'detected-diff-b'); - file_put_contents($fnameB, $b); + if ($filter) { + $old = $schema->filterDef($old); + $def = $schema->filterDef($def); + } + + // @hack + $old = tweakPrimaryKey($old); + $def = tweakPrimaryKey($def); + + $sections = array_unique(array_merge(array_keys($old), array_keys($def))); + $final = array(); + foreach ($sections as $section) { + if ($section == 'fields') { + // this shouldn't be needed maybe... wait what? + } + $diff = $schema->diffArrays($old, $def, $section, $compare); + $chunks = array('del', 'mod', 'add'); + foreach ($chunks as $chunk) { + if ($diff[$chunk]) { + foreach ($diff[$chunk] as $key) { + if ($chunk == 'del') { + $final[$section]["DEL $key"] = $old[$section][$key]; + } else if ($chunk == 'add') { + $final[$section]["ADD $key"] = $def[$section][$key]; + } else if ($chunk == 'mod') { + $final[$section]["OLD $key"] = $old[$section][$key]; + $final[$section]["NEW $key"] = $def[$section][$key]; + } + } + } + } + } - $cmd = sprintf('diff -U 100 %s %s', - escapeshellarg($fnameA), - escapeshellarg($fnameB)); - passthru($cmd); + prettyDumpArray($final, $tableName); + print "\n"; +} - unlink($fnameA); - unlink($fnameB); +function tweakPrimaryKey($def) +{ + if (isset($def['primary key'])) { + $def['primary keys'] = array('primary key' => $def['primary key']); + unset($def['primary key']); + } + return $def; } if (have_option('all')) { @@ -168,15 +214,7 @@ if (have_option('all')) { if (count($args)) { foreach ($args as $tableName) { if (have_option('diff')) { - ob_start(); - dumpTable($tableName, false); - $defined = ob_get_clean(); - - ob_start(); - dumpTable($tableName, true); - $detected = ob_get_clean(); - - showDiff($defined, $detected); + dumpDiff($tableName, !have_option('raw')); } else if (have_option('build')) { dumpBuildTable($tableName); } else if (have_option('update')) { |