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