mirror of
https://github.com/HeyPuter/puter
synced 2024-11-14 22:06:00 +00:00
dev: add file walker
This commit is contained in:
parent
d3a9ba847a
commit
47f76ccc89
@ -32,7 +32,8 @@
|
|||||||
"check-translations": "node tools/check-translations.js"
|
"check-translations": "node tools/check-translations.js"
|
||||||
},
|
},
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"src/*"
|
"src/*",
|
||||||
|
"tools/*"
|
||||||
],
|
],
|
||||||
"nodemonConfig": {
|
"nodemonConfig": {
|
||||||
"ext": "js, json, mjs, jsx, svg, css",
|
"ext": "js, json, mjs, jsx, svg, css",
|
||||||
|
15
tools/file-walker/package.json
Normal file
15
tools/file-walker/package.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "file-walker",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "test.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": "",
|
||||||
|
"license": "AGPL-3.0-only",
|
||||||
|
"dependencies": {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
181
tools/file-walker/test.js
Normal file
181
tools/file-walker/test.js
Normal file
@ -0,0 +1,181 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const fsp = fs.promises;
|
||||||
|
const path_ = require('path');
|
||||||
|
|
||||||
|
const hl_readdir = async path => {
|
||||||
|
const names = await fs.promises.readdir(path);
|
||||||
|
const entries = [];
|
||||||
|
|
||||||
|
for ( const name of names ) {
|
||||||
|
// wet: copied from phoenix shell
|
||||||
|
const stat_path = path_.join(path, name);
|
||||||
|
const stat = await fs.promises.lstat(stat_path);
|
||||||
|
entries.push({
|
||||||
|
name,
|
||||||
|
is_dir: stat.isDirectory(),
|
||||||
|
is_symlink: stat.isSymbolicLink(),
|
||||||
|
symlink_path: stat.isSymbolicLink() ? await fs.promises.readlink(stat_path) : null,
|
||||||
|
size: stat.size,
|
||||||
|
modified: stat.mtimeMs / 1000,
|
||||||
|
created: stat.ctimeMs / 1000,
|
||||||
|
accessed: stat.atimeMs / 1000,
|
||||||
|
mode: stat.mode,
|
||||||
|
uid: stat.uid,
|
||||||
|
gid: stat.gid,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
};
|
||||||
|
|
||||||
|
const walk = async function* walk (options, root_path, components = []) {
|
||||||
|
const current_path = path_.join(root_path, ...components);
|
||||||
|
const entries = await hl_readdir(current_path);
|
||||||
|
outer:
|
||||||
|
for ( const entry of entries ) {
|
||||||
|
entry.dirpath = current_path;
|
||||||
|
entry.path = path_.join(current_path, entry.name);
|
||||||
|
|
||||||
|
// TODO: labelled break?
|
||||||
|
for ( const exclude_regex of (options.excludes ?? []) ) {
|
||||||
|
if ( exclude_regex.test(entry.path) ) {
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! options.pre_order ) yield entry;
|
||||||
|
if ( entry.is_dir ) {
|
||||||
|
yield* walk(options, root_path, [...components, entry.name]);
|
||||||
|
}
|
||||||
|
if ( options.pre_order ) yield entry;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const modes = {
|
||||||
|
primary_source_files: {
|
||||||
|
excludes: [
|
||||||
|
]
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const util = require('util');
|
||||||
|
const exec = util.promisify(require('child_process').exec);
|
||||||
|
|
||||||
|
async function git_blame(path) {
|
||||||
|
const abs_path = path_.resolve(path);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const { stdout } = await exec(`git blame -f "${abs_path}"`, {
|
||||||
|
maxBuffer: 1024 * 1024
|
||||||
|
});
|
||||||
|
|
||||||
|
const blameLines = stdout.split('\n');
|
||||||
|
const parsedBlame = blameLines
|
||||||
|
.map(line => {
|
||||||
|
if (!line.trim()) return null;
|
||||||
|
|
||||||
|
// console.log(line);
|
||||||
|
const parts = line.split(/\s+/);
|
||||||
|
let [commitHash, path, author, timestamp, lineNumber, , ,] = parts;
|
||||||
|
author = author.slice(1);
|
||||||
|
|
||||||
|
const o = {
|
||||||
|
commitHash,
|
||||||
|
author,
|
||||||
|
timestamp,
|
||||||
|
lineNumber: parseInt(lineNumber, 10),
|
||||||
|
};
|
||||||
|
return o;
|
||||||
|
})
|
||||||
|
.filter(item => item !== null)
|
||||||
|
;
|
||||||
|
|
||||||
|
return parsedBlame;
|
||||||
|
} catch (error) {
|
||||||
|
console.log('AZXV')
|
||||||
|
throw new Error(`Error executing git blame: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Example usage
|
||||||
|
const blame = async (path) => {
|
||||||
|
try {
|
||||||
|
const result = await git_blame(path);
|
||||||
|
// console.log('result?', result)
|
||||||
|
return result;
|
||||||
|
} catch ( e ) {
|
||||||
|
console.log('SKIPPED: ' + e.message);
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
const walk_test = async () => {
|
||||||
|
// console.log(await hl_readdir('.'));
|
||||||
|
for await ( const value of walk({
|
||||||
|
excludes: [
|
||||||
|
/^\.git/,
|
||||||
|
/^volatile\//,
|
||||||
|
/^node_modules\//,
|
||||||
|
/\/node_modules$/,
|
||||||
|
/^node_modules$/,
|
||||||
|
/package-lock\.json/,
|
||||||
|
/^src\/gui\/dist/,
|
||||||
|
]
|
||||||
|
}, '.') ) {
|
||||||
|
if ( ! value.is_dir ) continue;
|
||||||
|
console.log('value', value.path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const authors = {};
|
||||||
|
|
||||||
|
const blame_test = async () => {
|
||||||
|
// const results = await blame('src/backend/src/services/HostDiskUsageService.js');
|
||||||
|
// const results = await blame('package.json');
|
||||||
|
console.log('results', results)
|
||||||
|
return;
|
||||||
|
for ( const result of results ) {
|
||||||
|
if ( ! authors[result.author] ) {
|
||||||
|
authors[result.author] = { lines: 0 };
|
||||||
|
}
|
||||||
|
authors[result.author].lines++;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('AUTHORS', authors);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Contribution count function to test file walking and
|
||||||
|
git blame parsing.
|
||||||
|
*/
|
||||||
|
const walk_and_blame = async () => {
|
||||||
|
// console.log(await hl_readdir('.'));
|
||||||
|
for await ( const value of walk({
|
||||||
|
excludes: [
|
||||||
|
/^\.git/,
|
||||||
|
/^volatile\//,
|
||||||
|
/^node_modules\//,
|
||||||
|
/\/node_modules$/,
|
||||||
|
/^node_modules$/,
|
||||||
|
/package-lock\.json/,
|
||||||
|
/src\/backend\/src\/public\/assets/,
|
||||||
|
/^src\/gui\/src\/lib/
|
||||||
|
]
|
||||||
|
}, '.') ) {
|
||||||
|
if ( value.is_dir ) continue;
|
||||||
|
console.log('value', value.path);
|
||||||
|
const results = await blame(value.path);
|
||||||
|
for ( const result of results ) {
|
||||||
|
if ( ! authors[result.author] ) {
|
||||||
|
authors[result.author] = { lines: 0 };
|
||||||
|
}
|
||||||
|
authors[result.author].lines++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log('AUTHORS', authors);
|
||||||
|
}
|
||||||
|
|
||||||
|
const main = walk_and_blame;
|
||||||
|
|
||||||
|
main();
|
Loading…
Reference in New Issue
Block a user