// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import '../base/file_system.dart'; import '../base/project_migrator.dart'; import '../base/version.dart'; import '../ios/xcodeproj.dart'; import '../xcode_project.dart'; // Xcode 14.3 changed the readlink symlink behavior to be relative from the script working directory, instead of the // relative path of the symlink. The -f flag returns the original "--canonicalize" behavior the CocoaPods script relies on. // This has been fixed upstream in CocoaPods, but migrate a copy of their workaround so users don't need to update. // // See https://github.com/flutter/flutter/issues/123890#issuecomment-1494825976. class CocoaPodsScriptReadlink extends ProjectMigrator { CocoaPodsScriptReadlink( XcodeBasedProject project, XcodeProjectInterpreter xcodeProjectInterpreter, super.logger, ) : _podRunnerFrameworksScript = project.podRunnerFrameworksScript, _xcodeProjectInterpreter = xcodeProjectInterpreter; final File _podRunnerFrameworksScript; final XcodeProjectInterpreter _xcodeProjectInterpreter; @override void migrate() { if (!_podRunnerFrameworksScript.existsSync()) { logger.printTrace('CocoaPods Pods-Runner-frameworks.sh script not found, skipping "readlink -f" workaround.'); return; } final Version? version = _xcodeProjectInterpreter.version; // If Xcode not installed or less than 14.3 with readlink behavior change, skip this migration. if (version == null || version < Version(14, 3, 0)) { logger.printTrace('Detected Xcode version is $version, below 14.3, skipping "readlink -f" workaround.'); return; } processFileLines(_podRunnerFrameworksScript); } @override String? migrateLine(String line) { const String originalReadLinkLine = r'source="$(readlink "${source}")"'; const String replacementReadLinkLine = r'source="$(readlink -f "${source}")"'; return line.replaceAll(originalReadLinkLine, replacementReadLinkLine); } }