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

标签 repository bitbucket

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中用pullrequestsissues替换;
$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。它将使环境变量pwxargs及其所有后代进程可见,即脚本及其子级(curlgrepcut等),它们可能会或可能不会读取变量。 curl不会从环境中读取密码,但是如果上面提到的密码隐藏技巧有效,那么它可能就足够了。

有几种方法可以避免通过命令行传递密码来卷曲,特别是通过使用选项-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=$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/

相关文章:

c# - DDD 中的共享功能

maven - 如何防止 Maven 在依赖项的 pom 文件中使用 <repository>?

git - 将 git repo 文件推送到服务器

json - 从 Bitbucket 中检索文本文件内容

iphone - 如何在 Xcode 中配置 Git 以使用 BitBucket

repository - Entity Framework 无法获取实体并给出 "Object' s Key Does Not Match..”错误

windows-7 - 在 Ubuntu 和 Windows 7 之间共享双引导存储库?

java - 在哪里可以找到 Artifactory 存储库的 Ivy 描述符

tortoisehg - 如何浏览 Bitbucket 上的公共(public)存储库?

mercurial - 有没有办法提供像 BitBucket/Kiln 这样的基于 Web 的自托管 Mercurial 存储库 fork ?