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]>
59 lines
2.1 KiB
Go
59 lines
2.1 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/hanzoai/git/modules/git/gitcmd"
|
|
"github.com/hanzoai/git/modules/log"
|
|
)
|
|
|
|
type TemplateSubmoduleCommit struct {
|
|
Path string
|
|
Commit string
|
|
}
|
|
|
|
// GetTemplateSubmoduleCommits returns a list of submodules paths and their commits from a repository
|
|
// This function is only for generating new repos based on existing template, the template couldn't be too large.
|
|
func GetTemplateSubmoduleCommits(ctx context.Context, repoPath string) (submoduleCommits []TemplateSubmoduleCommit, _ error) {
|
|
cmd := gitcmd.NewCommand("ls-tree", "-r", "--", "HEAD")
|
|
stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe()
|
|
defer stdoutReaderClose()
|
|
err := cmd.WithDir(repoPath).
|
|
WithPipelineFunc(func(ctx gitcmd.Context) error {
|
|
scanner := bufio.NewScanner(stdoutReader)
|
|
for scanner.Scan() {
|
|
entry, err := parseLsTreeLine(scanner.Bytes())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if entry.EntryMode == EntryModeCommit {
|
|
submoduleCommits = append(submoduleCommits, TemplateSubmoduleCommit{Path: entry.Name, Commit: entry.ID.String()})
|
|
}
|
|
}
|
|
return scanner.Err()
|
|
}).
|
|
Run(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("GetTemplateSubmoduleCommits: error running git ls-tree: %v", err)
|
|
}
|
|
return submoduleCommits, nil
|
|
}
|
|
|
|
// AddTemplateSubmoduleIndexes Adds the given submodules to the git index.
|
|
// It is only for generating new repos based on existing template, requires the .gitmodules file to be already present in the work dir.
|
|
func AddTemplateSubmoduleIndexes(ctx context.Context, repoPath string, submodules []TemplateSubmoduleCommit) error {
|
|
for _, submodule := range submodules {
|
|
cmd := gitcmd.NewCommand("update-index", "--add", "--cacheinfo", "160000").AddDynamicArguments(submodule.Commit, submodule.Path)
|
|
if stdout, _, err := cmd.WithDir(repoPath).RunStdString(ctx); err != nil {
|
|
log.Error("Unable to add %s as submodule to repo %s: stdout %s\nError: %v", submodule.Path, repoPath, stdout, err)
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|