{ "cells": [ { "cell_type": "code", "execution_count": 3, "id": "d3aee937", "metadata": {}, "outputs": [], "source": [ "import git\n", "import os\n", "import sys\n", "import pandas as pd\n", "import matplotlib as mpl\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 5, "id": "8cb17f15", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'/Users/krystian.safjan/projects/priv/blog'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pwd" ] }, { "cell_type": "code", "execution_count": 6, "id": "13d4b586", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "git_dir='.'\n", "branch='master'\n", "try:\n", " repo = git.repo.Repo(git_dir)\n", "except:\n", " print(\"Exception of type: {}\\nDir. not a valid git project: {}\".\n", " format(sys.exc_info()[0], git_dir))\n", " exit()\n", "\n", "data = []\n", "for i in reversed(list(repo.iter_commits(rev=branch))):\n", " diff = i.stats.total\n", " data.append([i.committed_datetime.isoformat(),\n", " diff['insertions'],\n", " diff['deletions']])\n", "\n", "data = pd.DataFrame(data, columns=[\"date\", \"add\", \"remove\"])\n", "data['delta'] = data['add'] - data['remove']\n", "data['total'] = data.delta.cumsum()\n", "data.date = pd.to_datetime(data.date)\n", "data.set_index(['date'], inplace=True)\n", "\n", "plt.figure(\"Code Lines Progress in project {}\".\n", " format(os.path.basename(git_dir)))\n", "plt.ylabel(\"# of lines\")\n", "ax = data['total'].plot()\n", "ax.yaxis.set_major_formatter(mpl.ticker.StrMethodFormatter('{x:,.0f}'))\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "id": "ba944d53", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>add</th>\n", " <th>remove</th>\n", " <th>delta</th>\n", " <th>total</th>\n", " </tr>\n", " <tr>\n", " <th>date</th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " <th></th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>2018-01-11 13:04:58+01:00</th>\n", " <td>679</td>\n", " <td>0</td>\n", " <td>679</td>\n", " <td>679</td>\n", " </tr>\n", " <tr>\n", " <th>2018-01-11 13:07:17+01:00</th>\n", " <td>771</td>\n", " <td>32</td>\n", " <td>739</td>\n", " <td>1418</td>\n", " </tr>\n", " <tr>\n", " <th>2018-01-11 13:10:43+01:00</th>\n", " <td>1</td>\n", " <td>1</td>\n", " <td>0</td>\n", " <td>1418</td>\n", " </tr>\n", " <tr>\n", " <th>2018-01-11 13:12:26+01:00</th>\n", " <td>71</td>\n", " <td>71</td>\n", " <td>0</td>\n", " <td>1418</td>\n", " </tr>\n", " <tr>\n", " <th>2018-03-27 11:31:07+02:00</th>\n", " <td>18327</td>\n", " <td>1379</td>\n", " <td>16948</td>\n", " <td>18366</td>\n", " </tr>\n", " <tr>\n", " <th>...</th>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " <td>...</td>\n", " </tr>\n", " <tr>\n", " <th>2022-05-06 15:18:12+02:00</th>\n", " <td>18042</td>\n", " <td>2806</td>\n", " <td>15236</td>\n", " <td>129973</td>\n", " </tr>\n", " <tr>\n", " <th>2022-05-06 15:21:47+02:00</th>\n", " <td>26589</td>\n", " <td>17132</td>\n", " <td>9457</td>\n", " <td>139430</td>\n", " </tr>\n", " <tr>\n", " <th>2022-05-06 15:29:25+02:00</th>\n", " <td>2</td>\n", " <td>0</td>\n", " <td>2</td>\n", " <td>139432</td>\n", " </tr>\n", " <tr>\n", " <th>2022-05-06 17:43:11+02:00</th>\n", " <td>14</td>\n", " <td>13</td>\n", " <td>1</td>\n", " <td>139433</td>\n", " </tr>\n", " <tr>\n", " <th>2022-06-02 22:49:37+02:00</th>\n", " <td>36903</td>\n", " <td>64303</td>\n", " <td>-27400</td>\n", " <td>112033</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>234 rows × 4 columns</p>\n", "</div>" ], "text/plain": [ " add remove delta total\n", "date \n", "2018-01-11 13:04:58+01:00 679 0 679 679\n", "2018-01-11 13:07:17+01:00 771 32 739 1418\n", "2018-01-11 13:10:43+01:00 1 1 0 1418\n", "2018-01-11 13:12:26+01:00 71 71 0 1418\n", "2018-03-27 11:31:07+02:00 18327 1379 16948 18366\n", "... ... ... ... ...\n", "2022-05-06 15:18:12+02:00 18042 2806 15236 129973\n", "2022-05-06 15:21:47+02:00 26589 17132 9457 139430\n", "2022-05-06 15:29:25+02:00 2 0 2 139432\n", "2022-05-06 17:43:11+02:00 14 13 1 139433\n", "2022-06-02 22:49:37+02:00 36903 64303 -27400 112033\n", "\n", "[234 rows x 4 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": null, "id": "8405b341", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "comm", "language": "python", "name": "comm" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.13" } }, "nbformat": 4, "nbformat_minor": 5 }