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  }