{ "info": { "author": "Marius Gedminas", "author_email": "marius@gedmin.as", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "ghcloneall\n==========\n\nIt's a script to clone/update all repos for a user/organization from GitHub.\n\nTarget audience: maintainers of large collections of projects (for example,\nZopeFoundation members).\n\n\nUsage examples\n--------------\n\nFirst ``pip install ghcloneall``.\n\nClone all mgedmin's vim plugins::\n\n mkdir ~/src/vim-plugins\n cd ~/src/vim-plugins\n ghcloneall --init --user mgedmin --pattern '*.vim'\n ghcloneall\n\nClone all mgedmin's gists::\n\n mkdir ~/src/gists\n cd ~/src/gists\n ghcloneall --init --user mgedmin --gists\n ghcloneall\n\nClone all ZopeFoundation repositories::\n\n mkdir ~/src/zf\n cd ~/src/zf\n ghcloneall --init --org ZopeFoundation\n ghcloneall\n\nHere's a screencast of the above (running a slightly older version so the\nscript name differs):\n\n.. image:: https://asciinema.org/a/29651.png\n :alt: asciicast\n :width: 582\n :height: 380\n :align: center\n :target: https://asciinema.org/a/29651\n\n\nDetails\n-------\n\nWhat it does:\n\n- clones repositories you don't have locally\n- pulls changes for repositories you already have locally\n- warns you about local changes and other unexpected situations:\n\n - unknown files in the tree (in --verbose mode only)\n - staged but not committed changes\n - uncommitted (and unstaged changes)\n - non-master branch checked out\n - committed changes that haven't been pushed to master\n - remote URL pointing to an unexpected location (in --verbose mode only)\n\nYou can ask it to not change any files on disk and just look for pending\nchanges by running ``ghcloneall --dry-run``. This will also make the\ncheck faster!\n\n\nSynopsis\n--------\n\nOther command-line options::\n\n $ ghcloneall --help\n usage: ghcloneall [-h] [--version] [-c CONCURRENCY] [-n] [-q] [-v]\n [--start-from REPO] [--organization ORGANIZATION]\n [--user USER] [--gists] [--repositories] [--pattern PATTERN]\n [--include-forks] [--exclude-forks] [--include-archived]\n [--exclude-archived] [--include-private] [--exclude-private]\n [--include-disabled] [--exclude-disabled] [--init]\n [--http-cache DBNAME] [--no-http-cache]\n\n Clone/update all user/org repositories from GitHub.\n\n optional arguments:\n -h, --help show this help message and exit\n --version show program's version number and exit\n -c CONCURRENCY, --concurrency CONCURRENCY\n set concurrency level (default: 4)\n -n, --dry-run don't pull/clone, just print what would be done\n -q, --quiet terser output\n -v, --verbose perform additional checks\n --start-from REPO skip all repositories that come before REPO\n alphabetically\n --organization ORGANIZATION\n specify the GitHub organization\n --user USER specify the GitHub user\n --gists clone user's gists\n --repositories clone user's or organisation's repositories (default)\n --pattern PATTERN specify repository name glob pattern to filter\n --include-forks include repositories forked from other users/orgs\n --exclude-forks exclude repositories forked from other users/orgs\n (default)\n --include-archived include archived repositories\n --exclude-archived exclude archived repositories (default)\n --include-private include private repositories (default)\n --exclude-private exclude private repositories\n --include-disabled include disabled repositories (default)\n --exclude-disabled exclude disabled repositories\n --init create a .ghcloneallrc from command-line arguments\n --http-cache DBNAME cache HTTP requests on disk in an sqlite database for\n 5 minutes (default: .httpcache)\n --no-http-cache disable HTTP disk caching\n\n\nConfiguration file\n------------------\n\nThe script looks for ``.ghcloneallrc`` in the current working directory, which\nshould look like this::\n\n [ghcloneall]\n # Provide either github_user or github_org, but not both\n # github_org = ZopeFoundation\n github_user = mgedmin\n pattern = *.vim\n # You can also uncomment and change these if you wish\n # gists = False\n # include_forks = False\n # include_archived = False\n # include_private = True\n # include_disabled = True\n\nYou can create one with ``ghcloneall --init --{user,org} X [--pattern Y]\n[--{include,exclude}-{forks,archived,private,disabled}] [--gists|--repos]``.\n\n\nTips\n----\n\nFor best results configure SSH persistence to speed up git pulls -- in your\n``~/.ssh/config``::\n\n Host github.com\n ControlMaster auto\n ControlPersist yes\n ControlPath ~/.ssh/control-%r@%h-%p\n\nIt takes about 80 seconds to run ``git pull`` on all 382 ZopeFoundation\nrepos on my laptop with this kind of setup.\n\n\nChangelog\n=========\n\n\n1.9.2 (2019-10-15)\n------------------\n\n- Add support for Python 3.8.\n\n\n1.9.1 (2019-10-07)\n------------------\n\n- Reuse HTTP connections for GitHub API requests.\n\n\n1.9.0 (2019-09-06)\n------------------\n\n- Can now clone all user's gists.\n- Command line args: --gists, --repos.\n\n\n1.8.0 (2019-08-28)\n------------------\n\n- Skip forks and archived repositories by default.\n- Command-line args: --include-forks, --exclude-forks.\n- Command-line args: --include-archived, --exclude-archived.\n- Command-line args: --include-private, --exclude-private.\n- Command-line args: --include-disabled, --exclude-disabled.\n- Use a custom User-Agent header when talking to GitHub.\n\n\n1.7.1 (2019-08-14)\n------------------\n\n- Drop support for Python 3.3 and 3.4.\n- Add a test suite.\n- Fix AttributeError: 'str' object has no attribute 'format_map' on Python 2.\n\n\n1.7.0 (2018-12-19)\n------------------\n\n- Command line args: -q, --quiet\n- Fix display corruption on ^C\n\n\n1.6.1 (2018-10-19)\n------------------\n\n- Fix TypeError: get() got an unexpected keyword argument 'fallback' on\n Python 2.\n\n\n1.6 (2016-12-29)\n----------------\n\n- Comprehensive rebranding:\n\n - Rename the GitHub repository to https://github.com/mgedmin/ghcloneall\n - Rename ``cloneall.py`` to ``ghcloneall.py``\n - Rename the config file to ``.ghcloneallrc``, and rename the config\n section to ``[ghcloneall]``.\n\n- Don't print tracebacks on ^C (this regressed in 1.5).\n\n\n1.5 (2016-12-29)\n----------------\n\n- Released to PyPI as ``ghcloneall``\n- Added Python 2.7 support\n\n\n1.4 (2016-12-28)\n----------------\n\n- Command line args: --user, --pattern, --init\n- Load (some) options from a ``.cloneallrc``\n- Stop using ``--organization=ZopeFoundation`` by default, require an\n explicit option (or config file)\n- Rename clone_all_zf_repos.py to cloneall.py\n\n\n1.3 (2016-12-28)\n----------------\n\n- Command line args: -c\n- Show progress while fetching the list of repositories from GitHub\n- Update repositories concurrently by default\n- Highlight items in progress\n- Highlight failed items in red\n- Tweak progress bar style from ``[=== ]`` to ``[###..]``\n- Clear the progress bar on ^C\n- Handle git errors nicely\n- Bugfix: -vv could fail with NameError if unknown files were present in a\n working tree\n- Bugfix: correctly show progress when using --start-from\n- Bugfix: script would hang (for 10 minutes) if you didn't already have an\n SSH control master process running\n- Bugfix: --dry-run didn't show which repos were new\n\n\n1.2 (2016-11-09)\n----------------\n\n- Command line args: --dry-run, --verbose\n- Cache HTTP responses on disk for 10 minutes to avoid GitHub API rate limits\n- Report about forgotten uncommitted and staged changes\n- Warn about local (unpushed) commits too\n- Warn about other branches being checked out\n- Default to SSH URLs again (faster when using SSH's ControlPersist)\n\n\n1.1 (2015-11-07)\n----------------\n\n- Command line args: --version, --start-from, --organization\n- Output formatting: shorter repository names, totals at the end\n- Use ANSI colors to indicate changes\n- Don't print tracebacks on ^C\n- Default to HTTPS URLs\n\n\n1.0 (2015-11-07)\n----------------\n\n- Moved from a gist to a proper GitHub repository.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/mgedmin/ghcloneall", "keywords": "github git clone automation", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "ghcloneall", "package_url": "https://pypi.org/project/ghcloneall/", "platform": "", "project_url": "https://pypi.org/project/ghcloneall/", "project_urls": { "Homepage": "https://github.com/mgedmin/ghcloneall" }, "release_url": "https://pypi.org/project/ghcloneall/1.9.2/", "requires_dist": [ "requests", "requests-cache", "futures ; python_version==\"2.7\"" ], "requires_python": "", "summary": "Clone/update all user/organization GitHub repositories", "version": "1.9.2" }, "last_serial": 5975229, "releases": { "1.5": [ { "comment_text": "", "digests": { "md5": "653667a2870e148357cb035311bdc611", "sha256": "3f4781ebef4d9276c5754ab8932105d60ff5994f0858694c8625c3d83c0fea40" }, "downloads": -1, "filename": "ghcloneall-1.5.tar.gz", "has_sig": false, "md5_digest": "653667a2870e148357cb035311bdc611", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11983, "upload_time": "2016-12-29T07:49:01", "url": "https://files.pythonhosted.org/packages/dd/8b/0b4de10fa40edb4514f43ee226742dc2023b31bc451935f2e5c0c2dc5f8a/ghcloneall-1.5.tar.gz" } ], "1.6": [ { "comment_text": "", "digests": { "md5": "36f3550b0aefe55d18494cb41c750051", "sha256": "e94ea37eb6bba120ff1d50626b8e7077fd61e8ba66f579b43f018df039b18060" }, "downloads": -1, "filename": "ghcloneall-1.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "36f3550b0aefe55d18494cb41c750051", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14550, "upload_time": "2016-12-29T08:25:11", "url": "https://files.pythonhosted.org/packages/d4/ba/79464f97b106c0028c6bcf7b08ba6695b50c8b769005de3e097a16c00a71/ghcloneall-1.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cff5b73a76447485896220fb790050cc", "sha256": "ae38ea8add4f18b806225f9f3bf863eab2b1f3bd2ea80f982568c4086cf2ba8a" }, "downloads": -1, "filename": "ghcloneall-1.6.tar.gz", "has_sig": false, "md5_digest": "cff5b73a76447485896220fb790050cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12347, "upload_time": "2016-12-29T08:22:47", "url": "https://files.pythonhosted.org/packages/3b/8d/660f74d03a4d52223e84cceb16fff0d530617f9c83574f8ec84d6ff759cd/ghcloneall-1.6.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "6c54f08b8013b04c7f54721a0af4f507", "sha256": "06406d1ae1e85e79b99a0fe7c053cc2b32b9258f5fe658677acd3dffa8f260b5" }, "downloads": -1, "filename": "ghcloneall-1.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6c54f08b8013b04c7f54721a0af4f507", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 11133, "upload_time": "2018-10-18T21:40:33", "url": "https://files.pythonhosted.org/packages/2c/96/fa263f8b63f452e5a4d4b6688a62a274fc02a2fdfa7b81a14e64a31106a2/ghcloneall-1.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5499c4fbacaf674c575b556dc6ff98f6", "sha256": "cdce59aa2693979de489303d22ac55717c0dc939476e4e4db71eea313ac38970" }, "downloads": -1, "filename": "ghcloneall-1.6.1.tar.gz", "has_sig": false, "md5_digest": "5499c4fbacaf674c575b556dc6ff98f6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12366, "upload_time": "2018-10-18T21:40:34", "url": "https://files.pythonhosted.org/packages/aa/7f/25d74c5a830b007a0b639e245337d91d4ebf6579081a1876c49282228748/ghcloneall-1.6.1.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "506ffcb40a4851969c35d0a7f702d846", "sha256": "2fb0ace62c64a4d9f7755efc376a5974138f3aa8e566896930a488c251286966" }, "downloads": -1, "filename": "ghcloneall-1.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "506ffcb40a4851969c35d0a7f702d846", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12034, "upload_time": "2018-12-19T15:34:42", "url": "https://files.pythonhosted.org/packages/4f/e9/3db4650c4543c4acc5555f60dc5437c17edc033064654a79d2494c6b79a6/ghcloneall-1.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e92151c76615299b6a9946d0fcbe7fe3", "sha256": "1c8453d5ce2234eb16c69d7380a7583446006b4c9268f1b810d94900866f276d" }, "downloads": -1, "filename": "ghcloneall-1.7.0.tar.gz", "has_sig": false, "md5_digest": "e92151c76615299b6a9946d0fcbe7fe3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13305, "upload_time": "2018-12-19T15:34:44", "url": "https://files.pythonhosted.org/packages/2a/3e/47c9047cd1ce8993262f60215c090179050c0364db8b4b64a55b05a6ba5f/ghcloneall-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "bd96b3eb135192534c3b92e8f8fd7e3b", "sha256": "5a744ccc61d08df507cd74bedbbfd518691d7a2417d0e423c4b1cd619d82703c" }, "downloads": -1, "filename": "ghcloneall-1.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "bd96b3eb135192534c3b92e8f8fd7e3b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 12201, "upload_time": "2019-08-14T15:58:03", "url": "https://files.pythonhosted.org/packages/aa/01/241fdd407762293ed93ebb4edef4a173fb313ce97bbc0a97843f70a72ba8/ghcloneall-1.7.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "948d3d5bf2390cc50a16eeebf5249c91", "sha256": "1aa3860f733cc7da7a29076f3ff51afa5514b186ae5eb7612b52fed47ab0a008" }, "downloads": -1, "filename": "ghcloneall-1.7.1.tar.gz", "has_sig": false, "md5_digest": "948d3d5bf2390cc50a16eeebf5249c91", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20489, "upload_time": "2019-08-14T15:58:05", "url": "https://files.pythonhosted.org/packages/d4/01/0402881b20be30148d39fc0817c8a7354aabf4c4a7ccc1ade60bd5f97edb/ghcloneall-1.7.1.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "38d7c03b50f92c58ad8bf7c3771bb384", "sha256": "dfaa3db8909ec9d4677b7eca5a7556fb459cd1af2a2d8e67879891927834e201" }, "downloads": -1, "filename": "ghcloneall-1.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "38d7c03b50f92c58ad8bf7c3771bb384", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 13620, "upload_time": "2019-08-28T15:34:30", "url": "https://files.pythonhosted.org/packages/42/f9/cd8ceb7d0ae98392491f61621f87f94af3d3941dd2e0611165b678d051ad/ghcloneall-1.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e9419b49c34d6a2fd641a8921b4711d", "sha256": "23ac9476cff18ec14b215cfede5cefb7cb914c4ead6eeb89a8b8097350b0553d" }, "downloads": -1, "filename": "ghcloneall-1.8.0.tar.gz", "has_sig": false, "md5_digest": "0e9419b49c34d6a2fd641a8921b4711d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 22374, "upload_time": "2019-08-28T15:34:33", "url": "https://files.pythonhosted.org/packages/17/82/630fb6c5b7be2b472d3495abb5fc780d88b44fbdb052dfe801bc72fca3ab/ghcloneall-1.8.0.tar.gz" } ], "1.9.0": [ { "comment_text": "", "digests": { "md5": "9bcb107990b2c7e58651645c548eddf9", "sha256": "e7f890f989ea5bc541bd84954095b1763cc3e99266063e2cedcd8f0cd88df9c6" }, "downloads": -1, "filename": "ghcloneall-1.9.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "9bcb107990b2c7e58651645c548eddf9", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14264, "upload_time": "2019-09-06T07:50:13", "url": "https://files.pythonhosted.org/packages/69/d3/d086334d3fc4b22ec10f48691d373e01ce78016a17503441407475258035/ghcloneall-1.9.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b61724825598b425bbe6a80fe3380699", "sha256": "88ec69c5280a9d701dd5fc83c59f7d2332ddca0f1f9979469c689f2879618158" }, "downloads": -1, "filename": "ghcloneall-1.9.0.tar.gz", "has_sig": false, "md5_digest": "b61724825598b425bbe6a80fe3380699", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23548, "upload_time": "2019-09-06T07:50:28", "url": "https://files.pythonhosted.org/packages/9a/83/bc5e2eaba2ff540e80e5e2a4015f22d6addce1954df8444fe07a0d580d4c/ghcloneall-1.9.0.tar.gz" } ], "1.9.1": [ { "comment_text": "", "digests": { "md5": "125a95def5a969ec1a8ab9f0e33fec87", "sha256": "6f8f22af0fb1cd21ed82d895cc95b084c9d679f79cdd1e7df7b0540700c4129d" }, "downloads": -1, "filename": "ghcloneall-1.9.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "125a95def5a969ec1a8ab9f0e33fec87", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14338, "upload_time": "2019-10-07T14:50:11", "url": "https://files.pythonhosted.org/packages/c1/39/c6d6f20ea463c490aa58458d79e6551882df3e235085e0ef9911ca2437e3/ghcloneall-1.9.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fe7f4e57f2edb771763272219b0f80be", "sha256": "9f0cd120dd72e7a273ef5c40d31a940bee1d98b50d7ec2123c75f124c6cc2776" }, "downloads": -1, "filename": "ghcloneall-1.9.1.tar.gz", "has_sig": false, "md5_digest": "fe7f4e57f2edb771763272219b0f80be", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23660, "upload_time": "2019-10-07T14:50:13", "url": "https://files.pythonhosted.org/packages/08/30/26db08c17e8692d02dd5684851888f8735e50bbc994f83d610bbe1072494/ghcloneall-1.9.1.tar.gz" } ], "1.9.2": [ { "comment_text": "", "digests": { "md5": "595e04dbd3d8287d8d278d73fe4b0255", "sha256": "208045d78af7e4b574e3774dd7612d1d9a72baa921a70ec4fd9a9895734959e8" }, "downloads": -1, "filename": "ghcloneall-1.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "595e04dbd3d8287d8d278d73fe4b0255", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14360, "upload_time": "2019-10-15T07:10:36", "url": "https://files.pythonhosted.org/packages/3e/ca/5dbb696872f0d9adf5c41425f3db3ca5f0e5c523f140dfdc9a8878cc607f/ghcloneall-1.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f86eacab0fc5435227d72c55905e8f2", "sha256": "1f4e1e10b1b71d5ecee62ba26e0ffa1c3b8d5d9eb7dcae2fe7ab13539807d2d6" }, "downloads": -1, "filename": "ghcloneall-1.9.2.tar.gz", "has_sig": false, "md5_digest": "0f86eacab0fc5435227d72c55905e8f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23676, "upload_time": "2019-10-15T07:10:39", "url": "https://files.pythonhosted.org/packages/e1/7e/02c842be77dde93f3e79bbaca4c23044725761a5d29a8abc6e6079fbe8b0/ghcloneall-1.9.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "595e04dbd3d8287d8d278d73fe4b0255", "sha256": "208045d78af7e4b574e3774dd7612d1d9a72baa921a70ec4fd9a9895734959e8" }, "downloads": -1, "filename": "ghcloneall-1.9.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "595e04dbd3d8287d8d278d73fe4b0255", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14360, "upload_time": "2019-10-15T07:10:36", "url": "https://files.pythonhosted.org/packages/3e/ca/5dbb696872f0d9adf5c41425f3db3ca5f0e5c523f140dfdc9a8878cc607f/ghcloneall-1.9.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0f86eacab0fc5435227d72c55905e8f2", "sha256": "1f4e1e10b1b71d5ecee62ba26e0ffa1c3b8d5d9eb7dcae2fe7ab13539807d2d6" }, "downloads": -1, "filename": "ghcloneall-1.9.2.tar.gz", "has_sig": false, "md5_digest": "0f86eacab0fc5435227d72c55905e8f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23676, "upload_time": "2019-10-15T07:10:39", "url": "https://files.pythonhosted.org/packages/e1/7e/02c842be77dde93f3e79bbaca4c23044725761a5d29a8abc6e6079fbe8b0/ghcloneall-1.9.2.tar.gz" } ] }