// Copyright (c) 2023 Open Anolis Community Distro SIG, all rights reserved. // // Author: Jacob Wang // Xiao Lun // Zhao Hang package directives import ( "errors" "fmt" "io/ioutil" "os" "path/filepath" "github.com/go-git/go-git/v5" pkgcrewpb "pkgcrew/pb" "pkgcrew/pkg/data" ) // returns right if not empty, else left func eitherString(left string, right string) string { if right != "" { return right } return left } func add(cfg *pkgcrewpb.Cfg, pd *data.ProcessData, md *data.ModeData, patchTree *git.Worktree, pushTree *git.Worktree) error { for _, add := range cfg.Add { var replacingBytes []byte var filePath string switch addType := add.Source.(type) { case *pkgcrewpb.Add_File: filePath = eitherString(filepath.Base(addType.File), add.Name) if pd.UpstreamCentos { filePath = checkAddPrefix(eitherString(filepath.Base(addType.File), add.Name)) } fPatch, err := patchTree.Filesystem.OpenFile(addType.File, os.O_RDONLY, 0o644) if err != nil { return errors.New(fmt.Sprintf("COULD_NOT_OPEN_FROM:%s", addType.File)) } replacingBytes, err = ioutil.ReadAll(fPatch) if err != nil { return errors.New(fmt.Sprintf("COULD_NOT_READ_FROM:%s", addType.File)) } break case *pkgcrewpb.Add_Lookaside: filePath = eitherString(filepath.Base(addType.Lookaside), add.Name) if pd.UpstreamCentos { filePath = checkAddPrefix(eitherString(filepath.Base(addType.Lookaside), add.Name)) } var err error replacingBytes, err = pd.BlobStorage.Read(addType.Lookaside) if err != nil { return err } hashFunction := pd.CompareHash(replacingBytes, addType.Lookaside) if hashFunction == nil { return errors.New(fmt.Sprintf("LOOKASIDE_HASH_DOES_NOT_MATCH:%s", addType.Lookaside)) } md.SourcesToIgnore = append(md.SourcesToIgnore, &data.IgnoredSource{ Name: filePath, HashFunction: hashFunction, }) break } f, err := pushTree.Filesystem.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0o644) if err != nil { return errors.New(fmt.Sprintf("COULD_NOT_OPEN_DESTINATION:%s", filePath)) } _, err = f.Write(replacingBytes) if err != nil { return errors.New(fmt.Sprintf("COULD_NOT_WRITE_DESTIONATION:%s", filePath)) } } return nil }