mirror of
https://github.com/go-gitea/gitea.git
synced 2026-11-09 17:37:20 -06:00
If the stderr output is not handled, then it needs to use RunWithStderr to make sure the git error message is included in the returned error. Otherwise, when the git command fails, the error log won't show useful information. Ref: * #39795 : no useful information in log messages * https://github.com/go-gitea/gitea/pull/40160#pullrequestreview-5752720866
59 lines
2.1 KiB
Go
59 lines
2.1 KiB
Go
// Copyright 2024 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package git
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
|
|
"gitea.dev/modules/git/gitcmd"
|
|
"gitea.dev/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, repo RepositoryFacade) (submoduleCommits []TemplateSubmoduleCommit, _ error) {
|
|
cmd := gitcmd.NewCommand("ls-tree", "-r", "--", "HEAD")
|
|
stdoutReader, stdoutReaderClose := cmd.MakeStdoutPipe()
|
|
defer stdoutReaderClose()
|
|
err := cmd.WithRepo(repo).
|
|
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()
|
|
}).
|
|
RunWithStderr(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, tmpRepoPath 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(tmpRepoPath).RunStdString(ctx); err != nil {
|
|
log.Error("Unable to add %s as submodule to repo %s: stdout %s\nError: %v", submodule.Path, tmpRepoPath, stdout, err)
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|