{ "info": { "author": "LAZR Developers", "author_email": "lazr-developers@lists.launchpad.net", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3", "Operating System :: OS Independent", "Programming Language :: Python" ], "description": "======\nturnip\n======\n\nturnip is a flexible and scalable Git server suite written in Python\nusing Twisted.\n\nThe various servers provide customisable virtual hosting, with flexible\nauthentication and authorisation, and individual horizontal scaling from\nthe frontend to the storage layer.\n\nNone of the Python interfaces here should be considered stable.\n\n\nArchitecture\n============\n\nturnip's architecture is designed to maximise simplicity, scalability\nand robustness. Each server provides roughly one service, and an\ninstallation need only run the servers that it desires. Most servers\neschew local state to ease horizontal scaling, and those that do have\nlocal state can replicate and/or shard it.\n\nThere are two separate server stacks: pack and API. The pack stack\ncommunicates with Git clients via the pack protocol (git://), smart\nHTTP, or smart SSH. The HTTP and SSH frontends unwrap the tunneled pack\nprotocol, and forward it onto the midends as a normal pack protocol\nconnection. The separate HTTP API stack provides a programmatic remote\ninterface to high-level read and write operations on the repositories\n\n\nFrontends:\n * Pack\n * Smart HTTP\n * Smart SSH\n * HTTP API\n\nMidends:\n * Pack virtualisation\n * API virtualisation\n\nBackends:\n * Pack\n * API\n\n\nInternal protocol\n=================\n\nturnip uses an extension of the Git pack protocol for most communication\nbetween its servers. The only change is that turnip requests can specify\narbitrary named parameters, not just a hostname.\n\nThe relevant part of the Git pack protocol's git-proto-request is\nrepresented in ABNF as follows::\n\n git-proto-request = request-command SP pathname NUL [ host-parameter NUL ]\n host-parameter = \"host=\" hostname [ \":\" port ]\n\nturnip-proto-request alters it to this::\n\n turnip-proto-request = request-command SP pathname NUL \\*( param NUL )\n param = param-name \"=\" param-value\n param-name = \\*( %x01-3C / %x3E-FF ) ; exclude NUL and =\n param-value = \\*%x01-FF ; exclude NUL\n\nThe only additional parameters implemented today are\n'turnip-stateless-rpc' and 'turnip-advertise-refs', which are used by\nthe smart HTTP server to proxy to the standard pack protocol.\n\n\nDevelopment\n===========\n\nSetup\n-----\n\nCreate a trusty container (optional)::\n\n sudo lxc-create -t ubuntu -n turnip.trusty -- -r trusty -a amd64 -b $USER\n\nRun the following::\n\n sudo add-apt-repository ppa:launchpad/ppa\n sudo apt-get update\n cat system-dependencies.txt | sudo xargs apt-get install -y --no-install-recommends\n\n\nRunning\n-------\n\nPack smart-http/ssh services can be started with:\n\n python turnipserver.py\n\nThe HTTP API can be started with:\n\n make run-api \n\n\nDeployment\n==========\n\nTurnip is deployed with the turnip juju charm, available from:\n\n git clone https://git.launchpad.net/~canonical-launchpad-branches/charms/+source/turnip\n\nTo deploy with the local provider:\n\n juju switch local\n juju bootstrap\n juju deploy --repository=/path/to/loca/charm/repo/root local:trusty/turnip\n\n\n===============\nNEWS for turnip\n===============\n\n0.1.1 (2015-06-11)\n==================\n\n- Add a merge detection API.\n\n0.1 (2015-06-02)\n================\n\n- Initial release.", "description_content_type": null, "docs_url": null, "download_url": "https://launchpad.net/turnip/+download", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://launchpad.net/turnip", "keywords": null, "license": "AGPL v3", "maintainer": null, "maintainer_email": null, "name": "turnip", "package_url": "https://pypi.org/project/turnip/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/turnip/", "project_urls": { "Download": "https://launchpad.net/turnip/+download", "Homepage": "https://launchpad.net/turnip" }, "release_url": "https://pypi.org/project/turnip/0.1.1/", "requires_dist": null, "requires_python": null, "summary": "turnip", "version": "0.1.1" }, "last_serial": 2118695, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "c7516268013a69b2f0332e0a47ff6c02", "sha256": "d805c7f49792eeee217e0ef4e32cde0492cb01df88d3bc5b6e671fbef98b347f" }, "downloads": -1, "filename": "turnip-0.1.tar.gz", "has_sig": true, "md5_digest": "c7516268013a69b2f0332e0a47ff6c02", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 68529, "upload_time": "2015-06-02T12:59:19", "url": "https://files.pythonhosted.org/packages/b4/72/3b97d2fd1c12c1fe5a3f80453207a68a49b567c144a0b690235fc2fb2b80/turnip-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "278a32dca03c9d261f984269f73f4614", "sha256": "f70dab7061028a97d2b2447e2462c20497baac587e5c7ff54e9140212fd91308" }, "downloads": -1, "filename": "turnip-0.1.1.tar.gz", "has_sig": true, "md5_digest": "278a32dca03c9d261f984269f73f4614", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 69644, "upload_time": "2015-06-11T16:38:48", "url": "https://files.pythonhosted.org/packages/9a/61/ec0f40726ac5237cec5484aae030724e7d31b8d24c4f04356208707b3402/turnip-0.1.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "278a32dca03c9d261f984269f73f4614", "sha256": "f70dab7061028a97d2b2447e2462c20497baac587e5c7ff54e9140212fd91308" }, "downloads": -1, "filename": "turnip-0.1.1.tar.gz", "has_sig": true, "md5_digest": "278a32dca03c9d261f984269f73f4614", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 69644, "upload_time": "2015-06-11T16:38:48", "url": "https://files.pythonhosted.org/packages/9a/61/ec0f40726ac5237cec5484aae030724e7d31b8d24c4f04356208707b3402/turnip-0.1.1.tar.gz" } ] }