UNPKG

filefive

Version:

SFTP/FTP/Amazon S3 client and dual-panel file manager for macOS and Linux

89 lines (88 loc) 3.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = default_1; const node_util_1 = require("node:util"); const node_child_process_1 = require("node:child_process"); const node_path_1 = require("node:path"); const types_1 = require("../types"); const ramda_1 = require("ramda"); async function default_1(path, files) { const run = (0, node_util_1.promisify)(node_child_process_1.execFile); try { let { stdout: repoRoot } = await run('git', ['rev-parse', '--show-toplevel'], { cwd: path }); repoRoot = repoRoot.trim(); const { stdout: statuses } = await run('git', ['status', '-z', '.'], { cwd: path }); const [inRoot, inSubfolders] = (0, ramda_1.partition)(([p]) => (0, node_path_1.dirname)(p) == path, statuses .replace(/\0$/, '') .split('\0') .map(s => [(0, node_path_1.join)(repoRoot, s.substring(3)), s.substring(0, 2)]) .map(([path, status]) => [path.replace(/\/$/, ''), status])); if (inSubfolders.length == 1 && inSubfolders[0][0] == path && inSubfolders[0][1].includes('?')) { files.forEach(f => { const status = f.dir ? GitStatus.Contains : GitStatus.Untracked; f[types_1.FileAttrsAttr][status] = statusNames[status]; }); } else { const topDir = new RegExp('^([^/]+)'); [...inRoot .map(([path, s]) => [path, getStatusCode(s)]) .filter(([, status]) => status), ...[...new Set(inSubfolders.map(([p]) => topDir.exec(p.substring(path.length + 1))?.[1]).filter(s => s))].map(dir => [(0, node_path_1.join)(path, dir), GitStatus.Contains]) ].forEach(([path, status]) => { const f = files.find(f => f.path == path); if (f) { if (f.dir) { status = GitStatus.Contains; } f[types_1.FileAttrsAttr][status] = status ? (statusNames[status] ?? '') : ''; } }); } const { stdout: ignored } = await run('git', ['ls-files', '--others', '--ignored', '--exclude-standard', '--directory', '-z'], { cwd: path }); if (ignored == './\0') { files.forEach(f => f[types_1.FileAttrsAttr][GitStatus.Ignored] = statusNames[GitStatus.Ignored]); } else { ignored .replace(/\0$/, '') .split('\0') .map(s => (0, node_path_1.join)(path, s.replace(/\/$/, ''))) .forEach(path => { const f = files.find(f => f.path == path); f && (f[types_1.FileAttrsAttr][GitStatus.Ignored] = statusNames[GitStatus.Ignored]); }); } } catch { // either path is not in git repo or no git installed } return files; } var GitStatus; (function (GitStatus) { GitStatus["Untracked"] = "git_u"; GitStatus["Modified"] = "git_m"; GitStatus["Added"] = "git_a"; GitStatus["Contains"] = "git_c"; GitStatus["Ignored"] = "git_i"; })(GitStatus || (GitStatus = {})); const statusNames = { [GitStatus.Untracked]: 'Untracked', [GitStatus.Modified]: 'Modified', [GitStatus.Added]: 'Index Added', [GitStatus.Contains]: 'Has uncommited items', [GitStatus.Ignored]: 'Ignored' }; function getStatusCode(s) { if (s.includes('?')) { return GitStatus.Untracked; } else if (s.includes('M')) { return GitStatus.Modified; } else if (s.includes('A')) { return GitStatus.Added; } return null; }