From 29013159064ae489d413cc16b6ce7317928a36c9 Mon Sep 17 00:00:00 2001 From: Antoine Musso Date: Wed, 24 Jan 2007 22:13:12 +0000 Subject: [PATCH] Generalize and rename cleanupSkin.php so it can changes any option. FIXME: does not validate the new value --- maintenance/cleanupSkin.php | 93 -------------- maintenance/userOptions.inc | 237 ++++++++++++++++++++++++++++++++++++ maintenance/userOptions.php | 21 ++++ 3 files changed, 258 insertions(+), 93 deletions(-) delete mode 100644 maintenance/cleanupSkin.php create mode 100644 maintenance/userOptions.inc create mode 100644 maintenance/userOptions.php diff --git a/maintenance/cleanupSkin.php b/maintenance/cleanupSkin.php deleted file mode 100644 index 32bad30984..0000000000 --- a/maintenance/cleanupSkin.php +++ /dev/null @@ -1,93 +0,0 @@ - - */ - -// Options we will use -$options = array( 'quick' ); -$optionsWithArgs = array( 'old', 'new' ); - -// This is a command line script, load tools and parse args -require_once( 'commandLine.inc' ); - -// Check for mandatory options or print an usage message -if( !(isset($options['old']) && isset($options['new']) ) ) { -print << --new - [--quick] [--quiet] - -Options: - --old : the old skin name - --new : new skin name to update users with - --quick : hides the 5 seconds warning - --quiet : do not print what is happening - - -USAGE; - exit(0); -} - -// Load up the arguments: -$oldSkinName = $options['old']; -$newSkinName = $options['new']; -$quick = isset($options['quick']); -$quiet = isset($options['quiet']); - -// We list the user by user_id from one of the slave databases -$dbr = wfGetDB( DB_SLAVE ); -$result = $dbr->select( 'user', - array( 'user_id' ), - array(), - __FILE__ - ); - -// The warning message and countdown -if( !$quick ) { -print <<=1;) { - print_c($i, --$i); - sleep(1); - } - print "\n"; -} - -// Iterate through the users -while( $id = $dbr->fetchObject( $result ) ) { - - $user = User::newFromId( $id->user_id ); - - // We get this users informations - $curSkinName = $user->getOption( 'skin' ); - $username = $user->getName(); - - // Is he using the skin we want to migrate ? - if( $curSkinName == $oldSkinName ) { - - if(!$quiet) print "Changing skin for $username ('$oldSkinName' -> '$newSkinName'):"; - - // Change skin and save it - $user->setOption( 'skin', $newSkinName ); - $user->saveSettings(); - - if(!$quiet) print " OK\n"; - } elseif(!$quiet) { - print "Not changing '$username' using skin '$curSkinName'\n"; - } -} -print "Done.\n"; -?> diff --git a/maintenance/userOptions.inc b/maintenance/userOptions.inc new file mode 100644 index 0000000000..9ad9ca30bc --- /dev/null +++ b/maintenance/userOptions.inc @@ -0,0 +1,237 @@ +checkOpts( $opts, $args ) ) { + userOptions::showUsageAndExit(); + } else { + $this->mReady = $this->initializeOpts( $opts, $args ); + } + } + + + /** This is used to check options. Only needed on construction */ + private function checkOpts( $opts, $args ) { + // The three possible ways to run the script: + $list = isset( $opts['list'] ); + $usage = isset( $opts['usage'] ) && (count($args) <= 1); + $change = isset( $opts['old']) && isset($opts['new']) && (count($args) <= 1) ; + + // We want only one of them + $isValid = (($list + $usage + $change) == 1); + + return $isValid; + } + + /** load script options in the object */ + private function initializeOpts( $opts, $args ) { + + $this->mQuick = isset( $opts['nowarn'] ); + $this->mQuiet = isset( $opts['quiet'] ); + $this->mDry = isset( $opts['dry'] ); + + // Set object properties, specially 'mMode' used by run() + if( isset($opts['list']) ) { + $this->mMode = 'LISTER' ; + } elseif( isset($opts['usage']) ) { + $this->mMode = 'USAGER' ; + $this->mAnOption = isset($args[0]) ? $args[0] : false ; + } elseif( isset($opts['old']) && isset($opts['new']) ) { + $this->mMode = 'CHANGER' ; + $this->mOldValue = $opts['old'] ; + $this->mNewValue = $opts['new'] ; + $this->mAnOption = $args[0]; + } else { + die("There is a bug in the software, this should never happen\n"); + } + + return true; + } + + // Dumb stuff to run a mode. + public function run() { + if(!$this->mReady ) { + return false; + } + + $this->{$this->mMode}( ); + + } + + # + # Modes. + # + + /** List default options and their value */ + private function LISTER( ) { + $def = User::getDefaultOptions(); + ksort($def); + $maxOpt = 0; + foreach( $def as $opt => $value ) { + $maxOpt = max( $maxOpt, strlen($opt) ); + } + foreach( $def as $opt => $value ) { + printf( "%-{$maxOpt}s: %s\n", $opt, $value ); + } + } + + /** List options usage */ + private function USAGER( ) { + $ret = array(); + $defaultOptions = User::getDefaultOptions(); + + // We list user by user_id from one of the slave database + $dbr = wfGetDB( DB_SLAVE ); + $result = $dbr->select( 'user', + array( 'user_id' ), + array(), + __METHOD__ + ); + + while( $id = $dbr->fetchObject( $result ) ) { + + $user = User::newFromId( $id->user_id ); + + // Get the options and update stats + foreach( $defaultOptions as $name => $defaultValue ) { + $userValue = $user->getOption( $name ); + if( $userValue <> $defaultValue ) { + @$ret[$name][$userValue]++; + } + } + } + + foreach( $ret as $optionName => $usageStats ) { + print "Usage for <$optionName> (default: '{$defaultOptions[$optionName]}'):\n"; + foreach( $usageStats as $value => $count ) { + print " $count user(s): '$value'\n"; + } + print "\n"; + } + } + + + /** Change our users options */ + private function CHANGER( ) { + $this->warn(); + + // We list user by user_id from one of the slave database + $dbr = wfGetDB( DB_SLAVE ); + $result = $dbr->select( 'user', + array( 'user_id' ), + array(), + __METHOD__ + ); + + while( $id = $dbr->fetchObject( $result ) ) { + + $user = User::newFromId( $id->user_id ); + + $curValue = $user->getOption( $this->mAnOption ); + $username = $user->getName(); + + if( $curValue == $this->mOldValue ) { + + if(!$this->mQuiet) { + print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' to '{$this->mNewValue}'): "; + } + + // Change value + $user->setOption( $this->mAnOption, $this->mNewValue ); + + // Will not save the settings if run with --dry + if(!$this->mDry) { + $user->saveSettings(); + } + if( !$this->mQuiet) { print " OK\n"; } + + } elseif( !$this->mQuiet ) { + print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n"; + } + } + } + + + /** Return an array of option names */ + public static function getDefaultOptionsNames() { + $def = User::getDefaultOptions(); + $ret = array(); + foreach( $def as $optname => $defaultValue) { + array_push( $ret, $optname ); + } + return $ret; + } + + + # + # Helper methods + # + + public static function showUsageAndExit() { +print << --usage + php userOptions.php [options]  --old --new + +Switchs: + --list : list available user options and their default value + + --usage