You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					172 lines
				
				5.2 KiB
			
		
		
			
		
	
	
					172 lines
				
				5.2 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const fs = require('fs')
							 | 
						||
| 
								 | 
							
								const path = require('path')
							 | 
						||
| 
								 | 
							
								const mkdirp = require('mkdirp')
							 | 
						||
| 
								 | 
							
								const rimraf = require('rimraf')
							 | 
						||
| 
								 | 
							
								const tempy = require('tempy')
							 | 
						||
| 
								 | 
							
								const installFrom = require('../src/install')
							 | 
						||
| 
								 | 
							
								const uninstallFrom = require('../src/uninstall')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function install(rootDir, dir) {
							 | 
						||
| 
								 | 
							
								  installFrom(path.join(rootDir, dir))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function uninstall(rootDir, dir) {
							 | 
						||
| 
								 | 
							
								  uninstallFrom(path.join(rootDir, dir))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function mkdir(rootDir, dir) {
							 | 
						||
| 
								 | 
							
								  mkdirp.sync(path.join(rootDir, dir))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function writeFile(dir, filePath, data) {
							 | 
						||
| 
								 | 
							
								  fs.writeFileSync(path.join(dir, filePath), data)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function readFile(dir, filePath) {
							 | 
						||
| 
								 | 
							
								  return fs.readFileSync(path.join(dir, filePath), 'utf-8')
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function exists(dir, filePath) {
							 | 
						||
| 
								 | 
							
								  return fs.existsSync(path.join(dir, filePath))
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('yorkie', () => {
							 | 
						||
| 
								 | 
							
								  let dir
							 | 
						||
| 
								 | 
							
								  beforeEach(() => (dir = tempy.directory()))
							 | 
						||
| 
								 | 
							
								  afterEach(() => rimraf.sync(dir))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should support basic layout', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, '/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/hooks/pre-commit')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('#yorkie')
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('cd "."')
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch(`node "./node_modules/yorkie/src/runner.js" pre-commit`)
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('--no-verify')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    const prepareCommitMsg = readFile(dir, '.git/hooks/prepare-commit-msg')
							 | 
						||
| 
								 | 
							
								    expect(prepareCommitMsg).toMatch('cannot be bypassed')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uninstall(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not install git hooks when installed in sub directory', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/package.json', '{}')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-commit')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should support git submodule', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/modules/A/B')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/package.json', '{}')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/.git', 'git: ../../.git/modules/A/B')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/modules/A/B/hooks/pre-commit')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('cd "."')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uninstall(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not install git hooks in submodule sub directory', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/modules/A/B')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'A/B/C/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/C/package.json', '{}')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/.git', 'git: ../../.git/modules/A/B')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'A/B/C/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/modules/A/B/hooks/pre-commit')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should support git worktrees', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/worktrees/B')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/package.json', '{}')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Git path for worktrees is absolute
							 | 
						||
| 
								 | 
							
								    const absolutePath = path.join(dir, '.git/worktrees/B')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'A/B/.git', `git: ${absolutePath}`)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/worktrees/B/hooks/pre-commit')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('cd "."')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uninstall(dir, 'A/B/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-commit')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not modify user hooks', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, '.git/hooks/pre-push', 'foo')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Verify that it's not overwritten
							 | 
						||
| 
								 | 
							
								    install(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/hooks/pre-push')
							 | 
						||
| 
								 | 
							
								    expect(hook).toBe('foo')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    uninstall(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-push')).toBeTruthy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should not install from /node_modules/A/node_modules', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'node_modules/A/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'node_modules/A/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    expect(exists(dir, '.git/hooks/pre-push')).toBeFalsy()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it("should not crash if there's no .git directory", () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    expect(() => install(dir, 'node_modules/yorkie')).not.toThrow()
							 | 
						||
| 
								 | 
							
								    expect(() => uninstall(dir, 'node_modules/yorkie')).not.toThrow()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should migrate existing scripts (ghooks)', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(
							 | 
						||
| 
								 | 
							
								      dir,
							 | 
						||
| 
								 | 
							
								      '.git/hooks/pre-commit',
							 | 
						||
| 
								 | 
							
								      '// Generated by ghooks. Do not edit this file.'
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/hooks/pre-commit')
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('yorkie')
							 | 
						||
| 
								 | 
							
								    expect(hook).not.toMatch('ghooks')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  it('should migrate existing scripts (pre-commit)', () => {
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '.git/hooks')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, 'package.json', '{}')
							 | 
						||
| 
								 | 
							
								    mkdir(dir, '/node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    writeFile(dir, '.git/hooks/pre-commit', './node_modules/pre-commit/hook')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    install(dir, 'node_modules/yorkie')
							 | 
						||
| 
								 | 
							
								    const hook = readFile(dir, '.git/hooks/pre-commit')
							 | 
						||
| 
								 | 
							
								    expect(hook).toMatch('yorkie')
							 | 
						||
| 
								 | 
							
								    expect(hook).not.toMatch('./node_modules/pre-commit/hook')
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 |