-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsdk-manager-parser.ts
88 lines (77 loc) · 2.79 KB
/
sdk-manager-parser.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
import * as core from "@actions/core";
import { splitByEOL } from "./utils";
export interface AndroidPackageInfo {
name: string;
localVersion: string;
remoteVersion: string;
description: string;
installed: boolean;
update: boolean;
}
export type ParserState = "InstalledPackages" | "AvailablePackages" | "AvailableUpdates" | "None";
export const getNewState = (line: string): ParserState | null => {
if (!/^[\w ]+:$/.test(line)) {
return null;
}
switch(line) {
case "Installed packages:": return "InstalledPackages";
case "Available Packages:": return "AvailablePackages";
case "Available Updates:": return "AvailableUpdates";
default:
if (core.isDebug()) { core.debug(`Unknown state '${line}'`); }
return "None";
}
};
export const parseSDKManagerOutput = (stdout: string): AndroidPackageInfo[] => {
const result: AndroidPackageInfo[] = [];
let state: ParserState = "None";
const pushPackage = (packet: Partial<AndroidPackageInfo> & Pick<AndroidPackageInfo, "name">): void => {
const defaultPackage: AndroidPackageInfo = { name: packet.name, description: "", localVersion: "", remoteVersion: "", installed: false, update: false };
const packageIndex = result.findIndex(p => p.name === packet.name);
if (packageIndex >= 0) {
result[packageIndex] = { ...result[packageIndex], ...packet };
} else {
result.push({...defaultPackage, ...packet });
}
};
const lines = splitByEOL(stdout);
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
const line = lines[lineIndex].trim();
if (line.length === 0) {
state = "None";
continue;
}
const nextState = getNewState(line);
if (nextState) {
state = nextState;
// Skip the next 2 lines: table header and table header delimeter
lineIndex += 2;
continue;
}
const cols = line.split("|").map(s => s.trim()).filter(Boolean);
if (state === "InstalledPackages") {
pushPackage({
name: cols[0],
localVersion: cols[1],
description: cols[2],
installed: true
});
}
if (state === "AvailablePackages") {
pushPackage({
name: cols[0],
remoteVersion: cols[1],
description: cols[2]
});
} else if (state === "AvailableUpdates") {
pushPackage({
name: cols[0],
localVersion: cols[1],
remoteVersion: cols[2],
installed: true,
update: true
});
}
}
return result.sort((p1, p2) => p1.name.localeCompare(p2.name));
};