{ "info": { "author": "metagriffin", "author_email": "mg.pypi@uberdev.org", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "Intended Audience :: Developers", "Intended Audience :: Information Technology", "Intended Audience :: System Administrators", "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Other/Nonlisted Topic", "Topic :: Software Development", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Version Control", "Topic :: Utilities" ], "description": "===================================\nAutomated Publishing for Subversion\n===================================\n\nWelcome to **svnpublish**, a tool to enable automated publishing (and\nany other arbitrary commands to be executed) when updates are made to\na subversion version control repository.\n\nPublishing configurations are tied to either the entire repository or\nrestricted to subdirectories, referred to as a ``publishing point`` in\nsvnpublish-speak.\n\n\nProject\n=======\n\n* Homepage: https://github.com/metagriffin/svnpublish\n* Bugs: https://github.com/metagriffin/svnpublish/issues\n\n\nTL;DR\n=====\n\nInstall:\n\n.. code-block:: bash\n\n $ pip install svnpublish\n $ mkdir -p /etc/svnpublish\n $ svnpublish --init-options > /etc/svnpublish/myrepos.yaml\n\n # edit the self-documenting configuration file:\n $ vi /etc/svnpublish/myrepos.yaml\n\nPut in your ``REPOSITORY/hooks/post-commit``:\n\n.. code-block:: bash\n\n #!/bin/sh\n svnpublish --options /etc/svnpublish/myrepos.yaml \"$@\"\n\nIf running in asynchronous mode (recommended):\n\n.. code-block:: bash\n\n $ apt-get install daemontools-run\n\n # create the service directory with the user:group that runs svnpublish\n $ svnpublishd --init-service --service-dir /etc/service/svnpublishd --user www-data:www-data\n\n # review the output and adjust the service configuration:\n $ vi /etc/service/svnpublishd/run /etc/service/svnpublishd/log/run\n\n # grant the user running svnpublish access to HUP the service\n # (this assumes that \"#includedir /etc/sudoers.d\" is in \"/etc/sudoers.d\",\n # that the user is www-data, and that svc is located in /usr/bin)\n $ echo \"www-data ALL = NOPASSWD: /usr/bin/svc -h /etc/service/svnpublishd\" > /etc/sudoers.d/svnpublishd\n $ chmod 440 /etc/sudoers.d/svnpublishd\n\n # start the service\n $ rm -f /etc/service/svnpublishd/down\n $ svc -u /etc/service/svnpublishd\n\nThen add the \"--async\" option to svnpublish (making sure that the\n`serviceDir` option is set correctly in the svnpublish \"options.yaml\"\nfile). Extending the above example, the new post-commit hook should\nlook something like:\n\n.. code-block:: bash\n\n #!/bin/sh\n svnpublish --options /etc/svnpublish/myrepos.yaml --async \"$@\"\n\nNOTE: it is recommended to move the log directory to a more\nsystem-appropriate location -- see\n``/etc/service/svnpublishd/log/run``.\n\nOverview\n========\n\nTODO: add docs\n\n\nGlobal Configuration\n====================\n\nThe best way to set the initial svnpublish options is to use the\n``--init-options`` flag, which outputs a list of all available options\naccompanied with documentation. The recommended approach is to create\na per-repository configuration in ``/etc/svnpublish/`` which can be\ndone as follows:\n\n.. code-block:: bash\n\n $ sudo mkdir -p /etc/svnpublish\n $ svnpublish --init-options | sudo tee /etc/svnpublish/REPOSITORY.yaml > /dev/null\n $ sudo vi /etc/svnpublish/REPOSITORY.yaml\n\nAnd then modifying all of the options as needed. At a minimum, the\nfollowing options should be set:\n\n* admin\n* label\n* name\n* reposUrl\n* genemail.default.headers.from\n\n\nPublishing Point Configuration\n==============================\n\nTODO: add docs\n\n.. code-block:: yaml\n\n publish:\n\n ENGINE:\n\n ATTRIBUTE: VALUE\n\n\nExample:\n\n.. code-block:: yaml\n\n publish:\n\n # send an email notification\n - engine: email\n mailfrom: noreply@example.com\n recipients:\n - user1@example.com\n - user2@example.com\n\n # update an RSS (atom) feed\n - engine: rss\n window: 50\n label: Repository Feed\n output: /var/www/rss/output.xml\n feedUrl: https://svn.example.com/rss/output.xml\n\n # export the repository to the file system\n - engine: export\n path: /var/www/example.com\n fixate:\n - { engine: fingerprint }\n - { engine: fingerprint, path: htdocs/fingerprint }\n\n # export the repository to a remote host\n - engine: export\n remote: svnpublish@example.com\n keychain: /home/svnpublish/.keychain\n path: /var/www/example.com\n fixate:\n - { engine: fingerprint }\n - { engine: fingerprint, path: htdocs/fingerprint }\n\n\nEncrypted Email\n===============\n\nSvnPublish can be configured to send PGP-encrypted email, which\nprotects the contents of the emails from being read by unintended\nrecipients. Follow the instructions in\nhttps://pypi.python.org/pypi/genemail to setup a GPG-home directory,\nthen adjust the svnpublish \"options.yaml\" file to include the\nPgpModifier. For example:\n\n.. code-block:: yaml\n\n # ... other configurations ...\n\n genemail:\n modifier:\n class: 'genemail.PgpModifier'\n sign: 'noreply@example.com'\n gpg_options:\n gnupghome: '/path/to/gpghome'\n\n\nAsynchronous Operation\n======================\n\nSvnpublish can run in asynchronous mode (the recommended approach),\nwhich means that commits happen quickly, and an asynchronous process\nthen takes care of executing the publishing. This asynchronous\nprocess, ``svnpublishd``, has been geared at being run by DJB's\n`daemontools `_. On debian-based\nsystems, daemontools can be easily installed with:\n\n.. code-block:: bash\n\n $ apt-get install daemontools-run\n\nThe svnpublishd service directory can be created automatically by a\ncall to ``svnpublishd --init-service OPTIONS``, which creates all of\nthe directories, \"run\" scripts, and default logging options necessary\nto run svnpublishd, tailored for the specified user:group that\nsvnpublish runs as. It is important to ensure this user:group setting\nis correct, as otherwise svnpublish and svnpublishd cannot\ncommunicate. The user:group that svnpublish runs as is usually the\nowner of the subversion repository. For example, if your svnpublish\nruns as www-data:www-data, then something like this should work:\n\n.. code-block:: bash\n\n $ svnpublishd --init-service --service-dir /etc/service/svnpublishd --user www-data:www-data\n\nCopyright Notice\n================\n\nThis software is free software: you can redistribute it and/or\nmodify it under the terms of the GNU General Public License as\npublished by the Free Software Foundation, either version 3 of the\nLicense, or (at your option) any later version.\n\nThis software is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\nGeneral Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program. If not, see http://www.gnu.org/licenses/.\n\n\\(C) Copyright 2013-EOT metagriffin -- see LICENSE.txt", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/metagriffin/svnpublish", "keywords": "svn subversion publish automation actions deploy test testing", "license": "GPLv3+", "maintainer": null, "maintainer_email": null, "name": "svnpublish", "package_url": "https://pypi.org/project/svnpublish/", "platform": "any", "project_url": "https://pypi.org/project/svnpublish/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/metagriffin/svnpublish" }, "release_url": "https://pypi.org/project/svnpublish/2.12/", "requires_dist": null, "requires_python": null, "summary": "Enables powerful automation from a subversion repository.", "version": "2.12" }, "last_serial": 1005377, "releases": { "1.3.dev-r295": [], "1.3.dev-r300": [], "1.3.dev-r302": [], "2.0.0": [ { "comment_text": "", "digests": { "md5": "6984072ec076f3ba9a993d6bb6e61c21", "sha256": "f62d577ce36d39e552f43c9aae76767208bece6d2f7c7256e286c8ee0d80c910" }, "downloads": -1, "filename": "svnpublish-2.0.0.tar.gz", "has_sig": false, "md5_digest": "6984072ec076f3ba9a993d6bb6e61c21", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 40898, "upload_time": "2013-11-04T19:09:51", "url": "https://files.pythonhosted.org/packages/ed/3d/f751506436f7492a1582061429c18ba241ca338a50e42ecd4e84724f1588/svnpublish-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "843a7505bee8d2269412f34bd73422ab", "sha256": "ffd838731443519c5de794e83e589a60947ad1a425063cd6a8369e2e05f16de5" }, "downloads": -1, "filename": "svnpublish-2.0.1.tar.gz", "has_sig": false, "md5_digest": "843a7505bee8d2269412f34bd73422ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42140, "upload_time": "2013-11-05T01:02:30", "url": "https://files.pythonhosted.org/packages/47/07/ae7646984484cde48ac95033f36b70bd9d03d88f8155c40a52f787cb5a2a/svnpublish-2.0.1.tar.gz" } ], "2.0.10": [ { "comment_text": "", "digests": { "md5": "82fa87e8e86636fa0652d68b49a846ed", "sha256": "252e994b5732219181018b4b62bd3f4d9a7b3b30e8b1248460d558219f11900d" }, "downloads": -1, "filename": "svnpublish-2.0.10.tar.gz", "has_sig": false, "md5_digest": "82fa87e8e86636fa0652d68b49a846ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84761, "upload_time": "2013-12-12T18:41:05", "url": "https://files.pythonhosted.org/packages/f0/63/35c9a193efe1fb84c2114273d480d7f558944b3b57d313a2466fbf3441b4/svnpublish-2.0.10.tar.gz" } ], "2.0.11": [ { "comment_text": "", "digests": { "md5": "aeb844123264a69796ba174a46fc0bff", "sha256": "ec10267c5531f309725aec86ce3247a4b7e9f37f651f813741ec4b97d5b7cbf3" }, "downloads": -1, "filename": "svnpublish-2.0.11.tar.gz", "has_sig": false, "md5_digest": "aeb844123264a69796ba174a46fc0bff", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84874, "upload_time": "2013-12-16T17:07:47", "url": "https://files.pythonhosted.org/packages/f6/ca/9a5131531938f2c1e2380df1607109d971033e7026a82b0625cca7c72461/svnpublish-2.0.11.tar.gz" } ], "2.0.11b1": [ { "comment_text": "", "digests": { "md5": "46fef15b08b7179a6f47b86a722aefde", "sha256": "bba6e7844c71331f2e0ffbf0629a0fa286e30d33dabaed09354204ef9d57ebe8" }, "downloads": -1, "filename": "svnpublish-2.0.11b1.tar.gz", "has_sig": false, "md5_digest": "46fef15b08b7179a6f47b86a722aefde", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 84805, "upload_time": "2013-12-16T16:51:30", "url": "https://files.pythonhosted.org/packages/5e/87/df2a09bc1cc450d03e706df76cb42a931941bfa19632f0def610c97bc9ad/svnpublish-2.0.11b1.tar.gz" } ], "2.0.2": [ { "comment_text": "", "digests": { "md5": "8a7d40b09654be9a941d0367c3669974", "sha256": "60c269556837d142eb381423112b19e6324fcd542ba80f1e4d9615c1a3d7f45b" }, "downloads": -1, "filename": "svnpublish-2.0.2.tar.gz", "has_sig": false, "md5_digest": "8a7d40b09654be9a941d0367c3669974", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 53043, "upload_time": "2013-11-05T01:05:56", "url": "https://files.pythonhosted.org/packages/d0/9d/7b564bb6498b24f647d6a7eb4bacfd0e0399395efb73423c70f625e4ccd8/svnpublish-2.0.2.tar.gz" } ], "2.0.3": [ { "comment_text": "", "digests": { "md5": "092a48398ca4c891574c1cb6d937244f", "sha256": "05b0ccb8057fde5f967467b8122ba9ba0f6a93b9ffdf7f461f9296de855198ea" }, "downloads": -1, "filename": "svnpublish-2.0.3.tar.gz", "has_sig": false, "md5_digest": "092a48398ca4c891574c1cb6d937244f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 63816, "upload_time": "2013-11-05T19:26:50", "url": "https://files.pythonhosted.org/packages/4a/32/ba1d1eb1ea584cc33c22247eb96b941a4da88ac61871b2eada4e03ce3adb/svnpublish-2.0.3.tar.gz" } ], "2.0.4": [ { "comment_text": "", "digests": { "md5": "aa50573d8f43c38efc12dc6b585d4523", "sha256": "7eae4b4d2f3946e90d80b23fa9587f6a8476db256d504e904954008ddd5f79cf" }, "downloads": -1, "filename": "svnpublish-2.0.4.tar.gz", "has_sig": false, "md5_digest": "aa50573d8f43c38efc12dc6b585d4523", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 64306, "upload_time": "2013-11-05T20:15:41", "url": "https://files.pythonhosted.org/packages/c1/ef/c70e446e8b3b13e76f41f2d8e014361182780256b2101dbcf224332d7582/svnpublish-2.0.4.tar.gz" } ], "2.0.6": [ { "comment_text": "", "digests": { "md5": "88c4e5da4484cff65b771d60d7b83e6b", "sha256": "f3f6e480c38d04fd96a9a4b347efad04f795216c65d8dd3fbff08248aeace115" }, "downloads": -1, "filename": "svnpublish-2.0.6.tar.gz", "has_sig": false, "md5_digest": "88c4e5da4484cff65b771d60d7b83e6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66755, "upload_time": "2013-11-08T20:12:09", "url": "https://files.pythonhosted.org/packages/79/c9/1a06a4dbbd09633730099088cadf83e8a7352df251d6ba7dc558e361c2d0/svnpublish-2.0.6.tar.gz" } ], "2.0.7b": [ { "comment_text": "", "digests": { "md5": "af981115a9e221ae16f9a2232dda973d", "sha256": "a1aa76da17d6fcb5c99d63b9e4bf7a101653e6f3af5ba4773b818bb409651c24" }, "downloads": -1, "filename": "svnpublish-2.0.7b.tar.gz", "has_sig": false, "md5_digest": "af981115a9e221ae16f9a2232dda973d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 66876, "upload_time": "2013-11-08T20:20:38", "url": "https://files.pythonhosted.org/packages/3f/9b/8e96f31241cd656dc1c2c3114d2e096e6f42163842bb4050ab358c461f62/svnpublish-2.0.7b.tar.gz" } ], "2.0.7b.1": [ { "comment_text": "", "digests": { "md5": "dd384b4a4a6629a08c1b88cac303ea4b", "sha256": "29af962ad13b7000a80d181ffa3fbd96a558163d975479b9ad7cb88fdc241de5" }, "downloads": -1, "filename": "svnpublish-2.0.7b.1.tar.gz", "has_sig": false, "md5_digest": "dd384b4a4a6629a08c1b88cac303ea4b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67102, "upload_time": "2013-11-08T21:40:03", "url": "https://files.pythonhosted.org/packages/20/6a/fa071e09583340891ed2aa3003841a1bd9be343b546ab3babc144cd21bc6/svnpublish-2.0.7b.1.tar.gz" } ], "2.0.7b.2": [ { "comment_text": "", "digests": { "md5": "561974852ed062b722b89a75547cc409", "sha256": "ff7406070847ec3ff4a4ba12208b0dfa109bb695927bf619a586d64446ac293c" }, "downloads": -1, "filename": "svnpublish-2.0.7b.2.tar.gz", "has_sig": false, "md5_digest": "561974852ed062b722b89a75547cc409", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67125, "upload_time": "2013-11-08T22:05:08", "url": "https://files.pythonhosted.org/packages/ed/3b/fea80cb3deb5cc019c3c300c21232af2ff8c677c831ff300bbab8159f156/svnpublish-2.0.7b.2.tar.gz" } ], "2.0.8": [ { "comment_text": "", "digests": { "md5": "624a5b1a6de711610d5369c703024300", "sha256": "2cef55bb5d8e11c61c75c4720b5500c9fcebc716f61041895dfac31e6be99077" }, "downloads": -1, "filename": "svnpublish-2.0.8.tar.gz", "has_sig": false, "md5_digest": "624a5b1a6de711610d5369c703024300", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67139, "upload_time": "2013-11-08T22:13:58", "url": "https://files.pythonhosted.org/packages/ca/bf/884d71ca537d6e2686ea1251aec63958d25dc91c84654bf5da02402647c3/svnpublish-2.0.8.tar.gz" } ], "2.0.9": [ { "comment_text": "", "digests": { "md5": "49014c8c43192b823948e2a38d06c6a4", "sha256": "03a67919a9785045dcf0371899cfbd47c3c2ee80072f5ce1c9696fd7cdd90b99" }, "downloads": -1, "filename": "svnpublish-2.0.9.tar.gz", "has_sig": false, "md5_digest": "49014c8c43192b823948e2a38d06c6a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80046, "upload_time": "2013-11-13T18:10:47", "url": "https://files.pythonhosted.org/packages/6d/80/66ff2d05c366fc14cf4cdc383ed8ff270b1e3b0bb88647d880e3af0623c0/svnpublish-2.0.9.tar.gz" } ], "2.12": [ { "comment_text": "", "digests": { "md5": "bad4b3984a36015dfee51ae47d14e708", "sha256": "62c0f0d2034be4a4f7180d6d5792897b70143fdd6b74285fdf680d8b453679bd" }, "downloads": -1, "filename": "svnpublish-2.12.tar.gz", "has_sig": false, "md5_digest": "bad4b3984a36015dfee51ae47d14e708", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 101038, "upload_time": "2014-02-19T21:26:24", "url": "https://files.pythonhosted.org/packages/47/dc/b8bddb1b5a5a01ab395d65eb88070216120b8df5f933a7ca98289fd9d806/svnpublish-2.12.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bad4b3984a36015dfee51ae47d14e708", "sha256": "62c0f0d2034be4a4f7180d6d5792897b70143fdd6b74285fdf680d8b453679bd" }, "downloads": -1, "filename": "svnpublish-2.12.tar.gz", "has_sig": false, "md5_digest": "bad4b3984a36015dfee51ae47d14e708", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 101038, "upload_time": "2014-02-19T21:26:24", "url": "https://files.pythonhosted.org/packages/47/dc/b8bddb1b5a5a01ab395d65eb88070216120b8df5f933a7ca98289fd9d806/svnpublish-2.12.tar.gz" } ] }