github.com/TNTworks/flogo-cli@v0.9.1-0.20220522183836-60b8a963ae00/api/imports.go (about)

     1  package api
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  
     9  	"github.com/TNTworks/flogo-cli/common"
    10  	"github.com/TNTworks/flogo-cli/util"
    11  	"github.com/project-flogo/core/app"
    12  )
    13  
    14  func ListProjectImports(project common.AppProject) error {
    15  
    16  	appImports, err := util.GetAppImports(filepath.Join(project.Dir(), fileFlogoJson), project.DepManager(), false)
    17  	if err != nil {
    18  		return err
    19  	}
    20  
    21  	for _, imp := range appImports.GetAllImports() {
    22  
    23  		fmt.Fprintf(os.Stdout, "  %s\n", imp)
    24  	}
    25  
    26  	return nil
    27  }
    28  
    29  func SyncProjectImports(project common.AppProject) error {
    30  
    31  	appImports, err := util.GetAppImports(filepath.Join(project.Dir(), fileFlogoJson), project.DepManager(), false)
    32  	if err != nil {
    33  		return err
    34  	}
    35  	appImportsMap := make(map[string]util.Import)
    36  	for _, imp := range appImports.GetAllImports() {
    37  		appImportsMap[imp.GoImportPath()] = imp
    38  	}
    39  
    40  	goImports, err := project.GetGoImports(false)
    41  	if err != nil {
    42  		return err
    43  	}
    44  	goImportsMap := make(map[string]util.Import)
    45  	for _, imp := range goImports {
    46  		goImportsMap[imp.GoImportPath()] = imp
    47  	}
    48  
    49  	var toAdd []util.Import
    50  	for goPath, imp := range appImportsMap {
    51  		if _, ok := goImportsMap[goPath]; !ok {
    52  			toAdd = append(toAdd, imp)
    53  			if Verbose() {
    54  				fmt.Println("Adding missing Go import: ", goPath)
    55  			}
    56  		}
    57  	}
    58  
    59  	if util.FileExists(filepath.Join(project.Dir(), fileEngineJson)) {
    60  		engineImports, err := util.GetEngineImports(filepath.Join(project.Dir(), fileEngineJson), project.DepManager())
    61  		if err != nil {
    62  			return err
    63  		}
    64  
    65  		engImportsMap := make(map[string]util.Import)
    66  		for _, imp := range engineImports.GetAllImports() {
    67  			engImportsMap[imp.GoImportPath()] = imp
    68  		}
    69  
    70  		for goPath, imp := range engImportsMap {
    71  			if _, ok := goImportsMap[goPath]; !ok {
    72  				toAdd = append(toAdd, imp)
    73  				if Verbose() {
    74  					fmt.Println("Adding missing Go import: ", goPath)
    75  				}
    76  			}
    77  		}
    78  	}
    79  
    80  	var toRemove []string
    81  	for goPath := range goImportsMap {
    82  		if _, ok := appImportsMap[goPath]; !ok {
    83  			toRemove = append(toRemove, goPath)
    84  			if Verbose() {
    85  				fmt.Println("Removing extraneous Go import: ", goPath)
    86  			}
    87  		}
    88  	}
    89  
    90  	err = project.RemoveImports(toRemove...)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	err = project.AddImports(false, false, toAdd...)
    96  	if err != nil {
    97  		return err
    98  	}
    99  
   100  	return nil
   101  }
   102  
   103  func ResolveProjectImports(project common.AppProject) error {
   104  	if Verbose() {
   105  		fmt.Fprintln(os.Stdout, "Synchronizing project imports")
   106  	}
   107  	err := SyncProjectImports(project)
   108  	if err != nil {
   109  		return err
   110  	}
   111  
   112  	if Verbose() {
   113  		fmt.Fprintln(os.Stdout, "Reading flogo.json")
   114  	}
   115  	appDescriptor, err := readAppDescriptor(project)
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	if Verbose() {
   121  		fmt.Fprintln(os.Stdout, "Updating flogo.json import versions")
   122  	}
   123  	err = updateDescriptorImportVersions(project, appDescriptor)
   124  	if err != nil {
   125  		return err
   126  	}
   127  
   128  	if Verbose() {
   129  		fmt.Fprintln(os.Stdout, "Saving updated flogo.json")
   130  	}
   131  	err = writeAppDescriptor(project, appDescriptor)
   132  	if err != nil {
   133  		return err
   134  	}
   135  
   136  	return nil
   137  }
   138  
   139  func updateDescriptorImportVersions(project common.AppProject, appDescriptor *app.Config) error {
   140  
   141  	goModImports, err := project.DepManager().GetAllImports()
   142  	if err != nil {
   143  		return err
   144  	}
   145  
   146  	appImports, err := util.ParseImports(appDescriptor.Imports)
   147  	if err != nil {
   148  		return err
   149  	}
   150  
   151  	var result []string
   152  
   153  	for _, appImport := range appImports {
   154  
   155  		if goModImport, ok := goModImports[appImport.ModulePath()]; ok {
   156  			updatedImp := util.NewFlogoImportWithVersion(appImport, goModImport.Version())
   157  			result = append(result, updatedImp.CanonicalImport())
   158  		} else {
   159  			//not found, look for import of parent package
   160  			for pkg, goModImport := range goModImports {
   161  				if strings.Contains(appImport.ModulePath(), pkg) {
   162  					updatedImp := util.NewFlogoImportWithVersion(appImport, goModImport.Version())
   163  					result = append(result, updatedImp.CanonicalImport())
   164  				}
   165  			}
   166  		}
   167  	}
   168  
   169  	appDescriptor.Imports = result
   170  
   171  	return nil
   172  }
   173  
   174