{ "info": { "author": "Roger Ineichen, Projekt01 GmbH", "author_email": "dev@projekt01.ch", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Web Environment", "Framework :: Zope3", "Intended Audience :: Developers", "License :: OSI Approved :: Zope Public License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP" ], "description": "=======\nSummary\n=======\n\ninstall\n-------\n\nDownload and unzip this package next to your other packages in your local svn\nfolder structure. After that, install the p01.releaser package by running the\nfollowing commands on linux:\n\n python bootstrap.py\n\n bin/buildout\n\nwindows:\n\n python bootstrap.py\n\n bin\\buildout.exe\n\n\nrelease\n-------\n\nYou can use the release method with the following command for make a new or\nnext release.\n\nnix:\n\n bin/release \n\nwindows:\n\n bin\\release.exe \n\n\nWith this command the release script will do the following for the package\nwith the given name:\n\n - check for pending local modification\n\n - find existing versions\n\n - get next version based on options (-n, --next-version)\n\n - guess next version if nothing defined in options\n\n - ask for confirm guessed version or set explicit/initial version\n\n - ask for CHANGES.txt release text confirmation if already exist\n \n - or offer inplace CHANGES.txt editing if empty confirmed\n\nAfter this, the srcipt will start an automated build process and abort on any\nerror. Note an error could end in partial commited svn data or a missing\nrelease file. But this should be simple to check and correct. The steps are:\n\n - update version in CHANGES.txt if not already updated during editing\n\n - update version in setup.py\n\n - commit version change (local pkg dir)\n\n - create release based on setup.py (local pkg dir)\n\n - ensure tags folder if new package get release\n\n - tag package (svn cp tags/pkgName/version)\n\n - guess next release version\n\n - add next version and unreleased marker in CHANGES.txt\n\n - add next version including dev marker in setup.py\n\n - commit setup.py and CHANGES.txt dev marker update\n\nNow you are done and the release should be ready.\n\n\nin short\n--------\n\nIn short, the releae script should normal only do the following steps:\n\n - ask for new guessed version confirmation\n \n - ask for CHANGES.txt confirmation or offer editing\n\nand the release should just start.\n\n\ncredits\n-------\n\nThis package is a kind of simple version of keas.build for one package. The\nkeas.build package offers support for build several release based on\nconfiguration files. This is usefull if you need to make several releases\nbased on deifferent packages but not for release the package itself.\n\n\n======\nREADME\n======\n\nThis package provides a release helper script which can get used for svn based\nrepository development. The script will do all the steps which are required\nforrelease a package and add a dev marker if done. A new package release will\nget uploaded to the right pypi based on the package url. If authentication is\nrequired, the script will find them in your HOME/.pypirc configuration file.\nThis means there is no configuration required if your package meta data is\ncorrect defined and your \"python setup.py sdist upload\" command works.\n\n\nRequirement\n-----------\n\nBefore using the script make sure the following requirements are fine::\n\n - correct /.pypirc setup\n\n - pypi package server tweaks in setup.py (see Server Lock below)\n\n - working \"python setup.py sdist upload\" command\n\n - correct meta data (url, version) in /setup.py\n \n - existing CHANGES.txt file in your package\n\n\nSetup\n-----\n\nYou can setup the p01.releaser as a buildout part using the offered entry_point.\nSee setup.py. But I recommend not using the script as a buildout part in your\npackage because it will include the part in your deployment.\n\nThe recommended way to use the script is to link the p01.releaser package as\nan svn external in your package next to your other packages. It doesn't\nmatter which svn layout structure you are using. The release script will\nautomaticaly detect the svn repository layout and find the relevant folders.\nWith such a setup, you can go to the p01.releaser package and call the\nrelease command. Of corse, you have to run::\n\n python bootstrap.py\n bin/buildout\n\nbefore you can use the method::\n\n bin/release\n\nThe releaser script will find the correct package and tag folder based on your\nsvn layout. See below for more information about the common svn repository\nlayout structure.\n\n\nNote\n----\nThe release method will only release the package if something changed since the\nlast release. The release method will also not start the release process if\nthere is pending (not commited) code in your package. And the release method\nsupports you by adding comments to the CHANGES.txt.\n\n\nSVN\n---\n\nWe support 2 kind of svn layout. The first layout is the default layout used\nfor independent python libraries. Each package provdies own branches, tags and\ntrunk folders::\n\n - (svn layout detection rule: can't use trunk as name)\n |\n |- p01.releaser (cwd location)\n | |\n | - bin\n | |\n | - releaser.py (releaser.exe)\n |\n |- package1\n | |\n | - branches\n | |\n | - tags\n | | |\n | | - 0.5.0 (version)\n | |\n | |- trunk\n | |\n | - src ...\n |\n - package1\n |\n - branches\n |\n - tags\n | |\n | - 0.5.0 (version)\n |\n |- trunk\n |\n - src ...\n\nThe second svn layout is used for frameworks or other group of packages.\nEach package is located in the same trunk folder and they share branches and\ntags folders. This layout provides the option to simply tag all packages in\none step::\n\n - \n |\n - branches\n |\n - tags\n | |\n | - package1\n | |\n | - 0.5.0 (version)\n |\n - trunk\n |\n |- p01.releaser (cwd location)\n | |\n | - bin\n | |\n | - releaser.py (releaser.exe)\n |\n |- package1\n | | \n | - src ..\n |\n - package2\n | \n - src ..\n\n\nServer Lock\n-----------\n\nThe p01.releaser script will upload a relase to the pypi server found based on\nthe /.pypirc information. This should prevent that a release accidently\nget uploaded to the official public pypi server. But remember, the package meta\ndata in /setup.py must proide te correct url. And if you start the\nrelease process by hand with the command \"python.setup.py sdist upload\" you\nwill release to the public pypi server which is probably not what you want.\n\nOur solution which we use for private packages is the following. We use a\nmypypi server and a locker.py script in each of our private packages. This\nscript provides the following content::\n\n import sys\n import os.path\n from ConfigParser import ConfigParser\n \n \n #---[ repository locking ]-----------------------------------------------------\n \n def getRepository(name):\n \"\"\"Return repository server defined in .pypirc file\"\"\"\n server = None\n # find repository in .pypirc file\n rc = os.path.join(os.path.expanduser('~'), '.pypirc')\n if os.path.exists(rc):\n config = ConfigParser()\n config.read(rc)\n if 'distutils' in config.sections():\n # let's get the list of servers\n index_servers = config.get('distutils', 'index-servers')\n _servers = [s.strip() for s in index_servers.split('\\n')\n if s.strip() != '']\n for srv in _servers:\n if srv == name:\n repos = config.get(srv, 'repository')\n print \"Found repository %s for %s in '%s'\" % (repos,name,rc)\n server = repos\n break\n if not server:\n print \"No repository for %s found in '%s'\" % (name, rc)\n sys.exit(1)\n else:\n return server\n \n def lockRelease(name):\n \"\"\"Lock repository if we use the register or upload command\"\"\"\n \n COMMANDS_WATCHED = ('register', 'upload')\n changed = False\n server = None\n \n for command in COMMANDS_WATCHED:\n if command in sys.argv:\n # now get the server from pypirc\n if server is None:\n server = getRepository(name)\n # found one command, check for -r or --repository\n commandpos = sys.argv.index(command)\n i = commandpos+1\n repo = None\n while i/.pypirc file. The .pypirc file could look like::\n\n [distutils]\n index-servers = pypi\n mypypi\n\n [pypi]\n repository: http://pypi.python.org/pypi\n username:\n password:\n \n [mypypi]\n repository: http://pypi.domain.tld\n username:\n password:\n\nThis locker.py script concept is a seatbelt an prevents any release file upload\nto a wrong pypi server with or without the p01.releaser scipt. Remember the \nreleaser script will find it's correct server without this script. But it's\nallwayys a good idea to backup the concept if you have important libraries.\n\n\nIssues\n------\n\nJust like to remember that distutils is broken because of a bad re pattern.\nIt is not possible to include buildout.cfg or other files starting with\n``build`` on windows. This is only relevant if you need to include additional\npackage data with ``include_package_data=True``. After patching your pyhton\ninstallation it should be fine to include a MANIFST.in file with:\n\n include buildout.cfg\n\nsee:\n\n http://bugs.python.org/issue6884\n\n\n=======\nCHANGES\n=======\n\n0.6.0 (2012-11-16)\n------------------\n\n- added comment about distutils issue\n\n- added strict connection error handling\n\n- implemented checking externals\n\n- implemented better edit option\n\n- improve tests, fix test condition\n\n- fix changed marker\n\n- replace CHANGES.txt wrapper class ChangeDoc with a simpler implementation\n and API\n\n0.5.4 (2011-08-27)\n------------------\n\n- new version did not get added to CAHNGES.txt before release\n\n0.5.3 (2011-08-27)\n------------------\n\n- bugfix broken back to dev step\n\n0.5.2 (2011-08-27)\n------------------\n\n- improve version/date parsing. Something like this window.open('') was\n parsed as version headline\n\n- skip inline editing, just open the CHANGES.txt file and abort. I will\n probably bring back the CHANGES.txt fiel editing back if I'll find a way to\n open the file in an editor an block the subprocess till the editor will get\n closed. This is not so simple because opening a file in an already open\n editor will not block a subprocess.call\n\n0.5.1 (2011-08-25)\n------------------\n\n- added missing register argument in setup.py call. Seems that the pypi index\n needs this option or a package will not show up in th index\n\n0.5.0 (2011-08-25)\n------------------\n\n- initial release done with p01.releaser", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://pypi.python.org/pypi/p01.releaser", "keywords": "Buildout release script helper distribute distutils", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "p01.releaser", "package_url": "https://pypi.org/project/p01.releaser/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/p01.releaser/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://pypi.python.org/pypi/p01.releaser" }, "release_url": "https://pypi.org/project/p01.releaser/0.6.0/", "requires_dist": null, "requires_python": null, "summary": "Release helper script which offers a simple release process", "version": "0.6.0" }, "last_serial": 795915, "releases": { "0.5.1": [ { "comment_text": "", "digests": { "md5": "58fe564b841f5547dfe7f5303a91e98e", "sha256": "56de323f1e8b3a63eed2c466cbd8d7cf55d1b06ed6d4d48afbf1f8854bc375ca" }, "downloads": -1, "filename": "p01.releaser-0.5.1.zip", "has_sig": false, "md5_digest": "58fe564b841f5547dfe7f5303a91e98e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30335, "upload_time": "2011-08-25T04:44:06", "url": "https://files.pythonhosted.org/packages/8b/11/70ca1b9db9ebfd15fef0f514579beaf0c48097e7742018cc53d7208b194d/p01.releaser-0.5.1.zip" } ], "0.5.1dev": [], "0.5.2": [ { "comment_text": "", "digests": { "md5": "eccdd44f1f61adda3c1d420f20f1b083", "sha256": "f5634940553e2e2f947d5210192576e5b107151f6850b5a590e25dcf7dadfb10" }, "downloads": -1, "filename": "p01.releaser-0.5.2.zip", "has_sig": false, "md5_digest": "eccdd44f1f61adda3c1d420f20f1b083", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31146, "upload_time": "2011-08-27T18:03:34", "url": "https://files.pythonhosted.org/packages/ba/98/ea3afc9c505ee8c5fe20cd88fd4e7fd85cce4e9905fcacd8778383a0949f/p01.releaser-0.5.2.zip" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "64cf560c130b750bfd4a911df449e72b", "sha256": "e3ad543e12a2d389bb7efb6507657c9900286363e9a71d01458c758ca47be42f" }, "downloads": -1, "filename": "p01.releaser-0.5.3.zip", "has_sig": false, "md5_digest": "64cf560c130b750bfd4a911df449e72b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31238, "upload_time": "2011-08-27T18:14:04", "url": "https://files.pythonhosted.org/packages/a1/ef/d71da299fd793a9beff9d79c350ee56bc74978b3a35a625700a484673a8f/p01.releaser-0.5.3.zip" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "10fc96c6010d8853737cbf91bbba06f3", "sha256": "c376f073cf46aa9af1428a75a7bda276b856d97d36642a315c5e45450a4bf22a" }, "downloads": -1, "filename": "p01.releaser-0.5.4.zip", "has_sig": false, "md5_digest": "10fc96c6010d8853737cbf91bbba06f3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31327, "upload_time": "2011-08-27T18:19:27", "url": "https://files.pythonhosted.org/packages/e6/28/0246aafc8905f842818dbc9d612aff9befeb7aaacde0e53ee3f2b61d743a/p01.releaser-0.5.4.zip" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "67e23e9017a218192933495a2fd48148", "sha256": "8d03f4d7074692d398f301176c2d21656fa7152082e4b8a86f385030d1d816a6" }, "downloads": -1, "filename": "p01.releaser-0.6.0.zip", "has_sig": false, "md5_digest": "67e23e9017a218192933495a2fd48148", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32463, "upload_time": "2012-11-16T14:35:59", "url": "https://files.pythonhosted.org/packages/30/f2/75c71d3b1113a7b3ae104492793ad4fc0d60a56f64ba0d9d291cee468af1/p01.releaser-0.6.0.zip" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "67e23e9017a218192933495a2fd48148", "sha256": "8d03f4d7074692d398f301176c2d21656fa7152082e4b8a86f385030d1d816a6" }, "downloads": -1, "filename": "p01.releaser-0.6.0.zip", "has_sig": false, "md5_digest": "67e23e9017a218192933495a2fd48148", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32463, "upload_time": "2012-11-16T14:35:59", "url": "https://files.pythonhosted.org/packages/30/f2/75c71d3b1113a7b3ae104492793ad4fc0d60a56f64ba0d9d291cee468af1/p01.releaser-0.6.0.zip" } ] }