filefive
Version:
SFTP/FTP/Amazon S3 client and dual-panel file manager for macOS and Linux
89 lines (88 loc) • 3.66 kB
JavaScript
;
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;
}