Visualise a git repository by diff activity
See the code
Map showing the files in cpython that Guido van Rossum changed the most;
full SVG image available in repo
A version of this program is now available for use at heatmap.jonathanforsythe.co.uk
python generate_db.py {path_to_repo_dir}python -m venv . and install required modules with pip install -r requirements.txtpython app.py or flask run (flask run --host=<ip> to run on that ip address, with 0.0.0.0 being used for all addresses on that machine)127.0.0.1:5000This project consists of two parts:
Scans through an entire git history using git log, and creates a database using three tables:
Using these we can keep track of which files/commits changed the repository the most, which in itself can provide useful insight
Taking the database above, uses an SQL query to generate a JSON object with the following structure:
directory:
"name": <Directory name>
"val": <Sum of sizes of children>
"children": [<directory or file>, ...]
file:
"name": <File name>
"val": <Total number of line changes for this file over all commits>
then uses this to generate an inline svg image representing a treemap of the file system, with the size of each rectangle being the val described above.
Then generates a second JSON object in a similar manner to above, but filtering for the things we want (only certain emails, date ranges, etc), then uses this to highlight the rectangles in varying intensity based on the vals returned eg highlighting the files changed most by a certain author.
These speeds were attained on my personal computer.
| Repo | Number of commits | Git log time | Git log size | Database time | Database size | Total time |
|---|---|---|---|---|---|---|
| linux | 1,154,884 | 60 minutes | 444MB | 462.618 seconds | 733MB | 68 minutes |
| cpython | 115,874 | 4.6 minutes | 44.6MB | 36.607 seconds | 74.3MB | 5.2 minutes |
Time taken seems to scale linearly, going through approximately 300 commits/second, or requiring 0.0033 seconds/commit. Database size also scales linearly, with approximately 2600 commits/MB, or requiring 384 B/commit.
For this test I filtered each repo by its most prominent authors:
| Repo | Author filter | Drawing treemap time | Highlighting treemap time |
|---|---|---|---|
| linux | torvalds@linux-foundation.org | 19.7 s | 54.3 s |
| cpython | guido@python.org | 842 ms | 1238 ms |
These times are with minimum size drawn = 0, on very large repositories, so the performance is not completely unreasonable. This does not include the time for the browser to actually render the svg, which can take longer.
Currently done using git log which can take a very long time for large repos. Will look into any other ways of getting needed information on files.
Currently the user can submit only a single query for the highlighting. Ideally they could have a separate filter dictating which boxes to draw in the first place, and possibly multiple filters that could result in multiple colour highlighting on the same image.
749 followers · starred Feb 2023
225 followers · starred Jan 2023
5,134 followers · starred Jan 2023
28 followers · starred Jan 2023
Visualise a git repository by diff activity
See the code
Map showing the files in cpython that Guido van Rossum changed the most;
full SVG image available in repo
A version of this program is now available for use at heatmap.jonathanforsythe.co.uk
python generate_db.py {path_to_repo_dir}python -m venv . and install required modules with pip install -r requirements.txtpython app.py or flask run (flask run --host=<ip> to run on that ip address, with 0.0.0.0 being used for all addresses on that machine)127.0.0.1:5000This project consists of two parts:
Scans through an entire git history using git log, and creates a database using three tables:
Using these we can keep track of which files/commits changed the repository the most, which in itself can provide useful insight
Taking the database above, uses an SQL query to generate a JSON object with the following structure:
directory:
"name": <Directory name>
"val": <Sum of sizes of children>
"children": [<directory or file>, ...]
file:
"name": <File name>
"val": <Total number of line changes for this file over all commits>
then uses this to generate an inline svg image representing a treemap of the file system, with the size of each rectangle being the val described above.
Then generates a second JSON object in a similar manner to above, but filtering for the things we want (only certain emails, date ranges, etc), then uses this to highlight the rectangles in varying intensity based on the vals returned eg highlighting the files changed most by a certain author.
These speeds were attained on my personal computer.
| Repo | Number of commits | Git log time | Git log size | Database time | Database size | Total time |
|---|---|---|---|---|---|---|
| linux | 1,154,884 | 60 minutes | 444MB | 462.618 seconds | 733MB | 68 minutes |
| cpython | 115,874 | 4.6 minutes | 44.6MB | 36.607 seconds | 74.3MB | 5.2 minutes |
Time taken seems to scale linearly, going through approximately 300 commits/second, or requiring 0.0033 seconds/commit. Database size also scales linearly, with approximately 2600 commits/MB, or requiring 384 B/commit.
For this test I filtered each repo by its most prominent authors:
| Repo | Author filter | Drawing treemap time | Highlighting treemap time |
|---|---|---|---|
| linux | torvalds@linux-foundation.org | 19.7 s | 54.3 s |
| cpython | guido@python.org | 842 ms | 1238 ms |
These times are with minimum size drawn = 0, on very large repositories, so the performance is not completely unreasonable. This does not include the time for the browser to actually render the svg, which can take longer.
Currently done using git log which can take a very long time for large repos. Will look into any other ways of getting needed information on files.
Currently the user can submit only a single query for the highlighting. Ideally they could have a separate filter dictating which boxes to draw in the first place, and possibly multiple filters that could result in multiple colour highlighting on the same image.
749 followers · starred Feb 2023
225 followers · starred Jan 2023
5,134 followers · starred Jan 2023
28 followers · starred Jan 2023