github.com/replit/upm@v0.0.0-20240423230255-9ce4fc3ea24c/internal/backends/python/gen_pypi_map/sdist_reader.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "os" 7 "os/exec" 8 ) 9 10 type DistPackageMetadata struct { 11 Packages []string `json:"packages"` 12 InstallRequires []string `json:"install_requires"` 13 Error string `json:"error"` 14 } 15 16 func dumpSetupPy(path string) (DistPackageMetadata, error) { 17 // Grab metadata from the file 18 cmd := exec.Command("python", "dump_setup.py", path) 19 cmdReader, err := cmd.StdoutPipe() 20 21 if err != nil { 22 return DistPackageMetadata{}, err 23 } 24 25 err = cmd.Start() 26 if err != nil { 27 return DistPackageMetadata{}, err 28 } 29 30 decoder := json.NewDecoder(cmdReader) 31 32 var metadata DistPackageMetadata 33 err = decoder.Decode(&metadata) 34 if err != nil { 35 return DistPackageMetadata{}, err 36 } 37 38 err = cmd.Wait() 39 if err != nil { 40 return DistPackageMetadata{}, err 41 } 42 43 if metadata.Error != "" { 44 return DistPackageMetadata{}, fmt.Errorf("Error reading setup.py: %v", metadata.Error) 45 } 46 47 return metadata, nil 48 } 49 50 func ExtractSdist(reader ArchiveReader) ([]string, error) { 51 tempDir, _ := os.MkdirTemp(os.TempDir(), "sdist-") 52 defer os.RemoveAll(tempDir) 53 err := reader.Dump(tempDir) 54 if err != nil { 55 return nil, err 56 } 57 58 contents, err := os.ReadDir(tempDir) 59 if err != nil { 60 return nil, err 61 } 62 63 if len(contents) != 1 { 64 return nil, fmt.Errorf("SDist should never contain more then one file in root") 65 } 66 67 metadata, err := dumpSetupPy(tempDir + "/" + contents[0].Name() + "/setup.py") 68 return metadata.Packages, err 69 }