internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: pyodide/pyodide

Issue:
`pyodide_build.out_of_tree.venv.create_pyodide_venv` wrongly requires an Emscripten compiler
See https://github.com/pyodide/pyodide/discussions/3462#discussioncomment-4710208


Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/out_of_tree/venv.py b/pyodide-build/pyodide_build/out_of_tree/venv.py
--- a/pyodide-build/pyodide_build/out_of_tree/venv.py
+++ b/pyodide-build/pyodide_build/out_of_tree/venv.py
@@ -5,13 +5,7 @@
 from pathlib import Path
 from typing import Any
 
-from ..common import (
-    check_emscripten_version,
-    exit_with_stdio,
-    get_make_flag,
-    get_pyodide_root,
-    in_xbuildenv,
-)
+from ..common import exit_with_stdio, get_make_flag, get_pyodide_root, in_xbuildenv
 from ..logger import logger
 
 
@@ -224,8 +218,6 @@ def create_pyodide_venv(dest: Path) -> None:
         logger.error(f"ERROR: dest directory '{dest}' already exists")
         sys.exit(1)
 
-    check_emscripten_version()
-
     interp_path = pyodide_dist_dir() / "python"
     session = session_via_cli(["--no-wheel", "-p", str(interp_path), str(dest)])
     check_host_python_version(session)


Test patch:
Repository: pyodide/pyodide

Issue:
Please support pynacl
## 🐍 Package Request

- Package Name and Version: pynacl==latest
- Package URL: https://pypi.org/project/PyNaCl/

I have a user of [Awesome Panel Sharing](https://awesome-panel.org/sharing) that would like to be able to use [PyGithub](https://github.com/PyGithub/PyGithub) in his Panel Data App. See [panel-sharing #79](https://github.com/awesome-panel/awesome-panel/issues/79). This package depends on `pynacl`.

![image](https://user-images.githubusercontent.com/42288570/205825345-8979fe7c-b8f7-4d20-a436-918432131f21.png)

## Additional Context

I see in the request for Cryptography https://github.com/pyodide/pyodide/issues/761 that pynacl was also mentioned and there is some relation.

Thanks for the great work on Pyodide and bringing scientific Python to the browser.



Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/pywasmcross.py b/pyodide-build/pyodide_build/pywasmcross.py
--- a/pyodide-build/pyodide_build/pywasmcross.py
+++ b/pyodide-build/pyodide_build/pywasmcross.py
@@ -285,6 +285,8 @@ def replay_genargs_handle_argument(arg: str) -> str | None:
         # gcc flag that clang does not support
         "-Bsymbolic-functions",
         '-fno-second-underscore',
+        '-fstack-protector',  # doesn't work?
+        '-fno-strict-overflow',  # warning: argument unused during compilation
     ]:
         return None
     # fmt: on


Test patch:
Repository: pyodide/pyodide

Issue:
CSS broken in latest docs
## 🐛 Bug

![image](https://user-images.githubusercontent.com/24893111/214972488-e914fb00-d431-4354-9bdd-bf4b67f76516.png)

It seems like the versionwarning banner is not displayed correctly in latest docs.



Discussion:

Resolving patch:
diff --git a/docs/conf.py b/docs/conf.py
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -37,7 +37,6 @@
     "autodocsumm",
     "sphinx_pyodide",
     "sphinx_argparse_cli",
-    "versionwarning.extension",
     "sphinx_issues",
     "sphinx_autodoc_typehints",
     "sphinx_design",  # Used for tabs in building-from-sources.md
@@ -51,15 +50,12 @@
 root_for_relative_js_paths = "../src/"
 issues_github_path = "pyodide/pyodide"
 
-versionwarning_messages = {
-    "latest": (
-        "This is the development version of the documentation. "
-        'See <a href="https://pyodide.org/">here</a> for latest stable '
-        "documentation. Please do not use Pyodide with non "
-        "versioned (`dev`) URLs from the CDN for deployed applications!"
-    )
-}
-versionwarning_body_selector = "#main-content > div"
+versionwarning_message = (
+    "This is the development version of the documentation. "
+    'See <a href="https://pyodide.org/">here</a> for latest stable '
+    "documentation. Please do not use Pyodide with non "
+    "versioned (`dev`) URLs from the CDN for deployed applications!"
+)
 
 autosummary_generate = True
 autodoc_default_flags = ["members", "inherited-members"]
@@ -105,7 +101,9 @@
 html_logo = "_static/img/pyodide-logo.png"
 
 # theme-specific options
-html_theme_options: dict[str, Any] = {}
+html_theme_options: dict[str, Any] = {
+    "announcement": "",
+}
 
 # paths that contain custom static files (such as style sheets)
 html_static_path = ["_static"]
@@ -131,6 +129,9 @@
 
 IN_SPHINX = "sphinx" in sys.modules and hasattr(sys.modules["sphinx"], "application")
 IN_READTHEDOCS = "READTHEDOCS" in os.environ
+IN_READTHEDOCS_LATEST = (
+    IN_READTHEDOCS and os.environ.get("READTHEDOCS_VERSION") == "latest"
+)
 
 
 base_dir = Path(__file__).resolve().parent.parent
@@ -203,6 +204,12 @@ def calculate_pyodide_version(app):
     }
 
 
+def set_announcement_message():
+    html_theme_options["announcement"] = (
+        versionwarning_message if IN_READTHEDOCS_LATEST else ""
+    )
+
+
 def write_console_html(app):
     # Make console.html file
     env = {"PYODIDE_BASE_URL": app.config.CDN_URL}
@@ -327,6 +334,7 @@ def setup(app):
     app.add_config_value("CDN_URL", "", True)
     app.connect("source-read", global_replace)
 
+    set_announcement_message()
     apply_patches()
     calculate_pyodide_version(app)
     ensure_typedoc_on_path()


Test patch:
Repository: pyodide/pyodide

Issue:
Error about `--user` and `--target` flag when installing xbuildenv
I sometimes get following error while installing xbuild environment:

```bash
$ pyodide build .
Downloading xbuild environment
Installing xbuild environment
  stderr:
    ERROR: Can not combine '--user' and '--target'

    [notice] A new release of pip available: 22.3.1 -> 23.0
    [notice] To update, run: /home/gitpod/.pyenv/versions/3.10.2/bin/python -m pip install --upgrade pip
```

It happens here, which installs host site packages:

https://github.com/pyodide/pyodide/blob/7cc1058358242a5a9012edbb8163d86a860a1a28/pyodide-build/pyodide_build/install_xbuildenv.py#L50-L57

I think we need to add `--no-user` flag explicitly to prevent this error.


Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/install_xbuildenv.py b/pyodide-build/pyodide_build/install_xbuildenv.py
--- a/pyodide-build/pyodide_build/install_xbuildenv.py
+++ b/pyodide-build/pyodide_build/install_xbuildenv.py
@@ -51,6 +51,7 @@ def install_xbuildenv(version: str, xbuildenv_path: Path) -> None:
         [
             "pip",
             "install",
+            "--no-user",
             "-t",
             host_site_packages,
             "-r",


Test patch:
Repository: pyodide/pyodide

Issue:
pyodide-build shouldn't display tracebacks for "user error" / expected failures
## 🐛 Bug

pyodide-build has been updated to display rich tracebacks. This is useful only if the error was actually unexpected. In many places `pyodide-build` exits by raising an error which should just print the message and set a nonzero status code but not display some giant traceback message.


Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/cli/skeleton.py b/pyodide-build/pyodide_build/cli/skeleton.py
--- a/pyodide-build/pyodide_build/cli/skeleton.py
+++ b/pyodide-build/pyodide_build/cli/skeleton.py
@@ -1,11 +1,13 @@
 # Create or update a package recipe skeleton,
 # inspired from `conda skeleton` command.
 
+import sys
 from pathlib import Path
 
 import typer
 
 from .. import common, mkpkg
+from ..logger import logger
 
 app = typer.Typer()
 
@@ -55,12 +57,21 @@ def new_recipe_pypi(
     recipe_dir_ = pyodide_root / "packages" if not recipe_dir else Path(recipe_dir)
 
     if update or update_patched:
-        mkpkg.update_package(
-            recipe_dir_,
-            name,
-            version,
-            source_fmt=source_format,  # type: ignore[arg-type]
-            update_patched=update_patched,
-        )
+        try:
+            mkpkg.update_package(
+                recipe_dir_,
+                name,
+                version,
+                source_fmt=source_format,  # type: ignore[arg-type]
+                update_patched=update_patched,
+            )
+        except mkpkg.MkpkgFailedException as e:
+            logger.error(f"{name} update failed: {e}")
+            sys.exit(1)
+        except mkpkg.MkpkgSkipped as e:
+            logger.warn(f"{name} update skipped: {e}")
+        except Exception:
+            print(name)
+            raise
     else:
         mkpkg.make_package(recipe_dir_, name, version, source_fmt=source_format)  # type: ignore[arg-type]
diff --git a/pyodide-build/pyodide_build/mkpkg.py b/pyodide-build/pyodide_build/mkpkg.py
--- a/pyodide-build/pyodide_build/mkpkg.py
+++ b/pyodide-build/pyodide_build/mkpkg.py
@@ -46,6 +46,10 @@ class MetadataDict(TypedDict):
     vulnerabilities: list[Any]
 
 
+class MkpkgSkipped(Exception):
+    pass
+
+
 class MkpkgFailedException(Exception):
     pass
 
@@ -224,12 +228,13 @@ def update_package(
 
     yaml_content = yaml.load(meta_path.read_bytes())
 
-    if "url" not in yaml_content["source"]:
-        raise MkpkgFailedException(f"Skipping: {package} is a local package!")
-
     build_info = yaml_content.get("build", {})
-    if build_info.get("library", False) or build_info.get("sharedlibrary", False):
-        raise MkpkgFailedException(f"Skipping: {package} is a library!")
+    ty = build_info.get("type", None)
+    if ty in ["static_library", "shared_library", "cpython_module"]:
+        raise MkpkgSkipped(f"{package} is a {ty.replace('_', ' ')}!")
+
+    if "url" not in yaml_content["source"]:
+        raise MkpkgSkipped(f"{package} is a local package!")
 
     if yaml_content["source"]["url"].endswith("whl"):
         old_fmt = "wheel"


Test patch:
Repository: pyodide/pyodide

Issue:
Should detect when a PyProxy is used with GIL released
## 🐛 Bug

The following code attempts to use a PyProxy with the GIL released.
```js
pyodide = await loadPyodide({stdout: (msg) => pyodide.globals.get("x")});
pyodide.runPython("print(1)")
```
Chaos ensues:
![Screenshot from 2023-03-30 17-10-59](https://user-images.githubusercontent.com/8739626/228991469-89a3a430-8484-474a-94dd-5c1ab085b060.png)


### Expected behavior

Throw a reasonable no-gil error. Don't fatally fail.



Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/_py_compile.py b/pyodide-build/pyodide_build/_py_compile.py
--- a/pyodide-build/pyodide_build/_py_compile.py
+++ b/pyodide-build/pyodide_build/_py_compile.py
@@ -212,7 +212,13 @@ def _py_compile_archive(
         return None
     path_out = input_path.parent / name_out
 
-    _compile(input_path, path_out, keep=keep, verbose=verbose)
+    _compile(
+        input_path,
+        path_out,
+        keep=keep,
+        verbose=verbose,
+        compression_level=compression_level,
+    )
 
     return path_out
 


Test patch:
diff --git a/pyodide-build/pyodide_build/tests/test_cli.py b/pyodide-build/pyodide_build/tests/test_cli.py
--- a/pyodide-build/pyodide_build/tests/test_cli.py
+++ b/pyodide-build/pyodide_build/tests/test_cli.py
@@ -6,6 +6,7 @@
 
 import pytest
 from pytest_pyodide import spawn_web_server
+import zipfile
 import typer
 from typer.testing import CliRunner  # type: ignore[import]
 
@@ -17,6 +18,7 @@
     create_zipfile,
     skeleton,
     xbuildenv,
+    py_compile,
 )
 
 from .fixture import temp_python_lib, temp_python_lib2, temp_xbuildenv
@@ -367,3 +369,25 @@ def test_xbuildenv_install(tmp_path, temp_xbuildenv):
     assert (envpath / "xbuildenv" / "pyodide-root").is_dir()
     assert (envpath / "xbuildenv" / "site-packages-extras").is_dir()
     assert (envpath / "xbuildenv" / "requirements.txt").exists()
+
+
+@pytest.mark.parametrize("target", ["dir", "file"])
+@pytest.mark.parametrize("compression_level", [0, 6])
+def test_py_compile(tmp_path, target, compression_level):
+    wheel_path = tmp_path / "python.zip"
+    with zipfile.ZipFile(wheel_path, "w", compresslevel=3) as zf:
+        zf.writestr("a1.py", "def f():\n    pass")
+
+    if target == "dir":
+        target_path = tmp_path
+    elif target == "file":
+        target_path = wheel_path
+
+    py_compile.main(
+        path=target_path, silent=False, keep=False, compression_level=compression_level
+    )
+    with zipfile.ZipFile(tmp_path / "python.zip", "r") as fh:
+        if compression_level > 0:
+            assert fh.filelist[0].compress_type == zipfile.ZIP_DEFLATED
+        else:
+            assert fh.filelist[0].compress_type == zipfile.ZIP_STORED
Repository: pyodide/pyodide

Issue:
Add check for WASM magic number in .so files
> `pyodide build` now replaces native `.so` slugs with Emscripten
> slugs. Usually `.so`s in the generated wheels are actually Emscripten `.so`s
> so this is good. If they are actually native `.so`s then there is a problem
> either way.
  
  Not very critical, but should we actually check that the .so are emscripten .so rather than native .so that ended up there by mistake? For instance, we could check for the [WASM magic number](https://openhome.cc/eGossip/WebAssembly/Module.html) in the first 4 bytes maybe? It's supposed to be, `0061 736d`. Though I get the same bytes but in a different order, when I try,

```
$ hexdump -n 8 numpy/core/_multiarray_umath.cpython-311-wasm32-emscripten.so
0000000 6100 6d73 0001 0000 
```
but maybe I'm using hexdump wrong (**Edit:** yes, with the `-C` option it's better)

_Originally posted by @rth in https://github.com/pyodide/pyodide/issues/3927#issuecomment-1599511454_
            


Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/common.py b/pyodide-build/pyodide_build/common.py
--- a/pyodide-build/pyodide_build/common.py
+++ b/pyodide-build/pyodide_build/common.py
@@ -371,3 +371,9 @@ def get_wheel_dist_info_dir(wheel: ZipFile, pkg_name: str) -> str:
         )
 
     return info_dir
+
+
+def check_wasm_magic_number(file_path: Path) -> bool:
+    WASM_BINARY_MAGIC = b"\0asm"
+    with file_path.open(mode="rb") as file:
+        return file.read(4) == WASM_BINARY_MAGIC


Test patch:
diff --git a/pyodide-build/pyodide_build/tests/test_common.py b/pyodide-build/pyodide_build/tests/test_common.py
--- a/pyodide-build/pyodide_build/tests/test_common.py
+++ b/pyodide-build/pyodide_build/tests/test_common.py
@@ -3,6 +3,7 @@
 import pytest
 
 from pyodide_build.common import (
+    check_wasm_magic_number,
     environment_substitute_args,
     extract_wheel_metadata_file,
     find_missing_executables,
@@ -152,3 +153,14 @@ def test_extract_wheel_metadata_file(tmp_path):
 
     with pytest.raises(Exception):
         extract_wheel_metadata_file(input_path_empty, output_path_empty)
+
+
+def test_check_wasm_magic_number(tmp_path):
+    wasm_magic_number = b"\x00asm\x01\x00\x00\x00\x00\x11"
+    not_wasm_magic_number = b"\x7fELF\x02\x01\x01\x00\x00\x00"
+
+    (tmp_path / "goodfile.so").write_bytes(wasm_magic_number)
+    assert check_wasm_magic_number(tmp_path / "goodfile.so") is True
+
+    (tmp_path / "badfile.so").write_bytes(not_wasm_magic_number)
+    assert check_wasm_magic_number(tmp_path / "badfile.so") is False
Repository: pyodide/pyodide

Issue:
Emscripten.cmake missing from pyodide-build wheel
## 🐛 Bug

It seems like `Emscripten.cmake` is not bundled with `pyodide-build` wheels any more (since version 0.24.0) and I wonder whether this is a bug or an intended change. (I haven't found anything in the changelog). We were relying on the presence of the toolchain file over there in https://github.com/igraph/python-igraph/ to build a wasm wheel in CI and it is not working any more.

### To Reproduce

See, e.g., https://github.com/igraph/python-igraph/actions/runs/6459502630/job/17535393423

### Expected behavior

`pyodide-build` wheels should keep on bundling `Emscripten.cmake` so we can simply `pip install pyodide-build` in CI and then build `python-igraph`'s wasm wheels as before.

### Environment

- Pyodide Version<!-- (e.g. 1.8.1) -->: 0.24.1
- Browser version<!-- (e.g. Chrome 95.0.4638.54) -->: not applicable



Discussion:
Thanks for the report. Change due to https://github.com/pyodide/pyodide/pull/3934 @ryanking13 would know more about it.
Thanks for the feedback! In the meanwhile, we worked around the issue by adding the missing file during the CI build like this:

https://github.com/igraph/python-igraph/commit/e7903df985a81e166866ea1eeb91d191bfc83136#diff-5a273ce7e6a1e1cb40e78fcc5f3ea2a1175ffe117d9768b33ca4cafec1e460f1

I'm pretty sure that the change was not intentional, though, as `pyodide-build` still keeps on looking for the toolchain file while setting up the environment (and it even overrides `CMAKE_TOOLCHAIN_FILE` from the external environment so I cannot overrule `pyodide-build`'s decision): https://github.com/pyodide/pyodide/blob/main/pyodide-build/pyodide_build/build_env.py#L172


Oh... thanks for catching this. It was totally not intentional.

> (and it even overrides CMAKE_TOOLCHAIN_FILE from the external environment so I cannot overrule pyodide-build's decision)

I think we need to fix this too, so that if a user provides CMAKE_TOOLCHAIN_FILE, it should not be overridden.


Resolving patch:
diff --git a/pyodide-build/pyodide_build/build_env.py b/pyodide-build/pyodide_build/build_env.py
--- a/pyodide-build/pyodide_build/build_env.py
+++ b/pyodide-build/pyodide_build/build_env.py
@@ -62,6 +62,8 @@
     "SYSCONFIG_NAME",
     "TARGETINSTALLDIR",
     "WASM_LIBRARY_DIR",
+    "CMAKE_TOOLCHAIN_FILE",
+    "PYO3_CONFIG_FILE",
 }
 
 
@@ -169,10 +171,13 @@ def get_build_environment_vars() -> dict[str, str]:
 
     tools_dir = Path(__file__).parent / "tools"
 
-    env["CMAKE_TOOLCHAIN_FILE"] = str(
-        tools_dir / "cmake/Modules/Platform/Emscripten.cmake"
-    )
-    env["PYO3_CONFIG_FILE"] = str(tools_dir / "pyo3_config.ini")
+    if "CMAKE_TOOLCHAIN_FILE" not in env:
+        env["CMAKE_TOOLCHAIN_FILE"] = str(
+            tools_dir / "cmake/Modules/Platform/Emscripten.cmake"
+        )
+
+    if "PYO3_CONFIG_FILE" not in env:
+        env["PYO3_CONFIG_FILE"] = str(tools_dir / "pyo3_config.ini")
 
     hostsitepackages = env["HOSTSITEPACKAGES"]
     pythonpath = [


Test patch:
Repository: pyodide/pyodide

Issue:
cmake -E capabilities is broken
## 🐛 Bug

The most recent version of scikit-build-core switched to using `cmake -E capabilities` instead of `cmake --version`, as that's the recommended way to get information about CMake. https://github.com/scikit-build/scikit-build-core/pull/675 However, https://github.com/pyodide/pyodide/blob/975565bc3f14daf2d22545275ea9680f49a979f3/pyodide-build/pyodide_build/pywasmcross.py#L493 is adding `--fresh` to all cmake commands, which breaks this with "`-E capabilities accepts no additional arguments`". `cmake --version` doesn't care about the extra flag. (I assume this also may break all other `cmake -E` commands? Also `-P` (script) commands?)

Edit: -P is already checked, is -E needs to be added.

I think if this is going to be forcefully injected, it needs to be done more carefully based on the command being passed.


Discussion:

Resolving patch:
diff --git a/pyodide-build/pyodide_build/pywasmcross.py b/pyodide-build/pyodide_build/pywasmcross.py
--- a/pyodide-build/pyodide_build/pywasmcross.py
+++ b/pyodide-build/pyodide_build/pywasmcross.py
@@ -479,7 +479,7 @@ def handle_command_generate_args(  # noqa: C901
         return line
     elif cmd == "cmake":
         # If it is a build/install command, or running a script, we don't do anything.
-        if "--build" in line or "--install" in line or "-P" in line:
+        if "--build" in line or "--install" in line or "-P" in line or "-E" in line:
             return line
 
         flags = get_cmake_compiler_flags()


Test patch:
Repository: pyodide/pyodide

Issue:
Remove possible query string from tarballname
For CoolProp, we are getting `tarballname` as `'CoolProp_sources.zip?viasf=1'` which then crashes when we give it to `shutil.unpack_archive` with `Unknown archive format`.


Discussion:
Thanks for fixing this!

Resolving patch:
diff --git a/pyodide-build/pyodide_build/buildpkg.py b/pyodide-build/pyodide_build/buildpkg.py
--- a/pyodide-build/pyodide_build/buildpkg.py
+++ b/pyodide-build/pyodide_build/buildpkg.py
@@ -4,18 +4,18 @@
 Builds a Pyodide package.
 """
 
-import cgi
 import fnmatch
 import os
+import re
 import shutil
 import subprocess
 import sys
-import urllib
 from collections.abc import Iterator
 from datetime import datetime
 from pathlib import Path
 from typing import Any, cast
-from urllib import parse, request
+
+import requests
 
 from . import common, pypabuild
 from .bash_runner import BashRunnerWithSharedEnvironment, get_bash_runner
@@ -301,9 +301,10 @@ def _download_and_extract(self) -> None:
 
         max_retry = 3
         for retry_cnt in range(max_retry):
+            response = requests.get(url)
             try:
-                response = request.urlopen(url)
-            except urllib.error.URLError as e:
+                response.raise_for_status()
+            except requests.HTTPError as e:
                 if retry_cnt == max_retry - 1:
                     raise RuntimeError(
                         f"Failed to download {url} after {max_retry} trials"
@@ -313,18 +314,18 @@ def _download_and_extract(self) -> None:
 
             break
 
-        # TODO: replace cgi with something else (will be removed in Python 3.13)
-        _, parameters = cgi.parse_header(
-            response.headers.get("Content-Disposition", "")
-        )
-        if "filename" in parameters:
-            tarballname = parameters["filename"]
-        else:
-            tarballname = Path(parse.urlparse(response.geturl()).path).name
-
         self.build_dir.mkdir(parents=True, exist_ok=True)
+
+        tarballname = url.split("/")[-1]
+        if "Content-Disposition" in response.headers:
+            filenames = re.findall(
+                "filename=(.+)", response.headers["Content-Disposition"]
+            )
+            if filenames:
+                tarballname = filenames[0]
+
         tarballpath = self.build_dir / tarballname
-        tarballpath.write_bytes(response.read())
+        tarballpath.write_bytes(response.content)
 
         checksum = self.source_metadata.sha256
         if checksum is not None:


Test patch:
Repository: pyodide/pyodide

Issue:
`pyodide build -h` should print help text
## 🐛 Bug

`pyodide build -h` treats `-h` as a package name rather than as a request for help text.


Discussion:
Click has a horrible (IMO) default of not treating `-h` as help. You have to enable it.

Resolving patch:
diff --git a/pyodide-build/pyodide_build/cli/build.py b/pyodide-build/pyodide_build/cli/build.py
--- a/pyodide-build/pyodide_build/cli/build.py
+++ b/pyodide-build/pyodide_build/cli/build.py
@@ -282,5 +282,6 @@ def main(
     "context_settings": {
         "ignore_unknown_options": True,
         "allow_extra_args": True,
+        "help_option_names": ["-h", "--help"],
     },
 }


Test patch:
Repository: streamlink/streamlink

Issue:
Version information out of sync in docs
Caused by [this](https://github.com/streamlink/streamlink/blob/d5a50c42a2f251fe4fccc37d588cd72c66287bfd/src/streamlink/__init__.py#L15).



Discussion:

Resolving patch:
diff --git a/src/streamlink/__init__.py b/src/streamlink/__init__.py
--- a/src/streamlink/__init__.py
+++ b/src/streamlink/__init__.py
@@ -12,7 +12,7 @@
 
 
 __title__ = "streamlink"
-__version__ = "1.14.0-rc1"
+__version__ = "0.0.1"
 __license__ = "Simplified BSD"
 __author__ = "Christopher Rosell"
 __copyright__ = "Copyright 2011-2015 Christopher Rosell"


Test patch:
Repository: streamlink/streamlink

Issue:
Picarto Multi Streams
Seems that a fix for the Picarto multi streams has been provided here: 
https://github.com/chrippa/livestreamer/pull/1469 

Thanks!



Discussion:

Resolving patch:
diff --git a/src/streamlink/plugins/picarto.py b/src/streamlink/plugins/picarto.py
--- a/src/streamlink/plugins/picarto.py
+++ b/src/streamlink/plugins/picarto.py
@@ -13,7 +13,7 @@
 """, re.VERBOSE)
 
 _channel_casing_re = re.compile(r"""
-    <script>placeStreamChannelFlash\('(?P<channel>[^']+)',[^,]+,[^,]+,'(?P<visibility>[^']+)',[^,]+\);</script>
+    <script>placeStreamChannel(Flash)?\('(?P<channel>[^']+)',[^,]+,[^,]+,'(?P<visibility>[^']+)'(,[^,]+)?\);</script>
 """, re.VERBOSE)
 
 


Test patch: