Jdlrobson has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/347775 )
Change subject: Add scaffolding and migration script ...................................................................... Add scaffolding and migration script Change-Id: Ie9420dc85f658fa21a1524dca9374cb1e14fcad7 --- A MinervaNeue.php A README.txt A package.json A scripts/migrate.py A skin.json 5 files changed, 228 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/skins/MinervaNeue refs/changes/75/347775/1 diff --git a/MinervaNeue.php b/MinervaNeue.php new file mode 100644 index 0000000..f63fc93 --- /dev/null +++ b/MinervaNeue.php @@ -0,0 +1,14 @@ +<?php + +if ( function_exists( 'wfLoadSkin' ) ) { + wfLoadSkin( 'MinervaNeue' ); + // Keep i18n globals so mergeMessageFileList.php doesn't break + $wgMessagesDirs['MinervaNeue'] = __DIR__ . '/i18n'; + /* wfWarn( + 'Deprecated PHP entry point used for Vector skin. Please use wfLoadSkin instead, ' . + 'see https://www.mediawiki.org/wiki/Extension_registration for more details.' + ); */ + return true; +} else { + die( 'This version of the MinervaNeue skin requires MediaWiki 1.25+' ); +} diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..94c580b --- /dev/null +++ b/README.txt @@ -0,0 +1,6 @@ +Porting Minerva code from MobileFrontend to Minerva: +* Make sure this repository is in your MediaWiki skins directory +* Make sure MobileFrontend is installed in extensions/MobileFrontend in your MediaWiki install +* Run: + > python3 scripts/migrate.py +* Create commits for both MobileFrontend and Minerva to handle the move. diff --git a/package.json b/package.json new file mode 100644 index 0000000..efde4c0 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "private": true, + "scripts": { + "test": "grunt test" + }, + "devDependencies": { + "grunt": "0.4.5", + "grunt-cli": "0.1.13", + + "grunt-eslint": "19.0.0", + "eslint-config-wikimedia": "0.3.0", + "grunt-banana-checker": "0.5.0", + "grunt-jsonlint": "1.0.7", + "grunt-stylelint": "0.6.0", + "stylelint-config-wikimedia": "0.3.0" + } +} diff --git a/scripts/migrate.py b/scripts/migrate.py new file mode 100644 index 0000000..61c9280 --- /dev/null +++ b/scripts/migrate.py @@ -0,0 +1,155 @@ +mfdir = '../../extensions/MobileFrontend' + +import json, shutil, os, subprocess, time +from collections import OrderedDict + +messages = [ 'mobile-frontend-placeholder', 'skinname-minerva', + 'mobile-frontend-talk-back-to-userpage', + 'mobile-frontend-talk-back-to-projectpage', + 'mobile-frontend-talk-back-to-filepage', + 'mobile-frontend-talk-back-to-page', + 'mobile-frontend-editor-edit', + 'mobile-frontend-user-newmessages', + 'mobile-frontend-main-menu-contributions', + 'mobile-frontend-main-menu-watchlist', + 'mobile-frontend-main-menu-settings', + 'mobile-frontend-home-button', + 'mobile-frontend-random-button', + 'mobile-frontend-main-menu-nearby', + 'mobile-frontend-main-menu-logout', + 'mobile-frontend-main-menu-login', + 'mobile-frontend-history', + 'mobile-frontend-user-page-member-since', + 'mobile-frontend-main-menu-button-tooltip', + 'mobile-frontend-language-article-heading', + 'mobile-frontend-pageaction-edit-tooltip', + 'mobile-frontend-language-article-heading', + 'mobile-frontend-user-page-talk', + 'mobile-frontend-user-page-contributions', + 'mobile-frontend-user-page-uploads' +] + +# Do cleanup in preparation for patchsets it will make. +subprocess.call(["git clean -fd"], shell=True) +subprocess.call(["git stash && git clean -fd"], shell=True, cwd=mfdir) +subprocess.call(["rm -rf includes && rm -rf resources && rm -rf minerva.less && rm -rf i18n"], shell=True) +subprocess.call(["mkdir includes && mkdir includes/skins && mkdir resources && mkdir minerva.less && mkdir i18n"], shell=True) +time.sleep(1) + +def saveJSON(path, data): + with open(path, 'w') as outfile: + json.dump(data, outfile, indent = "\t", ensure_ascii=False, separators=(',', ': ')) + +def clean( keys_to_remove, data_key ): + # Remove the keys we added from MobileFrontend extension.json + for key in keys_to_remove: + try: + del mfExtensionData[data_key][key] + except KeyError: + pass + +def steal( path ): + print('stealing %s'%path) + try: + # ../ because we are in scripts folder + shutil.move( mfdir + '/' + path, path ) + except ( FileNotFoundError, shutil.Error ) as e: + print (e) + # probably done in initial steal steps + pass + +f = open(mfdir +'/extension.json', 'r') +mfExtensionData = json.load(f, object_pairs_hook=OrderedDict) +f.close() +f = open('skin.json', 'r') +minervaSkinData = json.load(f, object_pairs_hook=OrderedDict) +f.close() + +def isOwnedByMinerva(key, value): + return key.startswith("Minerva") or key.startswith( 'skins.minerva' ) or \ + ( type(value) == type('string') and "skins/" in value ) + +def migrateObject(fromObj, toObj, key): + obj = fromObj[key] + keys_to_remove = [] + files_to_steal = [] + for subkey in obj: + val = obj[subkey] + if isOwnedByMinerva(subkey, val): + if key == "ResourceModules": + steal( 'resources/%s'% subkey ) + elif key == 'AutoloadClasses': + steal( val ) + + toObj[key][subkey] = val + keys_to_remove.append(subkey) + + # cleanup + print('remove %s'%keys_to_remove) + clean( keys_to_remove, key ) + +migrateObject( mfExtensionData, minervaSkinData, "AutoloadClasses") +migrateObject( mfExtensionData, minervaSkinData, "ResourceModules") +migrateObject( mfExtensionData, minervaSkinData, "config") + +for hookname in mfExtensionData['Hooks']: + mfHooks = mfExtensionData['Hooks'][hookname] + minervaHooks = [] + newMfHooks = [] + for hook in mfHooks: + if isOwnedByMinerva(hook, hook): + minervaHooks.extend([hook]) + else: + newMfHooks.extend([hook]) + if len(minervaHooks) > 0: + minervaSkinData['Hooks'][hookname] = minervaHooks + mfExtensionData['Hooks'][hookname] = newMfHooks + +# steal templates etc from MobileFrontend +for root, dirs, files in os.walk(mfdir + '/includes/skins/'): + for file in files: + steal('includes/skins/' + file) + +# steal LESS stuff +for root, dirs, files in os.walk(mfdir + '/includes/minerva.less/'): + for file in files: + steal('minerva.less/' + file) + +# remove +del mfExtensionData["ValidSkinNames"] + +with open('skin.json', 'w') as outfile: + #prettify output + json.dump(minervaSkinData, outfile, sort_keys = True, indent = 2, ensure_ascii=False, separators=(',', ': ')) + +with open(mfdir + '/extension.json', 'w') as outfile: + #prettify output + json.dump(mfExtensionData, outfile, indent = "\t", ensure_ascii=False, separators=(',', ': ')) + +# migrate i18n +print('migrating i18n') +for root, dirs, files in os.walk(mfdir + '/i18n/'): + for language in files: + newLanguageData = {} + f = open(mfdir + '/i18n/' + language, 'r') + languageData = json.load(f, object_pairs_hook=OrderedDict) + f.close() + for msgKey in messages: + try: + newLanguageData[msgKey] = languageData[msgKey] + del languageData[msgKey] + except KeyError: + pass + + # save to mf + saveJSON( mfdir + '/i18n/' + language, languageData ) + + # mobile specific renames + try: + newLanguageData['skinname-minerva-neue'] = newLanguageData['skinname-minerva'] + del newLanguageData['skinname-minerva'] + except KeyError: + pass + + # save to minerva + saveJSON( 'i18n/' + language, newLanguageData ) diff --git a/skin.json b/skin.json new file mode 100644 index 0000000..9cec34b --- /dev/null +++ b/skin.json @@ -0,0 +1,36 @@ +{ + "AutoloadClasses": {}, + "ConfigRegistry": { + "minerva-neue": "GlobalVarConfig::newInstance" + }, + "Hooks": {}, + "MessagesDirs": { + "MinervaNeue": [ + "i18n" + ] + }, + "ResourceFileModulePaths": { + "localBasePath": "", + "remoteSkinPath": "MinervaNeue" + }, + "ResourceModuleSkinStyles": { + "minerva-neue": {} + }, + "ResourceModules": {}, + "ValidSkinNames": { + "minerva": "Minerva" + }, + "author": [], + "callback": "MinervaHooks::onRegistration", + "config": {}, + "descriptionmsg": "minerva-neue-skin-desc", + "license-name": "GPL-2.0+", + "manifest_version": 1, + "name": "MinervaNeue", + "namemsg": "skinname-minerva-neue", + "requires": { + "MediaWiki": ">= 1.25.0" + }, + "type": "skin", + "url": "https://www.mediawiki.org/wiki/Skin:MinervaNeue" +} \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/347775 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie9420dc85f658fa21a1524dca9374cb1e14fcad7 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/skins/MinervaNeue Gerrit-Branch: master Gerrit-Owner: Jdlrobson <jrob...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits