mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Deduplicate lfs common code (#30704)
This commit is contained in:
		
							
								
								
									
										32
									
								
								modules/git/pipeline/lfs_common.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								modules/git/pipeline/lfs_common.go
									
									
									
									
									
										Normal file
									
								
							| @@ -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) | ||||||
|  | } | ||||||
| @@ -7,12 +7,10 @@ package pipeline | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"fmt" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" |  | ||||||
| 
 | 
 | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 
 | 
 | ||||||
| @@ -21,23 +19,6 @@ import ( | |||||||
| 	"github.com/go-git/go-git/v5/plumbing/object" | 	"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 | // FindLFSFile finds commits that contain a provided pointer file hash | ||||||
| func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { | func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { | ||||||
| 	resultsMap := map[string]*LFSResult{} | 	resultsMap := map[string]*LFSResult{} | ||||||
| @@ -51,7 +32,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||||||
| 		All:   true, | 		All:   true, | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("Failed to get GoGit CommitsIter. Error: %w", err) | 		return nil, lfsError("failed to get GoGit CommitsIter", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	err = commitsIter.ForEach(func(gitCommit *object.Commit) error { | 	err = commitsIter.ForEach(func(gitCommit *object.Commit) error { | ||||||
| @@ -85,7 +66,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||||||
| 		return nil | 		return nil | ||||||
| 	}) | 	}) | ||||||
| 	if err != nil && err != io.EOF { | 	if err != nil && err != io.EOF { | ||||||
| 		return nil, fmt.Errorf("Failure in CommitIter.ForEach: %w", err) | 		return nil, lfsError("failure in CommitIter.ForEach", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, result := range resultsMap { | 	for _, result := range resultsMap { | ||||||
| @@ -156,7 +137,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||||||
| 	select { | 	select { | ||||||
| 	case err, has := <-errChan: | 	case err, has := <-errChan: | ||||||
| 		if has { | 		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: | 	default: | ||||||
| 	} | 	} | ||||||
| @@ -8,33 +8,14 @@ package pipeline | |||||||
| import ( | import ( | ||||||
| 	"bufio" | 	"bufio" | ||||||
| 	"bytes" | 	"bytes" | ||||||
| 	"fmt" |  | ||||||
| 	"io" | 	"io" | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"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 | // FindLFSFile finds commits that contain a provided pointer file hash | ||||||
| func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { | func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, error) { | ||||||
| 	resultsMap := map[string]*LFSResult{} | 	resultsMap := map[string]*LFSResult{} | ||||||
| @@ -137,11 +118,11 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||||||
| 					n += int64(count) | 					n += int64(count) | ||||||
| 					if bytes.Equal(binObjectID, objectID.RawValue()) { | 					if bytes.Equal(binObjectID, objectID.RawValue()) { | ||||||
| 						result := LFSResult{ | 						result := LFSResult{ | ||||||
| 							Name:      curPath + string(fname), | 							Name:         curPath + string(fname), | ||||||
| 							SHA:       curCommit.ID.String(), | 							SHA:          curCommit.ID.String(), | ||||||
| 							Summary:   strings.Split(strings.TrimSpace(curCommit.CommitMessage), "\n")[0], | 							Summary:      strings.Split(strings.TrimSpace(curCommit.CommitMessage), "\n")[0], | ||||||
| 							When:      curCommit.Author.When, | 							When:         curCommit.Author.When, | ||||||
| 							ParentIDs: curCommit.Parents, | 							ParentHashes: curCommit.Parents, | ||||||
| 						} | 						} | ||||||
| 						resultsMap[curCommit.ID.String()+":"+curPath+string(fname)] = &result | 						resultsMap[curCommit.ID.String()+":"+curPath+string(fname)] = &result | ||||||
| 					} else if string(mode) == git.EntryModeTree.String() { | 					} 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 { | 	for _, result := range resultsMap { | ||||||
| 		hasParent := false | 		hasParent := false | ||||||
| 		for _, parentID := range result.ParentIDs { | 		for _, parentID := range result.ParentHashes { | ||||||
| 			if _, hasParent = resultsMap[parentID.String()+":"+result.Name]; hasParent { | 			if _, hasParent = resultsMap[parentID.String()+":"+result.Name]; hasParent { | ||||||
| 				break | 				break | ||||||
| 			} | 			} | ||||||
| @@ -240,7 +221,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||||||
| 	select { | 	select { | ||||||
| 	case err, has := <-errChan: | 	case err, has := <-errChan: | ||||||
| 		if has { | 		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: | 	default: | ||||||
| 	} | 	} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user