drone/git/mapping.go

253 lines
5.7 KiB
Go

// Copyright 2023 Harness, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package git
import (
"fmt"
"github.com/harness/gitness/git/api"
"github.com/harness/gitness/git/parser"
)
func mapBranch(b *api.Branch) (*Branch, error) {
if b == nil {
return nil, fmt.Errorf("rpc branch is nil")
}
var commit *Commit
if b.Commit != nil {
var err error
commit, err = mapCommit(b.Commit)
if err != nil {
return nil, err
}
}
return &Branch{
Name: b.Name,
SHA: b.SHA,
Commit: commit,
}, nil
}
func mapCommit(c *api.Commit) (*Commit, error) {
if c == nil {
return nil, fmt.Errorf("rpc commit is nil")
}
author, err := mapSignature(&c.Author)
if err != nil {
return nil, fmt.Errorf("failed to map rpc author: %w", err)
}
comitter, err := mapSignature(&c.Committer)
if err != nil {
return nil, fmt.Errorf("failed to map rpc committer: %w", err)
}
return &Commit{
SHA: c.SHA,
ParentSHAs: c.ParentSHAs,
Title: c.Title,
Message: c.Message,
Author: *author,
Committer: *comitter,
FileStats: mapFileStats(c.FileStats),
}, nil
}
func mapFileStats(typeStats []api.CommitFileStats) []CommitFileStats {
var stats = make([]CommitFileStats, len(typeStats))
for i, tStat := range typeStats {
stats[i] = CommitFileStats{
Status: tStat.ChangeType,
Path: tStat.Path,
OldPath: tStat.OldPath,
Insertions: tStat.Insertions,
Deletions: tStat.Deletions,
}
}
return stats
}
func mapSignature(s *api.Signature) (*Signature, error) {
if s == nil {
return nil, fmt.Errorf("rpc signature is nil")
}
identity, err := mapIdentity(&s.Identity)
if err != nil {
return nil, fmt.Errorf("failed to map rpc identity: %w", err)
}
return &Signature{
Identity: identity,
When: s.When,
}, nil
}
func mapIdentity(id *api.Identity) (Identity, error) {
if id == nil {
return Identity{}, fmt.Errorf("rpc identity is nil")
}
return Identity{
Name: id.Name,
Email: id.Email,
}, nil
}
func mapBranchesSortOption(o BranchSortOption) api.GitReferenceField {
switch o {
case BranchSortOptionName:
return api.GitReferenceFieldObjectName
case BranchSortOptionDate:
return api.GitReferenceFieldCreatorDate
case BranchSortOptionDefault:
fallthrough
default:
// no need to error out - just use default for sorting
return ""
}
}
func mapAnnotatedTag(tag *api.Tag) *CommitTag {
tagger, _ := mapSignature(&tag.Tagger)
return &CommitTag{
Name: tag.Name,
SHA: tag.Sha,
Title: tag.Title,
Message: tag.Message,
Tagger: tagger,
IsAnnotated: true,
Commit: nil,
}
}
func mapListCommitTagsSortOption(s TagSortOption) api.GitReferenceField {
switch s {
case TagSortOptionDate:
return api.GitReferenceFieldCreatorDate
case TagSortOptionName:
return api.GitReferenceFieldRefName
case TagSortOptionDefault:
return api.GitReferenceFieldRefName
default:
// no need to error out - just use default for sorting
return api.GitReferenceFieldRefName
}
}
func mapTreeNode(n *api.TreeNode) (TreeNode, error) {
if n == nil {
return TreeNode{}, fmt.Errorf("rpc tree node is nil")
}
nodeType, err := mapTreeNodeType(n.NodeType)
if err != nil {
return TreeNode{}, err
}
mode, err := mapTreeNodeMode(n.Mode)
if err != nil {
return TreeNode{}, err
}
return TreeNode{
Type: nodeType,
Mode: mode,
SHA: n.SHA.String(),
Name: n.Name,
Path: n.Path,
}, nil
}
func mapTreeNodeType(t api.TreeNodeType) (TreeNodeType, error) {
switch t {
case api.TreeNodeTypeBlob:
return TreeNodeTypeBlob, nil
case api.TreeNodeTypeCommit:
return TreeNodeTypeCommit, nil
case api.TreeNodeTypeTree:
return TreeNodeTypeTree, nil
default:
return TreeNodeTypeBlob, fmt.Errorf("unknown rpc tree node type: %d", t)
}
}
func mapTreeNodeMode(m api.TreeNodeMode) (TreeNodeMode, error) {
switch m {
case api.TreeNodeModeFile:
return TreeNodeModeFile, nil
case api.TreeNodeModeExec:
return TreeNodeModeExec, nil
case api.TreeNodeModeSymlink:
return TreeNodeModeSymlink, nil
case api.TreeNodeModeCommit:
return TreeNodeModeCommit, nil
case api.TreeNodeModeTree:
return TreeNodeModeTree, nil
default:
return TreeNodeModeFile, fmt.Errorf("unknown rpc tree node mode: %d", m)
}
}
func mapRenameDetails(c []api.PathRenameDetails) []*RenameDetails {
renameDetailsList := make([]*RenameDetails, len(c))
for i, detail := range c {
renameDetailsList[i] = &RenameDetails{
OldPath: detail.OldPath,
NewPath: detail.Path,
CommitShaBefore: detail.CommitSHABefore,
CommitShaAfter: detail.CommitSHAAfter,
}
}
return renameDetailsList
}
func mapToSortOrder(o SortOrder) api.SortOrder {
switch o {
case SortOrderAsc:
return api.SortOrderAsc
case SortOrderDesc:
return api.SortOrderDesc
case SortOrderDefault:
return api.SortOrderDefault
default:
// no need to error out - just use default for sorting
return api.SortOrderDefault
}
}
func mapHunkHeader(h *parser.HunkHeader) HunkHeader {
return HunkHeader{
OldLine: h.OldLine,
OldSpan: h.OldSpan,
NewLine: h.NewLine,
NewSpan: h.NewSpan,
Text: h.Text,
}
}
func mapDiffFileHeader(h *parser.DiffFileHeader) DiffFileHeader {
return DiffFileHeader{
OldName: h.OldFileName,
NewName: h.NewFileName,
Extensions: h.Extensions,
}
}