mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
69 lines
2.3 KiB
Go
69 lines
2.3 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"context"
|
|
"path"
|
|
"strings"
|
|
|
|
giturl "github.com/hanzoai/git/modules/git/url"
|
|
"github.com/hanzoai/git/modules/util"
|
|
)
|
|
|
|
// CommitSubmoduleFile represents a file with submodule type.
|
|
type CommitSubmoduleFile struct {
|
|
repoLink string
|
|
fullPath string
|
|
refURL string
|
|
refID string
|
|
|
|
parsed bool
|
|
parsedTargetLink string
|
|
}
|
|
|
|
// NewCommitSubmoduleFile create a new submodule file
|
|
func NewCommitSubmoduleFile(repoLink, fullPath, refURL, refID string) *CommitSubmoduleFile {
|
|
return &CommitSubmoduleFile{repoLink: repoLink, fullPath: fullPath, refURL: refURL, refID: refID}
|
|
}
|
|
|
|
// RefID returns the commit ID of the submodule, it returns empty string for nil receiver
|
|
func (sf *CommitSubmoduleFile) RefID() string {
|
|
if sf == nil {
|
|
return ""
|
|
}
|
|
return sf.refID
|
|
}
|
|
|
|
func (sf *CommitSubmoduleFile) getWebLinkInTargetRepo(ctx context.Context, moreLinkPath string) *SubmoduleWebLink {
|
|
if sf == nil || sf.refURL == "" {
|
|
return nil
|
|
}
|
|
if strings.HasPrefix(sf.refURL, "../") {
|
|
targetLink := path.Join(sf.repoLink, sf.refURL)
|
|
return &SubmoduleWebLink{RepoWebLink: targetLink, CommitWebLink: targetLink + moreLinkPath}
|
|
}
|
|
if !sf.parsed {
|
|
sf.parsed = true
|
|
parsedURL, err := giturl.ParseRepositoryURL(ctx, sf.refURL)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
sf.parsedTargetLink = giturl.MakeRepositoryWebLink(parsedURL)
|
|
}
|
|
return &SubmoduleWebLink{RepoWebLink: sf.parsedTargetLink, CommitWebLink: sf.parsedTargetLink + moreLinkPath}
|
|
}
|
|
|
|
// SubmoduleWebLinkTree tries to make the submodule's tree link in its own repo, it also works on "nil" receiver
|
|
// It returns nil if the submodule does not have a valid URL or is nil
|
|
func (sf *CommitSubmoduleFile) SubmoduleWebLinkTree(ctx context.Context, optCommitID ...string) *SubmoduleWebLink {
|
|
return sf.getWebLinkInTargetRepo(ctx, "/tree/"+util.OptionalArg(optCommitID, sf.RefID()))
|
|
}
|
|
|
|
// SubmoduleWebLinkCompare tries to make the submodule's compare link in its own repo, it also works on "nil" receiver
|
|
// It returns nil if the submodule does not have a valid URL or is nil
|
|
func (sf *CommitSubmoduleFile) SubmoduleWebLinkCompare(ctx context.Context, commitID1, commitID2 string) *SubmoduleWebLink {
|
|
return sf.getWebLinkInTargetRepo(ctx, "/compare/"+commitID1+"..."+commitID2)
|
|
}
|