65.9K
CodeProject 正在变化。 阅读更多。
Home

存储库实用程序 - 类似 GitHub 的活动图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (7投票s)

2014年7月2日

CPOL

3分钟阅读

viewsIcon

23687

downloadIcon

361

为 SVN 存储库创建活动图

Chart

引言

上面的图表显示了我在一个项目中的活动。它看起来像 Github 的活动图,但实际上它显示的是 SVN 仓库的活动。您是否希望为您的 SVN 仓库也创建一个?如果您的答案是肯定的,请继续阅读。

背景

SVN 是我源代码控制的首选,我没有理由改变它。但是当然,我使用过 Github,并且我看到了他们的活动图,我希望看到我的 SVN 仓库也有这样的图表。所以我决定创建一个工具来可视化仓库活动。

解决方案的总体结构如图表 1 所示。

Solution

仓库连接

该工具从 SVN 仓库获取日志历史记录。但是有许多源代码控制系统,或多或少流行,具有不同的 API。为了从其他仓库类型检索数据,客户端应该为 `IRepositoryConnection` 接口提供一个实现,包含一个单独的方法 `IList<RevisionInfo>` `LoadHistory(RepositoryInfo repo)`,其中 `RevisionInfo` 是一个具有通用修订参数(`Number`、`Time`、`Author`、`Comment`、`FileCount`)的类,`RepositoryInfo` 是一个用于设置连接仓库所需参数的容器(Uri 或存储路径,`ProjectName`,可选的 `MinRevision` 和 `MaxRevision`)

默认情况下我唯一的实现是 `SvnRepositoryConnection`。它基于 SharpSvn 库。

评估逻辑

大多数计算都在 `RepositoryHistoryScanner` 类中执行。修订描述按作者 (`PeriodStats`) 分组,然后按日期 (`DaylyStats`) 分组。对于每个作者,计算最大提交计数和最长连续提交天数。作者的统计信息和最佳结果存储在 `PeriodHistory` 中。总体结构如图表 2 所示。

Structure

当所有修订都分组并且已知最佳统计信息时,是时候衡量作者的活动并评估他们每天的活动级别了。我为此目的定义了 `ActivityLevel` 枚举 ` {None, Low, Average, High, Great}`。

评估是可扩展的,每个人都可以为 `IDaylyStatsMeasure` 和 `IActivityDistribution` 接口提供实现。

第一步,通过 `IDaylyStats Measure.Measure(DaylyStats daylyActivity, PeriodHistory history)` 为 `DaylyStats` 对象计算一个双精度(非负)值。第二步,通过 `IActivityDistribution.GetLevel(double measure)` 方法返回活动级别。不同的测量方法和分布可以产生完全不同的结果。

我实现了 2 种类型的测量方法

  1. RevisionsCountMeasure

    revisionsCountMeasure

  2. LeaderRevisionsCountMeasure

    leaderrevisionsCountMeasure

两种测量方法都产生 [0; 1] 范围内的值。

此外,我添加了两种类型的分布 - `Uniform` 和 `Normal`。 它们如图表 3 和 4 所示。

Uniform

StdNormal

可视化客户端

为了根据作者的活动级别(写在 `DaylyStats` 中)可视化作者的活动,我使用了 `DataGridView` 控件。它包含 7 行 - 每周中的每一天一行。列数取决于 `PeriodHistory` 的长度。每个单元格使用背景颜色显示作者的活动(白色表示没有任何贡献,绿色渐变表示更高的级别)。当选择一个单元格时,会在表单底部显示更多详细信息。在网格的列标题中,我绘制了月份的名称。

要使用该实用工具,您只需在配置表单中指定仓库位置(Uri 或工作副本文件夹的路径)和项目名称。默认情况下,选择 `RevisionsCountMeasure` 和 `UniformActivityDistribution` 进行测量。您可以在组合框中更改它们。如果您可以提供 `IDaylyStatsMeasure` 或 `IActivityDistribution` 接口的良好实现,请发表评论。可选设置是最小和最大修订号。如有必要,输入登录名和密码以在身份验证表单中获取访问权限(请参阅屏幕截图)。

ConfigurationForm

LoginForm

可以将配置保存在文件中,以避免下次使用该工具时进行不必要的输入。

将图表导出为 .png 图像

如果项目持续很长时间,那么图表的宽度将大于屏幕宽度。在这种情况下,网格图表可以水平滚动,但这将更难进行良好的屏幕截图。因此,我添加了一个将图表导出到 .png 文件的功能。您可以在活动图表表单中使用此功能。单击“打印图表”按钮,选择文件位置并保存。Image 将被保存并自动打开

© . All rights reserved.