Git 已经成为代码版本控制的事实标准,但其普及并没有消除对源代码仓库的历史和内容进行深入分析的复杂性。
另一方面,SQL 是一种经过实战检验的语言,可以查询大型代码库,正如 Spark 和 BigQuery 等项目的采用所示。
因此,在 source{d},我们选择这两种技术来创建 gitbase 是合乎逻辑的:用于大规模分析 Git 仓库(使用 SQL)的代码即数据解决方案。
Gitbase 是一个完全开源的项目,它站在一系列巨人的肩膀上才得以开发出来,本文旨在指出主要的贡献者。

gitbase playground 提供了一种可视化使用 gitbase 的方式。
使用 Vitess 解析 SQL
Gitbase 的用户界面是 SQL。这意味着我们需要能够解析和理解通过网络按照 MySQL 协议到达的 SQL 请求。幸运的是,我们的 YouTube 朋友和他们的 Vitess 项目已经实现了这一点。Vitess 是一个数据库集群系统,用于 MySQL 的水平扩展。
我们只是抓取了对我们重要的代码片段,并将其制作成一个 开源项目,该项目允许任何人在几分钟内编写一个 MySQL 服务器(正如我在我的 justforfunc 剧集 CSVQL—使用 SQL 服务 CSV 中展示的那样)。
使用 go-git 读取 Git 仓库
一旦我们解析了一个请求,我们仍然需要找到如何通过读取数据集中的 Git 仓库来回答它。为此,我们集成了 source{d} 最成功的仓库 go-git。Go-git 是一个 纯 Go 语言编写的高度可扩展的 Git 实现。
这使我们能够轻松地分析存储在磁盘上的仓库,如 siva 文件(同样是 source{d} 的一个开源项目),或者只是用 git clone 克隆的仓库。
使用 enry 检测语言并使用 babelfish 解析文件
Gitbase 的分析能力不仅限于 Git 历史记录。通过集成我们的(显然是)开源项目 enry 进行语言检测,并集成 babelfish 进行程序解析。Babelfish 是一个用于通用源代码解析的自托管服务器,将代码文件转换为通用抽象语法树 (UAST)。
这两个功能在 gitbase 中作为用户函数 LANGUAGE 和 UAST 公开。它们共同使诸如 “查找上个月修改次数最多的函数名称” 这样的请求成为可能。
使其快速运行
Gitbase 分析非常大的数据集——例如,公共 Git 存档,其中包含来自 GitHub 的 3TB 源代码 (公告),为了做到这一点,每个 CPU 周期都很重要。
这就是为什么我们将另外两个项目集成到组合中:Rubex 和 Pilosa。
使用 Rubex 和 Oniguruma 加速正则表达式
Rubex 是 Go 的 regexp 标准库包的准直接替代品。我说准直接是因为它们没有在 regexp.Regexp 类型上实现 LiteralPrefix 方法,但直到现在我才听说过该方法。
Rubex 的性能来自高度优化的 C 库 Oniguruma,它使用 cgo 调用它。
使用 Pilosa 索引加速查询
索引是基本上每个关系数据库的众所周知的功能,但 Vitess 没有实现它们,因为它实际上不需要。
但开源再次提供了帮助,Pilosa, 一个用 Go 实现的分布式位图索引,它使 gitbase 可以在海量数据集上使用。Pilosa 是一个开源的分布式位图索引,可显著加速跨多个海量数据集的查询。
结论
我想借这篇博文亲自感谢开源社区,是他们使我们能够在比任何人预期的更短时间内创建 gitbase。在 source{d},我们是开源的坚定信徒,github.com/src-d 下的每一行代码(包括我们的 OKR 和投资者委员会)都是这一点的证明。
您想试用一下 gitbase 吗?最快和最简单的方法是使用 source{d} Engine。从 sourced.tech/engine 下载它,只需一个命令即可运行 gitbase!
想了解更多?请查看我在 Go SF meetup 上的演讲录像。
这篇文章 最初发表于 Medium,并经许可在此处转载。
评论已关闭。