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