【问题标题】:GitLab API - get the overall # of lines of codeGitLab API - 获取总体代码行数
【发布时间】:2021-11-16 20:38:58
【问题描述】:

我能够获得每个提交的统计数据(添加、删除、总计),但是我如何才能获得整体 #? 例如,如果一个 MR 有 30 次提交,我需要添加\删除的代码行数,您可以在右上角看到。 这个 # 不是每次提交的所有 # 的总和。 因此,我需要一个 API 来返回在 MR 级别添加\删除的净代码行数(无论有多少提交)。 例如,如果我有 2 次提交:第一次添加 10 行,第二次删除完全相同的 10 行,那么 net # 为 0。


这是场景: 我有一个 30 次提交的 MR。 GitLab API 支持获取每个提交(单独)的统计信息(添加\删除的代码行)。 如果我进入 GitLab UI,转到 MR \ Changes,我看到添加\删除的行数不是我通过 API 获得的所有提交统计信息的总和。 那是我的问题。 一个更简单的例子:假设我有 2 次提交,一次添加了 10 行代码,而第二次提交删除了完全相同的 10 行代码。使用 API,我得到了总和,即添加了 20 个 LOC。但是,如果我进入 GitLab UI \ Changes,它会显示 0(零),这是正确的;这是整体 chgs 的净值。这是我注意到的不一致之处。

【问题讨论】:

  • IS NOT the sum of all #'s per commit 你所描述的正是MR中每个提交的所有添加/删除的总和,所以我有点困惑。我不确定我是否完全理解您要查找的内容,如果您确定您要查找的内容不是 MR 中所有提交中删除和添加的总和。
  • 感谢您的回复。
  • 我想我现在明白你的意思了——关键因素是在后续提交中删除 相同的行 时。假设一个提交删除了 不同 行,这些行 not 从同一 MR 中的提交中添加,您想计算这些行。换句话说,如果 LOC 中的 有效 更改被另一次提交抹去,你不想在你的行数中考虑它。
  • 是的,这就是问题所在;希望有人有解决方案。
  • 我现在明白了。虽然没有直接为您提供计数的 API,但您可以自己从 diff 中计算出来。我添加了一个带有完整工作解决方案的答案。

标签: api statistics gitlab


【解决方案1】:

要为 MR 执行此操作,您将使用 MR changes API 并计算 changes[].diff 字段中以 +- 开头的行的出现次数,以分别获取添加和删除。

gitlab-org/gitlab-runner!3195 为例:

GITLAB_HOST="https://gitlab.com"
PROJECT_ID="250833"
MR_ID="3195"

URL="${GITLAB_HOST}/api/v4/projects/${PROJECT_ID}/merge_requests/${MR_ID}/changes"
DIFF=$(curl ${URL} | jq -r ".changes[].diff")
ADDITIONS=$(grep -E "^\+" <<< "$DIFF")
DELETIONS=$(grep -E "^\-" <<< "$DIFF")
NUM_ADDITIONS=$(wc -l <<< "$ADDITIONS")
NUM_DELETIONS=$(wc -l <<< "$DELETIONS")
echo "${MR_ID} has ${NUM_ADDITIONS} additions and ${NUM_DELETIONS} deletions"

输出是

3195 has 9 additions and 2 deletions

这与 UI 匹配,也显示了 9 个添加和 2 个删除

正如您所见,这是您所描述场景的一个代表性示例,因为此 MR 中的单个提交的总和是 13 次添加和 6 次删除。

【讨论】:

  • 谢谢;当然,您向我指出了一个非常有前途的 API。但是,使用该 API(获取每个 MR 的更改)以及使用 CURL,我将返回此信息:MR diff: -68,5 +68,6 MR diff: -667,13 +667,17 MR差异:-285,7 +285,7 MR 差异:-50,7 +50,15 MR 差异:-13,6 +13,7 MR 差异:-1,7 +1,10 MR 差异:-84,6 +84,8 MR 差异:-21,6 +21,7 MR 差异:-0,0 +1,59 似乎它与更改的文件数有关(在上面的示例中,总共有 9 个文件被更改,部分几个提交)。结果的语法与 GitLab API 文档中不同。
  • GitLab API 将“-1 +1”指定为差异答案。我观察到的,即-285,7 +285,7,我认为这意味着在 UI 中,文件 sn-p 从 LOC #285 开始,我认为添加了 7 个 LOC,删除了 7 个,所以净值为 0(零)。但是,它与 UI 左上角显示的整体 # 不匹配。
  • @da75 如果没有您在我面前使用的相同 MR,我很难说出您在描述什么。您能否提供一个在 gitlab.com 上公开的可重现示例?
  • 谢谢;我没有公开的 MR 可以提供;但是,根据 GitLab API,对于“GET /projects/:id/merge_requests/:merge_request_iid/changes”,我应该在其他数据中取回这个“diff”:“--- a/VERSION\ +++ b/VERSION \ @@ -1 +1 @@\ -1.9.7\,我假设 -1 +1 是我需要的。相反,对于那个 cmd,我得到例如“-124,9 +124,6”加上 chgs 本身. 我必须以一种方式设置 access_raw_diffs 参数吗?
  • 不,@@ 后面的数字不是您需要的。上面的脚本将做正确的事情。你也不需要传递access_raw_diffs。脚本所做的是计算实际的差异行,这些行都将以-+ 开头。 diff 中以 -+ 以外的任何其他内容开头的任何行都将被忽略(因为它们是 diff 的信息部分或未更改的代码行)您使用的是 gitlab.com 还是自托管?如果您使用自托管,您是否使用最新版本的 GitLab?如果不是,是什么版本? @da75 你试过我的脚本了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 2014-10-19
  • 2013-08-31
  • 2015-07-07
  • 1970-01-01
  • 2019-03-06
  • 2015-06-16
相关资源
最近更新 更多