MarkAHershberger has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/169308

Change subject: WIP -- Modifications to make-release to include skins
......................................................................

WIP -- Modifications to make-release to include skins

Change-Id: I57b54b7bd82f8b6d6bdee9ddb8e8c163bfbb09ae
---
M make-release/make-branches
M make-release/make-release.py
M make-release/make-release.yaml
3 files changed, 243 insertions(+), 132 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/tools/release 
refs/changes/08/169308/1

diff --git a/make-release/make-branches b/make-release/make-branches
index 48a9091..02dc559 100644
--- a/make-release/make-branches
+++ b/make-release/make-branches
@@ -36,12 +36,13 @@
        echo
                "usage: $self <branch-name>\n"
                . "\n"
-               . "Example: $self REL1_21\n";
+               . "Example: $self REL1_21 [local git repo]\n";
        exit( 1 );
 }
 
 $maker = new MakeExtensionBranches( array(
-       'branchName' => $argv[1],
+               'branchName' => $argv[1],
+               'localGitRepo' => isset( $argv[2] ) ? $argv[2] : null,
 ) );
 
 $maker->run();
@@ -65,6 +66,27 @@
        }
 
        protected function setup() {
+               if ( $this->opts->localGitRepo && is_dir( 
$this->opts->localGitRepo ) ) {
+                       $extDir = $this->opts->localGitRepo . "/extensions";
+                       if ( ! is_dir( $extDir ) ) {
+                               echo "$extDir doesn't exist.\n";
+                               exit(1);
+                       }
+                       if ( ! is_dir( "$extDir/.git" ) ) {
+                               echo "$extDir doesn't look like a git 
repository.\n";
+                               exit(1);
+                       }
+                       // Fetch from git submodules
+                       $this->chdir( $extDir );
+                       $ret = $this->execReadCmd( null, 'git', 'submodule' );
+                       $this->conf->extRepos = array_map(
+                               function($line) {                     /* **** 
Read this bottom up.  Steps numbered for easier reading. */
+                                       return array_pop(                 /* 4. 
Get the second item which is the extension name. */
+                                               explode( " ",                 
/* 3. Get 2 or 3 items from each line (line in format "SHA1HASH repo 
[(branch)]" at this point) */
+                                                       substr( $line, 1 ) ) ); 
  /* 2. For each line, skip the first char which may be a blank */
+                                                                             
/* 1. Get the results of "git submodule" in the extensions directory as a list 
of lines */
+                               }, explode( "\n", $this->execReadCmd( null, 
'git', 'submodule' ) ) );
+               }
                if ( !$this->conf->extRepos ) {
                        // Fetch from Gerrit
                        $list = $this->execReadCmd( $exit, 'ssh', '-p', 
'29418', 'gerrit.wikimedia.org', 'gerrit', 'ls-projects', '-p', 
'mediawiki/extensions' );
@@ -106,7 +128,15 @@
                $this->execWriteCmd( $exitcode, 'git', 'push', 'origin', 
"$branchName:refs/heads/$branchName" );
        }
 
-       public function run() {
+               protected function branchCore() {
+                       echo "branchCore no-op\n";
+               }
+
+               protected function tagCore() {
+                       echo "tagCore no-op\n";
+               }
+
+               public function run() {
                $this->setup();
                $this->setupBuildDirectory();
 
@@ -129,6 +159,8 @@
        protected function setupBuildDirectory() {
                if ( is_dir( $this->conf->buildDir ) ) {
                        echo "Using existing build dir";
+               } elseif ( !is_dir( dirname( $this->conf->buildDir ) ) ) {
+                       $this->error( "Parent of {$this->conf->buildDir} isn't 
a directory.  Not creating." );
                } elseif ( !mkdir( $this->conf->buildDir ) ) {
                        $this->error( "Unable to create directory 
{$this->conf->buildDir}" );
                }
@@ -145,7 +177,7 @@
 
        protected function execReadCmd( /*...*/ ) {
                $args = func_get_args();
-               $exitCode = array_unshift( $args );
+               $exitCode = array_shift( $args );
                if ( $this->conf->verbose && in_array( '-q', $args ) ) {
                        $args = array_diff( $args, array( '-q' ) );
                }
@@ -162,6 +194,11 @@
                if ( $exitCode ) {
                        $this->error( $args[0] . " exit with status 
$exitCode\n" );
                }
+               if ( $this->conf->verbose ) {
+                       array_map( function( $line ) {
+                                       echo "[output] $line\n";
+                               }, explode( "\n", $output ) );
+               }
                return trim( $output );
        }
 
diff --git a/make-release/make-release.py b/make-release/make-release.py
index 51d3ce2..f2c16fe 100755
--- a/make-release/make-release.py
+++ b/make-release/make-release.py
@@ -19,41 +19,47 @@
 import time
 import yaml
 
-config = {}
+def getVersionAddOns(version, addOns=[]):
+    if addOns == None:
+        addOns = []
 
+    if version.isSnapshot():
+        return addOns
 
-def getVersionExtensions(version, extensions=[]):
+    return config.setting['bundles']['mediawiki-%s' % version.major]
+
+def oldGetVersionExtensions(version, extensions=[]):
     coreExtensions = [
-        'ConfirmEdit',
-        'Gadgets',
-        'Nuke',
-        'ParserFunctions',
-        'PdfHandler',
-        'Renameuser',
-        'SpamBlacklist',
-        'Vector',
-        'WikiEditor',
+        'extensions/ConfirmEdit',
+        'extensions/Gadgets',
+        'extensions/Nuke',
+        'extensions/ParserFunctions',
+        'extensions/PdfHandler',
+        'extensions/Renameuser',
+        'extensions/SpamBlacklist',
+        'extensions/Vector',
+        'extensions/WikiEditor',
     ]
     newExtensions = [
-        'Cite',
-        'ImageMap',
-        'Interwiki',
-        'TitleBlacklist',
-        'SpamBlacklist',
-        'Poem',
-        'InputBox',
-        'LocalisationUpdate',
-        'SyntaxHighlight_GeSHi',
-        'SimpleAntiSpam',
+        'extensions/Cite',
+        'extensions/ImageMap',
+        'extensions/Interwiki',
+        'extensions/TitleBlacklist',
+        'extensions/SpamBlacklist',
+        'extensions/Poem',
+        'extensions/InputBox',
+        'extensions/LocalisationUpdate',
+        'extensions/SyntaxHighlight_GeSHi',
+        'extensions/SimpleAntiSpam',
     ]
     oldCoreExtensions = [
-        'ConfirmEdit',
-        'Gadgets',
-        'Nuke',
-        'ParserFunctions',
-        'Renameuser',
-        'Vector',
-        'WikiEditor',
+        'extensions/ConfirmEdit',
+        'extensions/Gadgets',
+        'extensions/Nuke',
+        'extensions/ParserFunctions',
+        'extensions/Renameuser',
+        'extensions/Vector',
+        'extensions/WikiEditor',
     ]
 
     # Export extensions for inclusion
@@ -65,26 +71,26 @@
         extensions += oldCoreExtensions
 
     if version > '1.22':
-        extensions.remove('Vector')
-        extensions.remove('SimpleAntiSpam')
+        extensions.remove('extensions/Vector')
+        extensions.remove('extensions/SimpleAntiSpam')
 
     # Return uniq elements (order not preserved)
     return list(set(extensions))
 
 
-def versionToTag(version):
-    return 'tags/' + version
+def config(conffile=None):
+    if not hasattr(config, "conffile") or getattr(config, "conffile") is None:
+        if conffile is None:
+            setattr(config, "conffile", 'make-release.yaml')
+        else:
+            setattr(config, "conffile", conffile)
 
+        if not os.path.isfile(config.conffile):
+            print "Configuration file not found: %s" % config.conffile
+            sys.exit(1)
+        print "Reading config file: %s\n" % config.conffile
 
-def read_config(conffile=None):
-    if conffile is None:
-        conffile = 'make-release.yaml'
-
-    if not os.path.isfile(conffile):
-        print "Configuration file not found: %s" % conffile
-        sys.exit(1)
-
-    return yaml.load(open(conffile))
+        setattr(config, "setting", yaml.load(open(config.conffile)))
 
 
 def parse_args():
@@ -136,7 +142,7 @@
     parser.add_argument(
         '--git-root-ext', dest='gitrootext',
         default=None,
-        help='base git URL to fetch extensions from (defaults to git-root)'
+        help='base git URL to fetch addOns from (defaults to git-root)'
     )
     parser.add_argument(
         '--build', dest='buildroot',
@@ -191,6 +197,9 @@
         self.phase = decomposed.get('phase', None)
         self.cycle = decomposed.get('cycle', None)
 
+    def __str__(self):
+        return self.raw
+
     def __repr__(self):
         if self.raw is None:
             return "<MwVersion Null (snapshot?)>"
@@ -203,6 +212,12 @@
             self.tag, self.prev_tag,
             self.branch
         )
+
+
+    def isSnapshot(self):
+        if self.raw[:9] == "snapshot-":
+            return True
+        return False
 
     def decomposeVersion(self, version):
         '''Split a version number to branch / major
@@ -259,26 +274,26 @@
                 ret['minor'] == '0' and
                 (ret['phase'] == 'rc' and
                  ret['cycle'] == '0'))):
-                ret['tag'] = 'tags/%s.%s%s%s' % (
+                ret['tag'] = '%s.%s%s%s' % (
                     ret['major'],
                     ret['minor'],
                     ret.get('phase', ''),
                     ret.get('cycle', '')
                 )
             elif('phase' in ret):
-                ret['tag'] = 'tags/%s.%s-%s.%s' % (
+                ret['tag'] = '%s.%s-%s.%s' % (
                     ret['major'],
                     ret['minor'],
                     ret.get('phase', ''),
                     ret.get('cycle', '')
                 )
             else:
-                ret['tag'] = 'tags/%s.%s' % (
+                ret['tag'] = '%s.%s' % (
                     ret['major'],
                     ret['minor'],
                 )
         except KeyError:
-            ret['tag'] = 'tags/%s.%s' % (
+            ret['tag'] = '%s.%s' % (
                 ret['major'],
                 ret['minor']
             )
@@ -297,17 +312,15 @@
         bits[last] = str(int(bits[last]) - 1)
 
         if(bits[0] <= '1.22' or
-           (bits[0] == '1.23' and
-            bits[1] == '0' and
-            (bits[2] == 'rc' and
-             bits[3] == '0'))):
+           (bits[0] == '1.23' and bits[1] == '0' and
+            (bits[2] == 'rc' and bits[3] == '0'))):
             ret['prevVersion'] = '%s.%s%s%s' % tuple(bits)
         elif('phase' in ret):
             ret['prevVersion'] = '%s.%s-%s.%s' % tuple(bits)
         else:
             ret['prevVersion'] = '%s.%s' % (bits[0], bits[1])
 
-        ret['prevTag'] = 'tags/' + ret['prevVersion']
+        ret['prevTag'] = ret['prevVersion']
 
         return ret
 
@@ -325,14 +338,13 @@
     def main(self):
         " return value should be usable as an exit code"
 
-        global config  # yeah globals are evil. We know.
-        config = read_config(options.conf)
+        config(options.conf)
 
         # TODO we should validate the YAML configuration file
 
-        extensions = []
-        bundles = config.get('bundles')
-        smwExtensions = bundles.get('smw')
+        addOns = []
+        bundles = config.setting['bundles']
+        smwAddOns = bundles['smw']
 
         print "Doing release for %s" % self.version
 
@@ -349,14 +361,13 @@
             return 0
 
         if options.smw:
-            # Other extensions for inclusion
-            for ext in smwExtensions:
-                extensions.append(ext)
+            # Other addOns for inclusion
+            for addOn in smwAddOns:
+                addOns.append(addOn)
 
         if options.previousversion:
             # Given the previous version on the command line
             self.makeRelease(
-                extensions=extensions,
                 version=options.version,
                 dir=self.version.major)
             return 0
@@ -373,7 +384,6 @@
 
         if noPrevious:
             self.makeRelease(
-                extensions=extensions,
                 version=options.version,
                 dir=self.version.major)
         else:
@@ -384,7 +394,6 @@
                 return 1
 
             self.makeRelease(
-                extensions=extensions,
                 version=options.version,
                 dir=options.buildroot)
         return 0
@@ -405,13 +414,13 @@
 
     def getGit(self, repo, dir, label, branch):
         oldDir = os.getcwd()
-        if os.path.exists(repo):
-            print "Updating local %s" % repo
-            proc = subprocess.Popen(['git', 'remote', 'update'],
-                                    cwd=repo)
-            if proc.wait() != 0:
-                print "Could not update local repository %s" % repo
-                sys.exit(1)
+        # if os.path.exists(repo):
+        #     print "Updating local %s" % repo
+        #     proc = subprocess.Popen(['git', 'remote', 'update'],
+        #                             cwd=repo)
+        #     if proc.wait() != 0:
+        #         print "Could not update local repository %s" % repo
+        #         sys.exit(1)
 
         if not self.options.offline:
             if (os.path.exists(dir)):
@@ -465,13 +474,13 @@
 
         print "Done"
 
-    def exportExtension(self, branch, extension, dir):
+    def exportAddOn(self, branch, addOn, dir):
         gitroot = self.options.gitroot
         if self.options.gitrootext:
             gitroot = self.options.gitrootext
 
-        self.getGit(gitroot + '/extensions/' + extension,
-                    dir + '/extensions/' + extension, extension, branch)
+        self.getGit(gitroot + '/' + addOn,
+                    dir + '/' + addOn, addOn, branch)
         print "Done"
 
     def makePatch(self, destDir, patchFileName, dir1, dir2, type):
@@ -483,7 +492,7 @@
             dir2 += '/languages/messages'
         else:
             print "Generating normal patch file..."
-            excludedExtensions = [
+            excludedAddOns = [
                 'messages',
                 '*.png',
                 '*.jpg',
@@ -495,8 +504,8 @@
                 '*.xmp',
                 '.git*',
             ]
-            for ext in excludedExtensions:
-                args.extend(['-x', ext])
+            for excl in excludedAddOns:
+                args.extend(['-x', excl])
 
         args.extend([dir1, dir2])
         print ' '.join(args)
@@ -516,15 +525,15 @@
         print "Done"
         return diffStatus == 1
 
-    def makeTarFile(self, package, targetDir, dir, tarOpts, argAdd=[]):
+    def makeTarFile(self, package, targetDir, dir, argAdd=[]):
         tar = self.options.tar_command
 
         # Generate the .tar.gz file
         filename = package + '.tar.gz'
         outFile = open(dir + '/' + filename, "w")
         args = [tar, '--format=gnu', '--exclude-vcs', '-C', dir]
-        if tarOpts.get("ignore"):
-            for patt in tarOpts.get("ignore"):
+        if config.setting['tar']:
+            for patt in config.setting['tar']['ignore']:
                 args += ['--exclude', patt]
         args += argAdd
         args += ['-c', targetDir]
@@ -540,14 +549,16 @@
         print filename + ' written'
         return filename
 
-    def makeRelease(self, version, dir, extensions=[]):
+    def makeRelease(self, version, dir):
 
         rootDir = self.options.buildroot
+        addOns = config.setting.get('theseAddOns', [])
 
         # variables related to the version
         branch = self.version.branch
         tag = self.version.tag
         prevVersion = self.version.prev_version
+        prevTag = self.version.prev_tag
 
         if rootDir is None:
             rootDir = os.getcwd()
@@ -571,7 +582,8 @@
         if not os.path.exists(dir):
             os.mkdir(dir)
 
-        package = 'mediawiki-' + version
+        package = 'mediawiki-%s' % self.version
+        getVersionAddOns( self.version )
 
         # Export the target
         self.export(tag, package, buildDir)
@@ -580,38 +592,35 @@
         for patch in patchRevisions:
             self.patchExport(patch, package)
 
-        extExclude = []
-        for ext in getVersionExtensions(version, extensions):
-            self.exportExtension(branch, ext, package)
-            extExclude.append("--exclude")
-            extExclude.append("extensions/" + ext)
+        exclude = []
+        for addOn in getVersionAddOns(self.version, addOns):
+            self.exportAddOn(branch, addOn, package)
+            exclude.append("--exclude")
+            exclude.append(addOn)
 
         # Generate the .tar.gz files
         outFiles = []
         outFiles.append(
             self.makeTarFile(
-                package='mediawiki-core-' + version,
+                package='mediawiki-core-%s' % self.version,
                 targetDir=package,
                 dir=buildDir,
-                tarOpts=config.get("tar"),
-                argAdd=extExclude)
+                argAdd=exclude)
         )
         outFiles.append(
             self.makeTarFile(
                 package=package,
                 targetDir=package,
-                tarOpts=config.get("tar"),
                 dir=buildDir)
         )
 
         # Patch
         if prevVersion is not None:
-            prevDir = 'mediawiki-' + prevVersion
-            self.export(versionToTag(prevVersion),
-                        prevDir, buildDir)
+            prevDir = 'mediawiki-%s' % prevVersion
+            self.export(prevTag, prevDir, buildDir)
 
-            for ext in getVersionExtensions(prevVersion, extensions):
-                self.exportExtension(branch, ext, prevDir)
+            for addOn in getVersionAddOns(prevVersion, addOns):
+                self.exportAddOn(branch, addOn, prevDir)
 
             self.makePatch(
                 buildDir, package + '.patch.gz', prevDir, package, 'normal')
@@ -619,7 +628,7 @@
             print package + '.patch.gz written'
             haveI18n = False
             if os.path.exists(package + '/languages/messages'):
-                i18nPatch = 'mediawiki-i18n-' + version + '.patch.gz'
+                i18nPatch = 'mediawiki-i18n-%s.patch.gz' % self.version
                 if (self.makePatch(
                         buildDir, i18nPatch, prevDir, package, 'i18n')):
                     outFiles.append(i18nPatch)
@@ -646,7 +655,7 @@
         # Generate upload tarball
         tar = self.options.tar_command
         args = [tar, '-C', buildDir,
-                '-cf', uploadDir + '/upload-' + version + '.tar']
+                '-cf', uploadDir + '/upload-%s.tar' % self.version]
         args.extend(uploadFiles)
         proc = subprocess.Popen(args)
         if proc.wait() != 0:
diff --git a/make-release/make-release.yaml b/make-release/make-release.yaml
index a561860..49c25d4 100644
--- a/make-release/make-release.yaml
+++ b/make-release/make-release.yaml
@@ -1,36 +1,101 @@
 # vim: set et ts=4 sw=4:
 bundles:
+    mediawiki-1.18: &base
+        - extensions/ConfirmEdit
+        - extensions/Gadgets
+        - extensions/Nuke
+        - extensions/ParserFunctions
+        - extensions/Renameuser
+        - extensions/Vector
+        - extensions/WikiEditor
+    mediawiki-1.19: *base
+    mediawiki-1.20: *base
+    mediawiki-1.21: *base
+    mediawiki-1.22:
+        - extensions/Cite
+        - extensions/ConfirmEdit
+        - extensions/Gadgets
+        - extensions/ImageMap
+        - extensions/InputBox
+        - extensions/Interwiki
+        - extensions/LocalisationUpdate
+        - extensions/Nuke
+        - extensions/ParserFunctions
+        - extensions/Poem
+        - extensions/Renameuser
+        - extensions/SimpleAntiSpam
+        - extensions/SpamBlacklist
+        - extensions/SyntaxHighlight_GeSHi
+        - extensions/TitleBlacklist
+        - extensions/Vector
+        - extensions/WikiEditor
+    mediawiki-1.23:  &REL1_23
+        - extensions/Cite
+        - extensions/ConfirmEdit
+        - extensions/Gadgets
+        - extensions/ImageMap
+        - extensions/InputBox
+        - extensions/Interwiki
+        - extensions/LocalisationUpdate
+        - extensions/Nuke
+        - extensions/ParserFunctions
+        - extensions/Poem
+        - extensions/Renameuser
+        - extensions/SpamBlacklist
+        - extensions/SyntaxHighlight_GeSHi
+        - extensions/TitleBlacklist
+        - extensions/WikiEditor
+    mediawiki-1.24:
+        - extensions/Cite
+        - extensions/ConfirmEdit
+        - extensions/Gadgets
+        - extensions/ImageMap
+        - extensions/InputBox
+        - extensions/Interwiki
+        - extensions/LocalisationUpdate
+        - extensions/Nuke
+        - extensions/ParserFunctions
+        - extensions/Poem
+        - extensions/Renameuser
+        - extensions/SpamBlacklist
+        - extensions/SyntaxHighlight_GeSHi
+        - extensions/TitleBlacklist
+        - extensions/WikiEditor
+        - skins/CologneBlue
+        - skins/Modern
+        - skins/MonoBook
+        - skins/Vector
     smw:
-        - AdminLinks
-        - ApprovedRevs
-        - Arrays
-        - DataTransfer,
-        - ExternalData
-        - HeaderTabs
-        - Maps
-        - PageSchemas
-        - ReplaceText
-        - SemanticCompoundQueries
-        - SemanticDrilldown,
-        - SemanticForms,
-        - SemanticFormsInputs,
-        - SemanticImageInput
-        - SemanticInternalObjects
-        - SemanticMaps
-        - SemanticMediaWiki
-        - SemanticResultFormats
-        - SemanticTasks
-        - SemanticWatchlist
-        - Validator
-        - Widgets
+        - extensions/AdminLinks
+        - extensions/ApprovedRevs
+        - extensions/Arrays
+        - extensions/DataTransfer,
+        - extensions/ExternalData
+        - extensions/HeaderTabs
+        - extensions/Maps
+        - extensions/PageSchemas
+        - extensions/ReplaceText
+        - extensions/SemanticCompoundQueries
+        - extensions/SemanticDrilldown,
+        - extensions/SemanticForms,
+        - extensions/SemanticFormsInputs,
+        - extensions/SemanticImageInput
+        - extensions/SemanticInternalObjects
+        - extensions/SemanticMaps
+        - extensions/SemanticMediaWiki
+        - extensions/SemanticResultFormats
+        - extensions/SemanticTasks
+        - extensions/SemanticWatchlist
+        - extensions/Validator
+        - extensions/Widgets
 tar:
-  ignore:
-    - "*~"
-    - ".js*"
-    - ".git*"
-    - testsuite
-    - tests
-    - "*.xcf"
-    - "#*#"
-    - ".#*"
-    - .travis.yml
+    ignore:
+        - "*~"
+        - ".js*"
+        - ".git*"
+        - testsuite
+        - tests
+        - "*.xcf"
+        - "#*#"
+        - ".#*"
+        - .travis.yml

-- 
To view, visit https://gerrit.wikimedia.org/r/169308
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I57b54b7bd82f8b6d6bdee9ddb8e8c163bfbb09ae
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/tools/release
Gerrit-Branch: master
Gerrit-Owner: MarkAHershberger <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to