|
|
|
|
@ -7,7 +7,9 @@ import (
|
|
|
|
|
"bufio"
|
|
|
|
|
"bytes"
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
"io/fs"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"regexp"
|
|
|
|
|
@ -138,31 +140,37 @@ func (gt *giteaTemplateFileMatcher) Match(s string) bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func readGiteaTemplateFile(tmpDir string) (*giteaTemplateFileMatcher, error) {
|
|
|
|
|
localPath := filepath.Join(tmpDir, ".gitea", "template")
|
|
|
|
|
if _, err := os.Stat(localPath); os.IsNotExist(err) {
|
|
|
|
|
return nil, nil
|
|
|
|
|
} else if err != nil {
|
|
|
|
|
func readLocalTmpRepoFileContent(localPath string, limit int) ([]byte, error) {
|
|
|
|
|
ok, err := util.IsRegularFile(localPath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
} else if !ok {
|
|
|
|
|
return nil, fs.ErrNotExist
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
content, err := os.ReadFile(localPath)
|
|
|
|
|
f, err := os.Open(localPath)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
defer f.Close()
|
|
|
|
|
|
|
|
|
|
return util.ReadWithLimit(f, limit)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func readGiteaTemplateFile(tmpDir string) (*giteaTemplateFileMatcher, error) {
|
|
|
|
|
localPath := filepath.Join(tmpDir, ".gitea", "template")
|
|
|
|
|
content, err := readLocalTmpRepoFileContent(localPath, 1024*1024)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
return newGiteaTemplateFileMatcher(localPath, content), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func substGiteaTemplateFile(ctx context.Context, tmpDir, tmpDirSubPath string, templateRepo, generateRepo *repo_model.Repository) error {
|
|
|
|
|
tmpFullPath := filepath.Join(tmpDir, tmpDirSubPath)
|
|
|
|
|
if ok, err := util.IsRegularFile(tmpFullPath); !ok {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
content, err := os.ReadFile(tmpFullPath)
|
|
|
|
|
content, err := readLocalTmpRepoFileContent(tmpFullPath, 1024*1024)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
return util.Iif(errors.Is(err, fs.ErrNotExist), nil, err)
|
|
|
|
|
}
|
|
|
|
|
if err := util.Remove(tmpFullPath); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
@ -172,7 +180,7 @@ func substGiteaTemplateFile(ctx context.Context, tmpDir, tmpDirSubPath string, t
|
|
|
|
|
substSubPath := filepath.Clean(filePathSanitize(generateExpansion(ctx, tmpDirSubPath, templateRepo, generateRepo)))
|
|
|
|
|
newLocalPath := filepath.Join(tmpDir, substSubPath)
|
|
|
|
|
regular, err := util.IsRegularFile(newLocalPath)
|
|
|
|
|
if canWrite := regular || os.IsNotExist(err); !canWrite {
|
|
|
|
|
if canWrite := regular || errors.Is(err, fs.ErrNotExist); !canWrite {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if err := os.MkdirAll(filepath.Dir(newLocalPath), 0o755); err != nil {
|
|
|
|
|
@ -242,15 +250,15 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
|
|
|
|
|
|
|
|
|
|
// Variable expansion
|
|
|
|
|
fileMatcher, err := readGiteaTemplateFile(tmpDir)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("readGiteaTemplateFile: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if fileMatcher != nil {
|
|
|
|
|
if err == nil {
|
|
|
|
|
err = processGiteaTemplateFile(ctx, tmpDir, templateRepo, generateRepo, fileMatcher)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
return fmt.Errorf("processGiteaTemplateFile: %w", err)
|
|
|
|
|
}
|
|
|
|
|
} else if errors.Is(err, fs.ErrNotExist) {
|
|
|
|
|
log.Debug("skip processing repo template files: no available .gitea/template")
|
|
|
|
|
} else {
|
|
|
|
|
return fmt.Errorf("readGiteaTemplateFile: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err = git.InitRepository(ctx, tmpDir, false, templateRepo.ObjectFormatName); err != nil {
|
|
|
|
|
|