{
"info": {
"author": "Thomas Aglassinger",
"author_email": "roskakori@users.sourceforge.net",
"bugtrack_url": null,
"classifiers": [
"Development Status :: 3 - Alpha",
"Environment :: Console",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)",
"Natural Language :: English",
"Operating System :: OS Independent",
"Programming Language :: Python :: 2.6",
"Programming Language :: Python :: 2.7",
"Topic :: Software Development :: Version Control"
],
"description": "======\r\nScunch\r\n======\r\n\r\nScunch updates a work copy of a source code management (SCM) system\r\nfrom an external folder and copies, adds and removes files and folders as\r\nnecessary.\r\n\r\nIntended scenarios of use are:\r\n\r\n* Automatic version management of external sources delivered by a third\r\n party.\r\n* Automatic version management of typically unversioned centralized\r\n resources such as server configuration files.\r\n* Migration of projects using folder based version management to a proper\r\n SCM.\r\n\r\nMain features are:\r\n\r\n* Flexible command line interface for easy automation.\r\n* Support for ant patterns to specify the files to be processed.\r\n* Optional conversion of text files to ensure consistency and save storage\r\n space.\r\n* Optional transformation of file names to lower case to prevent issues with\r\n case sensitive repositories and case insensitive file systems.\r\n* Optional actions to be taken before and after updating the work copy to\r\n ensure consistency and prevent pending changes.\r\n\r\n.. TODO: Elaborate the below scenario.\r\n.. Pseudo version management for users that have issues with manual version\r\n.. management (usual suspects are: managers, graphical artists, mainframe\r\n.. elders, ...).\r\n\r\nCurrently supported SCM systems are:\r\n\r\n* Subversion (svn)\r\n\r\nThe name \"scunch\" is a combination of the acronym \"SCM\" and the word\r\n\"punch\" with letters removed to make it easy to pronounce. (The initial\r\nname used during early development was \"scmpunch\").\r\n\r\n\r\nInstallation\r\n============\r\n\r\nTo install ``scunch``, you need:\r\n\r\n* Python 2.6 or any later 2.x version, available from\r\n .\r\n* The ``distribute`` package, available from\r\n .\r\n\r\nThen you can simply run::\r\n\r\n $ easy_install scunch\r\n\r\nIf you prefer a manual installation, you can obtain the ZIP archive from\r\n. Furthermore the source code is\r\navailable from .\r\n\r\nTo actually use ``scunch``, you also need an SCM tool. In particular,\r\nyou need the SCM's command line client to be installed and located in the\r\nshell's search path. Installing a desktop plug-in such as `TortoiseSVN\r\n`_ is not enough because it does not\r\ninstall a command line client.\r\n\r\nHere are some hints to install a command line client on popular platforms:\r\n\r\n* Mac OS X: ``svn`` is included in Leopard. Alternatively you can use\r\n `MacPorts `_.\r\n* Linux: Use your package manager, for example:\r\n ``apt-get install subversion``.\r\n* Windows: Use `SlikSVN `_.\r\n\r\n\r\nUsage\r\n=====\r\n\r\nThis section gives a short description of the available command line\r\noptions together with simple examples.\r\n\r\nTo read a summary of the available options, run::\r\n\r\n $ scunch --help\r\n\r\nFor more detailed usage in real world scenarios, read the section on\r\nscenarios_.\r\n\r\nBasic usage\r\n-----------\r\n\r\nTo \"punch\" the folder ``/tmp/ohsome`` into the work copy ``~/projects/ohsome``, run::\r\n\r\n $ scunch /tmp/ohsome ~/projects/ohsome\r\n\r\nTo do the same but also commit the changes, run::\r\n\r\n $ scunch --after=commit --message \"Punched version 1.3.8.\" /tmp/ohsome ~/projects/ohsome\r\n\r\n\r\nControlling the output\r\n----------------------\r\n\r\nTo control how much details you can see during the punching, use ``--log.``. To see\r\nonly warnings and errors, use::\r\n\r\n $ scunch --log=warning /tmp/ohsome ~/projects/ohsome\r\n\r\nTo see a lot of details about the inner workings, use::\r\n\r\n $ scunch --log=debug /tmp/ohsome ~/projects/ohsome\r\n\r\nPossible values for ``--log`` are: ``debug``, ``info`` (the default),\r\n``warning`` and ``error``.\r\n\r\n\r\nSpecifying which files to process\r\n---------------------------------\r\n\r\nBy default, ``scunch`` considers almost all files and folders\r\nin the external folder for transfer, excluding:\r\n\r\n* internal files and folders used by popular SCM systems, for example\r\n ``.svn`` and ``.gitignore``.\r\n* internal system files, for example MacOS X's ``.DS_Store``.\r\n* apparent temporary files, for example ``#*#``.\r\n\r\nTo ignore additional files use ``--exclude=PATTERN`` with ``PATTERN`` using\r\nthe popular `ant pattern syntax `_.\r\nAnt patters are similar to shell patterns and support the \"*\" and \"?\" place\r\nholder as usual. In addition to that, \"**\" stands for any amount of folders\r\nand sub folders matching any folder nesting level.\r\n\r\nFor example, to exclude all Python byte code files, use::\r\n\r\n $ scunch --exclude \"**/*.pyc, **/*.pyo\" ...\r\n\r\nIn case you want to punch only Python and files and ignore everything\r\nelse, use ``--include``::\r\n\r\n $ scunch --include \"**/*.py\" ...\r\n\r\nOf course you can combine both options to for example punch all Python\r\nfiles except test cases::\r\n\r\n $ scunch --include \"**/*.py\" --exclude \"**/test_*.py\" ...\r\n\r\nSometimes the work copy includes files that will never exist in the\r\nexternal folder. For example, the work copy might contain a script\r\nto run ``scunch`` with all options set up already. Because this script\r\ndoes not exist in the external folder, it would be removed as soon as\r\n``scunch`` is run. To prevent this from happening, use\r\n``--work-only=PATTERN``. For example::\r\n\r\n $ scunch --work-only \"run_scunch.sh\" ...\r\n\r\nNote that this example does not use the \"**\" place holder because only\r\nfiles in the work copy's top folder are of interest.\r\n\r\n\r\nPreparing the work copy\r\n-----------------------\r\n\r\nWhen punching any changes from the external folder the current state of the\r\nwork copy influences what actually is going to happen.\r\n\r\n``Scunch`` works best on a clean work copy without any pending changes and\r\nmessed up files. If this is not the case, ``scunch`` refuses to continue\r\nannouncing:\r\n\r\n Pending changes in \"...\" must be committed, use \"svn status\" for details.\r\n To resolve this, use '--before=reset' to discard the changes or\r\n '--before=none' to ignore them.\r\n\r\nIn case you are sure the changes are irrelvant and intend to discard them,\r\nuse::\r\n\r\n $ scunch --before reset ...\r\n\r\nThis reverts all changes and removes files not under version control.\r\n\r\nIn case you prefer a clean check out, use::\r\n\r\n $ scunch --before checkout --depot http://example.com/ohsome/trunk ...\r\n\r\nwhere ``http://example.com/ohsome/trunk`` represents the project's depot\r\nqualifier. Note that a ``before=checkout`` usually takes longer than a\r\n``--before=reset`` because a checkout needs to obtain all files again\r\nwhere else a ``--before=checkout`` needs to obtain every file in the depot.\r\n\r\nIn case you are happy with the current pending changes and want to preserve\r\nthem even after punching the external changes, use::\r\n\r\n $ scunch --before none ...\r\n\r\nThe result might or might not be what you want, though.\r\n\r\n\r\nCommitting punched changes\r\n--------------------------\r\n\r\nTo automatically commit the changes ``scunch`` just punched into your work\r\ncopy, use::\r\n\r\n $ scunch --after commit ...\r\n\r\nTo do the same with a meaningful log message, use::\r\n\r\n $ scunch --after commit --message \"Punched version 1.3.8.\" ...\r\n\r\nIn case you use a script to launch ``scunch`` and want to get rid of the\r\nwork copy once it is done, you can specify multiple actions for ``--after``\r\nseparated by a comma::\r\n\r\n $ scunch --after \"commit, purge\" ...\r\n\r\nThe actions are performed in the given order so make sure to use ``purge``\r\nlast. Also notice the double quotes (\") around ``\"commit, purge\"``. They\r\nensure that the shell does not consider ``purge`` a command line option of\r\nits own.\r\n\r\n\r\nMoving or renaming files\r\n------------------------\r\n\r\nBy default, ``scunch`` checks for files added and removed with the same\r\nname but located in a different folder. For example::\r\n\r\n Added : source/tools/uitools.py\r\n Removed: source/uitools.py\r\n\r\nWith Subversion, ``scunch`` will internally run::\r\n\r\n $ svn move ... source/uitools.py source/tools\r\n\r\ninstead of::\r\n\r\n $ svn add ... source/tools/uitools.py\r\n $ svn remove ... source/uitools.py\r\n\r\nThe advantage of moving files instead of adding/removing them is that the\r\nversion history remains attached to the new file.\r\n\r\nNote that this only works for files but not for folders. Furthermore, the\r\nfile names must be identical including upper/lower case and suffix.\r\n\r\nIf you rather want to add/remove files instead of moving them, you can\r\nspecify the move mode using the ``--move=MODE``::\r\n\r\n $ scunch --move=none /tmp/ohsome ~/projects/ohsome\r\n\r\nPossible move modes are:\r\n\r\n* ``name`` (the default): move files with identical names.\r\n* ``none``: use add/remove instead if move.\r\n\r\n\r\nTransforming names\r\n------------------\r\n\r\nEspecially when punching sources from 3rd parties sometimes some letters of\r\nfile or folder names change from lower case to upper case or the other way\r\naround. For example, a file called ``some.txt`` might be named ``Some.txt``\r\nthe next time around.\r\n\r\nOn a case sensitive file system (for instance most Unix file systems), this\r\nresult in the SCM to not make the connection between the two files and\r\nstarting a new change history. On a case insensitive file system (such as\r\nthe standard file systems for Mac OS X and Windows), the SCM gets seriously\r\nconfused because it is made to believe there are to files but the file\r\nsystem can only store one of them at a time.\r\n\r\nIn order to prevent this, you can tell ``scunch`` to transform names of\r\nfiles and folders while punching them into a work copy. For example::\r\n\r\n $ scunch --names=lower ...\r\n\r\nThis converts all names to lower case.\r\n\r\nPossible values for ``--names`` are:\r\n\r\n* ``preserve`` (the default): keep names as the are\r\n* ``lower``: transform names to lower case; for example, ``Some.txt``\r\n becomes ``some.txt``.\r\n* ``upper``: transform names to upper case; for example, ``Some.txt``\r\n becomes ``SOME.TXT``.\r\n\r\nNote that you should specify ``--names`` the first time when starting\r\nwith a new work copy. Renaming existing files and folder by only changing\r\nthe case of letters confuses most SCM's when the work copy resides on a\r\ncase insensitive file system.\r\n\r\n\r\nDealing with non ASCII file names\r\n---------------------------------\r\n\r\nTo perform SCM operations, ``scunch`` simply runs the proper SCM command\r\nline client as a shell process in the background. This typically works nice\r\nand dandy as long as all files to be processed have names that solely\r\nconsist of ASCII characters. As soon as you have names in Kanji or with\r\nUmlauts, trouble can ensue.\r\n\r\nBy default, ``scunch`` attempts to figure out proper settings for such a\r\nsituation by itself. However, this might fail and the result typically is a\r\n``UnicodeEncodeError``.\r\n\r\nThe first sign of trouble is when ``scunch`` logs the following warning message:\r\n\r\n LC_CTYPE should be set to for example 'UTF-8' to allow processing of file names with non-ASCII characters\r\n\r\nThis indicates that the console encoding is set to ASCII and any non ASCII\r\ncharacters in file names will result in a ``UnicodeEncodeError``. To fix\r\nthis, you can tell the console the file name encoding by setting the\r\nenvironment variable ``LC_CTYPE``. For Mac OS X and most modern Linux\r\nsystems, the following command should do the trick::\r\n\r\n $ export LC_CTYPE=UTF-8\r\n\r\nFor Windows 7 you can use::\r\n\r\n > set LC_CTYPE=UTF-8\r\n\r\nNote that this can have implications for other command line utilities, so\r\nmaking this a permanent setting in ``.profile`` or ``.bashrc`` might not\r\nbe a good idea. Alternatively you can specify the proper encoding every\r\ntime you run ``scunch`` (upper/lower case does not matter here)::\r\n\r\n $ scunch --encoding=utf-8 /tmp/ohsome ~/projects/ohsome\r\n\r\nFor other platforms, you can try the values above. If they do not work as\r\nintended, you need to dive into the documentation of your file system and\r\nfind out which encoding it uses.\r\n\r\nBut even if the encoding is correct, ``scunch`` and the file system still\r\nmight disagree on how to normalize Unicode characters. Again, ``scunch``\r\nattempts to figure out the proper normalization but in case it is wrong\r\nyou can specify it using ``--normalize``. Possible value are: ``auto``\r\n(the default), ``nfc``, ``nfkc``, ``nfd`` and ``nfkd``. To understand the\r\nmeaning of these values, check the Unicode Consortium's `FAQ on normalization `_.\r\n\r\nAs a complete example, the proper options for Mac OS X with a HFS volume\r\nare::\r\n\r\n $ scunch --encoding=utf-8 --normalize=nfd /tmp/ohsome ~/projects/ohsome\r\n\r\nIncidentally, these are the values ``scunch`` would have used already, so\r\nin practice there is not need to explicitly state them.\r\n\r\nIf however the files reside on a UDF volume, the proper settings would be::\r\n\r\n $ scunch --normalize=nfc /tmp/ohsome ~/projects/ohsome\r\n\r\nIn case the external files to punch into the work copy reside on a volume\r\nwith different settings than the work copy, or you cannot figure them out\r\nat all, try to copy the files to a Volume with know settings and run\r\n``scunch`` on this copy.\r\n\r\n.. scenarios:\r\n\r\nScenarios\r\n=========\r\n\r\nThis section describes common scenarios where ``scunch`` can be put to\r\ngood use.\r\n\r\nUpgrading from old school version management\r\n--------------------------------------------\r\n\r\nTim is a hobbyist developer who has been programming a nifty utility\r\nprogram for a while called \"nifti\". Until recently he has not been using\r\nany version management. If he deemed it useful to keep a certain state of\r\nthe source code, he just copied it to a new folder and added a timestamp to\r\nthe folder name::\r\n\r\n $ cd ~/projects\r\n $ ls\r\n nifti\r\n nifti_2010-11-27\r\n nifti_2010-09-18\r\n nifti_2010-07-03\r\n nifti_2010-05-23\r\n\r\nAfter having been enlightened, he decides to move the project to a\r\nSubversion repository. Nevertheless he would like to have all his snapshots\r\navailable.\r\n\r\nAs a first step, Tim creates a local Subversion repository::\r\n\r\n $ mkdir /Users/tim/repositories\r\n $ svnadmin create /Users/tim/repositories/nifti\r\n\r\nNext he adds the project folders using the ``file`` protocol::\r\n\r\n $ svn mkdir file:///Users/tim/repositories/nifti/trunk file:///Users/tim/repositories/nifti/tags file:///Users/tim/repositories/nifti/branches\r\n\r\nNo he can check out the ``trunk`` to a temporary folder::\r\n\r\n $ cd /tmp\r\n $ svn checkout --username tim file:///Users/tim/repositories/nifti/trunk nifti\r\n\r\nNow it is time to punch the oldest version into the still empty work copy::\r\n\r\n $ cd /tmp/nifti\r\n $ scunch ~/projects/nifti_2010-05-23\r\n\r\nTim reviews the changes to be committed. Unsurprisingly, there are only\r\n\"add\" operations::\r\n\r\n $ svn status\r\n A setup.py\r\n A README.txt\r\n A nifti/\r\n ...\r\n\r\nTo commit this, Tim runs::\r\n\r\n $ svn commit --message \"Added initial version.\"\r\n\r\nThen he proceeds with the other versions, where he lets ``scunch`` handle\r\nthe commit all by itself::\r\n\r\n $ scunch --commit ~/projects/nifti_2010-07-03\r\n $ scunch --commit ~/projects/nifti_2010-08-18\r\n $ scunch --commit ~/projects/nifti_2010-11-27\r\n $ scunch --commit ~/projects/nifti\r\n\r\nNow all the changes are nicely traceable in the repository. However, the\r\ntimestamps use the time of the commit instead of the date when the source\r\ncode was current. In order to fix that, Tim looks at the history log to\r\nfind out the revision number of his changes and notes which actual date the\r\nare supposed to represent::\r\n\r\n r1 --> before 2010-05-23\r\n r2 --> 2010-05-23\r\n r3 --> 2010-07-03\r\n r4 --> 2010-08-18\r\n r5 --> 2010-11-27\r\n r6 --> today\r\n\r\nTo update the timestamp in the repository, Tim sets the revision property\r\n``date`` accordingly::\r\n\r\n $ svn propset svn:date --revprop --revision 2 \"2010-05-23 12:00:00Z\" file:///Users/tim/repositories/nifti/trunk\r\n\r\nNote that this only works with the ``file`` protocol. If you want to do the\r\nsame on a repository using the ``http`` protocol, you have to install a\r\nproper post commit hook in the repository that allows you to change\r\nproperties even after they have been committed. Refer to the Subversion\r\nmanual for details on how to do that.\r\n\r\nSimilarly, Tim can set the log comments to a more meaningful text using the\r\nrevision property ``log``.\r\n\r\nOnce the repository is in shape, Tim can remove his current source code and\r\nreplace it with the work copy::\r\n\r\n $ cd ~/projects\r\n $ mv nifti nifti_backup # Do not delete just yet in case something went wrong.\r\n $ svn checkout file:///Users/tim/repositories/nifti/trunk nifti\r\n\r\nNow Tim has a version controlled project where he can commit changes any\r\ntime he wants.\r\n\r\n\r\nVersion management of third party source code\r\n---------------------------------------------\r\n\r\nJoe works in an IT department. One of his responsibilities to install\r\nupdates for a web application named \"ohsome\" developed and delivered by a\r\nthird party. The work flow for this is well defined:\r\n\r\n1. Vendor send the updated source code to Joe in a ZIP archive containing a\r\n mix of HTML, JavaScript and XML files, mixed in with a few server\r\n configuration files.\r\n\r\n2. Joe extracts the ZIP archive to a local folder.\r\n\r\n3. Joe moves the contents of local folder to the application folder on the\r\n server. In the process, he removes all previous files for the application.\r\n\r\nThis works well as long as the vendor managed to pack everything into the ZIP\r\narchive. However, experience shows that the vendor sometimes forgets to\r\ninclude necessary files in the ZIP archive or does include configurations\r\nfiles intended for a different site. While these situations always could be\r\nresolved, it took a long time to analyze what's wrong and find out which files\r\nwere effected. This resulted in delays of a release, reduced end user\r\nsatisfaction and large amount of phone calls being made and email being\r\nsent - including summaries for the management.\r\n\r\nJoe decides that it would be a good idea to take a look at the changes\r\nbefore copying them to the web server. And even if he cannot spot a\r\nmistake before installing an update, SCM should help him in his\r\nanalysis later on.\r\n\r\nJoe's company already has a Subversion repository for various projects, so\r\nas a first step he adds a new project to the repository and creates a new\r\nwork copy on his computer::\r\n\r\n $ svn add --message \"Added project folders for ohsome application by Vendor.\" http://svn.example.com/ohsome http://svn.example.com/ohsome/trunk http://svn.example.com/ohsome/tags http://svn.example.com/ohsome/branches\r\n\r\nThis creates a project folder and the usual trunk, tags and branches\r\nfolders. For the time being, Joe intends to use only the trunk to hold the\r\nmost current version of the \"ohsome\" application.\r\n\r\nNext, Joe creates a yet empty work copy in a local folder on his computer::\r\n\r\n $ cd ~/projects\r\n $ svn checkout http://svn.example.com/ohsome/trunk ohsome\r\n\r\nNow he copies all the files from the web server to the work copy::\r\n\r\n $ cp -r /web/ohsome/* ~/projects/ohsome\r\n\r\nAlthough the files are now in the work copy, the are not yet under version\r\nmanagement. So Joe adds almost all the files except one folder named \"temp\" that\r\naccording to his knowledge contains only temporary files generated by the\r\nweb application::\r\n\r\n $ cd ~/projects/ohsome\r\n $ svn propset svn:ignore temp .\r\n $ svn add ...\r\n\r\nAfter that, he manually commits the current state of the web server::\r\n\r\n $ svn commit --message \"Added initial application version 1.3.7.\"\r\n\r\nFor the time being, Joe is done.\r\n\r\nA couple of weeks later, the vendor send a ZIP archive with the application\r\nversion 1.3.8. As usual, Joe extracts the archive::\r\n\r\n $ cd /tmp\r\n $ unzip ~/Downloads/ohsome_1.3.8.zip\r\n\r\nThe result of this is a folder /tmp/ohsome containing all the files and\r\nfolders to be copied to the web server under /web/ohsome/. However, this\r\ntime Joe wants to review the changes first by \"punching\" them into his\r\nwork copy. So he runs ``scunch`` with the following options::\r\n\r\n $ scunch /tmp/ohsome ~/projects/ohsome\r\n\r\nThis \"punches\" all the changes from folder /tmp/ohsome (where the ZIP\r\narchive got extracted) to the work copy in ~/projects/ohsome.\r\n\r\nAs a result Joe can review the changes. He uses TortoiseSVN for that, but\r\n``svn status`` and ``svn diff`` would have worked too.\r\n\r\nOnce he finished his review without noticing any obvious issues, he\r\nmanually commits the changes::\r\n\r\n $ cd ~/projects/ohsome\r\n $ svn commit --message \"Punched version 1.3.8.\"\r\n\r\nWhen version 1.3.9 ships, Joe decides that he might as well review the\r\nchanges directly in the repository after the commit. So this time he simply\r\nuses::\r\n\r\n $ cd /tmp\r\n $ unzip ~/Downloads/ohsome_1.3.9.zip\r\n $ scunch --commit --message \"Punched version 1.3.9.\"\r\n\r\nJoe can then use ``svn log`` to look for particular points of interest.\r\nFor instance, to find modified configuration files (matching the pattern \\*.cfg)::\r\n\r\n $ svn log --verbose --limit 1 http://svn.example.com/ohsome/trunk | grep \"\\.cfg$\"\r\n\r\nTo get a list of Removed files and folders::\r\n\r\n $ svn log --verbose --limit 1 http://svn.example.com/ohsome/trunk | grep \"^ D\"\r\n\r\n(Note: Here, ``grep`` looks for three blanks and a \"D\" for \"deleted\" at the beginning of a line.)\r\n\r\n\r\n.. Pseudo SCM for users with SCM issues\r\n.. ------------------------------------\r\n..\r\n.. SCM in its current form approached the IT scene relatively late. Most\r\n.. concepts for operating systems and file management already have been\r\n.. established a long time ago. Consequently SCM has not been integrated well\r\n.. in the users's work flow and ended up as optional add on instead of being\r\n.. an integral part of it. Despite brave attempts like MULTICS, VMS, WebDAV\r\n.. and Desktop integrations like TortoiseSVN, version managements remains a\r\n.. mystery to many.\r\n..\r\n.. Although software developers profit enough from SCM to take the effort\r\n.. learning to cope with them, people from other backgrounds keep stumbling\r\n.. over the various idiosyncrasies and usability issues modern SCM's offer.\r\n.. This is particular true for people who see computers as tools that help\r\n.. them to get their job done and often limit their use to a single\r\n.. application (for instance graphical artists) or people who at one time\r\n.. decided that the know everything they need to know about computers and can\r\n.. safely ignore everything that happened after the Disco movement (for\r\n.. instance mainframe elders).\r\n..\r\n.. Continuous attempts to get such people to use an SCM only result in\r\n.. increased frustration and waste of time for everybody involved.\r\n..\r\n.. TODO: Describe solution.\r\n\r\n\r\nLicense\r\n=======\r\n\r\nCopyright (C) 2011 - 2012 Thomas Aglassinger\r\n\r\nThis program is free software: you can redistribute it and/or modify it\r\nunder the terms of the GNU Lesser General Public License as published by\r\nthe Free Software Foundation, either version 3 of the License, or (at your\r\noption) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful, but WITHOUT\r\nANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r\nFITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public\r\nLicense for more details.\r\n\r\nYou should have received a copy of the GNU Lesser General Public License\r\nalong with this program. If not, see .\r\n\r\n\r\nVersion history\r\n===============\r\n\r\n**Version 0.5.8, 2012-05-08**\r\n\r\n* #21: Fixed adding of files within 3 nested otherwise empty folders.\r\n* Improved debug logging for ant patters: it can now be set separately by\r\n using logger 'antglob.pattern'.\r\n\r\n**Version 0.5.7, 2012-04-08**\r\n\r\n* Fixed confusing warning message in case LC_CTYPE was not set properly.\r\n* Fixed logging messages which can now handle non ASCII paths properly.\r\n* Improved performance by changing some lists to sets.\r\n\r\n**Version 0.5.6, 2011-03-04**\r\n\r\n* #20: Changed ``--names`` to fail in case the work copy already contains\r\n existing entries not complying to the name transformation.\r\n* Changed file attributes of transferred text files to use the same\r\n attributes as the source file.\r\n\r\n**Version 0.5.5, 2011-02-28**\r\n\r\n* Fixed ``--before=reset``, which did not remove unversioned added folders.\r\n* Cleaned up code.\r\n\r\n**Version 0.5.4, 2011-02-23**\r\n\r\n* Improved validation of command line options.\r\n* Cleaned up error messages, code and documentation.\r\n\r\n**Version 0.5.3, 2011-02-20**\r\n\r\n* #18: Added transformations of file and folder names, use for example\r\n ``--names=lower``.\r\n* #19: Fixed duplicate processing of punched folders in root folder.\r\n\r\n**Version 0.5.2, 2011-02-17**\r\n\r\n* #16: Fixed moving of files in moved folders, during which the containing folder\r\n was removed before the files could be moved.\r\n* #14: Fixed logged numbers of files processed.\r\n* #15: Added list of possible values to ``--help`` for options of type choice.\r\n\r\n**Version 0.5.1, 2011-02-14**\r\n\r\n* #10: Added command line option ``--before`` to specify action to be taken\r\n before punching.\r\n* Added check that no changes are pending before copying files from the\r\n external folder. Use ``--before=none`` to skip this.\r\n* #11: Added command line option ``--after`` to specify actions to be taken\r\n after punching.\r\n* Removed command line option ``--commit``, use ``--after=commit``\r\n instead.\r\n\r\n**Version 0.5.0, 2011-02-12**\r\n\r\n* #12: Added options ``--include`` and ``--exclude`` to specify which\r\n files in the external folder should be punched. These options take a\r\n list of ant patterns separated by a comma (,) or blank space.\r\n* #13: Added option ``--work-only`` to specify files and folders that\r\n only exist in the work copy but not in the external folder but should be\r\n preserved nevertheless. This is useful if the work copy contains helper\r\n scripts, ``build.xml`` for ant, Makefiles and so on that call scunch or\r\n other tools but will never be part of the external folder.\r\n* Changed ``--text`` to use ant-like pattern instead of a suffix list. For\r\n example now use ``--text=\"**/*.txt\" instead of ``text=txt``.\r\n\r\n**Version 0.4.1, 2011-01-09**\r\n\r\n* Fixed ``AssertionError`` if no explicit ``--encoding`` was specified.\r\n* Cleaned up command line help and code.\r\n\r\n**Version 0.4, 2011-01-08**\r\n\r\nAdded options to normalize text files and fixed some critical bugs.\r\n\r\n* #4: Added command line option ``--text`` to specify which files should be\r\n considered text and normalized concerning end of line characters.\r\n* #5: Added command line option ``--newline`` to specify which end of line\r\n characters should be used for text files.\r\n* #6: Added command line option ``--tabsize`` to specify that tabs should\r\n be aligned on a certain number of spaces in text files.\r\n* #7: Added command line option ``--strip-trailing`` to remove trailing\r\n white space in text files.\r\n* Fixed sorting of file names which could result into inconsistent work\r\n copies.\r\n* Fixed processing of internal file name diff sequences of type 'replace',\r\n which could result in inconsistent work copies.\r\n\r\n**Version 0.3, 2011-01-05**\r\n\r\n* Fixed processing of file names with non ASCII characters for Mac OS X\r\n and possibly other platforms.\r\n* Added command lines options ``--encoding`` and ``--normalize`` to\r\n specify how to deal with non ASCII characters.\r\n\r\n**Version 0.2, 2011-01-04**\r\n\r\n* Fixed ``NotImplementedError``.\r\n* Added support for moving files with same name instead of performing a\r\n simple add/remove. This preserves the version history on the new file.\r\n Use ``--move=none`` to get the old behavior.\r\n* Cleaned up logging output.\r\n\r\n**Version 0.1, 2011-01-03**\r\n\r\n* Initial release.",
"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/scunch/",
"keywords": "svn scm version import apply copy transfer punch working work",
"license": "GNU Library or Lesser General Public License (LGPL)",
"maintainer": "",
"maintainer_email": "",
"name": "scunch",
"package_url": "https://pypi.org/project/scunch/",
"platform": "UNKNOWN",
"project_url": "https://pypi.org/project/scunch/",
"project_urls": {
"Download": "UNKNOWN",
"Homepage": "http://pypi.python.org/pypi/scunch/"
},
"release_url": "https://pypi.org/project/scunch/0.5.8/",
"requires_dist": null,
"requires_python": null,
"summary": "Update svn working copy from folder.",
"version": "0.5.8"
},
"last_serial": 799357,
"releases": {
"0.1": [
{
"comment_text": "",
"digests": {
"md5": "218aabf60a4fb083dc294440b716f0fa",
"sha256": "4c2f99dd920228679261c6d8dd00d31f662efbee6f23c1e27211267f3bcef33a"
},
"downloads": -1,
"filename": "scunch-0.1.zip",
"has_sig": false,
"md5_digest": "218aabf60a4fb083dc294440b716f0fa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 29419,
"upload_time": "2011-01-03T19:44:53",
"url": "https://files.pythonhosted.org/packages/5e/33/6d16f35a04303b3e5e7abe999a6739efbfe82f41746becb0e6b56260815d/scunch-0.1.zip"
}
],
"0.2": [
{
"comment_text": "",
"digests": {
"md5": "274d9d257704738c93c7e31b0f2738f5",
"sha256": "579ca77f4ff78b81c4ea6dc347f232e294a4edd591b9c6857f14e34c2996a191"
},
"downloads": -1,
"filename": "scunch-0.2.zip",
"has_sig": false,
"md5_digest": "274d9d257704738c93c7e31b0f2738f5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 34820,
"upload_time": "2011-01-04T17:35:12",
"url": "https://files.pythonhosted.org/packages/b8/4a/822559b2feaffc461442cb3ed6207361de0b3a3a3bc9c2df34e3597c181e/scunch-0.2.zip"
}
],
"0.3": [
{
"comment_text": "",
"digests": {
"md5": "44aa256a726ca8f0356fc7789e74a7a8",
"sha256": "78a7df483883dc9d94546a9f22e7916ac5520f2420a0a603aec3c9430d5bb9c4"
},
"downloads": -1,
"filename": "scunch-0.3.zip",
"has_sig": false,
"md5_digest": "44aa256a726ca8f0356fc7789e74a7a8",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 39843,
"upload_time": "2011-01-06T12:22:32",
"url": "https://files.pythonhosted.org/packages/a7/e3/3933c086bb165dba090e2950430e44826fe6e4f8726f1fe575bdfcaed2df/scunch-0.3.zip"
}
],
"0.4.0": [
{
"comment_text": "",
"digests": {
"md5": "d27499e1ff9a3ad20594d502037f3f99",
"sha256": "0497634dccd37d2b994766006afde88b6c73ad6490edf5f74664cf14ebb78696"
},
"downloads": -1,
"filename": "scunch-0.4.0.zip",
"has_sig": false,
"md5_digest": "d27499e1ff9a3ad20594d502037f3f99",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 43416,
"upload_time": "2011-01-08T23:10:03",
"url": "https://files.pythonhosted.org/packages/bf/b9/4ad0bb0e2145530d19b0a4383800203156944f6dca8c17988167cafdc4c4/scunch-0.4.0.zip"
}
],
"0.4.1": [
{
"comment_text": "",
"digests": {
"md5": "fec5caaf2487a56501eb62213bd4412f",
"sha256": "2a0b16558da0caa15a9b971c6d22623701b23fc192cb209d2dba43561dd9122b"
},
"downloads": -1,
"filename": "scunch-0.4.1.zip",
"has_sig": false,
"md5_digest": "fec5caaf2487a56501eb62213bd4412f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 44580,
"upload_time": "2011-01-09T16:45:41",
"url": "https://files.pythonhosted.org/packages/fb/04/eb52a53e5b661b216822973c351398acd246647977ff8b0e1371559a9922/scunch-0.4.1.zip"
}
],
"0.5.0": [
{
"comment_text": "",
"digests": {
"md5": "f3952796a2c7e67691ee03e3312f89df",
"sha256": "5837b62cda6487773ebd2cb14c9e5365673c5572ddd8ca993b070076af88ace4"
},
"downloads": -1,
"filename": "scunch-0.5.0.zip",
"has_sig": false,
"md5_digest": "f3952796a2c7e67691ee03e3312f89df",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 57556,
"upload_time": "2011-02-12T05:57:38",
"url": "https://files.pythonhosted.org/packages/e7/b5/9c776973939f1864ff7024accb3da07c8dbe99075c57a3b9104f02bc93e6/scunch-0.5.0.zip"
}
],
"0.5.1": [
{
"comment_text": "",
"digests": {
"md5": "1cde4fbbb4333a1aa51bd21e5dbdfad3",
"sha256": "b6f5aed3cb116c0f3f43ca5df001cd6080fa187e168612fc10486ec8dbbe4e72"
},
"downloads": -1,
"filename": "scunch-0.5.1.zip",
"has_sig": false,
"md5_digest": "1cde4fbbb4333a1aa51bd21e5dbdfad3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 62670,
"upload_time": "2011-02-14T23:53:06",
"url": "https://files.pythonhosted.org/packages/ed/fa/b2ec5d4be25ba76c5be3b6ef0309eaba715fa25dd0e8e4ba8472a4722801/scunch-0.5.1.zip"
}
],
"0.5.2": [
{
"comment_text": "",
"digests": {
"md5": "79e3d25c5aab0602c3dbed252758e076",
"sha256": "fd881d83f548abb993e4f29d55fdfcebd32769ae94b83e6515ad2dc02bbcb4ec"
},
"downloads": -1,
"filename": "scunch-0.5.2.zip",
"has_sig": false,
"md5_digest": "79e3d25c5aab0602c3dbed252758e076",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 63538,
"upload_time": "2011-02-17T17:34:43",
"url": "https://files.pythonhosted.org/packages/da/69/6301f7cb2a6f0c506b939f18f8fbdaca13782c65f6137db8497a6000bf55/scunch-0.5.2.zip"
}
],
"0.5.3": [
{
"comment_text": "",
"digests": {
"md5": "e1ca1c35cef159dc33748e523ec8ff8c",
"sha256": "c3e93d92e8b360e4b0ae7931e36a10cc3008b2f7375e3a5641d21e083f1a24e8"
},
"downloads": -1,
"filename": "scunch-0.5.3.zip",
"has_sig": false,
"md5_digest": "e1ca1c35cef159dc33748e523ec8ff8c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 66503,
"upload_time": "2011-02-20T16:06:37",
"url": "https://files.pythonhosted.org/packages/d8/63/28edf7b50da0e5de63bf3a233364fd1b12b5ce4baa1174a0819070f5eaf4/scunch-0.5.3.zip"
}
],
"0.5.4": [
{
"comment_text": "",
"digests": {
"md5": "f6f048b24c96798dd6c6776e0ee11a75",
"sha256": "e52d9b81de557ae54561c297ad16c67eedb93348f6e0a8b2d36fcd71d26c291f"
},
"downloads": -1,
"filename": "scunch-0.5.4.zip",
"has_sig": false,
"md5_digest": "f6f048b24c96798dd6c6776e0ee11a75",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 68690,
"upload_time": "2011-02-23T21:28:59",
"url": "https://files.pythonhosted.org/packages/a5/21/4fc052f28ae38c72ff1056e20aeadda6ac9bcf96fd83d3d3656fdeb50ee0/scunch-0.5.4.zip"
}
],
"0.5.5": [
{
"comment_text": "",
"digests": {
"md5": "1aab3a60a442a319ae524ae1c1c4104d",
"sha256": "7b8d30b32f3f6d0a18088d607522dfe2ec58d39d3e4f00512572a4454743004b"
},
"downloads": -1,
"filename": "scunch-0.5.5.zip",
"has_sig": false,
"md5_digest": "1aab3a60a442a319ae524ae1c1c4104d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 69844,
"upload_time": "2011-02-28T13:22:36",
"url": "https://files.pythonhosted.org/packages/de/eb/833fced3446c05e8fa74ec1e58198e6955811e7fa943bcd6c7d4d0b38cc1/scunch-0.5.5.zip"
}
],
"0.5.6": [
{
"comment_text": "",
"digests": {
"md5": "9e59153e1d69091a47bfea5188af4bd0",
"sha256": "6f62a1f058bce303b9818b7c0614870525c4ececbc8cc6b135e524641aa884e6"
},
"downloads": -1,
"filename": "scunch-0.5.6.zip",
"has_sig": false,
"md5_digest": "9e59153e1d69091a47bfea5188af4bd0",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 70698,
"upload_time": "2011-03-04T09:24:28",
"url": "https://files.pythonhosted.org/packages/fa/d7/bea206ee6b52c7c39e9a528ac2196e40951fab2f3746fae8e2d3f16e0a55/scunch-0.5.6.zip"
}
],
"0.5.8": [
{
"comment_text": "",
"digests": {
"md5": "24302df2b824d2f3b7e8730d55317cb6",
"sha256": "839b360bae377f7fac1dd717a108851908dfea6b167c5c174e616ede577e6fa9"
},
"downloads": -1,
"filename": "scunch-0.5.8.zip",
"has_sig": false,
"md5_digest": "24302df2b824d2f3b7e8730d55317cb6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 72017,
"upload_time": "2012-05-08T22:44:13",
"url": "https://files.pythonhosted.org/packages/3a/39/ee5d47e0e15ec1b8c24add7b0b7fd83a308591a1c947ab08a27975414478/scunch-0.5.8.zip"
}
]
},
"urls": [
{
"comment_text": "",
"digests": {
"md5": "24302df2b824d2f3b7e8730d55317cb6",
"sha256": "839b360bae377f7fac1dd717a108851908dfea6b167c5c174e616ede577e6fa9"
},
"downloads": -1,
"filename": "scunch-0.5.8.zip",
"has_sig": false,
"md5_digest": "24302df2b824d2f3b7e8730d55317cb6",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 72017,
"upload_time": "2012-05-08T22:44:13",
"url": "https://files.pythonhosted.org/packages/3a/39/ee5d47e0e15ec1b8c24add7b0b7fd83a308591a1c947ab08a27975414478/scunch-0.5.8.zip"
}
]
}