首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取BitBucket repos的代码

获取BitBucket repos的代码
EN

Code Review用户
提问于 2019-11-19 11:41:42
回答 1查看 197关注 0票数 4

这实际上很好(我们有> 2k的回复),但我非常希望它一有结果就立即开始产生结果。大多数情况下,它看起来比它更快(通过更多的响应)。

代码语言:javascript
复制
   bbrepos(){
        #clone[1] is ssh using a filter made the escaping really ugly. 
        #If it becomes necessary we can use a jq arg
        # get max number of repos, ceil(repos / 50), then create a page 
        #sequence and curl them all
        local url=https://api.bitbucket.org/2.0/repositories/twengg
        local project=${1:+"q=project.key=\"$1\""}
        curl -snL  "$url?pagelen=0&page=1" | jq '"$(((\(.size) / 50) + 1 ))"' \
            | xargs bash -c 'eval "echo $1"' _ | xargs seq 1 | xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n" \
            | xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL  "$1/$2" | jq -er .values[].links.clone[1].href' _ $url {} \ #clone[1] is ssh
            | sort -u
    }

工作流程示例:

代码语言:javascript
复制
bbsearch something | xargs -P 20 git clone

或者,也可以方便地拥有以下其他工作流:

代码语言:javascript
复制
bbsearch something other thing | xargs -P 20 git clone

cat things-to-find.txt | bbsearch | xargs -P 20 git clone

示例有效载荷(通常是很大的,因此我将其简化为所需的内容):

代码语言:javascript
复制
{
  "pagelen": 1,
  "size": 3054,
  "values": [
    {
      "links": {
        "clone": [
          {
            "href": "https://chb0bitbucket@bitbucket.org/twengg/development-process.git",
            "name": "https"
          },
          {
            "href": "git@bitbucket.org:twengg/development-process.git",
            "name": "ssh"
          }
        ],
        "self": {
          "href": "https://api.bitbucket.org/2.0/repositories/twengg/development-process"
        }
      }
    }
  ],
  "page": 1,
  "next": "https://api.bitbucket.org/2.0/repositories/twengg?page=2"
}
EN

回答 1

Code Review用户

发布于 2019-11-28 19:42:56

eval是邪恶的

始终寻找避免eval的方法。

来自已发布代码的相关片段:

curl -snL "$url?pagelen=0&page=1“\区jq‘”$(.size)/ 50) +1))“\ xargs bash -c 'eval "echo $1”_

代码使用jq创建要由Bash计算的格式化表达式,在表达式的中间注入.size

实现相同目标的更好方法是让jq简单地输出变量本身,然后用Bash编写表达式:

代码语言:javascript
复制
curl -snL  "$url?pagelen=0&page=1" \
    | jq -r .size \
    | xargs bash -c 'echo $((($1 / 50) + 1))' _

不必要管道

使用xargs处理一行输入是很奇怪的,而生成另一个Bash只是为了计算表达式是很奇怪的。实际上,没有必要在一个管道中强制执行一系列操作。

我会像这样重写上面的片段:

代码语言:javascript
复制
repos_count=$(curl -snL "$url?pagelen=0&page=1" | jq -r .size)
((pages_count = (repos_count / 50) + 1))

用描述性名称

将位置参数存储在变量中

必须记住$1$2的含义是一种心理负担。我会将它们存储在函数开头带有描述性名称的局部变量中。

避免seq

它是否过时了,并非在所有系统中都可用。使用Bash计数循环代替:

代码语言:javascript
复制
for ((page = 1; page <= pages_count; page++)); do
    ...
done \
| xargs -L 1 ...

长管道

断线

当每行有一条语句时,更容易阅读代码。尤其是当一条线太长时,你必须向右滚动才能看到它。所以,不是这样的:

@ xargs bash -c‘clone $1"’_ xargs seq 1\ xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n“\\ xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL”$1/2“而论jq -er .values[].links.clone.href‘’$url {} \#克隆是ssh排序-u

我建议这样写:

代码语言:javascript
复制
| xargs bash -c 'eval "echo $1"' _ \
| xargs seq 1 \
| xargs -L 1 printf "?pagelen=50&page=%s&${1:-$project}\n" \
| xargs -I {} -L 1 -P 20 -I {} bash -c 'curl -snL  "$1/$2" \
| jq -er .values[].links.clone[1].href' _ $url {} \
| sort -u

总是用作命令行参数

的双引号变量。

| jq -er .values[].links.clone[1].href' _ $url {}中,你忘了引用$url的双引号。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/232640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档