在repository
主页中,我可以在底部看到recent activity
中发布的评论,该位仅显示10个commnet。
我想要自开始以来发布的所有评论。
有什么办法吗
最佳答案
可以使用bitbucket’s REST API检索对拉取请求,问题和提交的注释。
但是,似乎没有办法在一个地方列出所有它们,因此获取它们的唯一方法是针对存储库的每个PR,发行或提交查询API。
请注意,这花费了很长时间,因为bitbucket似乎对通过API访问存储库数据的访问次数设置了限制:在检索到大约一千个结果后,我得到了超出此资源的速率限制的错误,因此我只能获取大约从上次速率限制错误起,每秒输入一个条目。
查找存储库的API URL
第一步是找到仓库的URL。对于私人存储库,有必要通过提供用户名和密码(使用curl的-u
开关)进行身份验证。 URL的格式为:
https://api.bitbucket.org/2.0/repositories/{repoOwnerName}/{repoName}
从本地git存储库运行
git remote -v
应该提供缺少的值。通过验证是否从存储库信息($url
)中正确检索了存储库信息作为JSON数据来检查伪造的URL(以下称为curl -u username $url
)。获取提交的评论
提交的注释可以从
$url/commit/{commitHash}/comments
访问。生成的JSON数据可以由脚本处理。注意结果是paginated。
下面,我仅提取每次提交的评论数。它由检索到的JSON对象的成员
size
的值指示;我还通过添加GET参数fields=size
来请求partial response。我的脚本
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"
要使用它,请考虑到上述错误的可能性:
A)准备输入数据。从本地存储库中,根据需要生成提交列表(如果需要,请运行
git fetch -a
,然后更新本地git repo);查看git help rev-list
如何进行自定义。git rev-list --all | sort > sorted-all.id
cp sorted-all.id remaining.id
B)运行脚本。请注意,密码是在此处作为参数传递的-因此,请首先使用
stty -echo; IFS= read -r passwd; stty echo
将其安全地分配给变量,并在一行中输入;另请参阅下面的安全注意事项。使用选项-P
在此处将处理并行化为15个进程。< remaining.id xargs -P 15 -L 1 ./getNComments.sh "$passwd" > commits.temp
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
D)最后,您可以获得带有以下注释的提交:
grep '^[1-9]' commits.result
提取拉取请求和问题的注释
该过程与获取提交的注释的过程相同,但是需要进行以下两项调整:
编辑脚本以在URL
commit
中用pullrequests
或issues
替换;令
$n
为要搜索的问题/ PR的数量。上面的git rev-list
命令变为:seq 1 $n > sorted-all.id
可以通过以下方式获取存储库中PR的总数:
curl -su username $url/pullrequests'?state=&fields=size'
以及(如果已设置问题跟踪器)以下问题的数量:
curl -su username $url/issues'?fields=size'
希望该存储库具有足够的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}
例如,要在firefox中打开所有带注释的PR:
awk '/^[1-9]/{print "https://bitbucket.org/{repoOwnerName}/{repoName}/pull-requests/"$2}' PRs.result | xargs firefox
安全注意事项
通过
ps ax
(或/proc/$PID/cmdline
),命令行上传递的参数对系统的所有用户都是可见的。因此,将公开位桶密码,如果系统由多个用户共享,则可能是一个问题。有以下三个命令从命令行获取密码:xargs,脚本和curl。
看起来curl试图通过覆盖它的内存来隐藏密码,但是它不能保证能起作用,即使这样做了,它也会在过程开始后的很短时间内使密码可见。在我的系统上,curl的参数没有隐藏。
更好的选择是通过环境变量传递敏感信息。它们应该仅对当前用户可见,并且可以通过
ps axe
(或/proc/$PID/environ
)以root用户身份查看;尽管似乎有些系统允许所有用户访问此信息(执行ls -l /proc/*/environ
来检查环境文件的权限)。在脚本中,只需将
pw=$1 id=$2
行替换为id=$1
,然后在命令行调用中在pw="$passwd"
之前传递xargs
。它将使环境变量pw
对xargs
及其所有后代进程可见,即脚本及其子级(curl
,grep
,cut
等),它们可能会或可能不会读取变量。 curl不会从环境中读取密码,但是如果上面提到的密码隐藏技巧有效,那么它可能就足够了。有几种方法可以避免通过命令行传递密码来卷曲,特别是通过使用选项
-K -
的标准输入。在脚本中,将curl -s -u username:"$pw"
替换为printf -- '-s\n-u "%s"\n' "$authinfo" | curl -K -
,然后定义变量authinfo
以包含username:password格式的数据。请注意,此方法需要printf
是安全的内置shell(使用type printf
进行检查),否则密码将显示在其进程参数中。如果不是内置的,请尝试使用print
或echo
。一个无论如何都不会出现在
ps
输出中的环境变量的简单替代方法是通过文件。创建一个具有对当前用户(chmod 600
)限制的读/写权限的文件,并对其进行编辑,使其包含username:password作为第一行。在脚本中,将pw=$1
替换为IFS= 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
然后调用传递
pipe
而不是文件的脚本。最后,进行清理:kill $pid
exec 3<&-
这将确保身份验证信息直接从外壳传递给脚本(通过内核),不写入磁盘,也不会通过
ps
暴露给其他用户。
关于repository - 如何查看用户在bitbucket存储库中发布的所有评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20649225/