func loadToolsFrom(tools *[]*types.Tool, builtinToolsVersionsFilePath string) error { rows, err := utils.ReadFileToRows(builtinToolsVersionsFilePath) if err != nil { return i18n.WrapError(err) } folder, err := filepath.Abs(filepath.Dir(builtinToolsVersionsFilePath)) if err != nil { return i18n.WrapError(err) } for _, row := range rows { row = strings.TrimSpace(row) if row != constants.EMPTY_STRING { rowParts := strings.Split(row, "=") toolName := strings.Split(rowParts[0], ".")[1] toolVersion := rowParts[1] if !toolsSliceContains(tools, toolName, toolVersion) { *tools = append(*tools, &types.Tool{Name: toolName, Version: toolVersion, Folder: folder}) } } } return nil }
func merge(builtSketchPath, bootloaderPath, mergedSketchPath string) error { sketch, err := utils.ReadFileToRows(builtSketchPath) if err != nil { return utils.WrapError(err) } sketch = sketch[:len(sketch)-2] bootloader, err := utils.ReadFileToRows(bootloaderPath) if err != nil { return utils.WrapError(err) } for _, row := range bootloader { sketch = append(sketch, row) } return utils.WriteFile(mergedSketchPath, strings.Join(sketch, "\n")) }
func ObjFileIsUpToDate(sourceFile, objectFile, dependencyFile string) (bool, error) { sourceFile = filepath.Clean(sourceFile) objectFile = filepath.Clean(objectFile) dependencyFile = filepath.Clean(dependencyFile) sourceFileStat, err := os.Stat(sourceFile) if err != nil { return false, i18n.WrapError(err) } objectFileStat, err := os.Stat(objectFile) if err != nil { if os.IsNotExist(err) { return false, nil } else { return false, i18n.WrapError(err) } } dependencyFileStat, err := os.Stat(dependencyFile) if err != nil { if os.IsNotExist(err) { return false, nil } else { return false, i18n.WrapError(err) } } if sourceFileStat.ModTime().After(objectFileStat.ModTime()) { return false, nil } if sourceFileStat.ModTime().After(dependencyFileStat.ModTime()) { return false, nil } rows, err := utils.ReadFileToRows(dependencyFile) if err != nil { return false, i18n.WrapError(err) } rows = utils.Map(rows, removeEndingBackSlash) rows = utils.Map(rows, strings.TrimSpace) rows = utils.Map(rows, unescapeDep) rows = utils.Filter(rows, nonEmptyString) if len(rows) == 0 { return true, nil } firstRow := rows[0] if !strings.HasSuffix(firstRow, ":") { return false, nil } objFileInDepFile := firstRow[:len(firstRow)-1] if objFileInDepFile != objectFile { return false, nil } rows = rows[1:] for _, row := range rows { depStat, err := os.Stat(row) if err != nil && !os.IsNotExist(err) { // There is probably a parsing error of the dep file // Ignore the error and trigger a full rebuild anyway return false, nil } if os.IsNotExist(err) { return false, nil } if depStat.ModTime().After(objectFileStat.ModTime()) { return false, nil } } return true, nil }