这个项目有X个星标

      ☕ 2 分钟

参与极狐Gitlab创作营,赢取酷炫奖品!
极狐GitLab是GitLab DevOps平台的中国发行版。

这是一个使用Gitlab API的例子。通过Gitlab API,你可以做很多有趣/有意义的事情,最大化自动化你的工作流。

星标是一个很直接的指标,可以反映项目的受欢迎程度和适用性。

如果有这样一个项目,它的设计目的就是让项目本身的标题/路径与项目的星标数目保持同步呢?

对,是真的,不信你可以点个星标试试看。 :)
对,是真的,不信你可以点个星标试试看。 :)

要实现这个点子,思路很直接:

graph TD
    start[开始] --> get_stars(获取星标数目)
    get_stars --> compare{星标数目和上次检查不一样?}
    compare --> |是| update(更新项目标题和路径)
    compare --> |否| sleep(休息一会儿)
    update --> sleep
    sleep --> get_stars

获取项目星标数目更新项目属性的API都是现成的,用上社区的SDK,万事具备,只差一个循环:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var currentStars int
for {
    time.Sleep(interval)

    project, _, badLuck := jihu.Projects.GetProject(config.ProjectID, &gitlab.GetProjectOptions{})
    if badLuck != nil {
        logger.Warn("failed to get project", zap.Int("projectID", config.ProjectID), zap.Error(badLuck))
        continue
    }

    if project.StarCount == currentStars {
        // relax
        continue
    }

    currentStars = project.StarCount

    newName := fmt.Sprintf("这个项目有%d个星标", currentStars)
    newPath := fmt.Sprintf("This-Project-Has-%d-Stars", currentStars)
    _, _, badLuck = jihu.Projects.EditProject(config.ProjectID, &gitlab.EditProjectOptions{
        Name: &newName,
        Path: &newPath,
    })
    if badLuck != nil {
        logger.Warn("failed to update start count", zap.Int("projectID", config.ProjectID), zap.Error(err))
        continue
    }

    logger.Info("new star count updated", zap.Int("projectID", config.ProjectID), zap.Int("stars", currentStars))
}

我只摘取了最核心的部分,初始化和配置声明可以查看代码原文

Gitlab的重定向会保证项目的各个路径都是可用的,毕竟这么做我们自己都没法确定此时此刻项目的路径是哪一个了……

这个点子是从RealPeha那里学来的,我第一次看到它时,乐了好一会。


nanmu42
作者
nanmu42
用心构建美好事物。

目录