当前位置:   article > 正文

gitlab获取项目所有文件名

gitlab请求所有文件名

【推荐阅读】微服务还能火多久?>>> hot3.png

gitlab获取项目所有文件名

gitlab api 没有提供获取项目下所有文件名的方法。需要通过间接的方式获取。

通过api 接口

gitlab 提供了一个 /projects/{project_id}/repository/tree?path={path} 的接口可以获取某个路径下的文件和目录。根据官方文档,该接口表现如命令 git ls-tree 类似。由于只能返回路径下的文件和目录,因此需要不断迭代。也就是先访问根目录,取出类型为src的目录,继续遍历,直到遍历所有子目录。网上能够Google到的方案基本都是基于此原理,在此就不再赘述。

通过页面接口(重点)

gitlab页面上提供了一个find file by filename的功能。点进去后,后台会先请求获取所有文件名 ,再通过前端实现实时筛选。本方就是基于此接口,最大的难点在于代码实现页面登录,保存登录信息,然后请求该接口。示例代码基于golang 和第三方库 goreqeust 完成http请求 , goquery 完成页面元素提取。

  1. package main
  2. import (
  3. "net/url"
  4. "github.com/PuerkitoBio/goquery"
  5. "github.com/parnurzeal/gorequest"
  6. "github.com/sirupsen/logrus"
  7. )
  8. var(
  9. GitlabLoginAddr="http://git.example.com/users/sign_in"
  10. GitProjectAddr="http://git.example.com/backend/authservice"
  11. GitUser = "bob"
  12. GitPassword = "bobpassword"
  13. )
  14. func main(){
  15. agent := gorequest.New()
  16. agent.SetDoNotClearSuperAgent(true)
  17. //访问登录页面,获取authenticity_token及其cookies
  18. resp, _, errs := agent.Get(GitlabLoginAddr).End()
  19. if len(errs) > 0{
  20. logrus.Fatal(errs)
  21. }
  22. if resp.StatusCode != 200 {
  23. logrus.Fatal("got statuscode: ", resp.StatusCode)
  24. }
  25. doc, err := goquery.NewDocumentFromReader(resp.Body)
  26. if err != nil {
  27. logrus.Fatal(err)
  28. }
  29. //页面提取 authenticity_token
  30. csrfToken, exist := doc.Find(`input[name="authenticity_token"]`).Attr("value")
  31. if !exist {
  32. logrus.Fatal("failed tp read csrf_token")
  33. }
  34. data := make(url.Values)
  35. data["authenticity_token"] = []string{csrfToken}
  36. data["user[login]"] = []string{GitUser}
  37. data["user[password]"] = []string{GitPassword}
  38. //登录
  39. resp, body, errs := agent.Post(GitlabLoginAddr).SendString(data.Encode()).End()
  40. if len(errs) > 0 {
  41. logrus.Fatal(errs)
  42. }
  43. if resp.StatusCode != 200 {
  44. logrus.Error(body)
  45. logrus.Fatal("got statuscode: ", resp.StatusCode)
  46. }
  47. //获取项目所有文件名
  48. resp, body, errs = agent.Get(GitProjectAddr+"/files/master?format=json").Set("X-CSRF-Token", csrfToken).End()
  49. if len(errs) > 0 {
  50. logrus.Fatal(errs)
  51. }
  52. if resp.StatusCode != 200 {
  53. logrus.Error("got statuscode: ", resp.StatusCode)
  54. }
  55. //body json解析即为所有文件名list
  56. logrus.Info(string(body))
  57. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/120179
推荐阅读
相关标签
  

闽ICP备14008679号