123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- const path = require('path');
- const fs = require('fs-plus');
- const temp = require('temp').track();
- const { Directory } = require('pathwatcher');
- const GitRepository = require('../src/git-repository');
- const GitRepositoryProvider = require('../src/git-repository-provider');
- describe('GitRepositoryProvider', () => {
- let provider;
- beforeEach(() => {
- provider = new GitRepositoryProvider(
- atom.project,
- atom.config,
- atom.confirm
- );
- });
- afterEach(() => {
- if (provider) {
- Object.keys(provider.pathToRepository).forEach(key => {
- provider.pathToRepository[key].destroy();
- });
- }
- });
- describe('.repositoryForDirectory(directory)', () => {
- describe('when specified a Directory with a Git repository', () => {
- it('resolves with a GitRepository', async () => {
- const directory = new Directory(
- path.join(__dirname, 'fixtures', 'git', 'master.git')
- );
- const result = await provider.repositoryForDirectory(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- // Refresh should be started
- await new Promise(resolve => result.onDidChangeStatuses(resolve));
- });
- it('resolves with the same GitRepository for different Directory objects in the same repo', async () => {
- const firstRepo = await provider.repositoryForDirectory(
- new Directory(path.join(__dirname, 'fixtures', 'git', 'master.git'))
- );
- const secondRepo = await provider.repositoryForDirectory(
- new Directory(
- path.join(__dirname, 'fixtures', 'git', 'master.git', 'objects')
- )
- );
- expect(firstRepo).toBeInstanceOf(GitRepository);
- expect(firstRepo).toBe(secondRepo);
- });
- });
- describe('when specified a Directory without a Git repository', () => {
- it('resolves with null', async () => {
- const directory = new Directory(temp.mkdirSync('dir'));
- const repo = await provider.repositoryForDirectory(directory);
- expect(repo).toBe(null);
- });
- });
- describe('when specified a Directory with an invalid Git repository', () => {
- it('resolves with null', async () => {
- const dirPath = temp.mkdirSync('dir');
- fs.writeFileSync(path.join(dirPath, '.git', 'objects'), '');
- fs.writeFileSync(path.join(dirPath, '.git', 'HEAD'), '');
- fs.writeFileSync(path.join(dirPath, '.git', 'refs'), '');
- const directory = new Directory(dirPath);
- const repo = await provider.repositoryForDirectory(directory);
- expect(repo).toBe(null);
- });
- });
- describe('when specified a Directory with a valid gitfile-linked repository', () => {
- it('returns a Promise that resolves to a GitRepository', async () => {
- const gitDirPath = path.join(
- __dirname,
- 'fixtures',
- 'git',
- 'master.git'
- );
- const workDirPath = temp.mkdirSync('git-workdir');
- fs.writeFileSync(
- path.join(workDirPath, '.git'),
- `gitdir: ${gitDirPath}\n`
- );
- const directory = new Directory(workDirPath);
- const result = await provider.repositoryForDirectory(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- });
- });
- describe('when specified a Directory with a commondir file for a worktree', () => {
- it('returns a Promise that resolves to a GitRepository', async () => {
- const directory = new Directory(
- path.join(
- __dirname,
- 'fixtures',
- 'git',
- 'master.git',
- 'worktrees',
- 'worktree-dir'
- )
- );
- const result = await provider.repositoryForDirectory(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- });
- });
- describe('when specified a Directory without exists()', () => {
- let directory;
- beforeEach(() => {
- // An implementation of Directory that does not implement existsSync().
- const subdirectory = {};
- directory = {
- getSubdirectory() {},
- isRoot() {
- return true;
- }
- };
- spyOn(directory, 'getSubdirectory').andReturn(subdirectory);
- });
- it('returns a Promise that resolves to null', async () => {
- const repo = await provider.repositoryForDirectory(directory);
- expect(repo).toBe(null);
- expect(directory.getSubdirectory).toHaveBeenCalledWith('.git');
- });
- });
- });
- describe('.repositoryForDirectorySync(directory)', () => {
- describe('when specified a Directory with a Git repository', () => {
- it('resolves with a GitRepository', async () => {
- const directory = new Directory(
- path.join(__dirname, 'fixtures', 'git', 'master.git')
- );
- const result = provider.repositoryForDirectorySync(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- // Refresh should be started
- await new Promise(resolve => result.onDidChangeStatuses(resolve));
- });
- it('resolves with the same GitRepository for different Directory objects in the same repo', () => {
- const firstRepo = provider.repositoryForDirectorySync(
- new Directory(path.join(__dirname, 'fixtures', 'git', 'master.git'))
- );
- const secondRepo = provider.repositoryForDirectorySync(
- new Directory(
- path.join(__dirname, 'fixtures', 'git', 'master.git', 'objects')
- )
- );
- expect(firstRepo).toBeInstanceOf(GitRepository);
- expect(firstRepo).toBe(secondRepo);
- });
- });
- describe('when specified a Directory without a Git repository', () => {
- it('resolves with null', () => {
- const directory = new Directory(temp.mkdirSync('dir'));
- const repo = provider.repositoryForDirectorySync(directory);
- expect(repo).toBe(null);
- });
- });
- describe('when specified a Directory with an invalid Git repository', () => {
- it('resolves with null', () => {
- const dirPath = temp.mkdirSync('dir');
- fs.writeFileSync(path.join(dirPath, '.git', 'objects'), '');
- fs.writeFileSync(path.join(dirPath, '.git', 'HEAD'), '');
- fs.writeFileSync(path.join(dirPath, '.git', 'refs'), '');
- const directory = new Directory(dirPath);
- const repo = provider.repositoryForDirectorySync(directory);
- expect(repo).toBe(null);
- });
- });
- describe('when specified a Directory with a valid gitfile-linked repository', () => {
- it('returns a Promise that resolves to a GitRepository', () => {
- const gitDirPath = path.join(
- __dirname,
- 'fixtures',
- 'git',
- 'master.git'
- );
- const workDirPath = temp.mkdirSync('git-workdir');
- fs.writeFileSync(
- path.join(workDirPath, '.git'),
- `gitdir: ${gitDirPath}\n`
- );
- const directory = new Directory(workDirPath);
- const result = provider.repositoryForDirectorySync(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- });
- });
- describe('when specified a Directory with a commondir file for a worktree', () => {
- it('returns a Promise that resolves to a GitRepository', () => {
- const directory = new Directory(
- path.join(
- __dirname,
- 'fixtures',
- 'git',
- 'master.git',
- 'worktrees',
- 'worktree-dir'
- )
- );
- const result = provider.repositoryForDirectorySync(directory);
- expect(result).toBeInstanceOf(GitRepository);
- expect(provider.pathToRepository[result.getPath()]).toBeTruthy();
- expect(result.getType()).toBe('git');
- });
- });
- describe('when specified a Directory without existsSync()', () => {
- let directory;
- beforeEach(() => {
- // An implementation of Directory that does not implement existsSync().
- const subdirectory = {};
- directory = {
- getSubdirectory() {},
- isRoot() {
- return true;
- }
- };
- spyOn(directory, 'getSubdirectory').andReturn(subdirectory);
- });
- it('returns null', () => {
- const repo = provider.repositoryForDirectorySync(directory);
- expect(repo).toBe(null);
- expect(directory.getSubdirectory).toHaveBeenCalledWith('.git');
- });
- });
- });
- });
|