如何查看用户在bitbucket存储库中发布的所有评论

use*_*427 10 repository bitbucket

repository主页中,我可以看到recent activity底部发布的评论,它只显示10个通用.

我想要从开始以来发布的所有评论.

有什么办法吗?

una*_*agi 7

可以使用bitbucket的REST API检索对拉取请求,问题和提交的注释。

但是,似乎没有办法在一个地方列出所有它们,因此获取它们的唯一方法是针对存储库的每个PR,发行或提交查询API。

请注意,这花费了很长时间,因为bitbucket似乎对通过API访问存储库数据的访问次数设置了限制:在检索到大约一千个结果后,我得到了超出此资源的速率限制的错误,因此我只能检索到大约从上次速率限制错误开始,每秒经过一个条目。

查找存储库的API URL

第一步是找到仓库的URL。对于私有存储库,有必要通过提供用户名和密码(使用curl的-u开关)进行身份验证。URL的格式为:

https://api.bitbucket.org/2.0/repositories/{repoOwnerName}/{repoName}
Run Code Online (Sandbox Code Playgroud)

git remote -v从本地git存储库运行应提供缺少的值。$url通过验证是否正确地从其中检索了存储库信息作为JSON数据来检查伪造的URL(以下称为)curl -u username $url

获取提交的评论

提交的注释可以在访问$url/commit/{commitHash}/comments

生成的JSON数据可以由脚本处理。当心结果是分页的

下面,我仅提取每次提交的评论数。它由size所检索的JSON对象的成员的值指示;我还通过添加GET参数来请求部分响应fields=size

我的剧本getNComments.sh

#!/bin/sh

pw=$1
id=$2

json=$(curl -s -u username:"$pw" \
    https://api.bitbucket.org/2.0/repositories/{repoOwnerName}/{repoName}/commit/$id/comments'?fields=size')

printf '%s' "$json" | grep -q '"type": "error"' \
    && printf "ERROR $id\n" && exit 0

nComments=$(printf '%s' "$json" | grep -o '"size": [0-9]*' | cut -d' ' -f2)
: ${nComments:=EMPTY}

checkNumeric=$(printf '%s' "$nComments" | tr -dc 0-9)
[ "$nComments" != "$checkNumeric" ] \
    && printf >&2 "!ERROR! $id:\n%s\n" "$json" && exit 1

printf "$nComments $id\n"
Run Code Online (Sandbox Code Playgroud)

要使用它,请考虑到上述错误的可能性:

A)准备输入数据。从本地存储库,生成所需的提交列表(git fetch -a如果需要,在更新本地git repo之前运行);查看git help rev-list如何自定义。

git rev-list --all | sort > sorted-all.id
cp sorted-all.id remaining.id
Run Code Online (Sandbox Code Playgroud)

B)运行脚本。请注意,密码是在此处作为参数传递的-因此请先stty -echo; IFS= read -r passwd; stty echo在一行中安全地使用,将其分配给变量;另请参阅下面的安全注意事项。使用option将处理并行化为15个进程-P

< remaining.id xargs -P 15 -L 1 ./getNComments.sh $passwd > commits.temp
Run Code Online (Sandbox Code Playgroud)

C)达到速率限制时,即getNComments.sh打印!ERROR!,然后杀死上面的命令(Ctrl-C),并在下面执行以下命令以更新输入和输出文件。等待一段时间,以增加请求限制,然后重新执行以上一个命令,然后重复执行直到所有数据都已处理(即wc -l remaining.id返回0)。

cat commits.temp >> commits.result
cut -d' ' -f2 commits.result | sort | comm -13 - sorted-all.id > remaining.id
Run Code Online (Sandbox Code Playgroud)

D)最后,您可以获得带有以下注释的提交:

grep '^[1-9]' commits.result
Run Code Online (Sandbox Code Playgroud)

提取拉取请求和问题的注释

该过程与获取提交的注释相同,但是需要进行以下两项调整:

  1. 编辑脚本以根据需要commitpullrequests或替换URL issues

  2. $n是问题数量/永久居民进行搜索。git rev-list上面的命令变为:seq 1 $n > sorted-all.id

可以通过以下方式获取存储库中PR的总数:

curl -su username $url/pullrequests'?state=&fields=size'
Run Code Online (Sandbox Code Playgroud)

以及(如果已设置问题跟踪器)以下问题的数量:

curl -su username $url/issues'?fields=size'
Run Code Online (Sandbox Code Playgroud)

希望该存储库具有足够的PR和问题,以便可以一次性获取所有数据。

查看评论

可以通过Web界面在其commit / PR / issue页面上正常查看它们:

https://bitbucket.org/{repoOwnerName}/{repoName}/commits/{commitHash}
https://bitbucket.org/{repoOwnerName}/{repoName}/pull-requests/{prId}
https://bitbucket.org/{repoOwnerName}/{repoName}/issues/{issueId}
Run Code Online (Sandbox Code Playgroud)

例如,要在firefox中打开所有带注释的PR:

awk '/^[1-9]/{print "https://bitbucket.org/{repoOwnerName}/{repoName}/pull-requests/"$2}' PRs.result | xargs firefox
Run Code Online (Sandbox Code Playgroud)

安全注意事项

通过ps ax(或/proc/$PID/cmdline),命令行上传递的参数对系统的所有用户都是可见的。因此,将公开位桶密码,如果系统由多个用户共享,则可能是一个问题。有以下三个命令可从命令行获取密码:xargs,脚本和curl。

看起来curl试图通过覆盖它的内存来隐藏密码,但是它不能保证能起作用,即使这样做了,它也会在过程开始后的很短时间内使密码可见。在我的系统上,curl的参数没有隐藏。

更好的选择是通过环境变量传递敏感信息。它们应该仅对当前用户可见,并通过ps axe(或/proc/$PID/environ)可见;尽管似乎有些系统允许所有用户访问此信息(执行a ls -l /proc/*/environ检查环境文件的权限)。

在该脚本中只需更换线pw=$1 id=$2id=$1,然后传递pw=$passwd之前xargs在命令行调用。这将使环境变量pw可见xargs及其所有后代的过程,也就是剧本和它的孩子(curlgrepcut等),这可能会或可能无法读取变量。curl不会从环境中读取密码,但是如果上面提到的密码隐藏技巧有效,那么它可能就足够了。

有多种方法可以避免通过命令行传递密码来卷曲,特别是通过使用option的标准输入-K -。在脚本中,替换curl -s -u username:"$pw"printf -- '-s\n-u "%s"\n' "$authinfo" | curl -K -并定义变量authinfo以包含格式为username:password的数据。请注意,此方法printf必须是内置的shell,以确保安全(使用选中type printf),否则密码将显示在其过程参数中。如果不是内置的,请尝试使用printecho代替。

一个ps在任何情况下都不会出现在输出中的环境变量的简单替代方法是通过文件。创建具有对当前用户(chmod 600)的读/写权限的文件,然后对其进行编辑,使其包含username:password作为第一行。在脚本中,将其替换pw=$1IFS= read -r authinfo < "$1",然后对其进行编辑,以使用curl的-K选项,如上段所述。在命令行调用中$passwd,用文件名替换。

文件方法的缺点是密码将被写入磁盘(请注意,其中的文件/proc不在磁盘上)。如果这也是不希望的,则可以传递命名管道而不是常规文件:

mkfifo pipe
chmod 600 pipe
# make sure printf is a builtin, or use an equivalent instead
(while :; do printf -- '%s\n' "username:$passwd"; done) > pipe&
pid=$!
exec 3<pipe
Run Code Online (Sandbox Code Playgroud)

然后调用传递的脚本pipe而不是文件。最后,进行清理:

kill $pid
exec 3<&-
Run Code Online (Sandbox Code Playgroud)

这样可以确保将身份验证信息直接从外壳传递给脚本(通过内核),不写入磁盘,也不会通过公开给其他用户ps


Mar*_*man 2

您可以转到“提交”并查看每个提交的第一行,您需要单击每个提交才能查看更多信息。

如果我找到一种方法来查看所有内容而无需深入研究每个提交,我将更新此答案。