diff --git a/.github/CONTRIBUTING.rst b/.github/CONTRIBUTING.rst
new file mode 100644
index 00000000000000..83cfee34b45cfb
--- /dev/null
+++ b/.github/CONTRIBUTING.rst
@@ -0,0 +1,47 @@
+Contributing to Python
+======================
+
+Build Status
+------------
+
+- master
+
+ + `Stable buildbots `_
+
+- 3.6
+
+ + `Stable buildbots `_
+
+- 3.5
+
+ + `Stable buildbots `_
+
+- 2.7
+
+ + `Stable buildbots `_
+
+
+Contribution Guidelines
+-----------------------
+Please read the `devguide `_ for
+guidance on how to contribute to this project. The documentation covers
+everything from how to build the code to submitting a pull request. There are
+also suggestions on how you can most effectively help the project.
+
+Please be aware that our workflow does deviate slightly from the typical GitHub
+project. Details on how to properly submit a pull request are covered in
+`Lifecycle of a Pull Request `_.
+One key point is to keep comments on GitHub to only those related to the reviewing
+the code in the pull request. All other discussions -- e.g. about the issue being
+fixed -- should happen on bugs.python.org.
+
+If you are making a code contribution or large documentation contribution,
+please feel free to add yourself to the ``Misc/ACKS`` file alphabetically.
+
+
+Code of Conduct
+---------------
+All interactions for this project are covered by the
+`PSF Code of Conduct `_. Everyone is
+expected to be open, considerate, and respectful of others no matter their
+position within the project.
diff --git a/.github/appveyor.yml b/.github/appveyor.yml
new file mode 100644
index 00000000000000..e71346fa2b2e73
--- /dev/null
+++ b/.github/appveyor.yml
@@ -0,0 +1,28 @@
+version: 3.4.6+.{build}
+clone_depth: 5
+branches:
+ only:
+ - master
+ - /\d\.\d/
+ - buildbot-custom
+build_script:
+- cmd: PCbuild\build.bat -e
+test_script:
+- cmd: PCbuild\rt.bat -q -uall -u-cpu -rwW --slow --timeout=1200 -j0
+
+# Only trigger AppVeyor if actual code or its configuration changes
+only_commits:
+ files:
+ - .github/appveyor.yml
+ - .gitattributes
+ - Grammar/
+ - Include/
+ - Lib/
+ - Modules/
+ - Objects/
+ - PC/
+ - PCBuild/
+ - Parser/
+ - Programs/
+ - Python/
+ - Tools/
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000000000..169ec5c51e0872
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,68 @@
+language: c
+dist: trusty
+sudo: false
+group: beta
+
+# To cache doc-building dependencies.
+cache: pip
+
+branches:
+ only:
+ - master
+ - /^\d\.\d$/
+
+matrix:
+ fast_finish: true
+ allow_failures:
+ - env: OPTIONAL=true
+ include:
+ - os: linux
+ language: c
+ compiler: clang
+ # gcc also works, but to keep the # of concurrent builds down, we use one C
+ # compiler here and the other to run the coverage build. Clang is preferred
+ # in this instance for its better error messages.
+ env: TESTING=cpython
+ - os: osx
+ language: c
+ compiler: clang
+ # Testing under macOS is optional until testing stability has been demonstrated.
+ env: OPTIONAL=true
+ before_install:
+ - brew install openssl xz
+ - export CPPFLAGS="-I$(brew --prefix openssl)/include"
+ - export LDFLAGS="-L$(brew --prefix openssl)/lib"
+
+# Travis provides only 2 cores, so don't overdo the parallelism and waste memory.
+before_script:
+ - |
+ set -e
+ if ! git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qvE '(\.rst$)|(^Doc)|(^Misc)'
+ then
+ echo "Only docs were updated, stopping build process."
+ exit
+ fi
+ ./configure --with-pydebug
+ make -j4
+
+script:
+ # Using the built Python as patchcheck.py is built around the idea of using
+ # a checkout-build of CPython to know things like what base branch the changes
+ # should be compared against.
+ # Only run on Linux as the check only needs to be run once.
+ - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./python Tools/scripts/patchcheck.py --travis $TRAVIS_PULL_REQUEST; fi
+ # `-r -w` implicitly provided through `make buildbottest`.
+ - make buildbottest TESTOPTS="-j4 -uall,-cpu"
+
+notifications:
+ email: false
+ irc:
+ channels:
+ # This is set to a secure variable to prevent forks from notifying the
+ # IRC channel whenever they fail a build. This can be removed when travis
+ # implements https://github.com/travis-ci/travis-ci/issues/1094.
+ # The actual value here is: irc.freenode.net#python-dev
+ - secure: "s7kAkpcom2yUJ8XqyjFI0obJmhAGrn1xmoivdaPdgBIA++X47TBp1x4pgDsbEsoalef7bEwa4l07KdT4qa+DOd/c4QxaWom7fbN3BuLVsZuVfODnl79+gYq/TAbGfyH+yDs18DXrUfPgwD7C5aW32ugsqAOd4iWzfGJQ5OrOZzqzGjYdYQUEkJFXgxDEIb4aHvxNDWGO3Po9uKISrhb5saQ0l776yLo1Ur7M4oxl8RTbCdgX0vf5TzPg52BgvZpOgt3DHOUYPeiJLKNjAE6ibg0U95sEvMfHX77nz4aFY4/3UI6FFaRla34rZ+mYKrn0TdxOhera1QOgPmM6HzdO4K44FpfK1DS0Xxk9U9/uApq+cG0bU3W+cVUHDBe5+90lpRBAXHeHCgT7TI8gec614aiT8lEr3+yH8OBRYGzkjNK8E2LJZ/SxnVxDe7aLF6AWcoWLfS6/ziAIBFQ5Nc4U72CT8fGVSkl8ywPiRlvixKdvTODMSZo0jMqlfZSNaAPTsNRx4wu5Uis4qekwe32Fz4aB6KGpsuuVjBi+H6v0RKxNJNGY3JKDiEH2TK0UE2auJ5GvLW48aUVFcQMB7euCWYXlSWVRHh3WLU8QXF29Dw4JduRZqUpOdRgMHU79UHRq+mkE0jAS/nBcS6CvsmxCpTSrfVYuMOu32yt18QQoTyU="
+ on_success: change
+ on_failure: always
+ skip_join: true
diff --git a/Lib/test/test_imaplib.py b/Lib/test/test_imaplib.py
index 838411e76fe691..68a710561327f6 100644
--- a/Lib/test/test_imaplib.py
+++ b/Lib/test/test_imaplib.py
@@ -468,16 +468,6 @@ def test_logincapa(self):
_server = self.imap_class(self.host, self.port)
self.check_logincapa(_server)
- def test_logincapa_with_client_certfile(self):
- with transient_internet(self.host):
- _server = self.imap_class(self.host, self.port, certfile=CERTFILE)
- self.check_logincapa(_server)
-
- def test_logincapa_with_client_ssl_context(self):
- with transient_internet(self.host):
- _server = self.imap_class(self.host, self.port, ssl_context=self.create_ssl_context())
- self.check_logincapa(_server)
-
def test_logout(self):
with transient_internet(self.host):
_server = self.imap_class(self.host, self.port)
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index e29b0d585c7230..c5f5937889f76b 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -770,7 +770,11 @@ def setUp(self):
if support.can_symlink():
os.symlink(os.path.abspath(t2_path), self.link_path)
os.symlink('broken', broken_link_path, True)
- self.sub2_tree = (sub2_path, ["link"], ["broken_link", "tmp3"])
+ if os.path.isdir(broken_link_path):
+ # On Windows a symlink can has the FILE_ATTRIBUTE_DIRECTORY flag.
+ self.sub2_tree = (sub2_path, ["broken_link", "link"], ["tmp3"])
+ else:
+ self.sub2_tree = (sub2_path, ["link"], ["broken_link", "tmp3"])
else:
self.sub2_tree = (sub2_path, [], ["tmp3"])
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 19b140239439cf..6d55f9bbf34ba4 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -609,24 +609,24 @@ def test_empty_env(self):
def test_invalid_cmd(self):
# null character in the command name
cmd = sys.executable + '\0'
- with self.assertRaises(ValueError):
+ with self.assertRaises((ValueError, TypeError)):
subprocess.Popen([cmd, "-c", "pass"])
# null character in the command argument
- with self.assertRaises(ValueError):
+ with self.assertRaises((ValueError, TypeError)):
subprocess.Popen([sys.executable, "-c", "pass#\0"])
def test_invalid_env(self):
# null character in the enviroment variable name
newenv = os.environ.copy()
newenv["FRUIT\0VEGETABLE"] = "cabbage"
- with self.assertRaises(ValueError):
+ with self.assertRaises((ValueError, TypeError)):
subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
# null character in the enviroment variable value
newenv = os.environ.copy()
newenv["FRUIT"] = "orange\0VEGETABLE=cabbage"
- with self.assertRaises(ValueError):
+ with self.assertRaises((ValueError, TypeError)):
subprocess.Popen([sys.executable, "-c", "pass"], env=newenv)
# equal character in the enviroment variable name