Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package pipeline
  4. import (
  5. "bufio"
  6. "bytes"
  7. "context"
  8. "fmt"
  9. "io"
  10. "strings"
  11. "sync"
  12. "code.gitea.io/gitea/modules/git"
  13. "code.gitea.io/gitea/modules/log"
  14. )
  15. // RevListAllObjects runs rev-list --objects --all and writes to a pipewriter
  16. func RevListAllObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, basePath string, errChan chan<- error) {
  17. defer wg.Done()
  18. defer revListWriter.Close()
  19. stderr := new(bytes.Buffer)
  20. var errbuf strings.Builder
  21. cmd := git.NewCommand(ctx, "rev-list", "--objects", "--all")
  22. if err := cmd.Run(&git.RunOpts{
  23. Dir: basePath,
  24. Stdout: revListWriter,
  25. Stderr: stderr,
  26. }); err != nil {
  27. log.Error("git rev-list --objects --all [%s]: %v - %s", basePath, err, errbuf.String())
  28. err = fmt.Errorf("git rev-list --objects --all [%s]: %w - %s", basePath, err, errbuf.String())
  29. _ = revListWriter.CloseWithError(err)
  30. errChan <- err
  31. }
  32. }
  33. // RevListObjects run rev-list --objects from headSHA to baseSHA
  34. func RevListObjects(ctx context.Context, revListWriter *io.PipeWriter, wg *sync.WaitGroup, tmpBasePath, headSHA, baseSHA string, errChan chan<- error) {
  35. defer wg.Done()
  36. defer revListWriter.Close()
  37. stderr := new(bytes.Buffer)
  38. var errbuf strings.Builder
  39. cmd := git.NewCommand(ctx, "rev-list", "--objects").AddDynamicArguments(headSHA)
  40. if baseSHA != "" {
  41. cmd = cmd.AddArguments("--not").AddDynamicArguments(baseSHA)
  42. }
  43. if err := cmd.Run(&git.RunOpts{
  44. Dir: tmpBasePath,
  45. Stdout: revListWriter,
  46. Stderr: stderr,
  47. }); err != nil {
  48. log.Error("git rev-list [%s]: %v - %s", tmpBasePath, err, errbuf.String())
  49. errChan <- fmt.Errorf("git rev-list [%s]: %w - %s", tmpBasePath, err, errbuf.String())
  50. }
  51. }
  52. // BlobsFromRevListObjects reads a RevListAllObjects and only selects blobs
  53. func BlobsFromRevListObjects(revListReader *io.PipeReader, shasToCheckWriter *io.PipeWriter, wg *sync.WaitGroup) {
  54. defer wg.Done()
  55. defer revListReader.Close()
  56. scanner := bufio.NewScanner(revListReader)
  57. defer func() {
  58. _ = shasToCheckWriter.CloseWithError(scanner.Err())
  59. }()
  60. for scanner.Scan() {
  61. line := scanner.Text()
  62. if len(line) == 0 {
  63. continue
  64. }
  65. fields := strings.Split(line, " ")
  66. if len(fields) < 2 || len(fields[1]) == 0 {
  67. continue
  68. }
  69. toWrite := []byte(fields[0] + "\n")
  70. for len(toWrite) > 0 {
  71. n, err := shasToCheckWriter.Write(toWrite)
  72. if err != nil {
  73. _ = revListReader.CloseWithError(err)
  74. break
  75. }
  76. toWrite = toWrite[n:]
  77. }
  78. }
  79. }