86ee592eb2
So they can't be imported from external repositories. I'm not giving any stability guarantees on anything except the CLI.
128 lines
2.8 KiB
Go
128 lines
2.8 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
"github.com/spf13/cobra"
|
|
generate "github.com/tweag/gomod2nix/internal/generate"
|
|
schema "github.com/tweag/gomod2nix/internal/schema"
|
|
)
|
|
|
|
const directoryDefault = "./"
|
|
|
|
var (
|
|
flagDirectory string
|
|
flagOutDir string
|
|
maxJobs int
|
|
)
|
|
|
|
func generateFunc(cmd *cobra.Command, args []string) {
|
|
directory := flagDirectory
|
|
outDir := flagOutDir
|
|
|
|
// If we are dealing with a project packaged by passing packages on the command line
|
|
// we need to create a temporary project.
|
|
var tmpProj *generate.TempProject
|
|
if len(args) > 0 {
|
|
var err error
|
|
|
|
if directory != directoryDefault {
|
|
panic(fmt.Errorf("directory flag not supported together with import arguments"))
|
|
}
|
|
if outDir == "" {
|
|
pwd, err := os.Getwd()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
outDir = pwd
|
|
}
|
|
|
|
tmpProj, err = generate.NewTempProject(args)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer func() {
|
|
err := tmpProj.Remove()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
directory = tmpProj.Dir
|
|
} else if outDir == "" {
|
|
// Default out to current working directory if we are developing some software in the current repo.
|
|
outDir = directory
|
|
}
|
|
|
|
// Write gomod2nix.toml
|
|
{
|
|
goMod2NixPath := filepath.Join(outDir, "gomod2nix.toml")
|
|
outFile := goMod2NixPath
|
|
pkgs, err := generate.GeneratePkgs(directory, goMod2NixPath, maxJobs)
|
|
if err != nil {
|
|
panic(fmt.Errorf("error generating pkgs: %v", err))
|
|
}
|
|
|
|
var goPackagePath string
|
|
var subPackages []string
|
|
|
|
if tmpProj != nil {
|
|
subPackages = tmpProj.SubPackages
|
|
goPackagePath = tmpProj.GoPackagePath
|
|
}
|
|
|
|
output, err := schema.Marshal(pkgs, goPackagePath, subPackages)
|
|
if err != nil {
|
|
panic(fmt.Errorf("error marshaling output: %v", err))
|
|
}
|
|
|
|
err = os.WriteFile(outFile, output, 0644)
|
|
if err != nil {
|
|
panic(fmt.Errorf("error writing file: %v", err))
|
|
}
|
|
log.Info(fmt.Sprintf("Wrote: %s", outFile))
|
|
}
|
|
}
|
|
|
|
var rootCmd = &cobra.Command{
|
|
Use: "gomod2nix",
|
|
Short: "Convert applications using Go modules -> Nix",
|
|
Run: generateFunc,
|
|
}
|
|
|
|
var generateCmd = &cobra.Command{
|
|
Use: "generate",
|
|
Short: "Run gomod2nix.toml generator",
|
|
Run: generateFunc,
|
|
}
|
|
|
|
var importCmd = &cobra.Command{
|
|
Use: "import",
|
|
Short: "Import Go sources into the Nix store",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
err := generate.ImportPkgs(flagDirectory, maxJobs)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.PersistentFlags().StringVar(&flagDirectory, "dir", "./", "Go project directory")
|
|
rootCmd.PersistentFlags().StringVar(&flagOutDir, "outdir", "", "Output directory (defaults to project directory)")
|
|
rootCmd.PersistentFlags().IntVar(&maxJobs, "jobs", 10, "Max number of concurrent jobs")
|
|
|
|
rootCmd.AddCommand(generateCmd)
|
|
rootCmd.AddCommand(importCmd)
|
|
}
|
|
|
|
func Execute() {
|
|
err := rootCmd.Execute()
|
|
if err != nil {
|
|
os.Exit(1)
|
|
}
|
|
}
|