github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/builtins/core/modules/cmd-import.go (about)

     1  package modules
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/lmorg/murex/builtins/core/httpclient"
    10  	"github.com/lmorg/murex/config/profile"
    11  	"github.com/lmorg/murex/lang"
    12  	"github.com/lmorg/murex/utils"
    13  	"github.com/lmorg/murex/utils/cd"
    14  	"github.com/lmorg/murex/utils/readline"
    15  )
    16  
    17  func packageDirExists(pack string) error {
    18  	_, err := os.Stat(pack)
    19  	if os.IsNotExist(err) {
    20  		return nil
    21  	}
    22  
    23  	return errors.New("a file or directory already exists with that package name")
    24  }
    25  
    26  func importModules(p *lang.Process) error {
    27  	modulePath := profile.ModulePath()
    28  	path, err := p.Parameters.String(1)
    29  	if err != nil {
    30  		return err
    31  	}
    32  
    33  	if path == modulePath+profile.PackagesFile {
    34  		return errors.New("you cannot import the same file as the master packages.json file")
    35  	}
    36  
    37  	if utils.IsURL(path) {
    38  		resp, err := httpclient.Request(p.Context, "GET", path, nil, p.Config, true)
    39  		if err != nil {
    40  			return err
    41  		}
    42  
    43  		f, err := utils.NewTempFile(resp.Body, "_package.json")
    44  		if err != nil {
    45  			return err
    46  		}
    47  
    48  		path = f.FileName
    49  
    50  		defer f.Close()
    51  	}
    52  
    53  	importDb, err := readPackagesFile(path)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	db, err := readPackagesFile(modulePath + profile.PackagesFile)
    59  	if err != nil {
    60  		return err
    61  	}
    62  
    63  	for i := range importDb {
    64  		err = cd.Chdir(p, modulePath)
    65  		if err != nil {
    66  			write(p, "{RED}%s{RESET}", err.Error())
    67  			continue
    68  		}
    69  
    70  		p.Stdout.Writeln(bytes.Repeat([]byte{'-'}, readline.GetTermWidth()))
    71  		write(p, "Importing '%s'....", importDb[i].Package)
    72  		err = packageDirExists(importDb[i].Package)
    73  		if err != nil {
    74  			write(p, "{RED}%s{RESET}", err.Error())
    75  			continue
    76  		}
    77  
    78  		importDb[i].Package, _, err = getPackage(p, importDb[i].URI)
    79  		if err != nil {
    80  			write(p, "{RED}%s{RESET}", err.Error())
    81  			continue
    82  		}
    83  
    84  		db = append(db, importDb[i])
    85  
    86  		_, err = profile.LoadPackage(modulePath+importDb[i].Package, true)
    87  		if err != nil {
    88  			write(p, "{RED}%s{RESET}", err.Error())
    89  		}
    90  	}
    91  
    92  	var message string
    93  
    94  	err = writePackagesFile(&db)
    95  	if err != nil {
    96  		message += err.Error() + utils.NewLineString
    97  	}
    98  
    99  	if message != "" {
   100  		return errors.New(strings.TrimSpace(message))
   101  	}
   102  
   103  	return nil
   104  }