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  }