├── .gitignore ├── .gitmodules ├── .gitreview ├── sort-gitmodules.py └── sync-with-gerrit.py /.gitignore: -------------------------------------------------------------------------------- 1 | # git-deploy status file: 2 | /.deploy 3 | 4 | # Editors 5 | \#*# 6 | .#* 7 | *~ 8 | *.kate-swp 9 | .*.swp 10 | .project 11 | cscope.files 12 | cscope.out 13 | ## NetBeans 14 | nbproject* 15 | project.index 16 | ## Sublime 17 | sublime-* 18 | sftp-config.json 19 | 20 | # Building & testing 21 | node_modules/ 22 | 23 | # Composer 24 | /vendor 25 | /composer.lock 26 | /composer.json 27 | 28 | # Operating systems 29 | ## Mac OS X 30 | .DS_Store 31 | ## Windows 32 | Thumbs.db 33 | 34 | # Misc 35 | .buildpath 36 | .classpath 37 | .idea 38 | .metadata* 39 | .settings 40 | /static* 41 | /tags 42 | /.htaccess 43 | /.htpasswd 44 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "2018"] 2 | path = 2018 3 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/2018 4 | branch = . 5 | [submodule "Aether"] 6 | path = Aether 7 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Aether 8 | branch = . 9 | [submodule "Amethyst"] 10 | path = Amethyst 11 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Amethyst 12 | branch = . 13 | [submodule "Anisa"] 14 | path = Anisa 15 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Anisa 16 | branch = . 17 | [submodule "BlueSky"] 18 | path = BlueSky 19 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/BlueSky 20 | branch = . 21 | [submodule "BlueSpiceCalumma"] 22 | path = BlueSpiceCalumma 23 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/BlueSpiceCalumma 24 | branch = . 25 | [submodule "BlueSpiceDiscovery"] 26 | path = BlueSpiceDiscovery 27 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/BlueSpiceDiscovery 28 | branch = . 29 | [submodule "Bouquet"] 30 | path = Bouquet 31 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Bouquet 32 | branch = . 33 | [submodule "Cavendish"] 34 | path = Cavendish 35 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Cavendish 36 | branch = . 37 | [submodule "CologneBlue"] 38 | path = CologneBlue 39 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/CologneBlue 40 | branch = . 41 | [submodule "Cosmos"] 42 | path = Cosmos 43 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Cosmos 44 | branch = . 45 | [submodule "DeskMessMirrored"] 46 | path = DeskMessMirrored 47 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/DeskMessMirrored 48 | branch = . 49 | [submodule "Dusk"] 50 | path = Dusk 51 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Dusk 52 | branch = . 53 | [submodule "DuskToDawn"] 54 | path = DuskToDawn 55 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/DuskToDawn 56 | branch = . 57 | [submodule "Empty"] 58 | path = Empty 59 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Empty 60 | branch = . 61 | [submodule "Example"] 62 | path = Example 63 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Example 64 | branch = . 65 | [submodule "Foreground"] 66 | path = Foreground 67 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Foreground 68 | branch = . 69 | [submodule "Freo"] 70 | path = Freo 71 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Freo 72 | branch = . 73 | [submodule "Gamepress"] 74 | path = Gamepress 75 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Gamepress 76 | branch = . 77 | [submodule "GreyStuff"] 78 | path = GreyStuff 79 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/GreyStuff 80 | branch = . 81 | [submodule "GuMaxDD"] 82 | path = GuMaxDD 83 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/GuMaxDD 84 | branch = . 85 | [submodule "HasSomeColours"] 86 | path = HasSomeColours 87 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/HasSomeColours 88 | branch = . 89 | [submodule "Mask"] 90 | path = Mask 91 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Mask 92 | branch = . 93 | [submodule "Material"] 94 | path = Material 95 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Material 96 | branch = . 97 | [submodule "MediaWikiWordpressThemes"] 98 | path = MediaWikiWordpressThemes 99 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/MediaWikiWordpressThemes 100 | branch = . 101 | [submodule "Metrolook"] 102 | path = Metrolook 103 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Metrolook 104 | branch = . 105 | [submodule "MinervaNeue"] 106 | path = MinervaNeue 107 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/MinervaNeue 108 | branch = . 109 | [submodule "Mirage"] 110 | path = Mirage 111 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Mirage 112 | branch = . 113 | [submodule "Modern"] 114 | path = Modern 115 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Modern 116 | branch = . 117 | [submodule "MonoBook"] 118 | path = MonoBook 119 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/MonoBook 120 | branch = . 121 | [submodule "Nimbus"] 122 | path = Nimbus 123 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Nimbus 124 | branch = . 125 | [submodule "Nostalgia"] 126 | path = Nostalgia 127 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Nostalgia 128 | branch = . 129 | [submodule "Pivot"] 130 | path = Pivot 131 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Pivot 132 | branch = . 133 | [submodule "Poncho"] 134 | path = Poncho 135 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Poncho 136 | branch = . 137 | [submodule "Reflection"] 138 | path = Reflection 139 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Reflection 140 | branch = . 141 | [submodule "Refreshed"] 142 | path = Refreshed 143 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Refreshed 144 | branch = . 145 | [submodule "Schulenburg"] 146 | path = Schulenburg 147 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Schulenburg 148 | branch = . 149 | [submodule "Splash"] 150 | path = Splash 151 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Splash 152 | branch = . 153 | [submodule "Tempo"] 154 | path = Tempo 155 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Tempo 156 | branch = . 157 | [submodule "Timeless"] 158 | path = Timeless 159 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Timeless 160 | branch = . 161 | [submodule "Truglass"] 162 | path = Truglass 163 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Truglass 164 | branch = . 165 | [submodule "TuleapSkin"] 166 | path = TuleapSkin 167 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/TuleapSkin 168 | branch = . 169 | [submodule "Vector"] 170 | path = Vector 171 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/Vector 172 | branch = . 173 | [submodule "WMAU"] 174 | path = WMAU 175 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/WMAU 176 | branch = . 177 | [submodule "WPtouch"] 178 | path = WPtouch 179 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/WPtouch 180 | branch = . 181 | [submodule "WikimediaApiPortal"] 182 | path = WikimediaApiPortal 183 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/WikimediaApiPortal 184 | branch = . 185 | [submodule "WoOgLeShades"] 186 | path = WoOgLeShades 187 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/WoOgLeShades 188 | branch = . 189 | [submodule "apex"] 190 | path = apex 191 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/apex 192 | branch = . 193 | [submodule "erudite"] 194 | path = erudite 195 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/erudite 196 | branch = . 197 | [submodule "mediawiki-strapping"] 198 | path = mediawiki-strapping 199 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/mediawiki-strapping 200 | branch = . 201 | [submodule "p2wiki"] 202 | path = p2wiki 203 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/p2wiki 204 | branch = . 205 | [submodule "shared"] 206 | path = shared 207 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/shared 208 | branch = . 209 | [submodule "webplatform"] 210 | path = webplatform 211 | url = https://gerrit.wikimedia.org/r/mediawiki/skins/webplatform 212 | branch = . 213 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=gerrit.wikimedia.org 3 | port=29418 4 | project=mediawiki/skins.git 5 | track=1 6 | -------------------------------------------------------------------------------- /sort-gitmodules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # Code is released into public domain 4 | 5 | from collections import defaultdict 6 | 7 | sections = defaultdict(list) 8 | section_name = '' 9 | 10 | with open('.gitmodules', 'r') as f: 11 | for line in f: 12 | if line.startswith('['): 13 | section_name = line 14 | sections[section_name].append(line) 15 | 16 | with open('.gitmodules', 'w') as f: 17 | for section_name in sorted(sections): 18 | f.write(''.join(sections[section_name])) 19 | 20 | print('Sorted .gitmodules. Review output and commit.') 21 | -------------------------------------------------------------------------------- /sync-with-gerrit.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import logging 4 | import os.path 5 | import subprocess 6 | import json 7 | import shutil 8 | 9 | # Configuration for this script 10 | basepath = "mediawiki/skins/" 11 | gerrit_conf = { 12 | 'host': 'gerrit.wikimedia.org', 13 | 'port': '29418', 14 | 'url': 'https://{host}/r/{project}' 15 | } 16 | 17 | # Global logger 18 | logging.basicConfig(level=logging.DEBUG) 19 | log = logging.getLogger() 20 | 21 | 22 | def main(): 23 | log.info("Fetching projects from gerrit (prefix: %s)" % basepath) 24 | projects = gerrit('ls-projects', [ 25 | '--type', 'CODE', 26 | '--prefix', basepath, 27 | '--description', 28 | '--format', 'json', 29 | ]) 30 | 31 | # strip out subprojects in extensions 32 | projects = json.loads(projects) 33 | log.info("Checking modules") 34 | gitmodules = [] 35 | for p in sorted(projects.keys()): 36 | basename = project_basename(p) 37 | if '/' in basename: 38 | continue 39 | 40 | if projects[p].get('state') == 'READ_ONLY': 41 | log.info(" ".join([p, 'skipping, repo is readonly'])) 42 | 43 | if os.path.isdir(basename): 44 | log.info("Removing directory for %s" % p) 45 | shutil.rmtree(basename) 46 | 47 | continue 48 | 49 | gitmodules.append(p) 50 | if not os.path.isdir(basename): 51 | log.info("Adding submodule for %s" % p) 52 | try: 53 | submodule_add(p) 54 | except subprocess.CalledProcessError: 55 | log.error("Git reported an issue adding module %s" % p) 56 | 57 | log.info("Rewriting .gitmodules") 58 | f = open('.gitmodules', 'w') 59 | f.write(generate_gitmodules(gitmodules)) 60 | f.close() 61 | 62 | log.info("Review change and submit!\nDone") 63 | 64 | 65 | def submodule_add(project): 66 | cmd = 'git submodule add'.split(' ') + [ 67 | gerrit_url(project), 68 | project_basename(project) 69 | ] 70 | subprocess.check_call(cmd) 71 | 72 | 73 | def generate_gitmodules(projects): 74 | "Create a .gitmodules file with branch=." 75 | gitmodules = '' 76 | for project in projects: 77 | p_url = gerrit_url(project) 78 | gitmodules += ( 79 | "[submodule \"{name}\"]\n" 80 | "\tpath = {name}\n" 81 | "\turl = {url}\n" 82 | "\tbranch = .\n" 83 | ).format( 84 | name=project_basename(project), 85 | url=p_url 86 | ) 87 | 88 | return gitmodules 89 | 90 | 91 | def gerrit(gerrit_cmd, args=[], gerrit_conf=gerrit_conf): 92 | "Helper to execute a gerrit command." 93 | ssh = [ 94 | '/usr/bin/ssh', 95 | '-p', gerrit_conf['port'], 96 | gerrit_conf['host'], 97 | ] 98 | 99 | cmd = ssh + ['gerrit {gerrit_cmd} {args}\''.format( 100 | ssh=ssh, gerrit_cmd=gerrit_cmd, args=' '.join(args))] 101 | 102 | return subprocess.check_output(cmd) 103 | 104 | 105 | def gerrit_url(project): 106 | return gerrit_conf['url'].format( 107 | host=gerrit_conf['host'], project=project) 108 | 109 | 110 | def project_basename(project): 111 | return project[len(basepath):] 112 | 113 | 114 | if __name__ == '__main__': 115 | main() 116 | --------------------------------------------------------------------------------