@@ -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 ( | |||
"bufio" | |||
"fmt" | |||
"io" | |||
"sort" | |||
"strings" | |||
"sync" | |||
"time" | |||
"code.gitea.io/gitea/modules/git" | |||
@@ -21,23 +19,6 @@ import ( | |||
"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{} | |||
@@ -51,7 +32,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||
All: true, | |||
}) | |||
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 { | |||
@@ -85,7 +66,7 @@ func FindLFSFile(repo *git.Repository, objectID git.ObjectID) ([]*LFSResult, err | |||
return nil | |||
}) | |||
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 { | |||
@@ -156,7 +137,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: | |||
} |
@@ -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: | |||
} |