blob: b815b3aabe280aad22b7a4a8eb5f81b1d31485e4 [file] [log] [blame]
// 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:file/memory.dart';
import 'package:packages_autoroller/src/repository.dart';
import 'package:platform/platform.dart';
import 'common.dart';
void main() {
group('repository', () {
late FakePlatform platform;
const String rootDir = '/';
const String revision = 'deadbeef';
late MemoryFileSystem fileSystem;
late FakeProcessManager processManager;
late TestStdio stdio;
setUp(() {
final String pathSeparator = const LocalPlatform().pathSeparator;
fileSystem = MemoryFileSystem.test();
platform = FakePlatform(
environment: <String, String>{
'HOME': <String>['path', 'to', 'home'].join(pathSeparator),
},
pathSeparator: pathSeparator,
);
processManager = FakeProcessManager.empty();
stdio = TestStdio();
});
test('commit() throws if there are no local changes to commit and addFirst = true', () {
const String commit1 = 'abc123';
const String commit2 = 'def456';
const String message = 'This is a commit message.';
processManager.addCommands(<FakeCommand>[
FakeCommand(
command: <String>[
'git',
'clone',
'--origin',
'upstream',
'--',
FrameworkRepository.defaultUpstream,
fileSystem.path.join(rootDir, 'package_autoroller_checkouts', 'framework'),
],
),
const FakeCommand(command: <String>['git', 'remote', 'add', 'mirror', 'mirror']),
const FakeCommand(command: <String>['git', 'fetch', 'mirror']),
const FakeCommand(command: <String>['git', 'checkout', FrameworkRepository.defaultBranch]),
const FakeCommand(command: <String>['git', 'rev-parse', 'HEAD'], stdout: commit1),
const FakeCommand(command: <String>['git', 'status', '--porcelain']),
const FakeCommand(command: <String>['git', 'commit', '--message', message]),
const FakeCommand(command: <String>['git', 'rev-parse', 'HEAD'], stdout: commit2),
]);
final Checkouts checkouts = Checkouts(
parentDirectory: fileSystem.directory(rootDir),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final FrameworkRepository repo = FrameworkRepository(
checkouts,
mirrorRemote: const Remote.mirror('mirror'),
);
expect(
() async => repo.commit(message, addFirst: true),
throwsExceptionWith('Tried to commit with message $message but no changes were present'),
);
});
test('commit() passes correct commit message', () async {
const String commit1 = 'abc123';
const String commit2 = 'def456';
const String message = 'This is a commit message.';
processManager.addCommands(<FakeCommand>[
FakeCommand(
command: <String>[
'git',
'clone',
'--origin',
'upstream',
'--',
FrameworkRepository.defaultUpstream,
fileSystem.path.join(rootDir, 'package_autoroller_checkouts', 'framework'),
],
),
const FakeCommand(command: <String>['git', 'remote', 'add', 'mirror', 'mirror']),
const FakeCommand(command: <String>['git', 'fetch', 'mirror']),
const FakeCommand(command: <String>['git', 'checkout', FrameworkRepository.defaultBranch]),
const FakeCommand(command: <String>['git', 'rev-parse', 'HEAD'], stdout: commit1),
const FakeCommand(command: <String>['git', 'commit', '--message', message]),
const FakeCommand(command: <String>['git', 'rev-parse', 'HEAD'], stdout: commit2),
]);
final Checkouts checkouts = Checkouts(
parentDirectory: fileSystem.directory(rootDir),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final FrameworkRepository repo = FrameworkRepository(
checkouts,
mirrorRemote: const Remote.mirror('mirror'),
);
await repo.commit(message);
expect(processManager.hasRemainingExpectations, false);
});
test('.listRemoteBranches() parses git output', () async {
const String remoteName = 'mirror';
const String lsRemoteOutput = '''
Extraneous debug information that should be ignored.
4d44dca340603e25d4918c6ef070821181202e69 refs/heads/experiment
35185330c6af3a435f615ee8ac2fed8b8bb7d9d4 refs/heads/feature-a
6f60a1e7b2f3d2c2460c9dc20fe54d0e9654b131 refs/heads/feature-b
c1436c42c0f3f98808ae767e390c3407787f1a67 refs/heads/fix_bug_1234
bbbcae73699263764ad4421a4b2ca3952a6f96cb refs/heads/stable
Extraneous debug information that should be ignored.
''';
processManager.addCommands(const <FakeCommand>[
FakeCommand(
command: <String>[
'git',
'clone',
'--origin',
'upstream',
'--',
FrameworkRepository.defaultUpstream,
'${rootDir}package_autoroller_checkouts/framework',
],
),
FakeCommand(command: <String>['git', 'remote', 'add', 'mirror', 'mirror']),
FakeCommand(command: <String>['git', 'fetch', 'mirror']),
FakeCommand(command: <String>['git', 'checkout', 'master']),
FakeCommand(command: <String>['git', 'rev-parse', 'HEAD'], stdout: revision),
FakeCommand(
command: <String>['git', 'ls-remote', '--heads', remoteName],
stdout: lsRemoteOutput,
),
]);
final Checkouts checkouts = Checkouts(
parentDirectory: fileSystem.directory(rootDir),
platform: platform,
processManager: processManager,
stdio: stdio,
);
final Repository repo = FrameworkRepository(
checkouts,
mirrorRemote: const Remote.mirror('mirror'),
);
final List<String> branchNames = await repo.listRemoteBranches(remoteName);
expect(
branchNames,
equals(<String>['experiment', 'feature-a', 'feature-b', 'fix_bug_1234', 'stable']),
);
});
});
}