/
extract.ts
106 lines (88 loc) · 2.64 KB
/
extract.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import { minimatch } from 'minimatch';
import upath from 'upath';
import { logger } from '../../../logger';
import { readLocalDirectory } from '../../../util/fs';
import { regEx } from '../../../util/regex';
import { HermitDatasource } from '../../datasource/hermit';
import type { PackageDependency, PackageFileContent } from '../types';
import type { HermitListItem } from './types';
const pkgReferenceRegex = regEx(`(?<packageName>.*?)-(?<version>[0-9]{1}.*)`);
/**
* extractPackageFile scans the folder of the package files
* and looking for .{packageName}-{version}.pkg
*/
export async function extractPackageFile(
content: string,
filename: string
): Promise<PackageFileContent | null> {
logger.trace('hermit.extractPackageFile()');
const dependencies = [] as PackageDependency[];
const packages = await listHermitPackages(filename);
if (!packages?.length) {
return null;
}
for (const p of packages) {
// version of a hermit package is either a Version or a Channel
// Channel will prepend with @ to distinguish from normal version
const version = p.Version === '' ? `@${p.Channel}` : p.Version;
const dep: PackageDependency = {
datasource: HermitDatasource.id,
depName: p.Name,
currentValue: version,
};
dependencies.push(dep);
}
return { deps: dependencies };
}
/**
* listHermitPackages will fetch all installed packages from the bin folder
*/
async function listHermitPackages(
hermitFile: string
): Promise<HermitListItem[] | null> {
logger.trace('hermit.listHermitPackages()');
const hermitFolder = upath.dirname(hermitFile);
let files: string[] = [];
try {
files = await readLocalDirectory(hermitFolder);
} catch (e) {
logger.debug(
{ hermitFolder, err: e },
'error listing hermit package references'
);
return null;
}
logger.trace({ files, hermitFolder }, 'files for hermit package list');
const out = [] as HermitListItem[];
for (const f of files) {
if (!minimatch(f, '.*.pkg')) {
continue;
}
const fileName = f
.replace(`${hermitFolder}/`, '')
.substring(1)
.replace(/\.pkg$/, '');
const channelParts = fileName.split('@');
if (channelParts.length > 1) {
out.push({
Name: channelParts[0],
Channel: channelParts[1],
Version: '',
});
}
const groups = pkgReferenceRegex.exec(fileName)?.groups;
if (!groups) {
logger.debug(
{ fileName },
'invalid hermit package reference file name found'
);
continue;
}
out.push({
Name: groups.packageName,
Version: groups.version,
Channel: '',
});
}
return out;
}