| // 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. | |
| @TestOn('vm') | |
| library; | |
| import 'dart:io'; | |
| import 'package:pub/src/exit_codes.dart' as exit_codes; | |
| import 'package:pub/src/exit_codes.dart'; | |
| import 'package:pub/src/path.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:yaml/yaml.dart'; | |
| import '../../descriptor.dart' as d; | |
| import '../../test_pub.dart'; | |
| void main() { | |
| test('checks out packages transitively from Git', () async { | |
| ensureGit(); | |
| await d.git('foo.git', [ | |
| d.libDir('foo'), | |
| d.libPubspec( | |
| 'foo', | |
| '1.0.0', | |
| deps: { | |
| 'bar': { | |
| 'git': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../bar.git')) | |
| .toString(), | |
| }, | |
| }, | |
| ), | |
| ]).create(); | |
| await d.git('bar.git', [ | |
| d.libDir('bar'), | |
| d.libPubspec('bar', '1.0.0'), | |
| ]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../foo.git')) | |
| .toString(), | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| await d.dir(cachePath, [ | |
| d.dir('git', [ | |
| d.dir('cache', [ | |
| d.gitPackageRepoCacheDir('foo'), | |
| d.gitPackageRepoCacheDir('bar'), | |
| ]), | |
| d.gitPackageRevisionCacheDir('foo'), | |
| d.gitPackageRevisionCacheDir('bar'), | |
| ]), | |
| ]).validate(); | |
| expect(packageSpec('foo'), isNotNull); | |
| expect(packageSpec('bar'), isNotNull); | |
| }); | |
| test('cannot have relative git url packages transitively from Git', () async { | |
| ensureGit(); | |
| await d.git('foo.git', [ | |
| d.libDir('foo'), | |
| d.libPubspec( | |
| 'foo', | |
| '1.0.0', | |
| deps: { | |
| 'bar': {'git': '../bar.git'}, | |
| }, | |
| ), | |
| ]).create(); | |
| await d.git('bar.git', [ | |
| d.libDir('bar'), | |
| d.libPubspec('bar', '1.0.0'), | |
| ]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../foo.git')) | |
| .toString(), | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await pubGet( | |
| error: contains( | |
| '"../bar.git" is a relative path, but this isn\'t a local pubspec.', | |
| ), | |
| exitCode: exit_codes.DATA, | |
| ); | |
| }); | |
| test('can have relative path dependencies transitively from Git', () async { | |
| ensureGit(); | |
| await d.git('foo.git', [ | |
| d.dir('pkgs', [ | |
| d.dir('foo', [ | |
| d.libPubspec( | |
| 'foo', | |
| '1.0.0', | |
| deps: { | |
| 'bar': {'path': '../bar'}, | |
| }, | |
| ), | |
| ]), | |
| d.dir('bar', [d.libPubspec('bar', '1.0.0')]), | |
| ]), | |
| ]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': { | |
| 'url': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../foo.git')) | |
| .toString(), | |
| 'path': 'pkgs/foo', | |
| }, | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| final lockFile = loadYaml( | |
| File(p.join(d.sandbox, appPath, 'pubspec.lock')).readAsStringSync(), | |
| ); | |
| expect( | |
| dig<String>(lockFile, ['packages', 'bar', 'description', 'path']), | |
| 'pkgs/bar', | |
| reason: 'Use forward slashes for path', | |
| ); | |
| }); | |
| test('can have relative path dependencies ' | |
| 'to the repo root dir transitively from Git', () async { | |
| ensureGit(); | |
| await d.git('foo.git', [ | |
| d.dir('foo', [ | |
| d.libPubspec( | |
| 'foo', | |
| '1.0.0', | |
| deps: { | |
| 'bar': {'path': '..'}, | |
| }, | |
| ), | |
| ]), | |
| d.libPubspec('bar', '1.0.0'), | |
| ]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': { | |
| 'url': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../foo.git')) | |
| .toString(), | |
| 'path': 'foo/', | |
| }, | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await pubGet(); | |
| }); | |
| test('cannot have relative path dependencies transitively from Git ' | |
| 'to outside the repo', () async { | |
| ensureGit(); | |
| await d.git('foo.git', [ | |
| d.libPubspec( | |
| 'foo', | |
| '1.0.0', | |
| deps: { | |
| 'bar': {'path': '../bar'}, | |
| }, | |
| ), | |
| ]).create(); | |
| await d.dir('bar', [d.libPubspec('bar', '1.0.0')]).create(); | |
| await d | |
| .appDir( | |
| dependencies: { | |
| 'foo': { | |
| 'git': | |
| p | |
| .toUri(p.absolute(d.sandbox, appPath, '../foo.git')) | |
| .toString(), | |
| }, | |
| }, | |
| ) | |
| .create(); | |
| await pubGet( | |
| exitCode: DATA, | |
| error: contains( | |
| 'Invalid description in the "foo" pubspec on the "bar" dependency: ' | |
| 'the path "../bar" cannot refer outside the git repository', | |
| ), | |
| ); | |
| }); | |
| } |