gitea源码

metadata.go 1.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package vagrant
  4. import (
  5. "archive/tar"
  6. "compress/gzip"
  7. "io"
  8. "strings"
  9. "code.gitea.io/gitea/modules/json"
  10. "code.gitea.io/gitea/modules/validation"
  11. )
  12. const (
  13. PropertyProvider = "vagrant.provider"
  14. )
  15. // Metadata represents the metadata of a Vagrant package
  16. type Metadata struct {
  17. Author string `json:"author,omitempty"`
  18. Description string `json:"description,omitempty"`
  19. ProjectURL string `json:"project_url,omitempty"`
  20. RepositoryURL string `json:"repository_url,omitempty"`
  21. }
  22. // ParseMetadataFromBox parses the metadata of a box file
  23. func ParseMetadataFromBox(r io.Reader) (*Metadata, error) {
  24. gzr, err := gzip.NewReader(r)
  25. if err != nil {
  26. return nil, err
  27. }
  28. defer gzr.Close()
  29. tr := tar.NewReader(gzr)
  30. for {
  31. hd, err := tr.Next()
  32. if err == io.EOF {
  33. break
  34. }
  35. if err != nil {
  36. return nil, err
  37. }
  38. if hd.Typeflag != tar.TypeReg {
  39. continue
  40. }
  41. if hd.Name == "info.json" {
  42. return ParseInfoFile(tr)
  43. }
  44. }
  45. return &Metadata{}, nil
  46. }
  47. // ParseInfoFile parses a info.json file to retrieve the metadata of a Vagrant package
  48. func ParseInfoFile(r io.Reader) (*Metadata, error) {
  49. var values map[string]string
  50. if err := json.NewDecoder(r).Decode(&values); err != nil {
  51. return nil, err
  52. }
  53. m := &Metadata{}
  54. // There is no defined format for this file, just try the common keys
  55. for k, v := range values {
  56. switch strings.ToLower(k) {
  57. case "description":
  58. fallthrough
  59. case "short_description":
  60. m.Description = v
  61. case "website":
  62. fallthrough
  63. case "homepage":
  64. fallthrough
  65. case "url":
  66. if validation.IsValidURL(v) {
  67. m.ProjectURL = v
  68. }
  69. case "repository":
  70. fallthrough
  71. case "source":
  72. if validation.IsValidURL(v) {
  73. m.RepositoryURL = v
  74. }
  75. case "author":
  76. fallthrough
  77. case "authors":
  78. m.Author = v
  79. }
  80. }
  81. return m, nil
  82. }