123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 'use strict'
- const normalize = require('normalize-path')
- const debugLog = require('debug')('lint-staged:resolveGitRepo')
- const fs = require('fs')
- const path = require('path')
- const { promisify } = require('util')
- const execGit = require('./execGit')
- const { readFile } = require('./file')
- const fsLstat = promisify(fs.lstat)
- /**
- * Resolve path to the .git directory, with special handling for
- * submodules and worktrees
- */
- const resolveGitConfigDir = async (gitDir) => {
- const defaultDir = normalize(path.join(gitDir, '.git'))
- const stats = await fsLstat(defaultDir)
- // If .git is a directory, use it
- if (stats.isDirectory()) return defaultDir
- // Otherwise .git is a file containing path to real location
- const file = (await readFile(defaultDir)).toString()
- return path.resolve(gitDir, file.replace(/^gitdir: /, '')).trim()
- }
- /**
- * Resolve git directory and possible submodule paths
- */
- const resolveGitRepo = async (cwd) => {
- try {
- debugLog('Resolving git repo from `%s`', cwd)
- // Unset GIT_DIR before running any git operations in case it's pointing to an incorrect location
- debugLog('Unset GIT_DIR (was `%s`)', process.env.GIT_DIR)
- delete process.env.GIT_DIR
- debugLog('Unset GIT_WORK_TREE (was `%s`)', process.env.GIT_WORK_TREE)
- delete process.env.GIT_WORK_TREE
- const gitDir = normalize(await execGit(['rev-parse', '--show-toplevel'], { cwd }))
- const gitConfigDir = normalize(await resolveGitConfigDir(gitDir))
- debugLog('Resolved git directory to be `%s`', gitDir)
- debugLog('Resolved git config directory to be `%s`', gitConfigDir)
- return { gitDir, gitConfigDir }
- } catch (error) {
- debugLog('Failed to resolve git repo with error:', error)
- return { error, gitDir: null, gitConfigDir: null }
- }
- }
- module.exports = resolveGitRepo
|