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 }