GitTree

Christopher Wu


Overview

This project was inspired by Gource, an OpenGL-based source code visualizer. GitTree is a WebGL-based 3D version. The git commit log of a source code directory is parsed via Python script and turned into a JSON representation. The GitTree web application takes that JSON and creates a 3D force-directed graph of the source code. Leaf nodes of the graph represent source code files. Their sizes are proportional to the sizes of their related files. Their colors represent the most recent commit author. Each commit author is designated a randomly-chosen color. As GitTree iterates through the commits, it updates the graph with new nodes for newly-created files, updates existing nodes' colors and sizes to represent file changes in each commit, and removes nodes for deleted files. Edges designated directory hierarchy and white parent nodes represent folders.

The graph is displayed in the middle of the screen. The list of commit authors is shown on the left. At the top is a Start/Stop button and a slider representing the graph's progress through the commit log. These controls are used to move forward or backward through the commit log. The user hold the left mouse button down and rotate the graph in all directions. The user can hold the right mouse button down to move the camera up, down, left, or right. Finally, the user can use the mouse scroll wheel to zoom the camera in or out. A bokeh shader is to blur the entire graph in proportion to the camera's zoom level.



Technology

A force-directed graph determines placement of nodes and edges by simulating physical forces.

Edges are implemented as springs. The movement of the springs is determined via Hooke's law, which states that the force required to stretch a spring is proportional to the desired stretch distance.

Nodes are given an electrical charge that causes them to repel each other. The placement of nodes is determined via Coulomb's law, which states that the force between two nodes is equal to a k constant multiplied by the quantities of the nodes' charges, divided by the squared distance of separation between the two nodes.

To obtain a stable system an overall drag force is applied to the entire graph to slow the movement of nodes and edges.

Body forces are calculated using a Barnes-Hut simulation. The graph is subdivided into an octree to group nearby components of the graph into bodies. This results in a n * log(n) calculation time instead of an n-squared time.

The force-directed graph implementation is provided by Andrei Kashcha's ``ngraph'' project. Ngraph provides a hook into Three.js, a Javascript WebGL library.



Instructions



Media


jQuery
GitTree app running on the commit log for the jQuery repository.




git
GitTree app running on the commit log for the Git repository.


Video of GitTree running on the jQuery repository.


Resources

Gource
Homepage for the Gource software version contol visualization project.

ngraph
GitHub page for the ngraph project.

Hooke's Law
Information on Hooke's Law.

Coulomb's Law
Information on Coulomb's Law.

Barnes-Hut Simulation
Information on the Barnes-Hut simulation.