github.com/bitrise-io/go-xamarin@v0.0.0-20211005113058-bf60a8bae851/analyzers/project/project.go (about) 1 package project 2 3 import ( 4 "fmt" 5 "path/filepath" 6 "strings" 7 8 "github.com/bitrise-io/go-utils/log" 9 "github.com/bitrise-io/go-utils/pathutil" 10 "github.com/bitrise-io/go-xamarin/constants" 11 "github.com/bitrise-io/go-xamarin/utility" 12 ) 13 14 // ConfigurationPlatformModel ... 15 type ConfigurationPlatformModel struct { 16 Configuration string 17 Platform string 18 OutputDir string 19 20 MtouchArchs []string 21 BuildIpa bool 22 23 SignAndroid bool 24 } 25 26 // Model ... 27 type Model struct { 28 Pth string 29 Name string // Set by solution analyze or set its path's filename without extension 30 31 // Solution Configuration|Platform - Project Configuration|Platform map 32 // !!! only set by solution analyze 33 ConfigMap map[string]string 34 35 ID string 36 SDK constants.SDK 37 TestFramework constants.TestFramework 38 OutputType string 39 AssemblyName string 40 41 ReferredProjectIDs []string 42 43 ManifestPth string 44 AndroidApplication bool 45 46 Configs map[string]ConfigurationPlatformModel // Project Configuration|Platform - ConfigurationPlatformModel map 47 } 48 49 // New ... 50 func New(pth string) (Model, error) { 51 return analyzeProject(pth) 52 } 53 54 func debugLog(err error, pth string) { 55 log.Debugf("%v for project at %s", err, pth) 56 } 57 58 func analyzeTargetDefinition(projectModel Model, pth string) (Model, error) { 59 projectDir := filepath.Dir(pth) 60 var err error 61 62 parsedProject, err := ParseProject(pth) 63 if err != nil { 64 return Model{}, err 65 } 66 67 for _, importedProject := range GetImportedProjects(parsedProject) { 68 if !strings.Contains(importedProject, "$(MSBuild") { 69 targetDefinitionPth := filepath.Join(projectDir, importedProject) 70 71 if exist, err := pathutil.IsPathExists(targetDefinitionPth); err != nil { 72 return Model{}, err 73 } else if exist { 74 projectFromTargetDefinition, err := analyzeTargetDefinition(projectModel, targetDefinitionPth) 75 if err != nil { 76 return Model{}, err 77 } 78 79 // Set properties became from solution analyze 80 projectFromTargetDefinition.Name = projectModel.Name 81 projectFromTargetDefinition.Pth = projectModel.Pth 82 projectFromTargetDefinition.ConfigMap = projectModel.ConfigMap 83 // --- 84 85 projectModel = projectFromTargetDefinition 86 } 87 } 88 } 89 90 projectModel.ID, err = GetProjectGUID(parsedProject) 91 if err != nil { 92 debugLog(err, pth) 93 } 94 95 projectModel.OutputType, err = GetOutputType(parsedProject) 96 if err != nil { 97 debugLog(err, pth) 98 } 99 100 projectModel.AssemblyName, err = GetAssemblyName(parsedProject) 101 if err != nil { 102 debugLog(err, pth) 103 } 104 105 projectModel.TestFramework, err = GetTestFramework(parsedProject) 106 if err != nil { 107 debugLog(err, pth) 108 } 109 110 projectModel.SDK, err = GetResolvedProjectTypeGUIDs(parsedProject) 111 if err != nil { 112 debugLog(err, pth) 113 } 114 115 if projectModel.SDK == constants.SDKAndroid { 116 projectModel.ManifestPth, err = GetResolvedAndroidManifestPath(parsedProject, projectDir) 117 if err != nil { 118 debugLog(err, pth) 119 } 120 121 projectModel.AndroidApplication, err = GetIsAndroidApplication(parsedProject) 122 if err != nil { 123 debugLog(err, pth) 124 } 125 } 126 127 projectModel.ReferredProjectIDs = GetReferencedProjectIds(parsedProject) 128 129 configPlatforms, err := GetPropertyGroupsConfiguration(parsedProject, projectDir, projectModel.SDK) 130 if err != nil { 131 debugLog(err, pth) 132 } 133 134 for _, configPlatform := range configPlatforms { 135 projectModel.Configs[utility.ToConfig(configPlatform.Configuration, configPlatform.Platform)] = configPlatform 136 } 137 138 return projectModel, nil 139 } 140 141 func analyzeProject(pth string) (Model, error) { 142 absPth, err := pathutil.AbsPath(pth) 143 if err != nil { 144 return Model{}, fmt.Errorf("failed to expand path (%s), error: %s", pth, err) 145 } 146 147 fileName := filepath.Base(absPth) 148 ext := filepath.Ext(absPth) 149 fileName = strings.TrimSuffix(fileName, ext) 150 151 project := Model{ 152 Pth: absPth, 153 Name: fileName, 154 ConfigMap: map[string]string{}, 155 Configs: map[string]ConfigurationPlatformModel{}, 156 SDK: constants.SDKUnknown, 157 TestFramework: constants.TestFrameworkUnknown, 158 } 159 return analyzeTargetDefinition(project, absPth) 160 }