From 102ff0427a653f2842052e2fdab6f9a3e133095c Mon Sep 17 00:00:00 2001 From: Mustafa Gezen Date: Wed, 5 Jan 2022 15:42:49 +0100 Subject: [PATCH] enhancement: allow callers to use custom loggers --- cmd/srpmproc/fetch.go | 2 +- pkg/data/process.go | 2 ++ pkg/data/utils.go | 7 +++---- pkg/directives/add.go | 2 +- pkg/directives/patch.go | 8 +++----- pkg/directives/replace.go | 2 +- pkg/modes/git.go | 15 +++++++-------- pkg/srpmproc/fetch.go | 11 ++++++++--- pkg/srpmproc/patch.go | 10 +++++----- pkg/srpmproc/process.go | 30 ++++++++++++++++++++---------- 10 files changed, 51 insertions(+), 38 deletions(-) diff --git a/cmd/srpmproc/fetch.go b/cmd/srpmproc/fetch.go index 1ffea36..5d5862b 100644 --- a/cmd/srpmproc/fetch.go +++ b/cmd/srpmproc/fetch.go @@ -45,7 +45,7 @@ func runFetch(_ *cobra.Command, _ []string) { log.Fatalf("could not get working directory: %v", err) } - err = srpmproc.Fetch(cdnUrl, wd) + err = srpmproc.Fetch(os.Stdout, cdnUrl, wd) if err != nil { log.Fatal(err) } diff --git a/pkg/data/process.go b/pkg/data/process.go index c926b57..608743d 100644 --- a/pkg/data/process.go +++ b/pkg/data/process.go @@ -24,6 +24,7 @@ import ( "github.com/go-git/go-billy/v5" "github.com/go-git/go-git/v5/plumbing/transport" "github.com/rocky-linux/srpmproc/pkg/blob" + "log" ) type FsCreatorFunc func(branch string) (billy.Filesystem, error) @@ -52,4 +53,5 @@ type ProcessData struct { AllowStreamBranches bool FsCreator FsCreatorFunc CdnUrl string + Log *log.Logger } diff --git a/pkg/data/utils.go b/pkg/data/utils.go index 67d5ff4..9807aff 100644 --- a/pkg/data/utils.go +++ b/pkg/data/utils.go @@ -30,7 +30,6 @@ import ( "github.com/go-git/go-billy/v5" "hash" "io" - "log" "os" "path/filepath" ) @@ -93,9 +92,9 @@ func StrContains(a []string, b string) bool { return false } -// check if content and checksum matches +// CompareHash checks if content and checksum matches // returns the hash type if success else nil -func CompareHash(content []byte, checksum string) hash.Hash { +func (pd *ProcessData) CompareHash(content []byte, checksum string) hash.Hash { var hashType hash.Hash switch len(checksum) { @@ -123,7 +122,7 @@ func CompareHash(content []byte, checksum string) hash.Hash { calculated := hex.EncodeToString(hashType.Sum(nil)) if calculated != checksum { - log.Printf("wanted checksum %s, but got %s", checksum, calculated) + pd.Log.Printf("wanted checksum %s, but got %s", checksum, calculated) return nil } diff --git a/pkg/directives/add.go b/pkg/directives/add.go index f9dd612..c7cdc12 100644 --- a/pkg/directives/add.go +++ b/pkg/directives/add.go @@ -68,7 +68,7 @@ func add(cfg *srpmprocpb.Cfg, pd *data.ProcessData, md *data.ModeData, patchTree return err } - hashFunction := data.CompareHash(replacingBytes, addType.Lookaside) + hashFunction := pd.CompareHash(replacingBytes, addType.Lookaside) if hashFunction == nil { return errors.New(fmt.Sprintf("LOOKASIDE_HASH_DOES_NOT_MATCH:%s", addType.Lookaside)) } diff --git a/pkg/directives/patch.go b/pkg/directives/patch.go index e3b1ce4..a0b2ccb 100644 --- a/pkg/directives/patch.go +++ b/pkg/directives/patch.go @@ -24,15 +24,13 @@ import ( "bytes" "errors" "fmt" - "log" - "github.com/bluekeyes/go-gitdiff/gitdiff" "github.com/go-git/go-git/v5" srpmprocpb "github.com/rocky-linux/srpmproc/pb" "github.com/rocky-linux/srpmproc/pkg/data" ) -func patch(cfg *srpmprocpb.Cfg, _ *data.ProcessData, _ *data.ModeData, patchTree *git.Worktree, pushTree *git.Worktree) error { +func patch(cfg *srpmprocpb.Cfg, pd *data.ProcessData, _ *data.ModeData, patchTree *git.Worktree, pushTree *git.Worktree) error { for _, patch := range cfg.Patch { patchFile, err := patchTree.Filesystem.Open(patch.File) if err != nil { @@ -40,7 +38,7 @@ func patch(cfg *srpmprocpb.Cfg, _ *data.ProcessData, _ *data.ModeData, patchTree } files, _, err := gitdiff.Parse(patchFile) if err != nil { - log.Printf("could not parse patch file: %v", err) + pd.Log.Printf("could not parse patch file: %v", err) return errors.New(fmt.Sprintf("COULD_NOT_PARSE_PATCH_FILE:%s", patch.File)) } @@ -58,7 +56,7 @@ func patch(cfg *srpmprocpb.Cfg, _ *data.ProcessData, _ *data.ModeData, patchTree err = gitdiff.NewApplier(patchSubjectFile).ApplyFile(&output, patchedFile) if err != nil { - log.Printf("could not apply patch: %v", err) + pd.Log.Printf("could not apply patch: %v", err) return errors.New(fmt.Sprintf("COULD_NOT_APPLY_PATCH_WITH_SUBJECT:%s", srcPath)) } } diff --git a/pkg/directives/replace.go b/pkg/directives/replace.go index ea8bcb2..2493d80 100644 --- a/pkg/directives/replace.go +++ b/pkg/directives/replace.go @@ -77,7 +77,7 @@ func replace(cfg *srpmprocpb.Cfg, pd *data.ProcessData, _ *data.ModeData, patchT if err != nil { return err } - hasher := data.CompareHash(bts, replacing.WithLookaside) + hasher := pd.CompareHash(bts, replacing.WithLookaside) if hasher == nil { return errors.New("LOOKASIDE_FILE_AND_HASH_NOT_MATCHING") } diff --git a/pkg/modes/git.go b/pkg/modes/git.go index 3b728ea..303e6fe 100644 --- a/pkg/modes/git.go +++ b/pkg/modes/git.go @@ -24,7 +24,6 @@ import ( "fmt" "github.com/rocky-linux/srpmproc/pkg/misc" "io/ioutil" - "log" "net/http" "path/filepath" "sort" @@ -142,7 +141,7 @@ func (g *GitMode) RetrieveSource(pd *data.ProcessData) (*data.ModeData, error) { } for _, branch := range latestTags { - log.Printf("tag: %s", strings.TrimPrefix(branch.remote, "refs/tags/")) + pd.Log.Printf("tag: %s", strings.TrimPrefix(branch.remote, "refs/tags/")) branches = append(branches, *branch) } @@ -179,7 +178,7 @@ func (g *GitMode) WriteSource(pd *data.ProcessData, md *data.ModeData) error { branchName = match[2] refspec = config.RefSpec(fmt.Sprintf("+refs/heads/%s:%s", branchName, md.TagBranch)) } - log.Printf("checking out upstream refspec %s", refspec) + pd.Log.Printf("checking out upstream refspec %s", refspec) err = remote.Fetch(&git.FetchOptions{ RemoteName: "upstream", RefSpecs: []config.RefSpec{refspec}, @@ -205,7 +204,7 @@ func (g *GitMode) WriteSource(pd *data.ProcessData, md *data.ModeData) error { metadataFile, err := md.Worktree.Filesystem.Open(fmt.Sprintf(".%s.metadata", md.Name)) if err != nil { - log.Printf("warn: could not open metadata file, so skipping: %v", err) + pd.Log.Printf("warn: could not open metadata file, so skipping: %v", err) return nil } @@ -233,7 +232,7 @@ func (g *GitMode) WriteSource(pd *data.ProcessData, md *data.ModeData) error { if md.BlobCache[hash] != nil { body = md.BlobCache[hash] - log.Printf("retrieving %s from cache", hash) + pd.Log.Printf("retrieving %s from cache", hash) } else { fromBlobStorage, err := pd.BlobStorage.Read(hash) if err != nil { @@ -241,10 +240,10 @@ func (g *GitMode) WriteSource(pd *data.ProcessData, md *data.ModeData) error { } if fromBlobStorage != nil && !pd.NoStorageDownload { body = fromBlobStorage - log.Printf("downloading %s from blob storage", hash) + pd.Log.Printf("downloading %s from blob storage", hash) } else { url := fmt.Sprintf("%s/%s/%s/%s", pd.CdnUrl, md.Name, branchName, hash) - log.Printf("downloading %s", url) + pd.Log.Printf("downloading %s", url) req, err := http.NewRequest("GET", url, nil) if err != nil { @@ -275,7 +274,7 @@ func (g *GitMode) WriteSource(pd *data.ProcessData, md *data.ModeData) error { return fmt.Errorf("could not open file pointer: %v", err) } - hasher := data.CompareHash(body, hash) + hasher := pd.CompareHash(body, hash) if hasher == nil { return fmt.Errorf("checksum in metadata does not match dist-git file") } diff --git a/pkg/srpmproc/fetch.go b/pkg/srpmproc/fetch.go index 7a6fc6c..d8b11e3 100644 --- a/pkg/srpmproc/fetch.go +++ b/pkg/srpmproc/fetch.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "github.com/rocky-linux/srpmproc/pkg/data" + "io" "io/ioutil" "log" "net/http" @@ -12,7 +13,11 @@ import ( "strings" ) -func Fetch(cdnUrl string, dir string) error { +func Fetch(logger io.Writer, cdnUrl string, dir string) error { + pd := &data.ProcessData{ + Log: log.New(logger, "", log.LstdFlags), + } + metadataPath := "" err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { if strings.HasSuffix(path, ".metadata") { @@ -53,7 +58,7 @@ func Fetch(cdnUrl string, dir string) error { path := lineInfo[1] url := fmt.Sprintf("%s/%s", cdnUrl, hash) - log.Printf("downloading %s", url) + pd.Log.Printf("downloading %s", url) req, err := http.NewRequest("GET", url, nil) if err != nil { @@ -75,7 +80,7 @@ func Fetch(cdnUrl string, dir string) error { return fmt.Errorf("could not close body handle: %v", err) } - hasher := data.CompareHash(body, hash) + hasher := pd.CompareHash(body, hash) if hasher == nil { return fmt.Errorf("checksum in metadata does not match dist-git file") } diff --git a/pkg/srpmproc/patch.go b/pkg/srpmproc/patch.go index 6ffe755..e191a5a 100644 --- a/pkg/srpmproc/patch.go +++ b/pkg/srpmproc/patch.go @@ -59,7 +59,7 @@ func cfgPatches(pd *data.ProcessData, md *data.ModeData, patchTree *git.Worktree continue } - log.Printf("applying directive %s", info.Name()) + pd.Log.Printf("applying directive %s", info.Name()) filePath := filepath.Join("ROCKY/CFG", info.Name()) directive, err := patchTree.Filesystem.Open(filePath) if err != nil { @@ -137,7 +137,7 @@ func executePatchesRpm(pd *data.ProcessData, md *data.ModeData) error { err = repo.Fetch(fetchOptions) refName := plumbing.NewBranchReferenceName(md.PushBranch) - log.Printf("set reference to ref: %s", refName) + pd.Log.Printf("set reference to ref: %s", refName) if err != nil { // no patches active @@ -197,9 +197,9 @@ func getTipStream(pd *data.ProcessData, module string, pushBranch string, origPu Auth: pd.Authenticator, }) if err != nil { - log.Printf("could not import module: %s", module) + pd.Log.Printf("could not import module: %s", module) if tries < 3 { - log.Printf("could not get rpm refs. will retry in 3s. %v", err) + pd.Log.Printf("could not get rpm refs. will retry in 3s. %v", err) time.Sleep(3 * time.Second) return getTipStream(pd, module, pushBranch, origPushBranch, tries+1) } @@ -302,7 +302,7 @@ func patchModuleYaml(pd *data.ProcessData, md *data.ModeData) error { log.Println("This module contains the following rpms:") for name := range module.Data.Components.Rpms { - log.Printf("\t- %s", name) + pd.Log.Printf("\t- %s", name) } defaultBranch := md.PushBranch diff --git a/pkg/srpmproc/process.go b/pkg/srpmproc/process.go index ed43902..ed6ee63 100644 --- a/pkg/srpmproc/process.go +++ b/pkg/srpmproc/process.go @@ -35,8 +35,10 @@ import ( "github.com/rocky-linux/srpmproc/pkg/misc" "github.com/rocky-linux/srpmproc/pkg/modes" "github.com/rocky-linux/srpmproc/pkg/rpmutils" + "io" "io/ioutil" "log" + "os" "os/user" "path/filepath" "strings" @@ -88,6 +90,7 @@ type ProcessDataRequest struct { NoStorageDownload bool SingleTag string CdnUrl string + LogWriter io.Writer } func gitlabify(str string) string { @@ -191,8 +194,14 @@ func NewProcessData(req *ProcessDataRequest) (*data.ProcessData, error) { reqFsCreator = req.FsCreator } + var writer io.Writer = os.Stdout + if req.LogWriter != nil { + writer = req.LogWriter + } + logger := log.New(writer, "", log.LstdFlags) + if req.TmpFsMode != "" { - log.Printf("using tmpfs dir: %s", req.TmpFsMode) + logger.Printf("using tmpfs dir: %s", req.TmpFsMode) fsCreator = func(branch string) (billy.Filesystem, error) { fs, err := reqFsCreator(branch) if err != nil { @@ -242,6 +251,7 @@ func NewProcessData(req *ProcessDataRequest) (*data.ProcessData, error) { AllowStreamBranches: req.AllowStreamBranches, FsCreator: fsCreator, CdnUrl: req.CdnUrl, + Log: logger, }, nil } @@ -344,7 +354,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { if strings.HasPrefix(md.TagBranch, prefix) { replace := strings.Replace(md.TagBranch, "refs/heads/", "", 1) matchString = fmt.Sprintf("refs/tags/imports/%s/%s", replace, filepath.Base(pd.RpmLocation)) - log.Printf("using match string: %s", matchString) + pd.Log.Printf("using match string: %s", matchString) } } if !misc.GetTagImportRegex(pd.ImportBranchPrefix, pd.AllowStreamBranches).MatchString(matchString) { @@ -377,7 +387,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { shouldContinue := true for _, ignoredTag := range tagIgnoreList { if ignoredTag == "refs/tags/"+newTag { - log.Printf("skipping %s", ignoredTag) + pd.Log.Printf("skipping %s", ignoredTag) shouldContinue = false } } @@ -387,9 +397,9 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { // create a new remote remoteUrl := fmt.Sprintf("%s/%s/%s.git", pd.UpstreamPrefix, remotePrefix, gitlabify(md.Name)) - log.Printf("using remote: %s", remoteUrl) + pd.Log.Printf("using remote: %s", remoteUrl) refspec := config.RefSpec(fmt.Sprintf("+refs/heads/%s:refs/remotes/origin/%s", md.PushBranch, md.PushBranch)) - log.Printf("using refspec: %s", refspec) + pd.Log.Printf("using refspec: %s", refspec) _, err = repo.CreateRemote(&config.RemoteConfig{ Name: "origin", @@ -407,7 +417,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { }) refName := plumbing.NewBranchReferenceName(md.PushBranch) - log.Printf("set reference to ref: %s", refName) + pd.Log.Printf("set reference to ref: %s", refName) var hash plumbing.Hash if commitPin[md.PushBranch] != "" { @@ -501,7 +511,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { if err != nil { return nil, err } - log.Printf("wrote %s to blob storage", checksum) + pd.Log.Printf("wrote %s to blob storage", checksum) } alreadyUploadedBlobs = append(alreadyUploadedBlobs, checksum) } @@ -541,7 +551,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { // show status status, _ := w.Status() - log.Printf("successfully processed:\n%s", status) + pd.Log.Printf("successfully processed:\n%s", status) statusLines := strings.Split(status.String(), "\n") for _, line := range statusLines { @@ -563,7 +573,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { hashes = nil pushRefspecs = append(pushRefspecs, "*:*") } else { - log.Printf("tip %s", head.String()) + pd.Log.Printf("tip %s", head.String()) hashes = append(hashes, head.Hash()) refOrigin := "refs/heads/" + md.PushBranch pushRefspecs = append(pushRefspecs, config.RefSpec(fmt.Sprintf("HEAD:%s", refOrigin))) @@ -588,7 +598,7 @@ func ProcessRPM(pd *data.ProcessData) (*srpmprocpb.ProcessResponse, error) { return nil, fmt.Errorf("could not get commit object: %v", err) } - log.Printf("committed:\n%s", obj.String()) + pd.Log.Printf("committed:\n%s", obj.String()) _, err = repo.CreateTag(newTag, commit, &git.CreateTagOptions{ Tagger: &object.Signature{