Revert "Enable developers to run pod from terminal directly and skip pod install if possible. (#13374)" (#13770)

This reverts commit c6a17525e8ea63fef80325cdb8af2d6e5ca37f87.
diff --git a/packages/flutter_tools/lib/src/commands/inject_plugins.dart b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
index f1df432..bf53cb5 100644
--- a/packages/flutter_tools/lib/src/commands/inject_plugins.dart
+++ b/packages/flutter_tools/lib/src/commands/inject_plugins.dart
@@ -24,7 +24,7 @@
 
   @override
   Future<Null> runCommand() async {
-    final bool result = injectPlugins().hasPlugin;
+    final bool result = injectPlugins();
     if (result) {
       printStatus('GeneratedPluginRegistrants successfully written.');
     } else {
diff --git a/packages/flutter_tools/lib/src/ios/cocoapods.dart b/packages/flutter_tools/lib/src/ios/cocoapods.dart
index f935821..78fd425 100644
--- a/packages/flutter_tools/lib/src/ios/cocoapods.dart
+++ b/packages/flutter_tools/lib/src/ios/cocoapods.dart
@@ -57,17 +57,15 @@
 
   Future<Null> processPods({
     @required Directory appIosDir,
+    @required String iosEngineDir,
     bool isSwift: false,
-    bool pluginOrFlutterPodChanged: true,
   }) async {
     if (await _checkPodCondition()) {
       if (!fs.file(fs.path.join(appIosDir.path, 'Podfile')).existsSync()) {
         await _createPodfile(appIosDir, isSwift);
       } // TODO(xster): Add more logic for handling merge conflicts.
-      if (_checkIfRunPodInstall(appIosDir.path, pluginOrFlutterPodChanged))
-        await _runPodInstall(appIosDir);
-    } else {
-      throwToolExit('CocoaPods not available for project using Flutter plugins');
+
+      await _runPodInstall(appIosDir, iosEngineDir);
     }
   }
 
@@ -110,12 +108,13 @@
     podfileTemplate.copySync(fs.path.join(bundle.path, 'Podfile'));
   }
 
-  Future<Null> _runPodInstall(Directory bundle) async {
+  Future<Null> _runPodInstall(Directory bundle, String engineDirectory) async {
     final Status status = logger.startProgress('Running pod install...', expectSlowOperation: true);
     final ProcessResult result = await processManager.run(
       <String>['pod', 'install', '--verbose'],
       workingDirectory: bundle.path,
       environment: <String, String>{
+        'FLUTTER_FRAMEWORK_DIR': engineDirectory,
         // See https://github.com/flutter/flutter/issues/10873.
         // CocoaPods analytics adds a lot of latency.
         'COCOAPODS_DISABLE_STATS': 'true',
@@ -138,28 +137,6 @@
     }
   }
 
-  // Check if you need to run pod install.
-  // The pod install will run if any of below is true.
-  // 1.Any plugins changed (add/update/delete)
-  // 2.The flutter.framework has changed (debug/release/profile)
-  // 3.The podfile.lock doesn't exists
-  // 4.The Pods/manifest.lock doesn't exists
-  // 5.The podfile.lock doesn't match Pods/manifest.lock.
-  bool _checkIfRunPodInstall(String appDir, bool pluginOrFlutterPodChanged) {
-    if (pluginOrFlutterPodChanged)
-      return true;
-    // Check if podfile.lock and Pods/Manifest.lock exists and matches.
-    final File podfileLockFile = fs.file(fs.path.join(appDir, 'Podfile.lock'));
-    final File manifestLockFile =
-        fs.file(fs.path.join(appDir, 'Pods', 'Manifest.lock'));
-    if (!podfileLockFile.existsSync() ||
-        !manifestLockFile.existsSync() ||
-        podfileLockFile.readAsStringSync() !=
-            manifestLockFile.readAsStringSync())
-      return true;
-    return false;
-  }
-
   void _diagnosePodInstallFailure(ProcessResult result) {
     if (result.stdout is String && result.stdout.contains('out-of-date source repos')) {
       printError(
diff --git a/packages/flutter_tools/lib/src/ios/mac.dart b/packages/flutter_tools/lib/src/ios/mac.dart
index 00abe0e..e3ead3b 100644
--- a/packages/flutter_tools/lib/src/ios/mac.dart
+++ b/packages/flutter_tools/lib/src/ios/mac.dart
@@ -254,9 +254,14 @@
   // copied over to a location that is suitable for Xcodebuild to find them.
   final Directory appDirectory = fs.directory(app.appDirectory);
   await _addServicesToBundle(appDirectory);
-  final InjectPluginsResult injectionResult = injectPlugins();
-  final bool hasFlutterPlugins = injectionResult.hasPlugin;
-  final String priorGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
+  final bool hasFlutterPlugins = injectPlugins();
+
+  if (hasFlutterPlugins)
+    await cocoaPods.processPods(
+      appIosDir: appDirectory,
+      iosEngineDir: flutterFrameworkDir(buildInfo.mode),
+      isSwift: app.isSwift,
+    );
 
   updateXcodeGeneratedProperties(
     projectPath: fs.currentDirectory.path,
@@ -266,15 +271,6 @@
     previewDart2: buildInfo.previewDart2,
   );
 
-  if (hasFlutterPlugins) {
-    final String currentGeneratedXCConfig = readGeneratedXCConfig(app.appDirectory);
-    await cocoaPods.processPods(
-        appIosDir: appDirectory,
-        isSwift: app.isSwift,
-        pluginOrFlutterPodChanged: (injectionResult.hasChanged ||
-            priorGeneratedXCConfig != currentGeneratedXCConfig));
-  }
-
   final List<String> commands = <String>[
     '/usr/bin/env',
     'xcrun',
@@ -359,17 +355,7 @@
   }
 }
 
-String readGeneratedXCConfig(String appPath) {
-  final String generateXCConfigPath =
-      fs.path.join(fs.currentDirectory.path, appPath, 'Flutter','Generated.xcconfig');
-  final File generateXCConfigFile = fs.file(generateXCConfigPath);
-  if (!generateXCConfigFile.existsSync())
-    return null;
-  return generateXCConfigFile.readAsStringSync();
-}
-
-Future<Null> diagnoseXcodeBuildFailure(
-    XcodeBuildResult result, BuildableIOSApp app) async {
+Future<Null> diagnoseXcodeBuildFailure(XcodeBuildResult result, BuildableIOSApp app) async {
   if (result.xcodeBuildExecution != null &&
       result.xcodeBuildExecution.buildForPhysicalDevice &&
       result.stdout?.contains('BCEROR') == true &&
diff --git a/packages/flutter_tools/lib/src/plugins.dart b/packages/flutter_tools/lib/src/plugins.dart
index 0eeaac7..19d7bc0 100644
--- a/packages/flutter_tools/lib/src/plugins.dart
+++ b/packages/flutter_tools/lib/src/plugins.dart
@@ -77,10 +77,8 @@
   return plugins;
 }
 
-// Return true if .flutter-plugins has changed, otherwise return false.
-bool _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
+void _writeFlutterPluginsList(String directory, List<Plugin> plugins) {
   final File pluginsProperties = fs.file(fs.path.join(directory, '.flutter-plugins'));
-  final String priorFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
   final String pluginManifest =
     plugins.map((Plugin p) => '${p.name}=${escapePath(p.path)}').join('\n');
   if (pluginManifest.isNotEmpty) {
@@ -90,8 +88,6 @@
       pluginsProperties.deleteSync();
     }
   }
-  final String currentFlutterPlugins = (pluginsProperties.existsSync() ? pluginsProperties.readAsStringSync() : null);
-  return currentFlutterPlugins != priorFlutterPlugins;
 }
 
 const String _androidPluginRegistryTemplate = '''package io.flutter.plugins;
@@ -210,25 +206,17 @@
 
 }
 
-class InjectPluginsResult{
-  InjectPluginsResult({this.hasPlugin : false, this.hasChanged : false});
-  /// True if any flutter plugin exists, otherwise false.
-  final bool hasPlugin;
-  /// True if plugins have changed since last build.
-  final bool hasChanged;
-}
-
 /// Finds Flutter plugins in the pubspec.yaml, creates platform injection
 /// registries classes and add them to the build dependencies.
 ///
 /// Returns whether any Flutter plugins are added.
-InjectPluginsResult injectPlugins({String directory}) {
+bool injectPlugins({String directory}) {
   directory ??= fs.currentDirectory.path;
   final List<Plugin> plugins = _findPlugins(directory);
-  final bool hasPluginsChanged = _writeFlutterPluginsList(directory, plugins);
+  _writeFlutterPluginsList(directory, plugins);
   if (fs.isDirectorySync(fs.path.join(directory, 'android')))
     _writeAndroidPluginRegistry(directory, plugins);
   if (fs.isDirectorySync(fs.path.join(directory, 'ios')))
     _writeIOSPluginRegistry(directory, plugins);
-  return new InjectPluginsResult(hasPlugin: plugins.isNotEmpty, hasChanged: hasPluginsChanged);
-}
\ No newline at end of file
+  return plugins.isNotEmpty;
+}
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-objc b/packages/flutter_tools/templates/cocoapods/Podfile-objc
index 8350f1e..90b5f65 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-objc
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-objc
@@ -1,42 +1,30 @@
 # Uncomment this line to define a global platform for your project
 # platform :ios, '9.0'
 
-def parse_KV_file(file,seperator='=')
-  file_abs_path = File.expand_path(file)
-  if !File.exists? file_abs_path
-    puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
-    return [];
-  end
-  pods_ary = []
-  File.foreach(file_abs_path) { |line|
-      plugin = line.split(pattern=seperator)
-      if plugin.length == 2
-        podname = plugin[0].strip()
-        path = plugin[1].strip()
-        podpath = File.expand_path("#{path}", file_abs_path)
-        pods_ary.push({:name => podname,:path=>podpath});
-      else
-        puts "Invalid plugin specification: #{line}"
-      end
-  }
-  return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+  abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
 end
 
 target 'Runner' do
-  use_frameworks!
-  # Flutter Pods
-  generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
-    generated_xcode_build_settings.map{ |p|
-    if p[:name]=='FLUTTER_FRAMEWORK_DIR'
-      pod 'Flutter', :path => p[:path]
-    end
-  }
+  # Pods for Runner
 
-  # Plugin Pods
-  plugin_pods = parse_KV_file("../.flutter-plugins")
-  plugin_pods.map{ |p|
-    pod p[:name], :path => File.expand_path("ios",p[:path])
-  }
+  # Flutter Pods
+  pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+  if File.exists? '../.flutter-plugins'
+    flutter_root = File.expand_path('..')
+    File.foreach('../.flutter-plugins') { |line|
+      plugin = line.split(pattern='=')
+      if plugin.length == 2
+        name = plugin[0].strip()
+        path = plugin[1].strip()
+        resolved_path = File.expand_path("#{path}/ios", flutter_root)
+        pod name, :path => resolved_path
+      else
+        puts "Invalid plugin specification: #{line}"
+      end
+    }
+  end
 end
 
 post_install do |installer|
@@ -45,4 +33,4 @@
       config.build_settings['ENABLE_BITCODE'] = 'NO'
     end
   end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/templates/cocoapods/Podfile-swift b/packages/flutter_tools/templates/cocoapods/Podfile-swift
index 8350f1e..74b3de0 100644
--- a/packages/flutter_tools/templates/cocoapods/Podfile-swift
+++ b/packages/flutter_tools/templates/cocoapods/Podfile-swift
@@ -1,42 +1,32 @@
 # Uncomment this line to define a global platform for your project
 # platform :ios, '9.0'
 
-def parse_KV_file(file,seperator='=')
-  file_abs_path = File.expand_path(file)
-  if !File.exists? file_abs_path
-    puts "Generated.xcconfig or .flutter-plugins expected but not present. If you're running pod install manually, make sure flutter build or flutter run is executed once first."
-    return [];
-  end
-  pods_ary = []
-  File.foreach(file_abs_path) { |line|
-      plugin = line.split(pattern=seperator)
-      if plugin.length == 2
-        podname = plugin[0].strip()
-        path = plugin[1].strip()
-        podpath = File.expand_path("#{path}", file_abs_path)
-        pods_ary.push({:name => podname,:path=>podpath});
-      else
-        puts "Invalid plugin specification: #{line}"
-      end
-  }
-  return pods_ary
+if ENV['FLUTTER_FRAMEWORK_DIR'] == nil
+  abort('Please set FLUTTER_FRAMEWORK_DIR to the directory containing Flutter.framework')
 end
 
 target 'Runner' do
   use_frameworks!
-  # Flutter Pods
-  generated_xcode_build_settings = parse_KV_file("./Flutter/Generated.xcconfig")
-    generated_xcode_build_settings.map{ |p|
-    if p[:name]=='FLUTTER_FRAMEWORK_DIR'
-      pod 'Flutter', :path => p[:path]
-    end
-  }
 
-  # Plugin Pods
-  plugin_pods = parse_KV_file("../.flutter-plugins")
-  plugin_pods.map{ |p|
-    pod p[:name], :path => File.expand_path("ios",p[:path])
-  }
+  # Pods for Runner
+
+  # Flutter Pods
+  pod 'Flutter', :path => ENV['FLUTTER_FRAMEWORK_DIR']
+
+  if File.exists? '../.flutter-plugins'
+    flutter_root = File.expand_path('..')
+    File.foreach('../.flutter-plugins') { |line|
+      plugin = line.split(pattern='=')
+      if plugin.length == 2
+        name = plugin[0].strip()
+        path = plugin[1].strip()
+        resolved_path = File.expand_path("#{path}/ios", flutter_root)
+        pod name, :path => resolved_path
+      else
+        puts "Invalid plugin specification: #{line}"
+      end
+    }
+  end
 end
 
 post_install do |installer|
@@ -45,4 +35,4 @@
       config.build_settings['ENABLE_BITCODE'] = 'NO'
     end
   end
-end
\ No newline at end of file
+end
diff --git a/packages/flutter_tools/test/ios/cocoapods_test.dart b/packages/flutter_tools/test/ios/cocoapods_test.dart
index 73c068d..493468f 100644
--- a/packages/flutter_tools/test/ios/cocoapods_test.dart
+++ b/packages/flutter_tools/test/ios/cocoapods_test.dart
@@ -41,7 +41,7 @@
     when(mockProcessManager.run(
       <String>['pod', 'install', '--verbose'],
       workingDirectory: 'project/ios',
-      environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+      environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
     )).thenReturn(exitsHappy);
   });
 
@@ -50,12 +50,13 @@
     () async {
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
       );
       expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Objective-C podfile template');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -69,13 +70,14 @@
     () async {
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
         isSwift: true,
       );
       expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Swift podfile template');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -92,11 +94,12 @@
         ..writeAsString('Existing Podfile');
       await cocoaPodsUnderTest.processPods(
         appIosDir: projectUnderTest,
+        iosEngineDir: 'engine/path',
       );      expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
       verify(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       ));
     },
     overrides: <Type, Generator>{
@@ -112,13 +115,14 @@
       try {
         await cocoaPodsUnderTest.processPods(
           appIosDir: projectUnderTest,
+          iosEngineDir: 'engine/path',
         );
         fail('Expected tool error');
       } catch (ToolExit) {
         verifyNever(mockProcessManager.run(
           <String>['pod', 'install', '--verbose'],
           workingDirectory: 'project/ios',
-          environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+          environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
         ));
       }
     },
@@ -138,7 +142,7 @@
       when(mockProcessManager.run(
         <String>['pod', 'install', '--verbose'],
         workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
+        environment: <String, String>{'FLUTTER_FRAMEWORK_DIR': 'engine/path', 'COCOAPODS_DISABLE_STATS': 'true'},
       )).thenReturn(new ProcessResult(
         1,
         1,
@@ -161,6 +165,7 @@
       try {
         await cocoaPodsUnderTest.processPods(
           appIosDir: projectUnderTest,
+          iosEngineDir: 'engine/path',
         );      expect(fs.file(fs.path.join('project', 'ios', 'Podfile')).readAsStringSync() , 'Existing Podfile');
         fail('Exception expected');
       } catch (ToolExit) {
@@ -172,62 +177,6 @@
       ProcessManager: () => mockProcessManager,
     },
   );
-
-  testUsingContext(
-    'Run pod install if plugins or flutter framework have changes.',
-        () async {
-      fs.file(fs.path.join('project', 'ios', 'Podfile'))
-        ..createSync()
-        ..writeAsString('Existing Podfile');
-      fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
-        ..createSync()
-        ..writeAsString('Existing lock files.');
-      fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
-        ..createSync(recursive: true)
-        ..writeAsString('Existing lock files.');
-      await cocoaPodsUnderTest.processPods(
-          appIosDir: projectUnderTest,
-          pluginOrFlutterPodChanged: true
-      );
-      verify(mockProcessManager.run(
-        <String>['pod', 'install', '--verbose'],
-        workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
-      ));
-    },
-    overrides: <Type, Generator>{
-      FileSystem: () => fs,
-      ProcessManager: () => mockProcessManager,
-    },
-  );
-
-  testUsingContext(
-    'Skip pod install if plugins and flutter framework remain unchanged.',
-        () async {
-      fs.file(fs.path.join('project', 'ios', 'Podfile'))
-        ..createSync()
-        ..writeAsString('Existing Podfile');
-      fs.file(fs.path.join('project', 'ios', 'Podfile.lock'))
-        ..createSync()
-        ..writeAsString('Existing lock files.');
-      fs.file(fs.path.join('project', 'ios', 'Pods','Manifest.lock'))
-        ..createSync(recursive: true)
-        ..writeAsString('Existing lock files.');
-      await cocoaPodsUnderTest.processPods(
-          appIosDir: projectUnderTest,
-          pluginOrFlutterPodChanged: false
-      );
-      verifyNever(mockProcessManager.run(
-        <String>['pod', 'install', '--verbose'],
-        workingDirectory: 'project/ios',
-        environment: <String, String>{'COCOAPODS_DISABLE_STATS': 'true'},
-      ));
-    },
-    overrides: <Type, Generator>{
-      FileSystem: () => fs,
-      ProcessManager: () => mockProcessManager,
-    },
-  );
 }
 
 class MockProcessManager extends Mock implements ProcessManager {}