blob: 3871ba0d17346927260538171cbcde477c57af88 [file] [log] [blame]
// Copyright (c) 2012, 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:test/test.dart';
import 'package:pub/src/entrypoint.dart';
import 'package:pub/src/io.dart';
import 'package:pub/src/system_cache.dart';
import 'descriptor.dart' as d;
import 'test_pub.dart';
String root;
Entrypoint entrypoint;
void main() {
group('not in a git repo', () {
setUp(() async {
await d.appDir().create();
createEntrypoint();
});
test('lists files recursively', () async {
await d.dir(appPath, [
d.file('file1.txt', 'contents'),
d.file('file2.txt', 'contents'),
d.dir('subdir', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.txt', 'subcontents')
])
]).create();
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'file1.txt'),
p.join(root, 'file2.txt'),
p.join(root, 'subdir', 'subfile1.txt'),
p.join(root, 'subdir', 'subfile2.txt')
]));
});
commonTests();
});
group('with git', () {
d.GitRepoDescriptor repo;
setUp(() async {
ensureGit();
repo = d.git(appPath, [d.appPubspec()]);
await repo.create();
createEntrypoint();
});
test("includes files that are or aren't checked in", () async {
await d.dir(appPath, [
d.file('file1.txt', 'contents'),
d.file('file2.txt', 'contents'),
d.dir('subdir', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.txt', 'subcontents')
])
]).create();
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'file1.txt'),
p.join(root, 'file2.txt'),
p.join(root, 'subdir', 'subfile1.txt'),
p.join(root, 'subdir', 'subfile2.txt')
]));
});
test('ignores files that are gitignored if desired', () async {
await d.dir(appPath, [
d.file('.gitignore', '*.txt'),
d.file('file1.txt', 'contents'),
d.file('file2.text', 'contents'),
d.dir('subdir', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.text', 'subcontents')
])
]).create();
expect(
entrypoint.root.listFiles(useGitIgnore: true),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, '.gitignore'),
p.join(root, 'file2.text'),
p.join(root, 'subdir', 'subfile2.text')
]));
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'file1.txt'),
p.join(root, 'file2.text'),
p.join(root, 'subdir', 'subfile1.txt'),
p.join(root, 'subdir', 'subfile2.text')
]));
});
test(
"ignores files that are gitignored even if the package isn't "
'the repo root', () async {
await d.dir(appPath, [
d.dir('sub', [
d.appPubspec(),
d.file('.gitignore', '*.txt'),
d.file('file1.txt', 'contents'),
d.file('file2.text', 'contents'),
d.dir('subdir', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.text', 'subcontents')
])
])
]).create();
createEntrypoint(p.join(appPath, 'sub'));
expect(
entrypoint.root.listFiles(useGitIgnore: true),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, '.gitignore'),
p.join(root, 'file2.text'),
p.join(root, 'subdir', 'subfile2.text')
]));
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'file1.txt'),
p.join(root, 'file2.text'),
p.join(root, 'subdir', 'subfile1.txt'),
p.join(root, 'subdir', 'subfile2.text')
]));
});
group('with a submodule', () {
setUp(() async {
await d.git('submodule', [
d.file('.gitignore', '*.txt'),
d.file('file2.text', 'contents')
]).create();
await repo.runGit(['submodule', 'add', '../submodule']);
await d.file('$appPath/submodule/file1.txt', 'contents').create();
createEntrypoint();
});
test('ignores its .gitignore without useGitIgnore', () {
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'submodule', 'file1.txt'),
p.join(root, 'submodule', 'file2.text'),
]));
});
test('respects its .gitignore with useGitIgnore', () {
expect(
entrypoint.root.listFiles(useGitIgnore: true),
unorderedEquals([
p.join(root, '.gitmodules'),
p.join(root, 'pubspec.yaml'),
p.join(root, 'submodule', '.gitignore'),
p.join(root, 'submodule', 'file2.text'),
]));
});
});
commonTests();
});
}
void createEntrypoint([String path]) {
path ??= appPath;
root = p.join(d.sandbox, path);
entrypoint = Entrypoint(root, SystemCache(rootDir: root));
addTearDown(() {
entrypoint = null;
});
}
void commonTests() {
test('ignores broken symlinks', () async {
// Windows requires us to symlink to a directory that actually exists.
await d.dir(appPath, [d.dir('target')]).create();
symlinkInSandbox(p.join(appPath, 'target'), p.join(appPath, 'link'));
deleteEntry(p.join(d.sandbox, appPath, 'target'));
expect(entrypoint.root.listFiles(), equals([p.join(root, 'pubspec.yaml')]));
});
test('ignores pubspec.lock files', () async {
await d.dir(appPath, [
d.file('pubspec.lock'),
d.dir('subdir', [d.file('pubspec.lock')])
]).create();
expect(entrypoint.root.listFiles(), equals([p.join(root, 'pubspec.yaml')]));
});
test('ignores packages directories', () async {
await d.dir(appPath, [
d.dir('packages', [d.file('file.txt', 'contents')]),
d.dir('subdir', [
d.dir('packages', [d.file('subfile.txt', 'subcontents')]),
])
]).create();
expect(entrypoint.root.listFiles(), equals([p.join(root, 'pubspec.yaml')]));
});
test('allows pubspec.lock directories', () async {
await d.dir(appPath, [
d.dir('pubspec.lock', [
d.file('file.txt', 'contents'),
])
]).create();
expect(
entrypoint.root.listFiles(),
unorderedEquals([
p.join(root, 'pubspec.yaml'),
p.join(root, 'pubspec.lock', 'file.txt')
]));
});
group('and "beneath"', () {
test('only lists files beneath the given root', () async {
await d.dir(appPath, [
d.file('file1.txt', 'contents'),
d.file('file2.txt', 'contents'),
d.dir('subdir', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.txt', 'subcontents'),
d.dir('subsubdir', [
d.file('subsubfile1.txt', 'subsubcontents'),
d.file('subsubfile2.txt', 'subsubcontents'),
])
])
]).create();
expect(
entrypoint.root.listFiles(beneath: p.join(root, 'subdir')),
unorderedEquals([
p.join(root, 'subdir', 'subfile1.txt'),
p.join(root, 'subdir', 'subfile2.txt'),
p.join(root, 'subdir', 'subsubdir', 'subsubfile1.txt'),
p.join(root, 'subdir', 'subsubdir', 'subsubfile2.txt')
]));
});
test("doesn't care if the root is disallowed", () async {
await d.dir(appPath, [
d.file('file1.txt', 'contents'),
d.file('file2.txt', 'contents'),
d.dir('packages', [
d.file('subfile1.txt', 'subcontents'),
d.file('subfile2.txt', 'subcontents'),
d.dir('subsubdir', [
d.file('subsubfile1.txt', 'subsubcontents'),
d.file('subsubfile2.txt', 'subsubcontents')
])
])
]).create();
expect(
entrypoint.root.listFiles(beneath: p.join(root, 'packages')),
unorderedEquals([
p.join(root, 'packages', 'subfile1.txt'),
p.join(root, 'packages', 'subfile2.txt'),
p.join(root, 'packages', 'subsubdir', 'subsubfile1.txt'),
p.join(root, 'packages', 'subsubdir', 'subsubfile2.txt')
]));
});
});
}