This is my short version of the official short version You've already read the 'How to become a MediaWiki Hacker' and you've created, or are ready to work on, a Phabricator task.
Besides the general MediaWiki contributing guidelines, the Semantic MediaWiki community has developed and evolved their own practices of software development. Chief among these is the use of a Docker-based continuous development environment so that you can build, debug, test and contribute changes to the SMW codebase plus all the many other extensions that are part of the SMW ecosystem. See Semantic MediaWiki/contributing for details.
@todo: add setting up Development Environment @todo: add testing
- Make sure you have git-review installed
sudo apt-get install git-review - clone MediaWiki into your working directory
cd ~/src git clone https://gerrit.wikimedia.org/r/mediawiki/core.git mediawiki cd mediawiki/
- After cloning a repository, you need to set it up for using git-review
git review -s(same asgit review --setup) - Use the commit message template that is found in the MediaWiki sources
git config commit.template .gitmessage - And configure your Gerrit/Developer account username - which you can also do in your .ssh/config
git config --global --add gitreview.username "freephile" - Create a new bugfix branch
git checkout master git pull git checkout -b fix-T385308-update-links
- work on the code and commit it
code ./
git status
git commit --all
- Then push it to gerrit for review
git review
Under the hood, the git-review -s setup will add a 'gerrit' remote to your local repo, using SSH transport, and your developer account login like this:
git remote -v gerrit ssh://freephile@gerrit.wikimedia.org:29418/mediawiki/core.git (fetch) gerrit ssh://freephile@gerrit.wikimedia.org:29418/mediawiki/core.git (push) origin https://gerrit.wikimedia.org/r/mediawiki/core.git (fetch) origin https://gerrit.wikimedia.org/r/mediawiki/core.git (push)
and it will add a commit hook at .git/hooks/commit-msg
#!/bin/sh
# From Gerrit Code Review 3.10.4
#
# Part of Gerrit Code Review (https://www.gerritcodereview.com/)
#
# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -u
# avoid [[ which is not POSIX sh.
if test "$#" != 1 ; then
echo "$0 requires an argument."
exit 1
fi
if test ! -f "$1" ; then
echo "file does not exist: $1"
exit 1
fi
# Do not create a change id if requested
case "$(git config --get gerrit.createChangeId)" in
false)
exit 0
;;
always)
;;
*)
# Do not create a change id for squash/fixup commits.
if head -n1 "$1" | LC_ALL=C grep -q '^[a-z][a-z]*! '; then
exit 0
fi
;;
esac
if git rev-parse --verify HEAD >/dev/null 2>&1; then
refhash="$(git rev-parse HEAD)"
else
refhash="$(git hash-object -t tree /dev/null)"
fi
random=$({ git var GIT_COMMITTER_IDENT ; echo "$refhash" ; cat "$1"; } | git hash-object --stdin)
dest="$1.tmp.${random}"
trap 'rm -f "$dest" "$dest-2"' EXIT
if ! cat "$1" | sed -e '/>8/q' | git stripspace --strip-comments > "${dest}" ; then
echo "cannot strip comments from $1"
exit 1
fi
if test ! -s "${dest}" ; then
echo "file is empty: $1"
exit 1
fi
reviewurl="$(git config --get gerrit.reviewUrl)"
if test -n "${reviewurl}" ; then
token="Link"
value="${reviewurl%/}/id/I$random"
pattern=".*/id/I[0-9a-f]\{40\}"
else
token="Change-Id"
value="I$random"
pattern=".*"
fi
if git interpret-trailers --parse < "$1" | grep -q "^$token: $pattern$" ; then
exit 0
fi
# There must be a Signed-off-by trailer for the code below to work. Insert a
# sentinel at the end to make sure there is one.
# Avoid the --in-place option which only appeared in Git 2.8
if ! git interpret-trailers \
--trailer "Signed-off-by: SENTINEL" < "$1" > "$dest-2" ; then
echo "cannot insert Signed-off-by sentinel line in $1"
exit 1
fi
# Make sure the trailer appears before any Signed-off-by trailers by inserting
# it as if it was a Signed-off-by trailer and then use sed to remove the
# Signed-off-by prefix and the Signed-off-by sentinel line.
# Avoid the --in-place option which only appeared in Git 2.8
# Avoid the --where option which only appeared in Git 2.15
if ! git -c trailer.where=before interpret-trailers \
--trailer "Signed-off-by: $token: $value" < "$dest-2" |
sed -e "s/^Signed-off-by: \($token: \)/\1/" \
-e "/^Signed-off-by: SENTINEL/d" > "$dest" ; then
echo "cannot insert $token line in $1"
exit 1
fi
if ! mv "${dest}" "$1" ; then
echo "cannot mv ${dest} to $1"
exit 1
fi