blob: bdfb1d905da50caf332c98cbea3a2a0f8306e382 [file] [log] [blame]
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
// for details. 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:path/path.dart' as p;
import 'package:pub/src/exit_codes.dart' as exit_codes;
import 'package:test/test.dart';
import '../descriptor.dart' as d;
import '../test_pub.dart';
Future<void> expectValidation(
Matcher output,
int exitCode, {
List<String> extraArgs = const [],
Map<String, String> environment = const {},
String? workingDirectory,
}) async {
await runPub(
output: output,
args: ['publish', '--dry-run', ...extraArgs],
environment: environment,
workingDirectory: workingDirectory ?? d.path(appPath),
exitCode: exitCode,
);
}
void main() {
test(
'should consider a package valid '
'if it contains no modified files (but contains a newly created one)',
() async {
await d.git('myapp', [
...d.validPackage().contents,
d.file('foo.txt', 'foo'),
d.file('.pubignore', 'bob.txt\n'),
d.file('bob.txt', 'bob'),
]).create();
await d.dir('myapp', [
d.file('bar.txt', 'bar'), // Create untracked file.
d.file('bob.txt', 'bob2'), // Modify pub-ignored file.
]).create();
await expectValidation(contains('Package has 0 warnings.'), 0);
},
);
test('Warns if files are modified', () async {
await d.git('myapp', [
...d.validPackage().contents,
d.file('foo.txt', 'foo'),
]).create();
await d.dir('myapp', [d.file('foo.txt', 'foo2')]).create();
await expectValidation(
allOf([
contains('Package has 1 warning.'),
contains('''
* 1 checked-in file is modified in git.
Usually you want to publish from a clean git state.
Consider committing these files or reverting the changes.
Modified files:
foo.txt
Run `git status` for more information.'''),
]),
exit_codes.DATA,
);
// Stage but do not commit foo.txt. The warning should still be active.
await d.git('myapp').runGit(['add', 'foo.txt']);
await expectValidation(
allOf([contains('Package has 1 warning.'), contains('foo.txt')]),
exit_codes.DATA,
);
await d.git('myapp').runGit(['commit', '-m', 'message']);
await d.dir('myapp', [
d.file('bar.txt', 'bar'), // Create untracked file.
d.file('bob.txt', 'bob2'), // Modify pub-ignored file.
]).create();
// Stage untracked file, now the warning should be about that.
await d.git('myapp').runGit(['add', 'bar.txt']);
await expectValidation(
allOf([
contains('Package has 1 warning.'),
contains('''
* 1 checked-in file is modified in git.
Usually you want to publish from a clean git state.
Consider committing these files or reverting the changes.
Modified files:
bar.txt
Run `git status` for more information.'''),
]),
exit_codes.DATA,
);
});
test('Works with non-ascii unicode characters in file name', () async {
await d.git('myapp', [
...d.validPackage().contents,
d.file('non_ascii_и.txt', 'foo'),
d.file('non_ascii_и_ignored.txt', 'foo'),
d.file('.pubignore', 'non_ascii_и_ignored.txt'),
]).create();
await d.dir('myapp', [
...d.validPackage().contents,
d.file('non_ascii_и.txt', 'foo2'),
d.file('non_ascii_и_ignored.txt', 'foo2'),
]).create();
await expectValidation(
allOf([
contains('Package has 1 warning.'),
contains('''
* 1 checked-in file is modified in git.
Usually you want to publish from a clean git state.
Consider committing these files or reverting the changes.
Modified files:
non_ascii_и.txt
Run `git status` for more information.'''),
]),
exit_codes.DATA,
);
});
test('Works in workspace', () async {
await d.git(appPath, [
d.libPubspec(
'myapp',
'1.2.3',
extras: {
'workspace': ['a'],
},
sdk: '^3.5.0',
),
d.dir('a', [
...d.validPackage().contents,
d.file('non_ascii_и.txt', 'foo'),
d.file('non_ascii_и_ignored.txt', 'foo'),
d.file('.pubignore', 'non_ascii_и_ignored.txt'),
]),
]).create();
await d.dir(appPath, [
d.dir('a', [
d.file('non_ascii_и.txt', 'foo2'),
d.file('non_ascii_и_ignored.txt', 'foo2'),
d.file('.pubignore', 'non_ascii_и_ignored.txt'),
]),
]).create();
await expectValidation(
workingDirectory: p.join(d.sandbox, appPath),
extraArgs: ['-C', 'a'],
allOf([
contains('Package has 1 warning.'),
contains('''
* 1 checked-in file is modified in git.
Usually you want to publish from a clean git state.
Consider committing these files or reverting the changes.
Modified files:
a${p.separator}non_ascii_и.txt
Run `git status` for more information.'''),
]),
exit_codes.DATA,
);
await expectValidation(
workingDirectory: p.join(d.sandbox, appPath, 'a'),
allOf([
contains('Package has 1 warning.'),
contains('''
* 1 checked-in file is modified in git.
Usually you want to publish from a clean git state.
Consider committing these files or reverting the changes.
Modified files:
non_ascii_и.txt
Run `git status` for more information.'''),
]),
exit_codes.DATA,
);
});
}