]> source.dussan.org Git - gitea.git/commitdiff
Deduplicate lfs common code (#30704)
authorwxiaoguang <wxiaoguang@gmail.com>
Fri, 26 Apr 2024 02:53:30 +0000 (10:53 +0800)
committerGitHub <noreply@github.com>
Fri, 26 Apr 2024 02:53:30 +0000 (02:53 +0000)
modules/git/pipeline/lfs.go [deleted file]
modules/git/pipeline/lfs_common.go [new file with mode: 0644]
modules/git/pipeline/lfs_gogit.go [new file with mode: 0644]
modules/git/pipeline/lfs_nogogit.go

diff --git a/modules/git/pipeline/lfs.go b/modules/git/pipeline/lfs.go
deleted file mode 100644 (file)
index 6dfca24..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2020 The Gitea Authors. All rights reserved.
-// SPDX-License-Identifier: MIT
-
-//go:build gogit
-
-package pipeline
-
-import (
-       "bufio"
-       "fmt"
-       "io"
-       "sort"
-       "strings"
-       "sync"
-       "time"
-
-       "code.gitea.io/gitea/modules/git"
-
-       gogit "github.com/go-git/go-git/v5"
-       "github.com/go-git/go-git/v5/plumbing"
-       "github.com/go-git/go-git/v5/plumbing/object"
-)
-
-// LFSResult represents commits found using a provided pointer file hash
-type LFSResult struct {
-       Name           string
-       SHA            string
-       Summary        string
-       When           time.Time
-       ParentHashes   []git.ObjectID
-       BranchName     string
-       FullCommitName string
-}
-
-type lfsResultSlice []*LFSResult
-
-func (a lfsResultSlice) Len() int           { return len(a) }
-func (a lfsResultSlice) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a lfsResultSlice) Less(i, j int) bool { return a[j].When.After(a[i].When) }
-
-// FindLFSFile finds commits that contain a provided pointer file hash
-func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) {
-       resultsMap := map[string]*LFSResult{}
-       results := make([]*LFSResult, 0)
-
-       basePath := repo.Path
-       gogitRepo := repo.GoGitRepo()
-
-       commitsIter, err := gogitRepo.Log(&gogit.LogOptions{
-               Order: gogit.LogOrderCommitterTime,
-               All:   true,
-       })
-       if err != nil {
-               return nil, fmt.Errorf("Failed to get GoGit CommitsIter. Error: %w", err)
-       }
-
-       err = commitsIter.ForEach(func(gitCommit *object.Commit) error {
-               tree, err := gitCommit.Tree()
-               if err != nil {
-                       return err
-               }
-               treeWalker := object.NewTreeWalker(tree, true, nil)
-               defer treeWalker.Close()
-               for {
-                       name, entry, err := treeWalker.Next()
-                       if err == io.EOF {
-                               break
-                       }
-                       if entry.Hash == plumbing.Hash(objectID.RawValue()) {
-                               parents := make([]git.ObjectID, len(gitCommit.ParentHashes))
-                               for i, parentCommitID := range gitCommit.ParentHashes {
-                                       parents[i] = git.ParseGogitHash(parentCommitID)
-                               }
-
-                               result := LFSResult{
-                                       Name:         name,
-                                       SHA:          gitCommit.Hash.String(),
-                                       Summary:      strings.Split(strings.TrimSpace(gitCommit.Message), "\n")[0],
-                                       When:         gitCommit.Author.When,
-                                       ParentHashes: parents,
-                               }
-                               resultsMap[gitCommit.Hash.String()+":"+name] = &result
-                       }
-               }
-               return nil
-       })
-       if err != nil && err != io.EOF {
-               return nil, fmt.Errorf("Failure in CommitIter.ForEach: %w", err)
-       }
-
-       for _, result := range resultsMap {
-               hasParent := false
-               for _, parentHash := range result.ParentHashes {
-                       if _, hasParent = resultsMap[parentHash.String()+":"+result.Name]; hasParent {
-                               break
-                       }
-               }
-               if !hasParent {
-                       results = append(results, result)
-               }
-       }
-
-       sort.Sort(lfsResultSlice(results))
-
-       // Should really use a go-git function here but name-rev is not completed and recapitulating it is not simple
-       shasToNameReader, shasToNameWriter := io.Pipe()
-       nameRevStdinReader, nameRevStdinWriter := io.Pipe()
-       errChan := make(chan error, 1)
-       wg := sync.WaitGroup{}
-       wg.Add(3)
-
-       go func() {
-               defer wg.Done()
-               scanner := bufio.NewScanner(nameRevStdinReader)
-               i := 0
-               for scanner.Scan() {
-                       line := scanner.Text()
-                       if len(line) == 0 {
-                               continue
-                       }
-                       result := results[i]
-                       result.FullCommitName = line
-                       result.BranchName = strings.Split(line, "~")[0]
-                       i++
-               }
-       }()
-       go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath)
-       go func() {
-               defer wg.Done()
-               defer shasToNameWriter.Close()
-               for _, result := range results {
-                       i := 0
-                       if i < len(result.SHA) {
-                               n, err := shasToNameWriter.Write([]byte(result.SHA)[i:])
-                               if err != nil {
-                                       errChan <- err
-                                       break
-                               }
-                               i += n
-                       }
-                       n := 0
-                       for n < 1 {
-                               n, err = shasToNameWriter.Write([]byte{'\n'})
-                               if err != nil {
-                                       errChan <- err
-                                       break
-                               }
-
-                       }
-
-               }
-       }()
-
-       wg.Wait()
-
-       select {
-       case err, has := <-errChan:
-               if has {
-                       return nil, fmt.Errorf("Unable to obtain name for LFS files. Error: %w", err)
-               }
-       default:
-       }
-
-       return results, nil
-}
diff --git a/modules/git/pipeline/lfs_common.go b/modules/git/pipeline/lfs_common.go
new file mode 100644 (file)
index 0000000..188e7d4
--- /dev/null
@@ -0,0 +1,32 @@
+// Copyright 2024 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package pipeline
+
+import (
+       "fmt"
+       "time"
+
+       "code.gitea.io/gitea/modules/git"
+)
+
+// LFSResult represents commits found using a provided pointer file hash
+type LFSResult struct {
+       Name           string
+       SHA            string
+       Summary        string
+       When           time.Time
+       ParentHashes   []git.ObjectID
+       BranchName     string
+       FullCommitName string
+}
+
+type lfsResultSlice []*LFSResult
+
+func (a lfsResultSlice) Len() int           { return len(a) }
+func (a lfsResultSlice) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
+func (a lfsResultSlice) Less(i, j int) bool { return a[j].When.After(a[i].When) }
+
+func lfsError(msg string, err error) error {
+       return fmt.Errorf("LFS error occurred, %s: err: %w", msg, err)
+}
diff --git a/modules/git/pipeline/lfs_gogit.go b/modules/git/pipeline/lfs_gogit.go
new file mode 100644 (file)
index 0000000..adcf8ed
--- /dev/null
@@ -0,0 +1,146 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+//go:build gogit
+
+package pipeline
+
+import (
+       "bufio"
+       "io"
+       "sort"
+       "strings"
+       "sync"
+
+       "code.gitea.io/gitea/modules/git"
+
+       gogit "github.com/go-git/go-git/v5"
+       "github.com/go-git/go-git/v5/plumbing"
+       "github.com/go-git/go-git/v5/plumbing/object"
+)
+
+// FindLFSFile finds commits that contain a provided pointer file hash
+func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) {
+       resultsMap := map[string]*LFSResult{}
+       results := make([]*LFSResult, 0)
+
+       basePath := repo.Path
+       gogitRepo := repo.GoGitRepo()
+
+       commitsIter, err := gogitRepo.Log(&gogit.LogOptions{
+               Order: gogit.LogOrderCommitterTime,
+               All:   true,
+       })
+       if err != nil {
+               return nil, lfsError("failed to get GoGit CommitsIter", err)
+       }
+
+       err = commitsIter.ForEach(func(gitCommit *object.Commit) error {
+               tree, err := gitCommit.Tree()
+               if err != nil {
+                       return err
+               }
+               treeWalker := object.NewTreeWalker(tree, true, nil)
+               defer treeWalker.Close()
+               for {
+                       name, entry, err := treeWalker.Next()
+                       if err == io.EOF {
+                               break
+                       }
+                       if entry.Hash == plumbing.Hash(objectID.RawValue()) {
+                               parents := make([]git.ObjectID, len(gitCommit.ParentHashes))
+                               for i, parentCommitID := range gitCommit.ParentHashes {
+                                       parents[i] = git.ParseGogitHash(parentCommitID)
+                               }
+
+                               result := LFSResult{
+                                       Name:         name,
+                                       SHA:          gitCommit.Hash.String(),
+                                       Summary:      strings.Split(strings.TrimSpace(gitCommit.Message), "\n")[0],
+                                       When:         gitCommit.Author.When,
+                                       ParentHashes: parents,
+                               }
+                               resultsMap[gitCommit.Hash.String()+":"+name] = &result
+                       }
+               }
+               return nil
+       })
+       if err != nil && err != io.EOF {
+               return nil, lfsError("failure in CommitIter.ForEach", err)
+       }
+
+       for _, result := range resultsMap {
+               hasParent := false
+               for _, parentHash := range result.ParentHashes {
+                       if _, hasParent = resultsMap[parentHash.String()+":"+result.Name]; hasParent {
+                               break
+                       }
+               }
+               if !hasParent {
+                       results = append(results, result)
+               }
+       }
+
+       sort.Sort(lfsResultSlice(results))
+
+       // Should really use a go-git function here but name-rev is not completed and recapitulating it is not simple
+       shasToNameReader, shasToNameWriter := io.Pipe()
+       nameRevStdinReader, nameRevStdinWriter := io.Pipe()
+       errChan := make(chan error, 1)
+       wg := sync.WaitGroup{}
+       wg.Add(3)
+
+       go func() {
+               defer wg.Done()
+               scanner := bufio.NewScanner(nameRevStdinReader)
+               i := 0
+               for scanner.Scan() {
+                       line := scanner.Text()
+                       if len(line) == 0 {
+                               continue
+                       }
+                       result := results[i]
+                       result.FullCommitName = line
+                       result.BranchName = strings.Split(line, "~")[0]
+                       i++
+               }
+       }()
+       go NameRevStdin(repo.Ctx, shasToNameReader, nameRevStdinWriter, &wg, basePath)
+       go func() {
+               defer wg.Done()
+               defer shasToNameWriter.Close()
+               for _, result := range results {
+                       i := 0
+                       if i < len(result.SHA) {
+                               n, err := shasToNameWriter.Write([]byte(result.SHA)[i:])
+                               if err != nil {
+                                       errChan <- err
+                                       break
+                               }
+                               i += n
+                       }
+                       n := 0
+                       for n < 1 {
+                               n, err = shasToNameWriter.Write([]byte{'\n'})
+                               if err != nil {
+                                       errChan <- err
+                                       break
+                               }
+
+                       }
+
+               }
+       }()
+
+       wg.Wait()
+
+       select {
+       case err, has := <-errChan:
+               if has {
+                       return nil, lfsError("unable to obtain name for LFS files", err)
+               }
+       default:
+       }
+
+       return results, nil
+}
index fe320f39f3fcb6c68a49c9b1ced689527274de36..349cfbd9ce5a2332a6e67f1080feccde5df51879 100644 (file)
@@ -8,33 +8,14 @@ package pipeline
 import (
        "bufio"
        "bytes"
-       "fmt"
        "io"
        "sort"
        "strings"
        "sync"
-       "time"
 
        "code.gitea.io/gitea/modules/git"
 )
 
-// LFSResult represents commits found using a provided pointer file hash
-type LFSResult struct {
-       Name           string
-       SHA            string
-       Summary        string
-       When           time.Time
-       ParentIDs      []git.ObjectID
-       BranchName     string
-       FullCommitName string
-}
-
-type lfsResultSlice []*LFSResult
-
-func (a lfsResultSlice) Len() int           { return len(a) }
-func (a lfsResultSlice) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
-func (a lfsResultSlice) Less(i, j int) bool { return a[j].When.After(a[i].When) }
-
 // FindLFSFile finds commits that contain a provided pointer file hash
 func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) {
        resultsMap := map[string]*LFSResult{}
@@ -137,11 +118,11 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err
                                        n += int64(count)
                                        if bytes.Equal(binObjectID, objectID.RawValue()) {
                                                result := LFSResult{
-                                                       Name:      curPath + string(fname),
-                                                       SHA:       curCommit.ID.String(),
-                                                       Summary:   strings.Split(strings.TrimSpace(curCommit.CommitMessage), "\n")[0],
-                                                       When:      curCommit.Author.When,
-                                                       ParentIDs: curCommit.Parents,
+                                                       Name:         curPath + string(fname),
+                                                       SHA:          curCommit.ID.String(),
+                                                       Summary:      strings.Split(strings.TrimSpace(curCommit.CommitMessage), "\n")[0],
+                                                       When:         curCommit.Author.When,
+                                                       ParentHashes: curCommit.Parents,
                                                }
                                                resultsMap[curCommit.ID.String()+":"+curPath+string(fname)] = &result
                                        } else if string(mode) == git.EntryModeTree.String() {
@@ -183,7 +164,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err
 
        for _, result := range resultsMap {
                hasParent := false
-               for _, parentID := range result.ParentIDs {
+               for _, parentID := range result.ParentHashes {
                        if _, hasParent = resultsMap[parentID.String()+":"+result.Name]; hasParent {
                                break
                        }
@@ -240,7 +221,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err
        select {
        case err, has := <-errChan:
                if has {
-                       return nil, fmt.Errorf("Unable to obtain name for LFS files. Error: %w", err)
+                       return nil, lfsError("unable to obtain name for LFS files", err)
                }
        default:
        }