Merge "Wrap revision info and nav in a div for easy formatting in MobileFrontend"
[lhc/web/wiklou.git] / includes / user / User.php
index 40b5b40..c46836b 100644 (file)
@@ -772,15 +772,15 @@ class User implements IDBAccessObject {
                        return self::$idCacheByName[$name];
                }
 
-               $db = ( $flags & self::READ_LATEST )
-                       ? wfGetDB( DB_MASTER )
-                       : wfGetDB( DB_SLAVE );
+               list( $index, $options ) = DBAccessObjectUtils::getDBOptions( $flags );
+               $db = wfGetDB( $index );
 
                $s = $db->selectRow(
                        'user',
                        [ 'user_id' ],
                        [ 'user_name' => $nt->getText() ],
-                       __METHOD__
+                       __METHOD__,
+                       $options
                );
 
                if ( $s === false ) {
@@ -911,6 +911,44 @@ class User implements IDBAccessObject {
                return true;
        }
 
+       /**
+        * Return the users who are members of the given group(s). In case of multiple groups,
+        * users who are members of at least one of them are returned.
+        *
+        * @param string|array $groups A single group name or an array of group names
+        * @param int $limit Max number of users to return. The actual limit will never exceed 5000
+        *   records; larger values are ignored.
+        * @param int $after ID the user to start after
+        * @return UserArrayFromResult
+        */
+       public static function findUsersByGroup( $groups, $limit = 5000, $after = null ) {
+               if ( $groups === [] ) {
+                       return UserArrayFromResult::newFromIDs( [] );
+               }
+
+               $groups = array_unique( (array)$groups );
+               $limit = min( 5000, $limit );
+
+               $conds = [ 'ug_group' => $groups ];
+               if ( $after !== null ) {
+                       $conds[] = 'ug_user > ' . (int)$after;
+               }
+
+               $dbr = wfGetDB( DB_SLAVE );
+               $ids = $dbr->selectFieldValues(
+                       'user_groups',
+                       'ug_user',
+                       $conds,
+                       __METHOD__,
+                       [
+                               'DISTINCT' => true,
+                               'ORDER BY' => 'ug_user',
+                               'LIMIT' => $limit,
+                       ]
+               ) ?: [];
+               return UserArray::newFromIDs( $ids );
+       }
+
        /**
         * Usernames which fail to pass this function will be blocked
         * from new account registrations, but may be used internally
@@ -1524,16 +1562,19 @@ class User implements IDBAccessObject {
                global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
 
                static $defOpt = null;
-               if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
-                       // Disabling this for the unit tests, as they rely on being able to change $wgContLang
-                       // mid-request and see that change reflected in the return value of this function.
-                       // Which is insane and would never happen during normal MW operation
+               static $defOptLang = null;
+
+               if ( $defOpt !== null && $defOptLang === $wgContLang->getCode() ) {
+                       // $wgContLang does not change (and should not change) mid-request,
+                       // but the unit tests change it anyway, and expect this method to
+                       // return values relevant to the current $wgContLang.
                        return $defOpt;
                }
 
                $defOpt = $wgDefaultUserOptions;
                // Default language setting
-               $defOpt['language'] = $wgContLang->getCode();
+               $defOptLang = $wgContLang->getCode();
+               $defOpt['language'] = $defOptLang;
                foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
                        $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
                }
@@ -2977,7 +3018,7 @@ class User implements IDBAccessObject {
         * @return string|bool User's current value for the option, or false if this option is disabled.
         * @see resetTokenFromOption()
         * @see getOption()
-        * @deprecated 1.26 Applications should use the OAuth extension
+        * @deprecated since 1.26 Applications should use the OAuth extension
         */
        public function getTokenFromOption( $oname ) {
                global $wgHiddenPrefs;