{ "info": { "author": "Emanuel Feld", "author_email": "elefbet@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5" ], "description": "======\r\nPoirot\r\n======\r\n\r\nPoirot helps you investigate your repositories. Give him a set of clues (e.g. strings or regular expressions) and he will report back any place they appear in your repository's revision history.\r\n\r\nWhen used as a pre-commit hook, Poirot can warn you if you're about to commit something you might not intend (think passwords, private keys, tokens, and other bits of sensitive or personally identifiable information).\r\n\r\nPoirot began as a fork of CFPB's fellow gumshoe, `Clouseau `_.\r\n\r\nDependencies\r\n=============\r\n* git\r\n* Python 2.7 or 3.3+\r\n* a UNIX-based OS (e.g. Mac or Linux) or a UNIX-y shell on Windows (e.g. `Cygwin `_, `Babun `_, or `Git-Bash `_). It will not work with the default Windows Command Prompt (cmd).\r\n\r\nPoirot uses these Python packages:\r\n\r\n* `Jinja2 `_ to format its console output\r\n* `tqdm `_ to display a progress bar\r\n* `regex `_ to allow for POSIX ERE regular expressions\r\n* `requests `_ to read remote pattern files\r\n\r\nInstallation\r\n==============\r\nPoirot is available on PyPi and can be `installed with pip `_ as:\r\n\r\n.. code:: bash\r\n\r\n pip install poirot\r\n\r\nYou may want to install it in a virtual environment, unless you plan on using Poirot in a global commit hook.\r\n\r\nIn that case, you will have to ensure that you have done a global pip install for any Python versions you are using. E.g., if you want to run it on Python 2.7, 3.3, and 3.5 installed, install Poirot as follows:\r\n\r\n.. code:: bash\r\n\r\n pip2.7 install poirot\r\n pip3.3 install poirot\r\n pip3.5 install poirot\r\n\r\nRunning Poirot from the Command Line\r\n========================================\r\nTo invoke Poirot and see his findings, call him from the command line with :code:`poirot` and the following optional arguments:\r\n\r\n* **--url**: The repository's URL, e.g. :code:`https://github.com/DCgov/poirot.git` or :code:`git@github.com:DCgov/poirot.git`. When included, you will be given the choice to clone or pull from the remote URL. Default value: none.\r\n* **--dir**: The local path to your repository's base directory or the directory you would like to clone or pull to. Default value: the current working directory.\r\n* **--term**: A single term or regular expression to search for. Default value: none.\r\n* **--patterns**: The path to a .txt file with strings or regular expression patterns, each on its own line. These can be the file's URL or its relative or absolute local path. You can give a comma-separated list of pattern files, if you wish to include more than one. Default value: `default.txt `_.\r\n* **--staged**: A flag, which when included, restricts search to staged revisions. This is helpful, along with :code:`--dir`, as part of a pre-commit hook.\r\n* **--revlist**: A range of revisions to inspect. Default value: The last commit (i.e. :code:`HEAD^!`) if :code:`--staged` is not included, otherwise none.\r\n* **--verbose**: A flag to output verbose, colorful output and pattern-match highlighting. The GIF above gives an example with --verbose included.\r\n* **--before**: Date restriction on revisions. Default value: none.\r\n* **--after**: Date restriction on revisions. Default value: none.\r\n* **--author**: Authorship restriction on revisions. Default value: none.\r\n* **--output**: File to output results as JSON. Default value: none.\r\n\r\nExamples\r\n_________\r\n\r\nThe most basic command Poirot will accept is:\r\n\r\n.. code:: bash\r\n\r\n poirot\r\n\r\nThat will search the current git directory's last commit (i.e. :code:`HEAD^!`) for the patterns in `the default pattern file `_.\r\n\r\nTo specify one or more different patterns files (each separated by a comma), do this instead:\r\n\r\n.. code:: bash\r\n\r\n poirot --patterns='../path/to/thisisapatternfile.txt,/Users/myusername/anotherpatternfile.txt'\r\n\r\nThe --patterns option also allows files accessible over HTTP, like `this one here `_:\r\n\r\n.. code:: bash\r\n\r\n poirot --patterns='https://raw.githubusercontent.com/DCgov/poirot/master/poirot/patterns/default.txt'\r\n\r\nTo search for a single term (like :code:`password`):\r\n\r\n.. code:: bash\r\n\r\n poirot --term=\"password\"\r\n\r\nSay you want to search for :code:`password` in the whole revision history of all branches. Then do:\r\n\r\n.. code:: bash\r\n\r\n poirot --term=\"password\" --revlist=\"all\"\r\n\r\nYou can further restrict the set of revisions Poirot looks through with the :code:`before`, :code:`after`, and :code:`author` options (which correspond to the `same flags in git `_). E.g.:\r\n\r\n.. code:: bash\r\n\r\n poirot --term=\"password\" --revlist=40dc6d1...3e4c011 --before=\"2015-11-28\" --after=\"2015-10-01\" --author=\"me@poirot.com\"\r\n\r\nPerhaps you don't have the repository available locally or you would like to update it from a remote URL. Just add the :code:`url` to your command and it will allow you to clone or pull to the current folder.\r\n\r\n.. code:: bash\r\n\r\n poirot --url https://github.com/foo/baz.git --term=\"password\"\r\n\r\nYou can also specify a different directory than the current one with :code:`dir`. The following command will clone/pull to the folder :code:`thisotherfolder`, which sits inside of the current directory. If it does not yet exist, it will be created.\r\n\r\n.. code:: bash\r\n\r\n poirot --url https://github.com/foo/baz.git --term=\"password\" --dir=\"thisotherfolder\"\r\n\r\nTo search changes that have been staged for commit, but not yet committed, use the :code:`staged` flag:\r\n\r\n.. code:: bash\r\n\r\n poirot --term=\"password\" --staged", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/emanuelfeld/poirot", "keywords": "", "license": "https://raw.githubusercontent.com/emanuelfeld/poirot/master/LICENSE.md", "maintainer": "", "maintainer_email": "", "name": "poirot", "package_url": "https://pypi.org/project/poirot/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/poirot/", "project_urls": { "Homepage": "https://github.com/emanuelfeld/poirot" }, "release_url": "https://pypi.org/project/poirot/1.0.1/", "requires_dist": [ "tqdm (>=3.4.0)", "Jinja2 (>=2.8)", "regex (>=2015.11.22)", "requests (>=2.9.1)" ], "requires_python": "", "summary": "Search a Git repository's full revision history (commit messages and diffs) for text patterns.", "version": "1.0.1" }, "last_serial": 2181267, "releases": { "0.0.18": [ { "comment_text": "", "digests": { "md5": "6747913e686b8819eaeeadb9a46b01bd", "sha256": "f1db0144a338ea04b4f6e0c5117ebb1808464c3b21d6ecd29b40a17b49f186c6" }, "downloads": -1, "filename": "poirot-0.0.18-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6747913e686b8819eaeeadb9a46b01bd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15747, "upload_time": "2016-01-04T17:35:47", "url": "https://files.pythonhosted.org/packages/c9/49/2a05e13e7d045e05001ee2bea3d6897632365e38958612b8213203d2c36a/poirot-0.0.18-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e57e65a6c67a2cf94c893e554e000d9", "sha256": "864c6a091e70523b72204eab6b6f43076e0e12d322fdeeabb1f9ef2fc4b1fbfe" }, "downloads": -1, "filename": "poirot-0.0.18.tar.gz", "has_sig": false, "md5_digest": "1e57e65a6c67a2cf94c893e554e000d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15310, "upload_time": "2016-01-04T17:35:52", "url": "https://files.pythonhosted.org/packages/36/cb/89a4e2e86d59f81611fa3cce256891c813012c38cdaa7c2d51ac0936fbdf/poirot-0.0.18.tar.gz" } ], "0.0.19": [ { "comment_text": "", "digests": { "md5": "f7a42d3ed73002cd72075bdcc150d87c", "sha256": "1ed60a0a2233351ade9f388c12062a926198917aa74fc9df05f81a0c6ed9990d" }, "downloads": -1, "filename": "poirot-0.0.19-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "f7a42d3ed73002cd72075bdcc150d87c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15754, "upload_time": "2016-01-04T18:47:03", "url": "https://files.pythonhosted.org/packages/d0/8a/9e0897ad92ffc1a2667733d3fb379625beef4ee3f6584de762cc737250c4/poirot-0.0.19-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7eeb79775fc1d2190a3a938555a2413e", "sha256": "55ff27bf98a58cdb7307eced15c105b0bf996969533a0590fdd4f88106ba76ed" }, "downloads": -1, "filename": "poirot-0.0.19.tar.gz", "has_sig": false, "md5_digest": "7eeb79775fc1d2190a3a938555a2413e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15318, "upload_time": "2016-01-04T18:47:09", "url": "https://files.pythonhosted.org/packages/fc/86/3a205f7cd16e8ba06b56b994fc7956ff2a36133f2973942b4bdbe18e3761/poirot-0.0.19.tar.gz" } ], "0.0.21": [ { "comment_text": "", "digests": { "md5": "2207de262001f42416d5bc85bb06d6a2", "sha256": "f4d0c28d11cc0659efef19cabd873eae74807c8694f606ac74cb3005397d566b" }, "downloads": -1, "filename": "poirot-0.0.21-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2207de262001f42416d5bc85bb06d6a2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16383, "upload_time": "2016-01-06T20:14:31", "url": "https://files.pythonhosted.org/packages/99/b3/d74dd962a97472ab81794e1b4c646571834eb91920a2e24e30828bc331b5/poirot-0.0.21-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "af09015647526bf816d92f8020f2e055", "sha256": "55f04bc84d547fec0ad19424d5a101f9a67f45f59a9aa82001b64bfda028fa68" }, "downloads": -1, "filename": "poirot-0.0.21.tar.gz", "has_sig": false, "md5_digest": "af09015647526bf816d92f8020f2e055", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16335, "upload_time": "2016-01-06T20:14:53", "url": "https://files.pythonhosted.org/packages/78/bc/19627af28c7cec656fae3fe0e27da259cd20bd736e5e093f78fca857d2b4/poirot-0.0.21.tar.gz" } ], "0.0.22": [ { "comment_text": "", "digests": { "md5": "2250ac98517b266a784ff3e6858a92aa", "sha256": "84569982dbf121977cd57da66573fb45694dd2ce754512cea2d443650c273439" }, "downloads": -1, "filename": "poirot-0.0.22-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2250ac98517b266a784ff3e6858a92aa", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16480, "upload_time": "2016-01-07T23:34:21", "url": "https://files.pythonhosted.org/packages/db/ec/f4cb92da1b2a110c82b85ad3bdf30ae828156130fec21604b1b42010ca6f/poirot-0.0.22-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c59955ca1919a5b29b6d1cbfa73da133", "sha256": "fc401592b7e647edea95d31e5689f85e85343651b4522df2516dfddada943f28" }, "downloads": -1, "filename": "poirot-0.0.22.tar.gz", "has_sig": false, "md5_digest": "c59955ca1919a5b29b6d1cbfa73da133", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16483, "upload_time": "2016-01-07T23:34:26", "url": "https://files.pythonhosted.org/packages/b6/ce/b29f2cda8315421b245c9be9b91c5956550a5db6b9037c240b2147193006/poirot-0.0.22.tar.gz" } ], "0.0.23": [ { "comment_text": "", "digests": { "md5": "0b554fb50fd4b4c5da7cee485f5db90f", "sha256": "d46500ce315fbfde713c5395e593eafe6b2965f0c1c7e8c486517e3a85cfed1c" }, "downloads": -1, "filename": "poirot-0.0.23-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "0b554fb50fd4b4c5da7cee485f5db90f", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 16967, "upload_time": "2016-01-08T22:25:33", "url": "https://files.pythonhosted.org/packages/08/ea/6974d193812a213491b163112451c2295fc7f1a9f297a9c0a0f78688f893/poirot-0.0.23-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d50bc91a0dc6dee21318bd46001a4574", "sha256": "d5fd4a24a8825baaa58fa7b019be80a03eab745a64e60a33e2464a473067dc90" }, "downloads": -1, "filename": "poirot-0.0.23.tar.gz", "has_sig": false, "md5_digest": "d50bc91a0dc6dee21318bd46001a4574", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17091, "upload_time": "2016-01-08T22:25:39", "url": "https://files.pythonhosted.org/packages/b2/22/378968e9535d0a0f2a5d05486f5b4f846aa8303e7f9434f6b81b0f316da4/poirot-0.0.23.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "c3b3313a7c79eeebad8fae9ac435d579", "sha256": "ef3ba07636b7e5a5df22302a1a249624429e5adcca2f2972c63df850eede6430" }, "downloads": -1, "filename": "poirot-0.1.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c3b3313a7c79eeebad8fae9ac435d579", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17182, "upload_time": "2016-02-08T19:39:59", "url": "https://files.pythonhosted.org/packages/83/34/4cc843b0683bbcb289e89070485c64ea01a457c4862cdd16f5a8eec34797/poirot-0.1.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3d28cfc088f5808196275577ce5ec0fe", "sha256": "00c5dae674e3d4a8a6956a82eaf3606eaa4b4c18f949aeae32b4269f0ae50a98" }, "downloads": -1, "filename": "poirot-0.1.0.tar.gz", "has_sig": false, "md5_digest": "3d28cfc088f5808196275577ce5ec0fe", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17415, "upload_time": "2016-02-08T19:40:25", "url": "https://files.pythonhosted.org/packages/60/b8/2cfb44c9595fe813fa8174ee9ecd00fe810b2839e55bee8eb8bff7e5b5e1/poirot-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "4602f9d7571e3ac4dd8bbdfe2712abdc", "sha256": "33ab1f86b5cdbf35f08271b478a23ccb92945fa514af1c884540718448f3555f" }, "downloads": -1, "filename": "poirot-0.2.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "4602f9d7571e3ac4dd8bbdfe2712abdc", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20822, "upload_time": "2016-03-11T15:43:51", "url": "https://files.pythonhosted.org/packages/80/d0/127f463821713a32b9c13754ff1484f48876dc3de721309d376a9586d1b1/poirot-0.2.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7e00ed5a5d3b3ca09df8eef204cb3f34", "sha256": "03f77d5d07a0fa0d116a30934b25251cbb94b1aa8703a06dfd826d0beb6afdd6" }, "downloads": -1, "filename": "poirot-0.2.0.tar.gz", "has_sig": false, "md5_digest": "7e00ed5a5d3b3ca09df8eef204cb3f34", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17027, "upload_time": "2016-03-11T15:44:21", "url": "https://files.pythonhosted.org/packages/ab/a4/1b9a69e5cb095176e0f78cdc4bcaae56297b1a84645e835b5b3ab667cb2d/poirot-0.2.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "c492e3f904bd386aed75b0708b623e7d", "sha256": "7ae197b4c1acc532de6779ad3b2b291665ed0b027e26e75c525c963d41077a12" }, "downloads": -1, "filename": "poirot-1.0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "c492e3f904bd386aed75b0708b623e7d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 21087, "upload_time": "2016-06-21T21:06:46", "url": "https://files.pythonhosted.org/packages/67/b7/657ffe8bc8a2914f062920257ee96e96200a164d09145c0c9c2973e908c9/poirot-1.0.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ae058f321c598a1a6979fa60a3249c52", "sha256": "fe16484129b4fc2f130ff624646bdcb4c340f92bfb2fbb3c8e29ae97203271c6" }, "downloads": -1, "filename": "poirot-1.0.0.tar.gz", "has_sig": false, "md5_digest": "ae058f321c598a1a6979fa60a3249c52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17358, "upload_time": "2016-06-21T21:07:01", "url": "https://files.pythonhosted.org/packages/a6/02/e0f38e80c3b54286875f00cdcbcfcde4c561bf6d9b7b6dbd6b2b535fd8ae/poirot-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "cd7f199889b4d186938bc4a56bee9b22", "sha256": "fab31c089b99dabd4fd5bea7616a4475063455ae64c8b8b70d46888cebe7ae88" }, "downloads": -1, "filename": "poirot-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cd7f199889b4d186938bc4a56bee9b22", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20871, "upload_time": "2016-06-22T11:37:12", "url": "https://files.pythonhosted.org/packages/9c/5b/ea5405ee6c03ef77fd06c281d20c57577e2da2615097a5f88817a6e3ca30/poirot-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dca4d74edbad5553beeb74c030b9d18d", "sha256": "3437901a1e6368b367a2412c7c6f53c962cb2e941f22866bdc41eba2700c1fc3" }, "downloads": -1, "filename": "poirot-1.0.1.tar.gz", "has_sig": false, "md5_digest": "dca4d74edbad5553beeb74c030b9d18d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17168, "upload_time": "2016-06-22T11:37:16", "url": "https://files.pythonhosted.org/packages/04/1b/50b77d35d438c0db30aef4404d3e82894bd980d2dba88774874e95c331aa/poirot-1.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "cd7f199889b4d186938bc4a56bee9b22", "sha256": "fab31c089b99dabd4fd5bea7616a4475063455ae64c8b8b70d46888cebe7ae88" }, "downloads": -1, "filename": "poirot-1.0.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "cd7f199889b4d186938bc4a56bee9b22", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 20871, "upload_time": "2016-06-22T11:37:12", "url": "https://files.pythonhosted.org/packages/9c/5b/ea5405ee6c03ef77fd06c281d20c57577e2da2615097a5f88817a6e3ca30/poirot-1.0.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dca4d74edbad5553beeb74c030b9d18d", "sha256": "3437901a1e6368b367a2412c7c6f53c962cb2e941f22866bdc41eba2700c1fc3" }, "downloads": -1, "filename": "poirot-1.0.1.tar.gz", "has_sig": false, "md5_digest": "dca4d74edbad5553beeb74c030b9d18d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17168, "upload_time": "2016-06-22T11:37:16", "url": "https://files.pythonhosted.org/packages/04/1b/50b77d35d438c0db30aef4404d3e82894bd980d2dba88774874e95c331aa/poirot-1.0.1.tar.gz" } ] }