add command for making "BUILD_ID to AOSP tag" map
This commit is contained in:
parent
dcc8339fd7
commit
3bf5977e81
4 changed files with 234 additions and 0 deletions
72
config/build-index/build-id-to-tag.yml
Normal file
72
config/build-index/build-id-to-tag.yml
Normal file
|
@ -0,0 +1,72 @@
|
|||
TP1A.220624.014: android-13.0.0_r1
|
||||
TP1A.220624.021: android-13.0.0_r2
|
||||
TP1A.220624.021.A1: android-13.0.0_r3
|
||||
TP1A.220905.004: android-13.0.0_r4
|
||||
TP1A.220905.004.A1: android-13.0.0_r5
|
||||
TP1A.220905.004.A2: android-13.0.0_r6
|
||||
TP1A.221005.002: android-13.0.0_r7
|
||||
TP1A.221005.003: android-13.0.0_r8
|
||||
TD1A.220804.009.A2: android-13.0.0_r9
|
||||
TD1A.220804.009.A5: android-13.0.0_r10
|
||||
TD1A.220804.031: android-13.0.0_r11
|
||||
TP1A.221105.002: android-13.0.0_r12
|
||||
TD1A.221105.001: android-13.0.0_r13
|
||||
TD1A.221105.003: android-13.0.0_r14
|
||||
TD1A.221105.001.A1: android-13.0.0_r15
|
||||
TQ1A.221205.011: android-13.0.0_r16
|
||||
TQ1A.221205.011.B1: android-13.0.0_r17
|
||||
TQ1A.221205.012: android-13.0.0_r18
|
||||
TQ1A.230105.001: android-13.0.0_r19
|
||||
TQ1A.230105.001.A2: android-13.0.0_r20
|
||||
TQ1A.230105.001.A3: android-13.0.0_r21
|
||||
TQ1A.230105.001.B1: android-13.0.0_r22
|
||||
TQ1A.230105.002: android-13.0.0_r23
|
||||
TQ1A.230105.002.A1: android-13.0.0_r24
|
||||
TQ1A.230205.001.A2: android-13.0.0_r27
|
||||
TQ1A.230205.001.B2: android-13.0.0_r28
|
||||
TQ1A.230205.001.D2: android-13.0.0_r29
|
||||
TQ1A.230205.002: android-13.0.0_r30
|
||||
TP1A.221005.002.B2: android-13.0.0_r31
|
||||
TQ2A.230305.008: android-13.0.0_r32
|
||||
TQ2A.230305.008.A1: android-13.0.0_r33
|
||||
TQ2A.230305.008.A3: android-13.0.0_r34
|
||||
TQ2A.230305.008.C1: android-13.0.0_r35
|
||||
TQ2A.230305.008.E1: android-13.0.0_r36
|
||||
TQ2A.230305.008.F1: android-13.0.0_r37
|
||||
TQ2A.230405.003: android-13.0.0_r38
|
||||
TQ2A.230405.003.A2: android-13.0.0_r39
|
||||
TQ2A.230405.003.B2: android-13.0.0_r40
|
||||
TQ2A.230405.003.E1: android-13.0.0_r41
|
||||
TQ2A.230405.003.G1: android-13.0.0_r42
|
||||
TQ2A.230505.002: android-13.0.0_r43
|
||||
TQ2A.230505.002.A1: android-13.0.0_r44
|
||||
TQ2A.230505.002.G1: android-13.0.0_r45
|
||||
TD4A.221205.042: android-13.0.0_r46
|
||||
TD4A.221205.042.A1: android-13.0.0_r47
|
||||
TD4A.221205.042.B1: android-13.0.0_r48
|
||||
TQ2B.230505.005.A1: android-13.0.0_r49
|
||||
TQ3A.230605.010: android-13.0.0_r50
|
||||
TQ3A.230605.011: android-13.0.0_r51
|
||||
TQ3A.230605.012: android-13.0.0_r52
|
||||
TQ3A.230605.010.A1: android-13.0.0_r53
|
||||
TQ3A.230605.012.A1: android-13.0.0_r54
|
||||
TD2A.230203.028: android-13.0.0_r55
|
||||
TQ3A.230605.009.A1: android-13.0.0_r56
|
||||
TD3A.230203.070.A1: android-13.0.0_r57
|
||||
TQ3C.230605.010.C1: android-13.0.0_r58
|
||||
TQ3C.230605.010.C2: android-13.0.0_r59
|
||||
TQ3C.230605.010.D1: android-13.0.0_r60
|
||||
TQ3A.230705.001: android-13.0.0_r61
|
||||
TQ3A.230705.001.A1: android-13.0.0_r62
|
||||
TQ3A.230705.001.B4: android-13.0.0_r63
|
||||
TQ3C.230705.001.B1: android-13.0.0_r64
|
||||
TQ3C.230705.001.C1: android-13.0.0_r65
|
||||
TQ3C.230705.001.C2: android-13.0.0_r66
|
||||
TQ3A.230805.001: android-13.0.0_r67
|
||||
TQ3A.230805.001.A1: android-13.0.0_r68
|
||||
TQ3A.230805.001.A2: android-13.0.0_r69
|
||||
TQ3A.230805.001.A3: android-13.0.0_r70
|
||||
TQ3A.230805.001.B1: android-13.0.0_r71
|
||||
TQ3C.230805.001.A3: android-13.0.0_r72
|
||||
TQ3C.230805.001.A4: android-13.0.0_r73
|
||||
TQ3C.230805.001.B2: android-13.0.0_r74
|
121
src/commands/update-aosp-tag-index.ts
Normal file
121
src/commands/update-aosp-tag-index.ts
Normal file
|
@ -0,0 +1,121 @@
|
|||
import { Command, flags } from '@oclif/command'
|
||||
import assert from 'assert'
|
||||
import { writeFileSync } from 'fs'
|
||||
import YAML from 'yaml'
|
||||
|
||||
import { ADEVTOOL_DIR, BUILD_ID_TO_TAG_FILE } from '../config/paths'
|
||||
import { showGitDiff } from '../util/cli'
|
||||
import { readFile } from '../util/fs'
|
||||
import { GitLsRemote } from '../util/git'
|
||||
import { yamlStringifyNoFold } from '../util/yaml'
|
||||
|
||||
type BuildIdToTag = Map<string, string>
|
||||
|
||||
export async function loadBuildIdToTagMap(): Promise<BuildIdToTag | null> {
|
||||
try {
|
||||
let file = await readFile(BUILD_ID_TO_TAG_FILE)
|
||||
return YAML.parse(file, { mapAsMap: true }) as BuildIdToTag
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
export default class UpdateAospTagIndex extends Command {
|
||||
static description = `update buildId-to-tag map in ${BUILD_ID_TO_TAG_FILE}`
|
||||
|
||||
static flags = {
|
||||
dryRun: flags.boolean({
|
||||
char: 'n',
|
||||
description: 'skip file update',
|
||||
}),
|
||||
}
|
||||
|
||||
async run() {
|
||||
let { flags } = this.parse(UpdateAospTagIndex)
|
||||
|
||||
// let bases = ['android-vts', 'android-security', 'android', 'android-platform', 'android-cts']
|
||||
let bases = ['android']
|
||||
// let versions = ['11.0.0', '12.0.0', '12.1.0', '13.0.0']
|
||||
let versions = ['13.0.0', '14.0.0']
|
||||
|
||||
let prefixes: string[] = []
|
||||
bases.forEach(base =>
|
||||
versions.forEach(version => {
|
||||
if (base === 'android-cts' || base === 'android-vts') {
|
||||
version = version.slice(0, -2)
|
||||
}
|
||||
prefixes.push(`${base}-${version}_r`)
|
||||
}),
|
||||
)
|
||||
|
||||
let map = (await loadBuildIdToTagMap()) ?? new Map<string, string>()
|
||||
let lsRemote = await GitLsRemote.get('https://github.com/aosp-mirror/platform_build')
|
||||
|
||||
let knownTags = new Set(map.values())
|
||||
let requests = new Map<string, Promise<Response>>()
|
||||
|
||||
for (let tagName of lsRemote.tags.keys()) {
|
||||
if (knownTags.has(tagName)) {
|
||||
continue
|
||||
}
|
||||
|
||||
if (prefixes.find(p => tagName.startsWith(p)) === undefined) {
|
||||
continue
|
||||
}
|
||||
|
||||
let url = `https://raw.githubusercontent.com/aosp-mirror/platform_build/${tagName}/core/build_id.mk`
|
||||
requests.set(tagName, fetch(url))
|
||||
}
|
||||
|
||||
let numNewTags = 0
|
||||
|
||||
for (let [tagName, responsePromise] of requests.entries()) {
|
||||
let resp = await responsePromise
|
||||
assert(resp.ok, tagName)
|
||||
|
||||
let build_id_mk = await resp.text()
|
||||
let buildIdPrefix = 'BUILD_ID='
|
||||
let line = build_id_mk.split('\n').find(s => s.startsWith(buildIdPrefix))
|
||||
assert(line !== undefined, 'missing BUILD_ID line in:\n' + build_id_mk)
|
||||
let build_id = line.substring(buildIdPrefix.length).trim()
|
||||
|
||||
this.log(tagName + ': ' + build_id)
|
||||
map.set(build_id, tagName)
|
||||
++numNewTags
|
||||
}
|
||||
|
||||
if (!flags.dryRun && numNewTags > 0) {
|
||||
let entries = Array.from(map.entries())
|
||||
.sort(([_k1, tag1], [_k2, tag2]) => compareTags(tag1, tag2))
|
||||
|
||||
writeFileSync(BUILD_ID_TO_TAG_FILE, yamlStringifyNoFold(new Map(entries)))
|
||||
}
|
||||
|
||||
if (numNewTags === 0) {
|
||||
this.log('No new tags')
|
||||
process.exit(1)
|
||||
}
|
||||
|
||||
showGitDiff(ADEVTOOL_DIR, BUILD_ID_TO_TAG_FILE)
|
||||
}
|
||||
}
|
||||
|
||||
function getTagRevision(tag: string) {
|
||||
let idx = tag.lastIndexOf('_r')
|
||||
assert(idx > 0, tag)
|
||||
return parseInt(tag.substring(idx + 2))
|
||||
}
|
||||
|
||||
function getTagBase(tag: string) {
|
||||
let idx = tag.lastIndexOf('_r')
|
||||
assert(idx > 0, tag)
|
||||
return tag.slice(0, idx)
|
||||
}
|
||||
|
||||
function compareTags(a: string, b: string) {
|
||||
let res = getTagBase(a).localeCompare(getTagBase(b))
|
||||
if (res == 0) {
|
||||
res = getTagRevision(a) - getTagRevision(b)
|
||||
}
|
||||
return res
|
||||
}
|
|
@ -21,3 +21,5 @@ export const BUILD_INDEX_FILE = path.join(BUILD_INDEX_DIR, 'build-index.yml')
|
|||
export const MAIN_BUILD_INDEX_PART = path.join(BUILD_INDEX_DIR, 'build-index-main.yml')
|
||||
|
||||
export const IMAGE_DOWNLOAD_DIR = process.env['ADEVTOOL_IMG_DOWNLOAD_DIR'] ?? path.join(ADEVTOOL_DIR, 'dl')
|
||||
|
||||
export const BUILD_ID_TO_TAG_FILE = path.join(BUILD_INDEX_DIR, 'build-id-to-tag.yml')
|
||||
|
|
39
src/util/git.ts
Normal file
39
src/util/git.ts
Normal file
|
@ -0,0 +1,39 @@
|
|||
import assert from 'assert'
|
||||
import { spawnAsync } from './process'
|
||||
|
||||
export class GitLsRemote {
|
||||
tags = new Map<string, string>()
|
||||
branches = new Map<string, string>()
|
||||
|
||||
static async get(repoUrl: string) {
|
||||
let lsRemote = await spawnAsync('git', ['ls-remote', '--tags', '--heads', repoUrl])
|
||||
|
||||
let result = new GitLsRemote()
|
||||
|
||||
const tagPrefix = 'refs/tags/'
|
||||
const tagSuffix = '^{}'
|
||||
const branchPrefix = 'refs/heads/'
|
||||
|
||||
for (let line of (await lsRemote).split('\n')) {
|
||||
if (line.length === 0) {
|
||||
continue
|
||||
}
|
||||
let split = line.split('\t')
|
||||
assert(split.length == 2, line)
|
||||
let commit = split[0]
|
||||
let desc = split[1]
|
||||
|
||||
if (desc.startsWith(tagPrefix)) {
|
||||
if (!desc.endsWith(tagSuffix)) {
|
||||
continue
|
||||
}
|
||||
result.tags.set(desc.slice(tagPrefix.length, - tagSuffix.length), commit)
|
||||
} else {
|
||||
assert(desc.startsWith(branchPrefix), line)
|
||||
result.branches.set(desc, commit)
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue