git-fame
========
Pretty-print ``git`` repository collaborators sorted by contributions.
|Py-Versions| |PyPI| |Conda-Forge| |Docker| |Snapcraft|
|Build-Status| |Coverage-Status| |Branch-Coverage-Status| |Codacy-Grade| |Libraries-Rank| |PyPI-Downloads|
|DOI-URI| |LICENCE| |OpenHub-Status| |Sponsor-Casper|
.. code:: sh
~$ git fame --cost hour,month --loc ins
Processing: 100%|██████████████████████████| 1/1 [00:00<00:00, 2.16repo/s]
Total commits: 1775
Total ctimes: 2770
Total files: 461
Total hours: 449.7
Total loc: 41659
Total months: 151.0
| Author | hrs | mths | loc | coms | fils | distribution |
|:---------------------|------:|-------:|------:|-------:|-------:|:----------------|
| Casper da Costa-Luis | 228 | 108 | 28572 | 1314 | 172 | 68.6/74.0/37.3 |
| Stephen Larroque | 28 | 18 | 5243 | 203 | 25 | 12.6/11.4/ 5.4 |
| pgajdos | 2 | 9 | 2606 | 2 | 18 | 6.3/ 0.1/ 3.9 |
| Martin Zugnoni | 2 | 5 | 1656 | 3 | 3 | 4.0/ 0.2/ 0.7 |
| Kyle Altendorf | 7 | 2 | 541 | 31 | 7 | 1.3/ 1.7/ 1.5 |
| Hadrien Mary | 5 | 1 | 469 | 31 | 17 | 1.1/ 1.7/ 3.7 |
| Richard Sheridan | 2 | 1 | 437 | 23 | 3 | 1.0/ 1.3/ 0.7 |
| Guangshuo Chen | 3 | 1 | 321 | 18 | 7 | 0.8/ 1.0/ 1.5 |
| Noam Yorav-Raphael | 4 | 1 | 229 | 11 | 6 | 0.5/ 0.6/ 1.3 |
| github-actions[bot] | 2 | 1 | 186 | 1 | 51 | 0.4/ 0.1/11.1 |
...
The ``distribution`` column is a percentage breakdown of ``loc/coms/fils``.
(e.g. in the table above, Casper has written surviving code in
``172/461 = 37.3%`` of all files).
------------------------------------------
.. contents:: Table of contents
:backlinks: top
:local:
Installation
------------
Latest PyPI stable release
~~~~~~~~~~~~~~~~~~~~~~~~~~
|PyPI| |PyPI-Downloads| |Libraries-Dependents|
.. code:: sh
pip install git-fame
Latest development release on GitHub
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|GitHub-Status| |GitHub-Stars| |GitHub-Commits| |GitHub-Forks| |GitHub-Updated|
Pull and install:
.. code:: sh
pip install "git+https://github.com/casperdcl/git-fame.git@main#egg=git-fame"
Latest Conda release
~~~~~~~~~~~~~~~~~~~~
|Conda-Forge|
.. code:: sh
conda install -c conda-forge git-fame
Latest Snapcraft release
~~~~~~~~~~~~~~~~~~~~~~~~
|Snapcraft|
.. code:: sh
snap install git-fame
Latest Docker release
~~~~~~~~~~~~~~~~~~~~~
|Docker|
.. code:: sh
docker pull casperdcl/git-fame
docker run --rm casperdcl/git-fame --help
docker run --rm -v </local/path/to/repository>:/repo casperdcl/git-fame
Register alias with git
~~~~~~~~~~~~~~~~~~~~~~~
On Windows, run:
.. code:: sh
git config --global alias.fame "!python -m gitfame"
This is probably not necessary on UNIX systems.
If ``git fame`` doesn't work after restarting the terminal on Linux & Mac OS, try (with single quotes):
.. code:: sh
git config --global alias.fame '!python -m gitfame'
Tab completion
~~~~~~~~~~~~~~
Optionally, systems with ``bash-completion`` can install tab completion
support. The
`git-fame_completion.bash <https://raw.githubusercontent.com/casperdcl/git-fame/main/git-fame_completion.bash>`__
file needs to be copied to an appropriate folder.
On Ubuntu, the procedure would be:
.. code:: sh
$ # Ensure completion works for `git` itself
$ sudo apt-get install bash-completion
$ # Install `git fame` completions
$ sudo wget \
https://raw.githubusercontent.com/casperdcl/git-fame/main/git-fame_completion.bash \
-O /etc/bash_completion.d/git-fame_completion.bash
followed by a terminal restart.
Changelog
---------
The list of all changes is available on the Releases page: |GitHub-Status|.
Usage
-----
.. code:: sh
git fame # If alias registered with git (see above)
git-fame # Alternative execution as python console script
python -m gitfame # Alternative execution as python module
git-fame -h # Print help
For example, to print statistics regarding all source files in a C++/CUDA
repository (``*.c/h/t(pp), *.cu(h)``), carefully handling whitespace and line
copies:
.. code:: sh
git fame --incl '\.[cht][puh]{0,2}$' -twMC
It is also possible to run from within a python shell or script.
.. code:: python
>>> import gitfame
>>> gitfame.main(['--sort=commits', '-wt', '/path/to/my/repo'])
Documentation
-------------
|Py-Versions| |README-Hits|
.. code::
Usage:
git-fame [--help | options] [<gitdir>...]
Arguments:
<gitdir> Git directory [default: ./].
May be specified multiple times to aggregate across
multiple repositories.
Options:
-h, --help Print this help and exit.
-v, --version Print module version and exit.
--branch=<b> Branch or tag [default: HEAD] up to which to check.
--sort=<key> [default: loc]|commits|files|hours|months.
--loc=<type> surv(iving)|ins(ertions)|del(etions)
What `loc` represents. Use 'ins,del' to count both.
defaults to 'surviving' unless `--cost` is specified.
--excl=<f> Excluded files (default: None).
In no-regex mode, may be a comma-separated list.
Escape (\,) for a literal comma (may require \\, in shell).
--incl=<f> Included files [default: .*]. See `--excl` for format.
--since=<date> Date from which to check. Can be absoulte (eg: 1970-01-31)
or relative to now (eg: 3.weeks).
--cost=<method> Include time cost in person-months (COCOMO) or
person-hours (based on commit times).
Methods: month(s)|cocomo|hour(s)|commit(s).
May be multiple comma-separated values.
Alters `--loc` default to imply 'ins' (COCOMO) or
'ins,del' (hours).
-R, --recurse Recursively find repositories & submodules within <gitdir>.
-n, --no-regex Assume <f> are comma-separated exact matches
rather than regular expressions [default: False].
NB: if regex is enabled ',' is equivalent to '|'.
-s, --silent-progress Suppress `tqdm` [default: False].
--warn-binary Don't silently skip files which appear to be binary data
[default: False].
-e, --show-email Show author email instead of name [default: False].
--enum Show row numbers [default: False].
-t, --bytype Show stats per file extension [default: False].
-w, --ignore-whitespace Ignore whitespace when comparing the parent's
version and the child's to find where the lines
came from [default: False].
-M Detect intra-file line moves and copies [default: False].
-C Detect inter-file line moves and copies [default: False].
--ignore-rev=<rev> Ignore changes made by the given revision
(requires `--loc=surviving`).
--ignore-revs-file=<f> Ignore revisions listed in the given file
(requires `--loc=surviving`).
--format=<format> Table format
[default: pipe]|md|markdown|yaml|yml|json|csv|tsv|tabulate.
May require `git-fame[<format>]`, e.g. `pip install git-fame[yaml]`.
Any `tabulate.tabulate_formats` is also accepted.
--manpath=<path> Directory in which to install git-fame man pages.
--log=<lvl> FATAL|CRITICAL|ERROR|WARN(ING)|[default: INFO]|DEBUG|NOTSET.
If multiple user names and/or emails correspond to the same user, aggregate
``git-fame`` statistics and maintain a ``git`` repository properly by adding a
`.mailmap file <https://git-scm.com/docs/git-blame#_mapping_authors>`_.
FAQs
~~~~
Options such as ``-w``, ``-M``, and ``-C`` can increase accuracy, but take
longer to compute.
Note that specifying ``--sort=hours`` or ``--sort=months`` requires ``--cost``
to be specified appropriately.
Note that ``--cost=months`` (``--cost=COCOMO``) approximates
`person-months <https://en.wikipedia.org/wiki/COCOMO>`_ and should be used with
``--loc=ins``.
Meanwhile, ``--cost=hours`` (``--cost=commits``) approximates
`person-hours <https://github.com/kimmobrunfeldt/git-hours/blob/8aaeee237cb9d9028e7a2592a25ad8468b1f45e4/index.js#L114-L143>`_.
Extra care should be taken when using ``ins`` and/or ``del`` for ``--loc``
since all historical files (including those no longer surviving) are counted.
In such cases, ``--excl`` may need to be significantly extended.
On the plus side, it is faster to compute ``ins`` and ``del`` compared to
``surv``.
Examples
--------
CODEOWNERS
~~~~~~~~~~
Generating
`CODEOWNERS <https://help.github.com/en/articles/about-code-owners>`__:
.. code:: sh
# bash syntax function for current directory git repository
owners(){
for f in $(git ls-files); do
# filename
echo -n "$f "
# author emails if loc distribution >= 30%
git fame -esnwMC --incl "$f" | tr '/' '|' \
| awk -F '|' '(NR>6 && $6>=30) {print $2}' \
| xargs echo
done
}
# print to screen and file
owners | tee .github/CODEOWNERS
# same but with `tqdm` progress for large repos
owners \
| tqdm --total $(git ls-files | wc -l) \
--unit file --desc "Generating CODEOWNERS" \
> .github/CODEOWNERS
Zenodo config
~~~~~~~~~~~~~
Generating `.zenodo.json <https://developers.zenodo.org/#deposit-metadata>`__:
.. code:: sh
git fame -wMC --format json \
| jq -c '{creators: [.data[] | {name: .[0]}]}' \
| sed -r -e 's/(\{"name")/\n \1/g' -e 's/:/: /g' \
> .zenodo.json
Contributions
-------------
|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|
All source code is hosted on `GitHub <https://github.com/casperdcl/git-fame>`__.
Contributions are welcome.
LICENCE
-------
Open Source (OSI approved): |LICENCE|
Citation information: |DOI-URI|
Authors
-------
|OpenHub-Status|
- Casper da Costa-Luis (`casperdcl <https://github.com/casperdcl>`__ |Sponsor-Casper|)
We are grateful for all |GitHub-Contributions|.
|README-Hits|
.. |Build-Status| image:: https://img.shields.io/github/actions/workflow/status/casperdcl/git-fame/test.yml?branch=main&label=git-fame&logo=GitHub
:target: https://github.com/casperdcl/git-fame/actions/workflows/test.yml
.. |Coverage-Status| image:: https://img.shields.io/coveralls/github/casperdcl/git-fame/main?logo=coveralls
:target: https://coveralls.io/github/casperdcl/git-fame
.. |Branch-Coverage-Status| image:: https://codecov.io/gh/casperdcl/git-fame/branch/main/graph/badge.svg
:target: https://codecov.io/gh/casperdcl/git-fame
.. |Codacy-Grade| image:: https://api.codacy.com/project/badge/Grade/bde789ee0e57491eb2bb8609bd4190c3
:target: https://www.codacy.com/app/casper-dcl/git-fame/dashboard
.. |GitHub-Status| image:: https://img.shields.io/github/tag/casperdcl/git-fame.svg?maxAge=86400&logo=github
:target: https://github.com/casperdcl/git-fame/releases
.. |GitHub-Forks| image:: https://img.shields.io/github/forks/casperdcl/git-fame.svg?logo=github
:target: https://github.com/casperdcl/git-fame/network
.. |GitHub-Stars| image:: https://img.shields.io/github/stars/casperdcl/git-fame.svg?logo=github
:target: https://github.com/casperdcl/git-fame/stargazers
.. |GitHub-Commits| image:: https://img.shields.io/github/commit-activity/y/casperdcl/git-fame?label=commits&logo=git
:target: https://github.com/casperdcl/git-fame/graphs/commit-activity
.. |GitHub-Issues| image:: https://img.shields.io/github/issues-closed/casperdcl/git-fame.svg?logo=github
:target: https://github.com/casperdcl/git-fame/issues
.. |GitHub-PRs| image:: https://img.shields.io/github/issues-pr-closed/casperdcl/git-fame.svg?logo=github
:target: https://github.com/casperdcl/git-fame/pulls
.. |GitHub-Contributions| image:: https://img.shields.io/github/contributors/casperdcl/git-fame.svg?logo=github
:target: https://github.com/casperdcl/git-fame/graphs/contributors
.. |GitHub-Updated| image:: https://img.shields.io/github/last-commit/casperdcl/git-fame?label=pushed&logo=github
:target: https://github.com/casperdcl/git-fame/pulse
.. |Sponsor-Casper| image:: https://img.shields.io/badge/sponsor-FOSS-dc10ff.svg?logo=Contactless%20Payment
:target: https://cdcl.ml/sponsor
.. |PyPI| image:: https://img.shields.io/pypi/v/git-fame.svg?logo=PyPI&logoColor=white
:target: https://pypi.org/project/git-fame
.. |PyPI-Downloads| image:: https://img.shields.io/pypi/dm/git-fame.svg?label=pypi%20downloads&logo=DocuSign
:target: https://pypi.org/project/git-fame
.. |Py-Versions| image:: https://img.shields.io/pypi/pyversions/git-fame.svg?logo=python&logoColor=white
:target: https://pypi.org/project/git-fame
.. |Conda-Forge| image:: https://img.shields.io/conda/v/conda-forge/git-fame.svg?label=conda-forge&logo=conda-forge
:target: https://anaconda.org/conda-forge/git-fame
.. |Snapcraft| image:: https://img.shields.io/badge/snap-install-blue.svg?logo=snapcraft&logoColor=white
:target: https://snapcraft.io/git-fame
.. |Docker| image:: https://img.shields.io/badge/docker-pull-blue.svg?logo=docker&logoColor=white
:target: https://hub.docker.com/r/casperdcl/git-fame
.. |Libraries-Rank| image:: https://img.shields.io/librariesio/sourcerank/pypi/git-fame.svg?color=green&logo=koding
:target: https://libraries.io/pypi/git-fame
.. |Libraries-Dependents| image:: https://img.shields.io/librariesio/dependent-repos/pypi/git-fame.svg?logo=koding
:target: https://github.com/casperdcl/git-fame/network/dependents
.. |OpenHub-Status| image:: https://www.openhub.net/p/git-fame/widgets/project_thin_badge?format=gif
:target: https://www.openhub.net/p/git-fame?ref=Thin+badge
.. |LICENCE| image:: https://img.shields.io/pypi/l/git-fame.svg?color=purple&logo=SPDX
:target: https://raw.githubusercontent.com/casperdcl/git-fame/main/LICENCE
.. |DOI-URI| image:: https://img.shields.io/badge/DOI-10.5281/zenodo.2544975-blue.svg?color=purple&logo=ORCID
:target: https://doi.org/10.5281/zenodo.2544975
.. |README-Hits| image:: https://caspersci.uk.to/cgi-bin/hits.cgi?q=git-fame&style=social&r=https://github.com/casperdcl/git-fame
:target: https://caspersci.uk.to/cgi-bin/hits.cgi?q=git-fame&a=plot&r=https://github.com/casperdcl/git-fame&style=social
Raw data
{
"_id": null,
"home_page": null,
"name": "git-fame",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "git, blame, git-blame, git-log, code-analysis, cost, loc, author, commit, shortlog, ls-files",
"author": null,
"author_email": "Casper da Costa-Luis <casper.dcl@physics.org>",
"download_url": "https://files.pythonhosted.org/packages/62/3e/6917394fb60a90847d6686ae18dc76fff6e8f98ea501e2768dcbd4d1d8ed/git_fame-2.0.2.tar.gz",
"platform": null,
"description": "git-fame\n========\n\nPretty-print ``git`` repository collaborators sorted by contributions.\n\n|Py-Versions| |PyPI| |Conda-Forge| |Docker| |Snapcraft|\n\n|Build-Status| |Coverage-Status| |Branch-Coverage-Status| |Codacy-Grade| |Libraries-Rank| |PyPI-Downloads|\n\n|DOI-URI| |LICENCE| |OpenHub-Status| |Sponsor-Casper|\n\n.. code:: sh\n\n ~$ git fame --cost hour,month --loc ins\n Processing: 100%|\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588| 1/1 [00:00<00:00, 2.16repo/s]\n Total commits: 1775\n Total ctimes: 2770\n Total files: 461\n Total hours: 449.7\n Total loc: 41659\n Total months: 151.0\n | Author | hrs | mths | loc | coms | fils | distribution |\n |:---------------------|------:|-------:|------:|-------:|-------:|:----------------|\n | Casper da Costa-Luis | 228 | 108 | 28572 | 1314 | 172 | 68.6/74.0/37.3 |\n | Stephen Larroque | 28 | 18 | 5243 | 203 | 25 | 12.6/11.4/ 5.4 |\n | pgajdos | 2 | 9 | 2606 | 2 | 18 | 6.3/ 0.1/ 3.9 |\n | Martin Zugnoni | 2 | 5 | 1656 | 3 | 3 | 4.0/ 0.2/ 0.7 |\n | Kyle Altendorf | 7 | 2 | 541 | 31 | 7 | 1.3/ 1.7/ 1.5 |\n | Hadrien Mary | 5 | 1 | 469 | 31 | 17 | 1.1/ 1.7/ 3.7 |\n | Richard Sheridan | 2 | 1 | 437 | 23 | 3 | 1.0/ 1.3/ 0.7 |\n | Guangshuo Chen | 3 | 1 | 321 | 18 | 7 | 0.8/ 1.0/ 1.5 |\n | Noam Yorav-Raphael | 4 | 1 | 229 | 11 | 6 | 0.5/ 0.6/ 1.3 |\n | github-actions[bot] | 2 | 1 | 186 | 1 | 51 | 0.4/ 0.1/11.1 |\n ...\n\nThe ``distribution`` column is a percentage breakdown of ``loc/coms/fils``.\n(e.g. in the table above, Casper has written surviving code in\n``172/461 = 37.3%`` of all files).\n\n------------------------------------------\n\n.. contents:: Table of contents\n :backlinks: top\n :local:\n\n\nInstallation\n------------\n\nLatest PyPI stable release\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|PyPI| |PyPI-Downloads| |Libraries-Dependents|\n\n.. code:: sh\n\n pip install git-fame\n\nLatest development release on GitHub\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n|GitHub-Status| |GitHub-Stars| |GitHub-Commits| |GitHub-Forks| |GitHub-Updated|\n\nPull and install:\n\n.. code:: sh\n\n pip install \"git+https://github.com/casperdcl/git-fame.git@main#egg=git-fame\"\n\nLatest Conda release\n~~~~~~~~~~~~~~~~~~~~\n\n|Conda-Forge|\n\n.. code:: sh\n\n conda install -c conda-forge git-fame\n\nLatest Snapcraft release\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n|Snapcraft|\n\n.. code:: sh\n\n snap install git-fame\n\nLatest Docker release\n~~~~~~~~~~~~~~~~~~~~~\n\n|Docker|\n\n.. code:: sh\n\n docker pull casperdcl/git-fame\n docker run --rm casperdcl/git-fame --help\n docker run --rm -v </local/path/to/repository>:/repo casperdcl/git-fame\n\nRegister alias with git\n~~~~~~~~~~~~~~~~~~~~~~~\n\nOn Windows, run:\n\n.. code:: sh\n\n git config --global alias.fame \"!python -m gitfame\"\n\nThis is probably not necessary on UNIX systems.\nIf ``git fame`` doesn't work after restarting the terminal on Linux & Mac OS, try (with single quotes):\n\n.. code:: sh\n\n git config --global alias.fame '!python -m gitfame'\n\nTab completion\n~~~~~~~~~~~~~~\n\nOptionally, systems with ``bash-completion`` can install tab completion\nsupport. The\n`git-fame_completion.bash <https://raw.githubusercontent.com/casperdcl/git-fame/main/git-fame_completion.bash>`__\nfile needs to be copied to an appropriate folder.\n\nOn Ubuntu, the procedure would be:\n\n.. code:: sh\n\n $ # Ensure completion works for `git` itself\n $ sudo apt-get install bash-completion\n\n $ # Install `git fame` completions\n $ sudo wget \\\n https://raw.githubusercontent.com/casperdcl/git-fame/main/git-fame_completion.bash \\\n -O /etc/bash_completion.d/git-fame_completion.bash\n\nfollowed by a terminal restart.\n\n\nChangelog\n---------\n\nThe list of all changes is available on the Releases page: |GitHub-Status|.\n\n\nUsage\n-----\n\n.. code:: sh\n\n git fame # If alias registered with git (see above)\n git-fame # Alternative execution as python console script\n python -m gitfame # Alternative execution as python module\n git-fame -h # Print help\n\nFor example, to print statistics regarding all source files in a C++/CUDA\nrepository (``*.c/h/t(pp), *.cu(h)``), carefully handling whitespace and line\ncopies:\n\n.. code:: sh\n\n git fame --incl '\\.[cht][puh]{0,2}$' -twMC\n\nIt is also possible to run from within a python shell or script.\n\n.. code:: python\n\n >>> import gitfame\n >>> gitfame.main(['--sort=commits', '-wt', '/path/to/my/repo'])\n\n\nDocumentation\n-------------\n\n|Py-Versions| |README-Hits|\n\n.. code::\n\n Usage:\n git-fame [--help | options] [<gitdir>...]\n\n Arguments:\n <gitdir> Git directory [default: ./].\n May be specified multiple times to aggregate across\n multiple repositories.\n\n Options:\n -h, --help Print this help and exit.\n -v, --version Print module version and exit.\n --branch=<b> Branch or tag [default: HEAD] up to which to check.\n --sort=<key> [default: loc]|commits|files|hours|months.\n --loc=<type> surv(iving)|ins(ertions)|del(etions)\n What `loc` represents. Use 'ins,del' to count both.\n defaults to 'surviving' unless `--cost` is specified.\n --excl=<f> Excluded files (default: None).\n In no-regex mode, may be a comma-separated list.\n Escape (\\,) for a literal comma (may require \\\\, in shell).\n --incl=<f> Included files [default: .*]. See `--excl` for format.\n --since=<date> Date from which to check. Can be absoulte (eg: 1970-01-31)\n or relative to now (eg: 3.weeks).\n --cost=<method> Include time cost in person-months (COCOMO) or\n person-hours (based on commit times).\n Methods: month(s)|cocomo|hour(s)|commit(s).\n May be multiple comma-separated values.\n Alters `--loc` default to imply 'ins' (COCOMO) or\n 'ins,del' (hours).\n -R, --recurse Recursively find repositories & submodules within <gitdir>.\n -n, --no-regex Assume <f> are comma-separated exact matches\n rather than regular expressions [default: False].\n NB: if regex is enabled ',' is equivalent to '|'.\n -s, --silent-progress Suppress `tqdm` [default: False].\n --warn-binary Don't silently skip files which appear to be binary data\n [default: False].\n -e, --show-email Show author email instead of name [default: False].\n --enum Show row numbers [default: False].\n -t, --bytype Show stats per file extension [default: False].\n -w, --ignore-whitespace Ignore whitespace when comparing the parent's\n version and the child's to find where the lines\n came from [default: False].\n -M Detect intra-file line moves and copies [default: False].\n -C Detect inter-file line moves and copies [default: False].\n --ignore-rev=<rev> Ignore changes made by the given revision\n (requires `--loc=surviving`).\n --ignore-revs-file=<f> Ignore revisions listed in the given file\n (requires `--loc=surviving`).\n --format=<format> Table format\n [default: pipe]|md|markdown|yaml|yml|json|csv|tsv|tabulate.\n May require `git-fame[<format>]`, e.g. `pip install git-fame[yaml]`.\n Any `tabulate.tabulate_formats` is also accepted.\n --manpath=<path> Directory in which to install git-fame man pages.\n --log=<lvl> FATAL|CRITICAL|ERROR|WARN(ING)|[default: INFO]|DEBUG|NOTSET.\n\n\nIf multiple user names and/or emails correspond to the same user, aggregate\n``git-fame`` statistics and maintain a ``git`` repository properly by adding a\n`.mailmap file <https://git-scm.com/docs/git-blame#_mapping_authors>`_.\n\nFAQs\n~~~~\n\nOptions such as ``-w``, ``-M``, and ``-C`` can increase accuracy, but take\nlonger to compute.\n\nNote that specifying ``--sort=hours`` or ``--sort=months`` requires ``--cost``\nto be specified appropriately.\n\nNote that ``--cost=months`` (``--cost=COCOMO``) approximates\n`person-months <https://en.wikipedia.org/wiki/COCOMO>`_ and should be used with\n``--loc=ins``.\n\nMeanwhile, ``--cost=hours`` (``--cost=commits``) approximates\n`person-hours <https://github.com/kimmobrunfeldt/git-hours/blob/8aaeee237cb9d9028e7a2592a25ad8468b1f45e4/index.js#L114-L143>`_.\n\nExtra care should be taken when using ``ins`` and/or ``del`` for ``--loc``\nsince all historical files (including those no longer surviving) are counted.\nIn such cases, ``--excl`` may need to be significantly extended.\nOn the plus side, it is faster to compute ``ins`` and ``del`` compared to\n``surv``.\n\nExamples\n--------\n\nCODEOWNERS\n~~~~~~~~~~\n\nGenerating\n`CODEOWNERS <https://help.github.com/en/articles/about-code-owners>`__:\n\n.. code:: sh\n\n # bash syntax function for current directory git repository\n owners(){\n for f in $(git ls-files); do\n # filename\n echo -n \"$f \"\n # author emails if loc distribution >= 30%\n git fame -esnwMC --incl \"$f\" | tr '/' '|' \\\n | awk -F '|' '(NR>6 && $6>=30) {print $2}' \\\n | xargs echo\n done\n }\n\n # print to screen and file\n owners | tee .github/CODEOWNERS\n\n # same but with `tqdm` progress for large repos\n owners \\\n | tqdm --total $(git ls-files | wc -l) \\\n --unit file --desc \"Generating CODEOWNERS\" \\\n > .github/CODEOWNERS\n\nZenodo config\n~~~~~~~~~~~~~\n\nGenerating `.zenodo.json <https://developers.zenodo.org/#deposit-metadata>`__:\n\n.. code:: sh\n\n git fame -wMC --format json \\\n | jq -c '{creators: [.data[] | {name: .[0]}]}' \\\n | sed -r -e 's/(\\{\"name\")/\\n \\1/g' -e 's/:/: /g' \\\n > .zenodo.json\n\nContributions\n-------------\n\n|GitHub-Commits| |GitHub-Issues| |GitHub-PRs| |OpenHub-Status|\n\nAll source code is hosted on `GitHub <https://github.com/casperdcl/git-fame>`__.\nContributions are welcome.\n\n\nLICENCE\n-------\n\nOpen Source (OSI approved): |LICENCE|\n\nCitation information: |DOI-URI|\n\n\nAuthors\n-------\n\n|OpenHub-Status|\n\n- Casper da Costa-Luis (`casperdcl <https://github.com/casperdcl>`__ |Sponsor-Casper|)\n\nWe are grateful for all |GitHub-Contributions|.\n\n|README-Hits|\n\n.. |Build-Status| image:: https://img.shields.io/github/actions/workflow/status/casperdcl/git-fame/test.yml?branch=main&label=git-fame&logo=GitHub\n :target: https://github.com/casperdcl/git-fame/actions/workflows/test.yml\n.. |Coverage-Status| image:: https://img.shields.io/coveralls/github/casperdcl/git-fame/main?logo=coveralls\n :target: https://coveralls.io/github/casperdcl/git-fame\n.. |Branch-Coverage-Status| image:: https://codecov.io/gh/casperdcl/git-fame/branch/main/graph/badge.svg\n :target: https://codecov.io/gh/casperdcl/git-fame\n.. |Codacy-Grade| image:: https://api.codacy.com/project/badge/Grade/bde789ee0e57491eb2bb8609bd4190c3\n :target: https://www.codacy.com/app/casper-dcl/git-fame/dashboard\n.. |GitHub-Status| image:: https://img.shields.io/github/tag/casperdcl/git-fame.svg?maxAge=86400&logo=github\n :target: https://github.com/casperdcl/git-fame/releases\n.. |GitHub-Forks| image:: https://img.shields.io/github/forks/casperdcl/git-fame.svg?logo=github\n :target: https://github.com/casperdcl/git-fame/network\n.. |GitHub-Stars| image:: https://img.shields.io/github/stars/casperdcl/git-fame.svg?logo=github\n :target: https://github.com/casperdcl/git-fame/stargazers\n.. |GitHub-Commits| image:: https://img.shields.io/github/commit-activity/y/casperdcl/git-fame?label=commits&logo=git\n :target: https://github.com/casperdcl/git-fame/graphs/commit-activity\n.. |GitHub-Issues| image:: https://img.shields.io/github/issues-closed/casperdcl/git-fame.svg?logo=github\n :target: https://github.com/casperdcl/git-fame/issues\n.. |GitHub-PRs| image:: https://img.shields.io/github/issues-pr-closed/casperdcl/git-fame.svg?logo=github\n :target: https://github.com/casperdcl/git-fame/pulls\n.. |GitHub-Contributions| image:: https://img.shields.io/github/contributors/casperdcl/git-fame.svg?logo=github\n :target: https://github.com/casperdcl/git-fame/graphs/contributors\n.. |GitHub-Updated| image:: https://img.shields.io/github/last-commit/casperdcl/git-fame?label=pushed&logo=github\n :target: https://github.com/casperdcl/git-fame/pulse\n.. |Sponsor-Casper| image:: https://img.shields.io/badge/sponsor-FOSS-dc10ff.svg?logo=Contactless%20Payment\n :target: https://cdcl.ml/sponsor\n.. |PyPI| image:: https://img.shields.io/pypi/v/git-fame.svg?logo=PyPI&logoColor=white\n :target: https://pypi.org/project/git-fame\n.. |PyPI-Downloads| image:: https://img.shields.io/pypi/dm/git-fame.svg?label=pypi%20downloads&logo=DocuSign\n :target: https://pypi.org/project/git-fame\n.. |Py-Versions| image:: https://img.shields.io/pypi/pyversions/git-fame.svg?logo=python&logoColor=white\n :target: https://pypi.org/project/git-fame\n.. |Conda-Forge| image:: https://img.shields.io/conda/v/conda-forge/git-fame.svg?label=conda-forge&logo=conda-forge\n :target: https://anaconda.org/conda-forge/git-fame\n.. |Snapcraft| image:: https://img.shields.io/badge/snap-install-blue.svg?logo=snapcraft&logoColor=white\n :target: https://snapcraft.io/git-fame\n.. |Docker| image:: https://img.shields.io/badge/docker-pull-blue.svg?logo=docker&logoColor=white\n :target: https://hub.docker.com/r/casperdcl/git-fame\n.. |Libraries-Rank| image:: https://img.shields.io/librariesio/sourcerank/pypi/git-fame.svg?color=green&logo=koding\n :target: https://libraries.io/pypi/git-fame\n.. |Libraries-Dependents| image:: https://img.shields.io/librariesio/dependent-repos/pypi/git-fame.svg?logo=koding\n :target: https://github.com/casperdcl/git-fame/network/dependents\n.. |OpenHub-Status| image:: https://www.openhub.net/p/git-fame/widgets/project_thin_badge?format=gif\n :target: https://www.openhub.net/p/git-fame?ref=Thin+badge\n.. |LICENCE| image:: https://img.shields.io/pypi/l/git-fame.svg?color=purple&logo=SPDX\n :target: https://raw.githubusercontent.com/casperdcl/git-fame/main/LICENCE\n.. |DOI-URI| image:: https://img.shields.io/badge/DOI-10.5281/zenodo.2544975-blue.svg?color=purple&logo=ORCID\n :target: https://doi.org/10.5281/zenodo.2544975\n.. |README-Hits| image:: https://caspersci.uk.to/cgi-bin/hits.cgi?q=git-fame&style=social&r=https://github.com/casperdcl/git-fame\n :target: https://caspersci.uk.to/cgi-bin/hits.cgi?q=git-fame&a=plot&r=https://github.com/casperdcl/git-fame&style=social\n",
"bugtrack_url": null,
"license": "MPL-2.0",
"summary": "Pretty-print `git` repository collaborators sorted by contributions",
"version": "2.0.2",
"project_urls": {
"changelog": "https://github.com/casperdcl/git-fame/releases",
"repository": "https://github.com/casperdcl/git-fame"
},
"split_keywords": [
"git",
" blame",
" git-blame",
" git-log",
" code-analysis",
" cost",
" loc",
" author",
" commit",
" shortlog",
" ls-files"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "b3da199fc428d9b5a7ec40f0e781f57f4b910a29e1f5884d7bff7ae4d0291ead",
"md5": "d7b1011386b7f236451cc2eeb5a6c1c4",
"sha256": "8915cd703e8ac6a76e093235cd429f2bbfb11701a79b554704f6633524a1a8f5"
},
"downloads": -1,
"filename": "git_fame-2.0.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "d7b1011386b7f236451cc2eeb5a6c1c4",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 19298,
"upload_time": "2024-10-06T22:39:19",
"upload_time_iso_8601": "2024-10-06T22:39:19.980582Z",
"url": "https://files.pythonhosted.org/packages/b3/da/199fc428d9b5a7ec40f0e781f57f4b910a29e1f5884d7bff7ae4d0291ead/git_fame-2.0.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "623e6917394fb60a90847d6686ae18dc76fff6e8f98ea501e2768dcbd4d1d8ed",
"md5": "1bfbecb148c2eebdc7d812917a90b1f5",
"sha256": "be72b64af451d887099339848fe310e686f2bd472bbde7e4fc338825c364bf2d"
},
"downloads": -1,
"filename": "git_fame-2.0.2.tar.gz",
"has_sig": false,
"md5_digest": "1bfbecb148c2eebdc7d812917a90b1f5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 26726,
"upload_time": "2024-10-06T22:39:21",
"upload_time_iso_8601": "2024-10-06T22:39:21.105492Z",
"url": "https://files.pythonhosted.org/packages/62/3e/6917394fb60a90847d6686ae18dc76fff6e8f98ea501e2768dcbd4d1d8ed/git_fame-2.0.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-06 22:39:21",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "casperdcl",
"github_project": "git-fame",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "git-fame"
}