// 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 'package:dev_tools/repository.dart'; import 'package:file/memory.dart'; import 'package:platform/platform.dart'; import '../../../packages/flutter_tools/test/src/fake_process_manager.dart'; import './common.dart'; void main() { group('repository', () { test('canCherryPick returns true if git cherry-pick returns 0', () { const LocalPlatform platform = LocalPlatform(); const String rootDir = '/'; const String commit = 'abc123'; final TestStdio stdio = TestStdio(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); final FakeProcessManager processManager = FakeProcessManager.list([ FakeCommand(command: [ 'git', 'clone', '--origin', 'upstream', '--', FrameworkRepository.defaultUpstream, fileSystem.path .join(rootDir, 'flutter_conductor_checkouts', 'framework'), ]), const FakeCommand(command: [ 'git', 'rev-parse', 'HEAD', ], stdout: commit), const FakeCommand(command: [ 'git', 'status', '--porcelain', ]), const FakeCommand(command: [ 'git', 'cherry-pick', '--no-commit', commit, ], exitCode: 0), const FakeCommand(command: [ 'git', 'reset', 'HEAD', '--hard', ]), ]); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(rootDir), platform: platform, processManager: processManager, stdio: stdio, ); final Repository repository = FrameworkRepository(checkouts); expect(repository.canCherryPick(commit), true); }); test('canCherryPick returns false if git cherry-pick returns non-zero', () { const LocalPlatform platform = LocalPlatform(); const String rootDir = '/'; const String commit = 'abc123'; final TestStdio stdio = TestStdio(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); final FakeProcessManager processManager = FakeProcessManager.list([ FakeCommand(command: [ 'git', 'clone', '--origin', 'upstream', '--', FrameworkRepository.defaultUpstream, fileSystem.path .join(rootDir, 'flutter_conductor_checkouts', 'framework'), ]), const FakeCommand(command: [ 'git', 'rev-parse', 'HEAD', ], stdout: commit), const FakeCommand(command: [ 'git', 'status', '--porcelain', ]), const FakeCommand(command: [ 'git', 'cherry-pick', '--no-commit', commit, ], exitCode: 1), const FakeCommand(command: [ 'git', 'diff', ]), const FakeCommand(command: [ 'git', 'reset', 'HEAD', '--hard', ]), ]); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(rootDir), platform: platform, processManager: processManager, stdio: stdio, ); final Repository repository = FrameworkRepository(checkouts); expect(repository.canCherryPick(commit), false); }); test('cherryPick() applies the commit', () { const LocalPlatform platform = LocalPlatform(); const String rootDir = '/'; const String commit = 'abc123'; final TestStdio stdio = TestStdio(); final MemoryFileSystem fileSystem = MemoryFileSystem.test(); final FakeProcessManager processManager = FakeProcessManager.list([ FakeCommand(command: [ 'git', 'clone', '--origin', 'upstream', '--', FrameworkRepository.defaultUpstream, fileSystem.path .join(rootDir, 'flutter_conductor_checkouts', 'framework'), ]), const FakeCommand(command: [ 'git', 'rev-parse', 'HEAD', ], stdout: commit), const FakeCommand(command: [ 'git', 'status', '--porcelain', ]), const FakeCommand(command: [ 'git', 'cherry-pick', commit, ]), ]); final Checkouts checkouts = Checkouts( fileSystem: fileSystem, parentDirectory: fileSystem.directory(rootDir), platform: platform, processManager: processManager, stdio: stdio, ); final Repository repository = FrameworkRepository(checkouts); repository.cherryPick(commit); expect(processManager.hasRemainingExpectations, false); }); }); }