* Get both before and after content for a file between two treeishes
(params: GetFilePairParams)
| 1988 | * Get both before and after content for a file between two treeishes |
| 1989 | */ |
| 1990 | async function handleGetFilePair(params: GetFilePairParams): Promise<GetFilePairResponse> { |
| 1991 | const startTime = Date.now() |
| 1992 | logger.info("[Git:getFilePair] Getting file pair", JSON.stringify({ |
| 1993 | workDir: params.workDir, |
| 1994 | from: params.fromTreeish, |
| 1995 | to: params.toTreeish, |
| 1996 | filePath: params.filePath, |
| 1997 | oldPath: params.oldPath, |
| 1998 | })) |
| 1999 | |
| 2000 | try { |
| 2001 | // Fast-reject generated / lock files — their diffs are never useful |
| 2002 | // and computing them freezes the renderer. |
| 2003 | if (isGeneratedFile(params.filePath)) { |
| 2004 | logger.info("[Git:getFilePair] Skipping generated file", JSON.stringify({ filePath: params.filePath })) |
| 2005 | return { before: "", after: "", tooLarge: true } |
| 2006 | } |
| 2007 | |
| 2008 | // Get before content (use oldPath if it's a rename) |
| 2009 | const beforePath = params.oldPath || params.filePath |
| 2010 | const beforeResult = await handleGetFileAtTreeish({ |
| 2011 | workDir: params.workDir, |
| 2012 | treeish: params.fromTreeish, |
| 2013 | filePath: beforePath, |
| 2014 | }) |
| 2015 | |
| 2016 | // Get after content - read from working tree (filesystem) not from git |
| 2017 | // This ensures we get uncommitted changes |
| 2018 | let afterContent = "" |
| 2019 | let afterTooLarge = false |
| 2020 | const fullPath = path.join(params.workDir, params.filePath) |
| 2021 | |
| 2022 | if (fs.existsSync(fullPath)) { |
| 2023 | const stats = fs.statSync(fullPath) |
| 2024 | if (stats.size > MAX_FILE_SIZE_FOR_DIFF) { |
| 2025 | afterTooLarge = true |
| 2026 | logger.info("[Git:getFilePair] After file too large", JSON.stringify({ |
| 2027 | filePath: params.filePath, |
| 2028 | size: stats.size, |
| 2029 | })) |
| 2030 | } else { |
| 2031 | afterContent = fs.readFileSync(fullPath, "utf8") |
| 2032 | } |
| 2033 | } |
| 2034 | |
| 2035 | // If either file is too large, return tooLarge flag |
| 2036 | if (beforeResult.tooLarge || afterTooLarge) { |
| 2037 | logger.info("[Git:getFilePair] File too large for diff", JSON.stringify({ |
| 2038 | filePath: params.filePath, |
| 2039 | beforeTooLarge: beforeResult.tooLarge, |
| 2040 | afterTooLarge, |
| 2041 | })) |
| 2042 | return { |
| 2043 | before: "", |
| 2044 | after: "", |
| 2045 | tooLarge: true, |
| 2046 | } |
| 2047 | } |
no test coverage detected