github.com/falafeljan/pkger@v0.18.0/pkging/pkgtest/load_ref.go (about)

     1  package pkgtest
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  
    10  	"github.com/markbates/pkger/here"
    11  	"github.com/markbates/pkger/pkging"
    12  )
    13  
    14  func LoadFile(name string, ref *Ref, pkg pkging.Pkger) (os.FileInfo, error) {
    15  	root := filepath.Join(ref.root, name)
    16  
    17  	info, err := os.Stat(root)
    18  	if err != nil {
    19  		return nil, err
    20  	}
    21  
    22  	if info.IsDir() {
    23  		return nil, fmt.Errorf("%s is a directory", name)
    24  	}
    25  
    26  	_, err = pkg.Current()
    27  	if err != nil {
    28  		return nil, err
    29  	}
    30  
    31  	af, err := os.Open(root)
    32  	if err != nil {
    33  		return nil, err
    34  	}
    35  	defer af.Close()
    36  
    37  	bf, err := pkg.Create(name)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	defer bf.Close()
    42  
    43  	xp := strings.TrimPrefix(root, filepath.Dir(root))
    44  	xp = filepath.Join(ref.Dir, xp)
    45  
    46  	cf, err := os.Create(xp)
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	defer cf.Close()
    51  
    52  	mw := io.MultiWriter(bf, cf)
    53  
    54  	_, err = io.Copy(mw, af)
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  	return info, nil
    59  }
    60  
    61  func LoadFiles(name string, ref *Ref, pkg pkging.Pkger) ([]os.FileInfo, error) {
    62  	var infos []os.FileInfo
    63  
    64  	her, err := here.Package("github.com/markbates/pkger")
    65  	if err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	root := filepath.Join(ref.root, name)
    70  
    71  	info, err := os.Stat(root)
    72  	if err != nil {
    73  		return nil, err
    74  	}
    75  
    76  	if !info.IsDir() {
    77  		return nil, fmt.Errorf("%s is not a directory", name)
    78  	}
    79  
    80  	her, err = pkg.Current()
    81  	if err != nil {
    82  		return nil, err
    83  	}
    84  
    85  	err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
    86  		if err != nil {
    87  			return err
    88  		}
    89  
    90  		if strings.HasPrefix(filepath.Base(path), ".") {
    91  			return nil
    92  		}
    93  
    94  		infos = append(infos, info)
    95  
    96  		xp := strings.TrimPrefix(path, root)
    97  		xp = filepath.Join(name, xp)
    98  
    99  		pt, err := pkg.Parse(xp)
   100  		if err != nil {
   101  			return err
   102  		}
   103  
   104  		if info.IsDir() {
   105  			if err := pkg.MkdirAll(pt.Name, info.Mode()); err != nil {
   106  				return err
   107  			}
   108  			if err := os.MkdirAll(filepath.Join(her.Dir, xp), info.Mode()); err != nil {
   109  				return err
   110  			}
   111  			return nil
   112  		}
   113  
   114  		af, err := os.Open(path)
   115  		if err != nil {
   116  			return err
   117  		}
   118  		defer af.Close()
   119  
   120  		bf, err := pkg.Create(pt.Name)
   121  		if err != nil {
   122  			return err
   123  		}
   124  		defer bf.Close()
   125  
   126  		xp = filepath.Join(her.Dir, xp)
   127  
   128  		cf, err := os.Create(xp)
   129  		if err != nil {
   130  			return err
   131  		}
   132  		defer cf.Close()
   133  
   134  		mw := io.MultiWriter(bf, cf)
   135  
   136  		_, err = io.Copy(mw, af)
   137  		if err != nil {
   138  			return err
   139  		}
   140  
   141  		return nil
   142  	})
   143  
   144  	if err != nil {
   145  		return nil, err
   146  	}
   147  
   148  	if len(infos) == 0 {
   149  		return nil, fmt.Errorf("did not load any infos for %s", name)
   150  	}
   151  
   152  	return infos, nil
   153  }