From 7a741dc9d0b1e56ccc0a234dedbd4d2d48551209 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Mon, 2 Jun 2025 16:30:29 -0500 Subject: [PATCH 01/17] chore(developer): ldml: additional line numbers - ajv validation - more fixes from out of box testing Fixes: #14099 --- common/web/types/src/kmx/kmx-plus/kmx-plus.ts | 2 +- common/web/types/src/util/util.ts | 2 +- .../web/utils/src/developer-utils-messages.ts | 9 +++-- developer/src/common/web/utils/src/index.ts | 2 +- .../ldml-keyboard/ldml-keyboard-xml-reader.ts | 5 +-- .../src/common/web/utils/src/xml-utils.ts | 36 +++++++++++++++++++ .../ldml/ldml-keyboard-xml-reader.tests.ts | 6 ++-- .../common/web/utils/test/xml-utils.tests.ts | 33 ++++++++++++++++- developer/src/kmc-ldml/src/compiler/layr.ts | 2 +- developer/src/kmc-ldml/src/compiler/vars.ts | 10 +++--- developer/src/kmc-ldml/test/disp.tests.ts | 3 +- developer/src/kmc-ldml/test/helpers/index.ts | 16 +-------- developer/src/kmc-ldml/test/keys.tests.ts | 4 +-- developer/src/kmc-ldml/test/layr.tests.ts | 3 +- developer/src/kmc-ldml/test/loca.tests.ts | 3 +- developer/src/kmc-ldml/test/messages.tests.ts | 3 +- developer/src/kmc-ldml/test/meta.tests.ts | 4 +-- 17 files changed, 101 insertions(+), 42 deletions(-) diff --git a/common/web/types/src/kmx/kmx-plus/kmx-plus.ts b/common/web/types/src/kmx/kmx-plus/kmx-plus.ts index 373cc57b27..4ccf80ed17 100644 --- a/common/web/types/src/kmx/kmx-plus/kmx-plus.ts +++ b/common/web/types/src/kmx/kmx-plus/kmx-plus.ts @@ -393,7 +393,7 @@ export class UnicodeSetItem extends VarsItem { super(id, value, sections, x); const needRanges = sections.usetparser.sizeUnicodeSet(value); if (needRanges >= 0) { - this.unicodeSet = sections.usetparser.parseUnicodeSet(value, needRanges); + this.unicodeSet = sections.usetparser.parseUnicodeSet(value, needRanges, x); } // otherwise: error (was recorded via callback) } unicodeSet?: UnicodeSet; diff --git a/common/web/types/src/util/util.ts b/common/web/types/src/util/util.ts index 70e1077cc5..be1a715b17 100644 --- a/common/web/types/src/util/util.ts +++ b/common/web/types/src/util/util.ts @@ -392,4 +392,4 @@ export class NFDAnalyzer extends StringAnalyzer { return null; } } -} +} \ No newline at end of file diff --git a/developer/src/common/web/utils/src/developer-utils-messages.ts b/developer/src/common/web/utils/src/developer-utils-messages.ts index 6fd328802b..cd1eb8d2fe 100644 --- a/developer/src/common/web/utils/src/developer-utils-messages.ts +++ b/developer/src/common/web/utils/src/developer-utils-messages.ts @@ -1,8 +1,9 @@ /* * Keyman is copyright (C) SIL Global. MIT License. */ -import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageDef as def, CompilerMessageSpec as m } from './compiler-interfaces.js'; +import { CompilerErrorNamespace, CompilerErrorSeverity, CompilerMessageDef as def, CompilerMessageSpec as m, CompilerMessageObjectSpec as mx } from './compiler-interfaces.js'; import { constants } from '@keymanapp/ldml-keyboard-constants'; +import { ObjectWithMetadata } from './symbol-utils.js'; const DeveloperUtilsErrMask = CompilerErrorNamespace.DeveloperUtils; // const SevInfo = CompilerErrorSeverity.Info | DeveloperUtilsErrMask; @@ -14,8 +15,10 @@ const SevError = CompilerErrorSeverity.Error | DeveloperUtilsErrMask; export class DeveloperUtilsMessages { // structured Ajv validation error static ERROR_SchemaValidationError = SevError | 0x0001; - static Error_SchemaValidationError = (o:{instancePath:string, keyword:string, message: string, params: string}) => m(this.ERROR_SchemaValidationError, - `Error validating LDML XML file: ${def(o.instancePath)}: ${def(o.keyword)}: ${def(o.message)} ${def(o.params)}`); + static Error_SchemaValidationError = (o:{instancePath:string, keyword:string, message: string, params: string}, x?: ObjectWithMetadata) => mx( + this.ERROR_SchemaValidationError, x, + `Error validating LDML XML file: ${def(o.instancePath)}: ${def(o.keyword)}: ${def(o.message)} ${def(o.params)}`, + ); static ERROR_ImportInvalidBase = SevError | 0x0002; static Error_ImportInvalidBase = (o: { base: string, path: string, subtag: string }) => diff --git a/developer/src/common/web/utils/src/index.ts b/developer/src/common/web/utils/src/index.ts index c39afa8bff..1174dd4684 100644 --- a/developer/src/common/web/utils/src/index.ts +++ b/developer/src/common/web/utils/src/index.ts @@ -67,7 +67,7 @@ export { UrlSubpathCompilerCallback } from './utils/UrlSubpathCompilerCallback.j export { DeveloperUtilsMessages } from './developer-utils-messages.js'; export * as SourceFilenamePatterns from './source-filename-patterns.js'; -export { KeymanXMLType, KeymanXMLWriter, KeymanXMLReader, KeymanXMLMetadata, XML_FILENAME_SYMBOL } from './xml-utils.js'; +export { KeymanXMLType, KeymanXMLWriter, KeymanXMLReader, KeymanXMLMetadata, XML_FILENAME_SYMBOL, withOffset } from './xml-utils.js'; export { SymbolUtils, ObjectWithMetadata } from './symbol-utils.js'; export * as LineUtils from './line-utils.js'; export * as GitHubUrls from './github-urls.js'; diff --git a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts index 0a31bc051b..f25b03582d 100644 --- a/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts +++ b/developer/src/common/web/utils/src/types/ldml-keyboard/ldml-keyboard-xml-reader.ts @@ -12,7 +12,7 @@ import { constants } from '@keymanapp/ldml-keyboard-constants'; import { LDMLKeyboardTestDataXMLSourceFile, LKTTest, LKTTests } from './ldml-keyboard-testdata-xml.js'; import boxXmlArray = util.boxXmlArray; import { LineFinderEventResolver } from '../../line-utils.js'; -import { XML_FILENAME_SYMBOL, KeymanXMLReader } from '../../xml-utils.js'; +import { XML_FILENAME_SYMBOL, KeymanXMLReader, findInstanceObject } from '../../xml-utils.js'; interface NameAndProps { '$'?: any; // content @@ -310,12 +310,13 @@ export class LDMLKeyboardXMLSourceFileReader implements EventResolver { public validate(source: LDMLKeyboardXMLSourceFile | LDMLKeyboardTestDataXMLSourceFile): boolean { if(!SchemaValidators.default.ldmlKeyboard3(source)) { for (const err of (SchemaValidators.default.ldmlKeyboard3).errors) { + const context = findInstanceObject(source, err?.instancePath?.split('/')); this.callbacks.reportMessage(DeveloperUtilsMessages.Error_SchemaValidationError({ instancePath: err.instancePath, keyword: err.keyword, message: err.message || 'Unknown AJV Error', // docs say 'message' is optional if 'messages:false' in options params: Object.entries(err.params || {}).sort().map(([k,v])=>`${k}="${v}"`).join(' '), - })); + }, context)); } return false; } diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index f83ca75dc7..1d2b01c71e 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -360,3 +360,39 @@ export class KeymanXMLWriter { } } +/** + * traverse an AJV instancePath and map to an object if possible + * @param source object tree root (contains the root object) + * @param path ajv split instancePath, such as '/keyboard3/layers/0'.split('/') + */ +export function findInstanceObject(source: any, path: string[]) : any { + if(!path || !source || path.length == 0) { + return source; + } else if(path[0] == '') { + return findInstanceObject(source, path.slice(1)); + } else if(Array.isArray(source) || typeof source == 'object') { + const child = source[path[0]]; + if (child == undefined) return child; // nothing here + if (!child || typeof child == 'string') { + return source; // return the *parent* object if the child is empty (could be a property) + } + return findInstanceObject(child, path.slice(1)); + } else { + return null; + } +} + +/** + * Return an object simulating an XML object with an offset number + * For use in calling message functions + * @param c number for the offset setting + * @param x if set, this object will be used as the base object instead of {} + */ +export function withOffset(c: number, x?: any) : KeymanXMLMetadata { + // set metadata on an empty object + const o = Object.assign({}, x); + KeymanXMLReader.setMetaData(o, { + startIndex: c + }); + return o; +} diff --git a/developer/src/common/web/utils/test/ldml/ldml-keyboard-xml-reader.tests.ts b/developer/src/common/web/utils/test/ldml/ldml-keyboard-xml-reader.tests.ts index d09c1dfc41..286edd7958 100644 --- a/developer/src/common/web/utils/test/ldml/ldml-keyboard-xml-reader.tests.ts +++ b/developer/src/common/web/utils/test/ldml/ldml-keyboard-xml-reader.tests.ts @@ -8,7 +8,7 @@ import { testReaderCases } from '../helpers/reader-callback-test.js'; import CLDRScanToVkey = Constants.CLDRScanToVkey; import CLDRScanToKeyMap = Constants.CLDRScanToKeyMap; import USVirtualKeyCodes = Constants.USVirtualKeyCodes; -import { KeymanXMLReader, XML_FILENAME_SYMBOL } from '../../src/xml-utils.js'; +import { KeymanXMLReader, withOffset, XML_FILENAME_SYMBOL } from '../../src/xml-utils.js'; function pluckKeysFromKeybag(keys: LKKey[], ids: string[]) { return keys.filter(({id}) => ids.indexOf(id) !== -1); @@ -25,7 +25,7 @@ describe('ldml keyboard xml reader tests', function () { keyword: 'required', message: `must have required property 'info'`, params: 'missingProperty="info"', - })], + }, withOffset(39))], }, { subpath: 'invalid-conforms-to.xml', @@ -34,7 +34,7 @@ describe('ldml keyboard xml reader tests', function () { keyword: 'enum', message: `must be equal to one of the allowed values`, params: 'allowedValues="45,46"', // this has to be kept in sync with the DTD - })], + }, withOffset(39))], }, { subpath: 'import-minimal.xml', diff --git a/developer/src/common/web/utils/test/xml-utils.tests.ts b/developer/src/common/web/utils/test/xml-utils.tests.ts index 4b3df736b6..ec4f1ae80c 100644 --- a/developer/src/common/web/utils/test/xml-utils.tests.ts +++ b/developer/src/common/web/utils/test/xml-utils.tests.ts @@ -12,7 +12,7 @@ import { env } from 'node:process'; import { readFileSync, writeFileSync } from 'node:fs'; -import { KeymanXMLType, KeymanXMLReader, KeymanXMLWriter } from '../src/xml-utils.js'; +import { KeymanXMLType, KeymanXMLReader, KeymanXMLWriter, findInstanceObject } from '../src/xml-utils.js'; import { LineFinder } from '../src/line-utils.js'; import { makePathToFixture } from './helpers/index.js'; import { SymbolUtils } from '../src/symbol-utils.js'; @@ -198,5 +198,36 @@ describe(`XML Reader line number test`, () => { LineFinder.offsetToLineColumn( getMetaData(actual.keyboard3.transforms).startIndex, lines), { line: 8, column: 2 }); }); + describe('findInstanceObject test', () => { + const path0 = '/keyboard3/layers/0'; + const TARGET = Symbol("Looking for this!"); + it(`Should be able to parse ${path0}`, () => { + const o = { + keyboard3: { + layers: [ + TARGET, + ] + } + }; + assert.equal(findInstanceObject(o, path0.split('/')), TARGET); + }); + // path to property + const path1 = '/keyboard3/conformsTo'; + it(`Should be able to parse ${path1}`, () => { + const keyboard3 = { conformsTo: "1234"}; + const o = { + keyboard3, + }; + assert.equal(findInstanceObject(o, path1.split('/')), keyboard3); + }); + const path2 = '/keyboard3/bad/path'; + it(`Should be able to handle ${path2}`, () => { + const keyboard3 = { conformsTo: "1234"}; + const o = { + keyboard3, + }; + assert.equal(findInstanceObject(o, path2.split('/')), undefined); + }); + }); }); diff --git a/developer/src/kmc-ldml/src/compiler/layr.ts b/developer/src/kmc-ldml/src/compiler/layr.ts index 9dff22a5bf..d450730bf9 100644 --- a/developer/src/kmc-ldml/src/compiler/layr.ts +++ b/developer/src/kmc-ldml/src/compiler/layr.ts @@ -60,7 +60,7 @@ export class LayrCompiler extends SectionCompiler { if (totalLayerCount === 0) { // TODO-LDML: does not validate touch layers yet // no layers seen anywhere valid = false; - this.callbacks.reportMessage(LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement(this.keyboard3?.layers[0])); + this.callbacks.reportMessage(LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement(this.keyboard3)); } return valid; } diff --git a/developer/src/kmc-ldml/src/compiler/vars.ts b/developer/src/kmc-ldml/src/compiler/vars.ts index 2a0538732a..f08c5a44e9 100644 --- a/developer/src/kmc-ldml/src/compiler/vars.ts +++ b/developer/src/kmc-ldml/src/compiler/vars.ts @@ -97,7 +97,7 @@ export class VarsCompiler extends SectionCompiler { // Sets for (const e of variables.set) { const { id, value } = e; - if(!this.validateIdentifier(id)) { + if(!this.validateIdentifier(id, e)) { valid = false; continue; } @@ -124,7 +124,7 @@ export class VarsCompiler extends SectionCompiler { // UnicodeSets for (const e of variables.uset) { const { id, value } = e; - if(!this.validateIdentifier(id)) { + if(!this.validateIdentifier(id, e)) { valid = false; continue; } @@ -291,7 +291,7 @@ export class VarsCompiler extends SectionCompiler { let { value } = e; // fix any variables value = result.substituteStrings(value, sections); - result.strings.push(new StringVarItem(id, value, sections)); + result.strings.push(new StringVarItem(id, value, sections, e)); } addSet(result: Vars, e: LDMLKeyboard.LKSet, sections: DependencySections): void { const { id } = e; @@ -306,14 +306,14 @@ export class VarsCompiler extends SectionCompiler { // this is not 'forMatch', all variables are to be assumed as string literals, not regex // content. const cookedItems: string[] = rawItems.map(v => result.substituteMarkerString(v, false)); - result.sets.push(new SetVarItem(id, cookedItems, sections)); + result.sets.push(new SetVarItem(id, cookedItems, sections, e)); } addUnicodeSet(result: Vars, e: LDMLKeyboard.LKUSet, sections: DependencySections): void { const { id } = e; let { value } = e; value = result.substituteStrings(value, sections); value = result.substituteUnicodeSets(value, sections); - result.usets.push(new UnicodeSetItem(id, value, sections, sections.usetparser)); + result.usets.push(new UnicodeSetItem(id, value, sections, sections.usetparser, e)); } // routines for using/substituting variables have been moved to the Vars class and its // properties diff --git a/developer/src/kmc-ldml/test/disp.tests.ts b/developer/src/kmc-ldml/test/disp.tests.ts index 3bad95e339..8b17b35c55 100644 --- a/developer/src/kmc-ldml/test/disp.tests.ts +++ b/developer/src/kmc-ldml/test/disp.tests.ts @@ -1,11 +1,12 @@ import 'mocha'; import {assert} from 'chai'; import { DispCompiler } from '../src/compiler/disp.js'; -import { compilerTestCallbacks, loadSectionFixture, testCompilationCases, withOffset } from './helpers/index.js'; +import { compilerTestCallbacks, loadSectionFixture, testCompilationCases } from './helpers/index.js'; import { KMXPlus } from '@keymanapp/common-types'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; import Disp = KMXPlus.Disp; +import { withOffset } from '@keymanapp/developer-utils'; describe('disp', function () { this.slow(500); // 0.5 sec -- json schema validation takes a while diff --git a/developer/src/kmc-ldml/test/helpers/index.ts b/developer/src/kmc-ldml/test/helpers/index.ts index 967287cf87..be6216f9c1 100644 --- a/developer/src/kmc-ldml/test/helpers/index.ts +++ b/developer/src/kmc-ldml/test/helpers/index.ts @@ -8,7 +8,7 @@ import * as path from 'path'; import { fileURLToPath } from 'url'; import { SectionCompiler, SectionCompilerNew } from '../../src/compiler/section-compiler.js'; import { util, KMXPlus, LdmlKeyboardTypes } from '@keymanapp/common-types'; -import { CompilerEvent, compilerEventFormat, CompilerCallbacks, LDMLKeyboardXMLSourceFileReader, LDMLKeyboardTestDataXMLSourceFile, LDMLKeyboard, KeymanXMLMetadata, KeymanXMLReader, CompilerError } from "@keymanapp/developer-utils"; +import { CompilerEvent, compilerEventFormat, CompilerCallbacks, LDMLKeyboardXMLSourceFileReader, LDMLKeyboardTestDataXMLSourceFile, LDMLKeyboard, CompilerError } from "@keymanapp/developer-utils"; import { LdmlKeyboardCompiler } from '../../src/main.js'; // make sure main.js compiles import { assert } from 'chai'; import { KMXPlusMetadataCompiler } from '../../src/compiler/metadata-compiler.js'; @@ -358,17 +358,3 @@ export function hex_str(s?: string) : string { return [...s].map(ch => dontEscape.test(ch) ? ch : util.escapeRegexChar(ch)).join(''); } -/** - * Return an object simulating an XML object with an offset number - * For use in calling message functions - * @param c number for the offset setting - * @param x if set, this object will be used as the base object instead of {} - */ -export function withOffset(c: number, x?: any) : KeymanXMLMetadata { - // set metadata on an empty object - const o = Object.assign({}, x); - KeymanXMLReader.setMetaData(o, { - startIndex: c - }); - return o; -} diff --git a/developer/src/kmc-ldml/test/keys.tests.ts b/developer/src/kmc-ldml/test/keys.tests.ts index 3c3c842810..97171cf6fc 100644 --- a/developer/src/kmc-ldml/test/keys.tests.ts +++ b/developer/src/kmc-ldml/test/keys.tests.ts @@ -1,7 +1,7 @@ import 'mocha'; import { assert } from 'chai'; import { KeysCompiler } from '../src/compiler/keys.js'; -import { assertCodePoints, compilerTestCallbacks, loadSectionFixture, testCompilationCases, withOffset } from './helpers/index.js'; +import { assertCodePoints, compilerTestCallbacks, loadSectionFixture, testCompilationCases } from './helpers/index.js'; import { KMXPlus, Constants, LdmlKeyboardTypes } from '@keymanapp/common-types'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; import { constants } from '@keymanapp/ldml-keyboard-constants'; @@ -9,7 +9,7 @@ import { MetaCompiler } from '../src/compiler/meta.js'; const keysDependencies = [ ...BASIC_DEPENDENCIES, MetaCompiler ]; import Keys = KMXPlus.Keys; import { BASIC_DEPENDENCIES } from '../src/compiler/empty-compiler.js'; -import { LDMLKeyboard } from '@keymanapp/developer-utils'; +import { LDMLKeyboard, withOffset } from '@keymanapp/developer-utils'; const K = Constants.USVirtualKeyCodes; describe('keys', function () { diff --git a/developer/src/kmc-ldml/test/layr.tests.ts b/developer/src/kmc-ldml/test/layr.tests.ts index dc0334c0b1..a1f3c5e184 100644 --- a/developer/src/kmc-ldml/test/layr.tests.ts +++ b/developer/src/kmc-ldml/test/layr.tests.ts @@ -2,12 +2,13 @@ import 'mocha'; import { assert } from 'chai'; import { LayrCompiler } from '../src/compiler/layr.js'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; -import { compilerTestCallbacks, testCompilationCases, withOffset } from './helpers/index.js'; +import { compilerTestCallbacks, testCompilationCases } from './helpers/index.js'; import { KMXPlus } from '@keymanapp/common-types'; import { constants } from '@keymanapp/ldml-keyboard-constants'; import Layr = KMXPlus.Layr; import LayrRow = KMXPlus.LayrRow; +import { withOffset } from '@keymanapp/developer-utils'; function allKeysOk(row : LayrRow, str : string, msg? : string) { const split = str.split(' '); diff --git a/developer/src/kmc-ldml/test/loca.tests.ts b/developer/src/kmc-ldml/test/loca.tests.ts index 287ee62b00..ffe4f656c7 100644 --- a/developer/src/kmc-ldml/test/loca.tests.ts +++ b/developer/src/kmc-ldml/test/loca.tests.ts @@ -1,11 +1,12 @@ import 'mocha'; import { assert } from 'chai'; import { LocaCompiler } from '../src/compiler/loca.js'; -import { compilerTestCallbacks, loadSectionFixture, withOffset } from './helpers/index.js'; +import { compilerTestCallbacks, loadSectionFixture } from './helpers/index.js'; import { KMXPlus } from '@keymanapp/common-types'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; import Loca = KMXPlus.Loca; +import { withOffset } from '@keymanapp/developer-utils'; describe('loca', function () { this.slow(500); // 0.5 sec -- json schema validation takes a while diff --git a/developer/src/kmc-ldml/test/messages.tests.ts b/developer/src/kmc-ldml/test/messages.tests.ts index a7d06006cb..60df66fb09 100644 --- a/developer/src/kmc-ldml/test/messages.tests.ts +++ b/developer/src/kmc-ldml/test/messages.tests.ts @@ -2,8 +2,7 @@ import 'mocha'; import {expect} from 'chai'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; import { verifyCompilerMessagesObject } from '@keymanapp/developer-test-helpers'; -import { CompilerErrorNamespace, CompilerEvent } from '@keymanapp/developer-utils'; -import { withOffset } from './helpers/index.js'; +import { CompilerErrorNamespace, CompilerEvent, withOffset } from '@keymanapp/developer-utils'; describe('LdmlCompilerMessages', function () { it('should have a valid LdmlCompilerMessages object', function() { diff --git a/developer/src/kmc-ldml/test/meta.tests.ts b/developer/src/kmc-ldml/test/meta.tests.ts index c744b3385e..beeed50915 100644 --- a/developer/src/kmc-ldml/test/meta.tests.ts +++ b/developer/src/kmc-ldml/test/meta.tests.ts @@ -1,13 +1,13 @@ import 'mocha'; import {assert} from 'chai'; import { MetaCompiler } from '../src/compiler/meta.js'; -import { compilerTestCallbacks, loadSectionFixture, withOffset } from './helpers/index.js'; +import { compilerTestCallbacks, loadSectionFixture } from './helpers/index.js'; import { KMXPlus } from '@keymanapp/common-types'; import { LdmlCompilerMessages } from '../src/compiler/ldml-compiler-messages.js'; import KeyboardSettings = KMXPlus.KeyboardSettings; import Meta = KMXPlus.Meta; -import { LDMLKeyboard } from '@keymanapp/developer-utils'; +import { LDMLKeyboard, withOffset } from '@keymanapp/developer-utils'; describe('meta', function () { this.slow(500); // 0.5 sec -- json schema validation takes a while From d9378aebb2a423e3aa5090d8f9802c376a6a8459 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 5 Jun 2025 11:11:42 +0700 Subject: [PATCH 02/17] maint(common): Build-bot now available to control test builds The Build-bot command is available now to control which platforms are built. See the wiki for instructions on how to use Build-bot. Build-bot: build Test-bot: skip --- resources/build.sh | 1 + resources/build/increment-version.sh | 2 +- resources/build/run-required-test-builds.sh | 199 ++++--- .../build/test/build-bot/pr-14013-commits.txt | 171 ++++++ .../build/test/build-bot/pr-14013-data.txt | 534 ++++++++++++++++++ .../build/test/build-bot/pr-9999-commits.txt | 17 + .../build/test/build-bot/pr-9999-data.txt | 3 + .../test/build-bot/trigger-build-bot.test.sh | 198 +++++++ resources/build/test/test-utils.inc.sh | 4 +- resources/build/trigger-build-bot.inc.sh | 163 ++++++ resources/build/trigger-builds.inc.sh | 58 +- resources/build/trigger-definitions.inc.sh | 32 ++ 12 files changed, 1288 insertions(+), 94 deletions(-) create mode 100644 resources/build/test/build-bot/pr-14013-commits.txt create mode 100644 resources/build/test/build-bot/pr-14013-data.txt create mode 100644 resources/build/test/build-bot/pr-9999-commits.txt create mode 100644 resources/build/test/build-bot/pr-9999-data.txt create mode 100755 resources/build/test/build-bot/trigger-build-bot.test.sh create mode 100644 resources/build/trigger-build-bot.inc.sh diff --git a/resources/build.sh b/resources/build.sh index a3cf8b0dd5..5ac7bde55d 100755 --- a/resources/build.sh +++ b/resources/build.sh @@ -15,6 +15,7 @@ builder_parse "$@" if builder_start_action test; then ./build/test/test.sh + ./build/test/build-bot/trigger-build-bot.test.sh ./build/publish-minimum-versions.sh test builder_finish_action success test fi diff --git a/resources/build/increment-version.sh b/resources/build/increment-version.sh index f1d15c6a7d..1ffa98054c 100755 --- a/resources/build/increment-version.sh +++ b/resources/build/increment-version.sh @@ -158,7 +158,7 @@ if [ "$action" == "commit" ]; then # Trigger builds for the previous version on TeamCity and GitHub # - triggerBuilds + triggerReleaseBuilds # # Now, create the PR on GitHub which will be merged when ready diff --git a/resources/build/run-required-test-builds.sh b/resources/build/run-required-test-builds.sh index eada3e90ca..4e6e324087 100755 --- a/resources/build/run-required-test-builds.sh +++ b/resources/build/run-required-test-builds.sh @@ -1,22 +1,51 @@ #!/usr/bin/env bash # # Determine if we need to do a build based on rules in -# trigger-definitions.inc.sh, rather than calculating changes in -# TeamCity. If a build is needed, then we ask TeamCity to -# start the build. +# trigger-definitions.inc.sh and based on commit trailers and PR body comments, +# rather than calculating changes in TeamCity. If a build is needed, then we ask +# TeamCity / GHA to start the build. # -set -e -set -u +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" +. "${THIS_SCRIPT%/*}/../../resources/build/builder.inc.sh" +## END STANDARD BUILD SCRIPT INCLUDE -if [[ $# -lt 1 ]]; then - echo 'Usage: run-required-test-build.sh pull-request-number|branch' - echo ' where branch can be master, beta' - exit 1 +. "${THIS_SCRIPT%/*}/trigger-definitions.inc.sh" +. "${THIS_SCRIPT%/*}/trigger-builds.inc.sh" +. "${THIS_SCRIPT%/*}/trigger-build-bot.inc.sh" +. "${THIS_SCRIPT%/*}/jq.inc.sh" + +builder_describe "Run test builds for the given pull request/primary branch" \ + "--dry-run,-n Only report back which builds would be started" \ + "--branch,-b=PRNUM Branch (master,beta) or pull-request to test" + +if [[ $# -eq 1 ]] && [[ "$1" =~ ^[0-9]+$ ]]; then + # For transitional period, when build configuration on TC needs to support + # both forms, we will pass a modified set of params to builder_parse + # + # TODO: remove this condition once all branches have received this change, + # and update TC build configuration to pass -b parameter + # + builder_parse -b "$1" else - PRNUM="$1" + builder_parse "$@" fi +# Validate parameters + +if ! builder_has_option --branch; then + builder_die "--branch parameter is required" +fi + +if [[ ! "$PRNUM" =~ ^([0-9]+|master|beta|stable-[0-9]+\.[0-9]+)$ ]]; then + builder_die "Invalid parameter --branch '$PRNUM'; expected 'master', 'beta', 'stable-x.y', or PR number" +fi + +# +# Debug logging +# function debug_echo() { if [ ! -z ${DEBUG:-} ]; then echo "DEBUG: $1" @@ -25,45 +54,51 @@ function debug_echo() { } # -# This must be run under a TeamCity environment in order to receive all variables -# - -## START STANDARD BUILD SCRIPT INCLUDE -# adjust relative paths as necessary -THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" -. "${THIS_SCRIPT%/*}/../../resources/build/build-utils.sh" -## END STANDARD BUILD SCRIPT INCLUDE - -. "${THIS_SCRIPT%/*}/trigger-definitions.inc.sh" -. "${THIS_SCRIPT%/*}/trigger-builds.inc.sh" -. "${THIS_SCRIPT%/*}/jq.inc.sh" - -# -# Iterate through the platforms 'array' passed in and +# Iterate through the platforms array passed in and # run builds associated with each platform found # - +# Parameters: +# 1: name of associative array of platforms, platform=skip|build|release|[fulltest?] +# 2: branch name or PR number +# function triggerTestBuilds() { - # Note: we always run builds for 'all' platforms - local platforms=( `echo "all $1"` ) + local -n platforms=$1 local branch="$2" - local force="${3:-false}" # Cancel any already running builds for this branch - node "$THIS_SCRIPT_PATH/ci/cancel-builds/cancel-test-builds.mjs" "$branch" "$TEAMCITY_TOKEN" + if builder_has_option --dry-run; then + builder_echo "DRY RUN: cancel current builds for $branch" + else + node "$THIS_SCRIPT_PATH/ci/cancel-builds/cancel-test-builds.mjs" "$branch" "$TEAMCITY_TOKEN" + fi - for platform in "${platforms[@]}"; do - echo "# $platform: checking for changes" + for platform in "${!platforms[@]}"; do + local platformBuildLevel=${platforms[$platform]} + if [[ $platformBuildLevel == skip ]]; then + builder_echo heading "$platform: skipping build" + continue + fi + + builder_echo heading "$platform: checking for git changes" eval test_builds='(${'bc_test_$platform'[@]})' for test_build in "${test_builds[@]}"; do if [[ $test_build == "" ]]; then continue; fi if [ "${test_build:(-7)}" == "_GitHub" ]; then local job=${test_build%_GitHub} - echo " -- Triggering GitHub action build $job/$branch" - triggerGitHubActionsBuild true "$job" "$branch" + + if builder_has_option --dry-run; then + builder_echo "DRY RUN: Triggering GitHub action build $job/$branch, level = $platformBuildLevel" + else + builder_echo "Triggering GitHub action build $job/$branch, level = $platformBuildLevel" + triggerGitHubActionsBuild true $platformBuildLevel "$job" "$branch" + fi else - echo " -- Triggering build configuration $test_build on teamcity" - triggerTeamCityBuild true "$test_build" "$vcs_test" "$branch" + if builder_has_option --dry-run; then + builder_echo "DRY RUN: Triggering build configuration $test_build on teamcity for $branch, level = $platformBuildLevel" + else + builder_echo "Triggering build configuration $test_build on teamcity for $branch, level = $platformBuildLevel" + triggerTeamCityBuild true $platformBuildLevel "$test_build" "$vcs_test" "$branch" + fi fi done done @@ -76,8 +111,8 @@ function triggerTestBuilds() { if [[ ! "$PRNUM" =~ ^[[:digit:]]+$ ]]; then # branch name is 'master', 'beta' [, or 'stable' -- in the future] - echo ". Branch $PRNUM needs to pass tests on all platforms." - triggerTestBuilds "`echo ${available_platforms[@]}`" "$PRNUM" "true" + builder_echo "Branch $PRNUM needs to pass tests on all platforms." + triggerTestBuilds main_branch_platform_build_levels $PRNUM exit 0 fi @@ -88,7 +123,7 @@ fi # targeted by the PR other than to ask GitHub, anyway.) # -echo ". Get information about pull request #$PRNUM from GitHub" +builder_echo grey "# Get information about pull request #$PRNUM from GitHub" prinfo=`curl -s -H "User-Agent: @keymanapp" -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/repos/keymanapp/keyman/pulls/$PRNUM` prbase=`echo ${prinfo} | "$JQ" -r '.base.ref'` prhead=`echo ${prinfo} | "$JQ" -r '.head.ref'` @@ -111,7 +146,7 @@ fi # # (Ensure we are within the repository before running git calls) -echo ". Ensure our local branch is up to date" +builder_echo grey "# Ensure our local branch is up to date" pushd "$KEYMAN_ROOT" > /dev/null git fetch origin > /dev/null @@ -132,7 +167,7 @@ fi # We work from origin so we don't need the branches in our local copy # -echo ". Get list of changed files in the pull request" +builder_echo grey "# Get list of changed files in the pull request" prfiles=`git diff --name-only "origin/$prbase"..."$prremote/$prhead" || ( if [ $? == 128 ]; then echo abort; else exit $?; fi )` if [ "$prfiles" == "abort" ]; then # Don't trigger any builds, exit with success @@ -155,41 +190,65 @@ popd > /dev/null # Find the platforms that have changes based on the watch_ variables in trigger-definitions.inc.sh # -echo ". Find platforms that have changes" -build_platforms=() +function find_platform_changes() { + builder_echo grey "# Find platforms that have changes" + declare -gA build_platforms + local platform watch -# Scan the files found -while IFS= read -r line; do - # for each platform - for platform in "${available_platforms[@]}"; do - if [[ ! " ${build_platforms[@]} " =~ " $platform " ]]; then - # Which platform are we watching? - eval watch='$'watch_$platform - # Add common patterns to the watch list - watch="^($platform|(oem/[^/]+/$platform)|resources|$watch)" - if [[ "$line" =~ $watch ]]; then - build_platforms+=($platform) + # Scan the files found + while IFS= read -r line; do + # for each platform + for platform in "${available_platforms[@]}"; do + if [[ ! " ${!build_platforms[@]} " =~ " $platform " ]]; then + # Which platform are we watching? + eval watch='$'watch_$platform + # Add common patterns to the watch list + # TODO: remove 'resources' from this watch? + watch="^($platform|(oem/[^/]+/$platform)|resources|$watch)" + if [[ "$line" =~ $watch ]]; then + # By default, we'll build a 'release' test build for touched platforms + build_platforms[$platform]=$build_level_release + fi fi - fi - done -done <<< "$prfiles" + done + done <<< "$prfiles" -debug_echo "Build platforms: ${build_platforms[*]}" + debug_echo "Default build platforms: ${!build_platforms[@]}" +} + +find_platform_changes + +# +# Now check PR commits for Build-bot: commands +# This will modify the build_platforms array +# + +if [ "$prremote" == "origin" ]; then + # We only accept Build-bot commands on trusted local origin PRs + prcommits=`curl -s -H "User-Agent: @keymanapp" -H "Authorization: Bearer $GITHUB_TOKEN" https://api.github.com/repos/keymanapp/keyman/pulls/$PRNUM/commits` + test_bot_check_pr_body "$PRNUM" "$prinfo" + build_bot_check_messages $PRNUM "$prinfo" "$prcommits" +fi + +# +# Start test builds as required +# if (( ${#build_platforms[@]} > 0)); then - # - # Start the test builds - # - echo ". Start test builds" - triggerTestBuilds "`echo ${build_platforms[@]}`" "$PRNUM" + builder_echo heading "Start test builds" + triggerTestBuilds build_platforms $PRNUM else - echo ". No builds to start" - curl --silent --write-out '\n' \ - --request POST \ - --header "Accept: application/vnd.github+json" \ - --header "Authorization: token $GITHUB_TOKEN" \ - --data '{"state":"success","description":"Skipping since no platform builds necessary","context":"Test Build (Keyman)"}' \ - "https://api.github.com/repos/keymanapp/keyman/statuses/${BUILD_VCS_NUMBER}" + builder_echo heading "No builds to start" + if builder_has_option --dry-run; then + builder_echo "DRY RUN: write successful status check 'Skipping since no platform builds necessary'" + else + curl --silent --write-out '\n' \ + --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data '{"state":"success","description":"Skipping since no platform builds necessary","context":"Test Build (Keyman)"}' \ + "https://api.github.com/repos/keymanapp/keyman/statuses/${BUILD_VCS_NUMBER}" + fi fi exit 0 diff --git a/resources/build/test/build-bot/pr-14013-commits.txt b/resources/build/test/build-bot/pr-14013-commits.txt new file mode 100644 index 0000000000..abfb04a549 --- /dev/null +++ b/resources/build/test/build-bot/pr-14013-commits.txt @@ -0,0 +1,171 @@ +[ + { + "sha": "b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "node_id": "C_kwDOAY2xT9oAKGI3OTcwZDQzOWNkZDE4ZTg0ZmQ3NTRiZjBmMDZhODg3OGMxOGJiOTc", + "commit": { + "author": { + "name": "Marc Durdin", + "email": "marc@durdin.net", + "date": "2025-04-30T01:59:27Z" + }, + "committer": { + "name": "Marc Durdin", + "email": "marc@durdin.net", + "date": "2025-04-30T01:59:27Z" + }, + "message": "maint(common): consolidate VC++ environment setup for meson\n\nUse the automated environment setup that we built for Windows and\nDeveloper builds in our meson build configurations, so we don't need to\ncall out to vsdevcmd.bat for every build step. This makes the build\nfaster, more consistent across the various ways we call VC++, and\nsimplifies the shell scripts. Removes the complicated build.bat wrappers.\n\nAlso removes the `cleanup_visual_studio_path` function which should no\nlonger be necessary, as our environment builder does the job for us.\n\nMinor complication in that `$TARGET_PATH` variable in kmcmplib/build.sh\nis also used in the Windows environment setup, so eliminated its use in\nkmcmplib/build.sh.\n\nFinally, removes the `$MESON_LOW_VERSION` variable as we know we are\nalways on Meson 1.0 or later now.\n\nBuild-bot: skip developer, windows, foo\nBuild-bot: bash windows", + "tree": { + "sha": "df937f0cb23e2e3736d92cf39b3b7f62ce20bcc1", + "url": "https://api.github.com/repos/keymanapp/keyman/git/trees/df937f0cb23e2e3736d92cf39b3b7f62ce20bcc1" + }, + "url": "https://api.github.com/repos/keymanapp/keyman/git/commits/b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "comment_count": 0, + "verification": { + "verified": false, + "reason": "unsigned", + "signature": null, + "payload": null, + "verified_at": null + } + }, + "url": "https://api.github.com/repos/keymanapp/keyman/commits/b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "html_url": "https://github.com/keymanapp/keyman/commit/b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "comments_url": "https://api.github.com/repos/keymanapp/keyman/commits/b7970d439cdd18e84fd754bf0f06a8878c18bb97/comments", + "author": { + "login": "mcdurdin", + "id": 4498365, + "node_id": "MDQ6VXNlcjQ0OTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/4498365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mcdurdin", + "html_url": "https://github.com/mcdurdin", + "followers_url": "https://api.github.com/users/mcdurdin/followers", + "following_url": "https://api.github.com/users/mcdurdin/following{/other_user}", + "gists_url": "https://api.github.com/users/mcdurdin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mcdurdin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mcdurdin/subscriptions", + "organizations_url": "https://api.github.com/users/mcdurdin/orgs", + "repos_url": "https://api.github.com/users/mcdurdin/repos", + "events_url": "https://api.github.com/users/mcdurdin/events{/privacy}", + "received_events_url": "https://api.github.com/users/mcdurdin/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "committer": { + "login": "mcdurdin", + "id": 4498365, + "node_id": "MDQ6VXNlcjQ0OTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/4498365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mcdurdin", + "html_url": "https://github.com/mcdurdin", + "followers_url": "https://api.github.com/users/mcdurdin/followers", + "following_url": "https://api.github.com/users/mcdurdin/following{/other_user}", + "gists_url": "https://api.github.com/users/mcdurdin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mcdurdin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mcdurdin/subscriptions", + "organizations_url": "https://api.github.com/users/mcdurdin/orgs", + "repos_url": "https://api.github.com/users/mcdurdin/repos", + "events_url": "https://api.github.com/users/mcdurdin/events{/privacy}", + "received_events_url": "https://api.github.com/users/mcdurdin/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "parents": [ + { + "sha": "926be6e9463e0497dbf1d32d4ef908ae2aad20db", + "url": "https://api.github.com/repos/keymanapp/keyman/commits/926be6e9463e0497dbf1d32d4ef908ae2aad20db", + "html_url": "https://github.com/keymanapp/keyman/commit/926be6e9463e0497dbf1d32d4ef908ae2aad20db" + } + ] + }, + { + "sha": "0230010a509e317f835d18e1d3be116c30047cf9", + "node_id": "C_kwDOAY2xT9oAKDAyMzAwMTBhNTA5ZTMxN2Y4MzVkMThlMWQzYmUxMTZjMzAwNDdjZjk", + "commit": { + "author": { + "name": "Marc Durdin", + "email": "marc@durdin.net", + "date": "2025-04-30T02:18:26Z" + }, + "committer": { + "name": "GitHub", + "email": "noreply@github.com", + "date": "2025-04-30T02:18:26Z" + }, + "message": "Merge branch 'maint/meson-versioning-improvements' into maint/core-developer/12639-meson-no-batch-wrappers\n\nBuild-bot: skip all", + "tree": { + "sha": "47bb7ca6f52998e8a14e478f5e9f5d7ba415ace3", + "url": "https://api.github.com/repos/keymanapp/keyman/git/trees/47bb7ca6f52998e8a14e478f5e9f5d7ba415ace3" + }, + "url": "https://api.github.com/repos/keymanapp/keyman/git/commits/0230010a509e317f835d18e1d3be116c30047cf9", + "comment_count": 0, + "verification": { + "verified": true, + "reason": "valid", + "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsFcBAABCAAQBQJoEYhyCRC1aQ7uu5UhlAAAg4MQAFxQGq7WPhHNzlspVIFv5k8W\nJPmC2SP+eUXyDKpO38MqnAPlMqaNrleB071BtE9i2DeWHwYvGwJ87ki95aAtg00F\ne4RbhJYy5sW/F/0fNzHgGNFPNb3EcRyt6I7X3xRB+i1k0PgTSVIpnLzXn3gj9GwU\n7PuLgNO0CUpcgWc6X7a259RAlLInEJ+I8p9XhW827eRalogwgALt4IuJmWyJALFL\nJFeWGlCKdVfbHEgBgEyA98zNnvtoxQ+FlJn1V1jJEBpCY+MPB5tyCXZ4LZbn/n7V\n0+2Pp3c5lnZKmaOyUykwQw7P8s4R2+aQnghRHEHa5Fm6hjQkHMiCOwgTwpIrUV+U\n4AWzPjZSw71cBmAUJBUe7SIBv51r1TUeuNy9x3/0r588znBItR12C91KQD8u9o3/\nMqcWTkpEuGgD2nYbhTdb9PNF4Ik/wbBKLDvjQg180b/ocklVaGAAqjOHdvkyQ4in\nIBRqiaeI3zD5TQ7936Sk1JQPil97PWzk27vde0KAeCR59yL8lCnHr2Rtp8hEpytX\nGrlL14GIaVK6YEvumloPFXrWnbdETu0yRllVa4T2RbWskZUtPG93l/fmOV6tiAr2\np79lgJQ0eEJ1fBNm9UsvjDXU478fSU5Dobg1pwv+wxr10u43tPbqmMI6VLxOjt7i\nz44SZyX8udppGuASFSsw\n=3UIv\n-----END PGP SIGNATURE-----\n", + "payload": "tree 47bb7ca6f52998e8a14e478f5e9f5d7ba415ace3\nparent b7970d439cdd18e84fd754bf0f06a8878c18bb97\nparent e976b5563589a9e38c778f3c06e404e82526358a\nauthor Marc Durdin 1745979506 +0700\ncommitter GitHub 1745979506 +0700\n\nMerge branch 'maint/meson-versioning-improvements' into maint/core-developer/12639-meson-no-batch-wrappers", + "verified_at": "2025-04-30T02:18:29Z" + } + }, + "url": "https://api.github.com/repos/keymanapp/keyman/commits/0230010a509e317f835d18e1d3be116c30047cf9", + "html_url": "https://github.com/keymanapp/keyman/commit/0230010a509e317f835d18e1d3be116c30047cf9", + "comments_url": "https://api.github.com/repos/keymanapp/keyman/commits/0230010a509e317f835d18e1d3be116c30047cf9/comments", + "author": { + "login": "mcdurdin", + "id": 4498365, + "node_id": "MDQ6VXNlcjQ0OTgzNjU=", + "avatar_url": "https://avatars.githubusercontent.com/u/4498365?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/mcdurdin", + "html_url": "https://github.com/mcdurdin", + "followers_url": "https://api.github.com/users/mcdurdin/followers", + "following_url": "https://api.github.com/users/mcdurdin/following{/other_user}", + "gists_url": "https://api.github.com/users/mcdurdin/gists{/gist_id}", + "starred_url": "https://api.github.com/users/mcdurdin/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/mcdurdin/subscriptions", + "organizations_url": "https://api.github.com/users/mcdurdin/orgs", + "repos_url": "https://api.github.com/users/mcdurdin/repos", + "events_url": "https://api.github.com/users/mcdurdin/events{/privacy}", + "received_events_url": "https://api.github.com/users/mcdurdin/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "committer": { + "login": "web-flow", + "id": 19864447, + "node_id": "MDQ6VXNlcjE5ODY0NDQ3", + "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/web-flow", + "html_url": "https://github.com/web-flow", + "followers_url": "https://api.github.com/users/web-flow/followers", + "following_url": "https://api.github.com/users/web-flow/following{/other_user}", + "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", + "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", + "organizations_url": "https://api.github.com/users/web-flow/orgs", + "repos_url": "https://api.github.com/users/web-flow/repos", + "events_url": "https://api.github.com/users/web-flow/events{/privacy}", + "received_events_url": "https://api.github.com/users/web-flow/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "parents": [ + { + "sha": "b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "url": "https://api.github.com/repos/keymanapp/keyman/commits/b7970d439cdd18e84fd754bf0f06a8878c18bb97", + "html_url": "https://github.com/keymanapp/keyman/commit/b7970d439cdd18e84fd754bf0f06a8878c18bb97" + }, + { + "sha": "e976b5563589a9e38c778f3c06e404e82526358a", + "url": "https://api.github.com/repos/keymanapp/keyman/commits/e976b5563589a9e38c778f3c06e404e82526358a", + "html_url": "https://github.com/keymanapp/keyman/commit/e976b5563589a9e38c778f3c06e404e82526358a" + } + ] + } +] diff --git a/resources/build/test/build-bot/pr-14013-data.txt b/resources/build/test/build-bot/pr-14013-data.txt new file mode 100644 index 0000000000..fc3f96a725 --- /dev/null +++ b/resources/build/test/build-bot/pr-14013-data.txt @@ -0,0 +1,534 @@ +{ + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14013", + "id": 2533896821, + "node_id": "PR_kwDOAY2xT86XCDJ1", + "html_url": "https://github.com/keymanapp/keyman/pull/14013", + "diff_url": "https://github.com/keymanapp/keyman/pull/14013.diff", + "patch_url": "https://github.com/keymanapp/keyman/pull/14013.patch", + "issue_url": "https://api.github.com/repos/keymanapp/keyman/issues/14013", + "number": 14013, + "state": "open", + "locked": false, + "title": "feat(developer): kmc-convert validate keylayout file 😎", + "user": { + "login": "SabineSIL", + "id": 86713187, + "node_id": "MDQ6VXNlcjg2NzEzMTg3", + "avatar_url": "https://avatars.githubusercontent.com/u/86713187?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SabineSIL", + "html_url": "https://github.com/SabineSIL", + "followers_url": "https://api.github.com/users/SabineSIL/followers", + "following_url": "https://api.github.com/users/SabineSIL/following{/other_user}", + "gists_url": "https://api.github.com/users/SabineSIL/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SabineSIL/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SabineSIL/subscriptions", + "organizations_url": "https://api.github.com/users/SabineSIL/orgs", + "repos_url": "https://api.github.com/users/SabineSIL/repos", + "events_url": "https://api.github.com/users/SabineSIL/events{/privacy}", + "received_events_url": "https://api.github.com/users/SabineSIL/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "body": "\r\n\r\n**The setup:** \r\n- The xsd-file : `resources\\standards-data\\keylayout\\dtd\\keylayout.xsd`\r\n- The `resources\\standards-data\\keylayout\\create_keylayout_schema.sh` exists and creates `resources\\standards-data\\keylayout\\keylayout.schema.json`\r\n- The `common/web/types/build.sh configure` creates a `common\\web\\types\\src\\schemas\\keylayout.schema.validator.mjs` file \r\n- The .mjs is then used in validate() function of `keylayout-file-reader.ts` (`...SchemaValidators.default.keylayout(source)`) \r\n\r\n**The problem:** \r\nAll the above works but while using the `validate20()` function of `keylayout.schema.validator.mjs` , **key0 will be \"?xml\"** which then produces the error.\r\n \r\n> \r\n> for (const **key0** in data) {\r\n> if (!(key0 === \"keyboard\")) {\r\n> validate20.errors = [{ instancePath, schemaPath: \"#/additionalProperties\", keyword: \"additionalProperties\", params: { additionalProperty: key0 }, message: \"must NOT have additional properties\" }];\r\n> return false;\r\n> break;\r\n> }\r\n> }\r\n\r\n**The error:** \r\n![image](https://github.com/user-attachments/assets/efa4a0ba-a53a-419f-9d39-15c61ce26fe5)\r\n\r\n**So the question is: Why is `?xml `treated as an element tag and how can we prevent this**\r\n\r\n@keymanapp-test-bot skip\r\n\r\nBuild-bot: skip", + "created_at": "2025-05-21T10:02:29Z", + "updated_at": "2025-05-26T01:30:35Z", + "closed_at": null, + "merged_at": null, + "merge_commit_sha": null, + "assignee": { + "login": "SabineSIL", + "id": 86713187, + "node_id": "MDQ6VXNlcjg2NzEzMTg3", + "avatar_url": "https://avatars.githubusercontent.com/u/86713187?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SabineSIL", + "html_url": "https://github.com/SabineSIL", + "followers_url": "https://api.github.com/users/SabineSIL/followers", + "following_url": "https://api.github.com/users/SabineSIL/following{/other_user}", + "gists_url": "https://api.github.com/users/SabineSIL/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SabineSIL/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SabineSIL/subscriptions", + "organizations_url": "https://api.github.com/users/SabineSIL/orgs", + "repos_url": "https://api.github.com/users/SabineSIL/repos", + "events_url": "https://api.github.com/users/SabineSIL/events{/privacy}", + "received_events_url": "https://api.github.com/users/SabineSIL/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "assignees": [ + { + "login": "SabineSIL", + "id": 86713187, + "node_id": "MDQ6VXNlcjg2NzEzMTg3", + "avatar_url": "https://avatars.githubusercontent.com/u/86713187?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/SabineSIL", + "html_url": "https://github.com/SabineSIL", + "followers_url": "https://api.github.com/users/SabineSIL/followers", + "following_url": "https://api.github.com/users/SabineSIL/following{/other_user}", + "gists_url": "https://api.github.com/users/SabineSIL/gists{/gist_id}", + "starred_url": "https://api.github.com/users/SabineSIL/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/SabineSIL/subscriptions", + "organizations_url": "https://api.github.com/users/SabineSIL/orgs", + "repos_url": "https://api.github.com/users/SabineSIL/repos", + "events_url": "https://api.github.com/users/SabineSIL/events{/privacy}", + "received_events_url": "https://api.github.com/users/SabineSIL/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + ], + "requested_reviewers": [ + + ], + "requested_teams": [ + + ], + "labels": [ + { + "id": 648605999, + "node_id": "MDU6TGFiZWw2NDg2MDU5OTk=", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/developer/", + "name": "developer/", + "color": "f9d0c4", + "default": false, + "description": "" + }, + { + "id": 1095223705, + "node_id": "MDU6TGFiZWwxMDk1MjIzNzA1", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/common/", + "name": "common/", + "color": "006b75", + "default": false, + "description": "" + }, + { + "id": 1298035273, + "node_id": "MDU6TGFiZWwxMjk4MDM1Mjcz", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/developer/compilers/", + "name": "developer/compilers/", + "color": "f9d0c4", + "default": false, + "description": "" + }, + { + "id": 1608627704, + "node_id": "MDU6TGFiZWwxNjA4NjI3NzA0", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/common/resources/", + "name": "common/resources/", + "color": "006b75", + "default": false, + "description": "Build infrastructure" + }, + { + "id": 2058996244, + "node_id": "MDU6TGFiZWwyMDU4OTk2MjQ0", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/feat", + "name": "feat", + "color": "84b6eb", + "default": false, + "description": "" + }, + { + "id": 2073602939, + "node_id": "MDU6TGFiZWwyMDczNjAyOTM5", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/common/web/", + "name": "common/web/", + "color": "006b75", + "default": false, + "description": "" + }, + { + "id": 7333596907, + "node_id": "LA_kwDOAY2xT88AAAABtR3O6w", + "url": "https://api.github.com/repos/keymanapp/keyman/labels/epic-kmc-convert", + "name": "epic-kmc-convert", + "color": "F9C2EE", + "default": false, + "description": "" + } + ], + "milestone": { + "url": "https://api.github.com/repos/keymanapp/keyman/milestones/229", + "html_url": "https://github.com/keymanapp/keyman/milestone/229", + "labels_url": "https://api.github.com/repos/keymanapp/keyman/milestones/229/labels", + "id": 12655812, + "node_id": "MI_kwDOAY2xT84AwRzE", + "number": 229, + "title": "A19S4", + "description": null, + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + }, + "open_issues": 108, + "closed_issues": 34, + "state": "open", + "created_at": "2025-04-02T03:26:05Z", + "updated_at": "2025-05-31T00:48:44Z", + "due_on": "2025-06-06T07:00:00Z", + "closed_at": null + }, + "draft": true, + "commits_url": "https://api.github.com/repos/keymanapp/keyman/pulls/14013/commits", + "review_comments_url": "https://api.github.com/repos/keymanapp/keyman/pulls/14013/comments", + "review_comment_url": "https://api.github.com/repos/keymanapp/keyman/pulls/comments{/number}", + "comments_url": "https://api.github.com/repos/keymanapp/keyman/issues/14013/comments", + "statuses_url": "https://api.github.com/repos/keymanapp/keyman/statuses/00158fdeeefc98e7d2b507729e91fab845415f6f", + "head": { + "label": "keymanapp:feat/developer/kmc-convert-validateKeylayout", + "ref": "feat/developer/kmc-convert-validateKeylayout", + "sha": "00158fdeeefc98e7d2b507729e91fab845415f6f", + "user": { + "login": "keymanapp", + "id": 12402926, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjEyNDAyOTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/12402926?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp", + "html_url": "https://github.com/keymanapp", + "followers_url": "https://api.github.com/users/keymanapp/followers", + "following_url": "https://api.github.com/users/keymanapp/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp/orgs", + "repos_url": "https://api.github.com/users/keymanapp/repos", + "events_url": "https://api.github.com/users/keymanapp/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "repo": { + "id": 26063183, + "node_id": "MDEwOlJlcG9zaXRvcnkyNjA2MzE4Mw==", + "name": "keyman", + "full_name": "keymanapp/keyman", + "private": false, + "owner": { + "login": "keymanapp", + "id": 12402926, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjEyNDAyOTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/12402926?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp", + "html_url": "https://github.com/keymanapp", + "followers_url": "https://api.github.com/users/keymanapp/followers", + "following_url": "https://api.github.com/users/keymanapp/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp/orgs", + "repos_url": "https://api.github.com/users/keymanapp/repos", + "events_url": "https://api.github.com/users/keymanapp/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/keymanapp/keyman", + "description": "Keyman cross platform input methods system running on Android, iOS, Linux, macOS, Windows and mobile and desktop web", + "fork": false, + "url": "https://api.github.com/repos/keymanapp/keyman", + "forks_url": "https://api.github.com/repos/keymanapp/keyman/forks", + "keys_url": "https://api.github.com/repos/keymanapp/keyman/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/keymanapp/keyman/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/keymanapp/keyman/teams", + "hooks_url": "https://api.github.com/repos/keymanapp/keyman/hooks", + "issue_events_url": "https://api.github.com/repos/keymanapp/keyman/issues/events{/number}", + "events_url": "https://api.github.com/repos/keymanapp/keyman/events", + "assignees_url": "https://api.github.com/repos/keymanapp/keyman/assignees{/user}", + "branches_url": "https://api.github.com/repos/keymanapp/keyman/branches{/branch}", + "tags_url": "https://api.github.com/repos/keymanapp/keyman/tags", + "blobs_url": "https://api.github.com/repos/keymanapp/keyman/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/keymanapp/keyman/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/keymanapp/keyman/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/keymanapp/keyman/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/keymanapp/keyman/statuses/{sha}", + "languages_url": "https://api.github.com/repos/keymanapp/keyman/languages", + "stargazers_url": "https://api.github.com/repos/keymanapp/keyman/stargazers", + "contributors_url": "https://api.github.com/repos/keymanapp/keyman/contributors", + "subscribers_url": "https://api.github.com/repos/keymanapp/keyman/subscribers", + "subscription_url": "https://api.github.com/repos/keymanapp/keyman/subscription", + "commits_url": "https://api.github.com/repos/keymanapp/keyman/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/keymanapp/keyman/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/keymanapp/keyman/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/keymanapp/keyman/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/keymanapp/keyman/contents/{+path}", + "compare_url": "https://api.github.com/repos/keymanapp/keyman/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/keymanapp/keyman/merges", + "archive_url": "https://api.github.com/repos/keymanapp/keyman/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/keymanapp/keyman/downloads", + "issues_url": "https://api.github.com/repos/keymanapp/keyman/issues{/number}", + "pulls_url": "https://api.github.com/repos/keymanapp/keyman/pulls{/number}", + "milestones_url": "https://api.github.com/repos/keymanapp/keyman/milestones{/number}", + "notifications_url": "https://api.github.com/repos/keymanapp/keyman/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/keymanapp/keyman/labels{/name}", + "releases_url": "https://api.github.com/repos/keymanapp/keyman/releases{/id}", + "deployments_url": "https://api.github.com/repos/keymanapp/keyman/deployments", + "created_at": "2014-11-01T21:01:44Z", + "updated_at": "2025-05-31T18:02:06Z", + "pushed_at": "2025-05-31T18:02:03Z", + "git_url": "git://github.com/keymanapp/keyman.git", + "ssh_url": "git@github.com:keymanapp/keyman.git", + "clone_url": "https://github.com/keymanapp/keyman.git", + "svn_url": "https://github.com/keymanapp/keyman", + "homepage": "https://keyman.com/", + "size": 489713, + "stargazers_count": 456, + "watchers_count": 456, + "language": "Pascal", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 120, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1043, + "license": { + "key": "other", + "name": "Other", + "spdx_id": "NOASSERTION", + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "android", + "css", + "hacktoberfest", + "ios", + "javascript", + "keyboard", + "keyboard-layouts", + "keyman", + "linux", + "macos", + "unicode", + "web", + "windows" + ], + "visibility": "public", + "forks": 120, + "open_issues": 1043, + "watchers": 456, + "default_branch": "master" + } + }, + "base": { + "label": "keymanapp:feat/developer/kmc-convert", + "ref": "feat/developer/kmc-convert", + "sha": "c7f6d15105920d8df18d8973b4f24846fa14ea27", + "user": { + "login": "keymanapp", + "id": 12402926, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjEyNDAyOTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/12402926?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp", + "html_url": "https://github.com/keymanapp", + "followers_url": "https://api.github.com/users/keymanapp/followers", + "following_url": "https://api.github.com/users/keymanapp/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp/orgs", + "repos_url": "https://api.github.com/users/keymanapp/repos", + "events_url": "https://api.github.com/users/keymanapp/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "repo": { + "id": 26063183, + "node_id": "MDEwOlJlcG9zaXRvcnkyNjA2MzE4Mw==", + "name": "keyman", + "full_name": "keymanapp/keyman", + "private": false, + "owner": { + "login": "keymanapp", + "id": 12402926, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjEyNDAyOTI2", + "avatar_url": "https://avatars.githubusercontent.com/u/12402926?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp", + "html_url": "https://github.com/keymanapp", + "followers_url": "https://api.github.com/users/keymanapp/followers", + "following_url": "https://api.github.com/users/keymanapp/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp/orgs", + "repos_url": "https://api.github.com/users/keymanapp/repos", + "events_url": "https://api.github.com/users/keymanapp/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "html_url": "https://github.com/keymanapp/keyman", + "description": "Keyman cross platform input methods system running on Android, iOS, Linux, macOS, Windows and mobile and desktop web", + "fork": false, + "url": "https://api.github.com/repos/keymanapp/keyman", + "forks_url": "https://api.github.com/repos/keymanapp/keyman/forks", + "keys_url": "https://api.github.com/repos/keymanapp/keyman/keys{/key_id}", + "collaborators_url": "https://api.github.com/repos/keymanapp/keyman/collaborators{/collaborator}", + "teams_url": "https://api.github.com/repos/keymanapp/keyman/teams", + "hooks_url": "https://api.github.com/repos/keymanapp/keyman/hooks", + "issue_events_url": "https://api.github.com/repos/keymanapp/keyman/issues/events{/number}", + "events_url": "https://api.github.com/repos/keymanapp/keyman/events", + "assignees_url": "https://api.github.com/repos/keymanapp/keyman/assignees{/user}", + "branches_url": "https://api.github.com/repos/keymanapp/keyman/branches{/branch}", + "tags_url": "https://api.github.com/repos/keymanapp/keyman/tags", + "blobs_url": "https://api.github.com/repos/keymanapp/keyman/git/blobs{/sha}", + "git_tags_url": "https://api.github.com/repos/keymanapp/keyman/git/tags{/sha}", + "git_refs_url": "https://api.github.com/repos/keymanapp/keyman/git/refs{/sha}", + "trees_url": "https://api.github.com/repos/keymanapp/keyman/git/trees{/sha}", + "statuses_url": "https://api.github.com/repos/keymanapp/keyman/statuses/{sha}", + "languages_url": "https://api.github.com/repos/keymanapp/keyman/languages", + "stargazers_url": "https://api.github.com/repos/keymanapp/keyman/stargazers", + "contributors_url": "https://api.github.com/repos/keymanapp/keyman/contributors", + "subscribers_url": "https://api.github.com/repos/keymanapp/keyman/subscribers", + "subscription_url": "https://api.github.com/repos/keymanapp/keyman/subscription", + "commits_url": "https://api.github.com/repos/keymanapp/keyman/commits{/sha}", + "git_commits_url": "https://api.github.com/repos/keymanapp/keyman/git/commits{/sha}", + "comments_url": "https://api.github.com/repos/keymanapp/keyman/comments{/number}", + "issue_comment_url": "https://api.github.com/repos/keymanapp/keyman/issues/comments{/number}", + "contents_url": "https://api.github.com/repos/keymanapp/keyman/contents/{+path}", + "compare_url": "https://api.github.com/repos/keymanapp/keyman/compare/{base}...{head}", + "merges_url": "https://api.github.com/repos/keymanapp/keyman/merges", + "archive_url": "https://api.github.com/repos/keymanapp/keyman/{archive_format}{/ref}", + "downloads_url": "https://api.github.com/repos/keymanapp/keyman/downloads", + "issues_url": "https://api.github.com/repos/keymanapp/keyman/issues{/number}", + "pulls_url": "https://api.github.com/repos/keymanapp/keyman/pulls{/number}", + "milestones_url": "https://api.github.com/repos/keymanapp/keyman/milestones{/number}", + "notifications_url": "https://api.github.com/repos/keymanapp/keyman/notifications{?since,all,participating}", + "labels_url": "https://api.github.com/repos/keymanapp/keyman/labels{/name}", + "releases_url": "https://api.github.com/repos/keymanapp/keyman/releases{/id}", + "deployments_url": "https://api.github.com/repos/keymanapp/keyman/deployments", + "created_at": "2014-11-01T21:01:44Z", + "updated_at": "2025-05-31T18:02:06Z", + "pushed_at": "2025-05-31T18:02:03Z", + "git_url": "git://github.com/keymanapp/keyman.git", + "ssh_url": "git@github.com:keymanapp/keyman.git", + "clone_url": "https://github.com/keymanapp/keyman.git", + "svn_url": "https://github.com/keymanapp/keyman", + "homepage": "https://keyman.com/", + "size": 489713, + "stargazers_count": 456, + "watchers_count": 456, + "language": "Pascal", + "has_issues": true, + "has_projects": true, + "has_downloads": true, + "has_wiki": true, + "has_pages": false, + "has_discussions": false, + "forks_count": 120, + "mirror_url": null, + "archived": false, + "disabled": false, + "open_issues_count": 1043, + "license": { + "key": "other", + "name": "Other", + "spdx_id": "NOASSERTION", + "url": null, + "node_id": "MDc6TGljZW5zZTA=" + }, + "allow_forking": true, + "is_template": false, + "web_commit_signoff_required": false, + "topics": [ + "android", + "css", + "hacktoberfest", + "ios", + "javascript", + "keyboard", + "keyboard-layouts", + "keyman", + "linux", + "macos", + "unicode", + "web", + "windows" + ], + "visibility": "public", + "forks": 120, + "open_issues": 1043, + "watchers": 456, + "default_branch": "master" + } + }, + "_links": { + "self": { + "href": "https://api.github.com/repos/keymanapp/keyman/pulls/14013" + }, + "html": { + "href": "https://github.com/keymanapp/keyman/pull/14013" + }, + "issue": { + "href": "https://api.github.com/repos/keymanapp/keyman/issues/14013" + }, + "comments": { + "href": "https://api.github.com/repos/keymanapp/keyman/issues/14013/comments" + }, + "review_comments": { + "href": "https://api.github.com/repos/keymanapp/keyman/pulls/14013/comments" + }, + "review_comment": { + "href": "https://api.github.com/repos/keymanapp/keyman/pulls/comments{/number}" + }, + "commits": { + "href": "https://api.github.com/repos/keymanapp/keyman/pulls/14013/commits" + }, + "statuses": { + "href": "https://api.github.com/repos/keymanapp/keyman/statuses/00158fdeeefc98e7d2b507729e91fab845415f6f" + } + }, + "author_association": "CONTRIBUTOR", + "auto_merge": null, + "active_lock_reason": null, + "merged": false, + "mergeable": false, + "rebaseable": false, + "mergeable_state": "dirty", + "merged_by": null, + "comments": 1, + "review_comments": 0, + "maintainer_can_modify": false, + "commits": 5, + "additions": 639, + "deletions": 12, + "changed_files": 13 +} \ No newline at end of file diff --git a/resources/build/test/build-bot/pr-9999-commits.txt b/resources/build/test/build-bot/pr-9999-commits.txt new file mode 100644 index 0000000000..ac257dfa8e --- /dev/null +++ b/resources/build/test/build-bot/pr-9999-commits.txt @@ -0,0 +1,17 @@ +[ + { + "commit": { + "message": "maint(common): test\nBuild-bot: build windows\n" + } + }, + { + "commit": { + "message": "maint(common): test\nBuild-bot: release windows\n" + } + }, + { + "commit": { + "message": "maint(common): test\nBuild-bot: skip windows\n" + } + } +] diff --git a/resources/build/test/build-bot/pr-9999-data.txt b/resources/build/test/build-bot/pr-9999-data.txt new file mode 100644 index 0000000000..2894897ccf --- /dev/null +++ b/resources/build/test/build-bot/pr-9999-data.txt @@ -0,0 +1,3 @@ +{ + "body": "Build-bot: release developer\r\nBuild-bot: skip windows\r\n" +} \ No newline at end of file diff --git a/resources/build/test/build-bot/trigger-build-bot.test.sh b/resources/build/test/build-bot/trigger-build-bot.test.sh new file mode 100755 index 0000000000..c0d914a6ce --- /dev/null +++ b/resources/build/test/build-bot/trigger-build-bot.test.sh @@ -0,0 +1,198 @@ +#!/usr/bin/env bash + +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" +. "${THIS_SCRIPT%/*}/../../../../resources/build/build-utils.sh" +# END STANDARD BUILD SCRIPT INCLUDE + +. "${THIS_SCRIPT_PATH}/../../trigger-definitions.inc.sh" +. "${THIS_SCRIPT_PATH}/../../trigger-build-bot.inc.sh" +. "${THIS_SCRIPT_PATH}/../test-utils.inc.sh" +. "${KEYMAN_ROOT}/resources/build/jq.inc.sh" + +# Initialize builder, no input parameters needed for these tests +builder_parse "" + +readonly ALL_BUILD_PLATFORMS_SKIP_EXPECTED='[ios]="skip" [web]="skip" [linux]="skip" [common_mac]="skip" [common_windows]="skip" [mac]="skip" [windows]="skip" [common_web]="skip" [android]="skip" [developer]="skip" [common_linux]="skip"' +readonly ALL_BUILD_PLATFORMS_BUILD_EXPECTED='[ios]="build" [web]="build" [linux]="build" [common_mac]="build" [common_windows]="build" [mac]="build" [windows]="build" [common_web]="build" [android]="build" [developer]="build" [common_linux]="build"' + +#---------------------------------------------------------------------------------------------------- +# Test build bot message parsing (e2e) +#---------------------------------------------------------------------------------------------------- + +test_build_bot_check_messages() { + builder_echo start test_build_bot_check_messages 'START TEST: build_bot_check_messages' + + # Mostly real data (only Build-bot commands edited for test) + _do_test_build_bot_check_messages_file 14013 "[windows]=release" "$ALL_BUILD_PLATFORMS_SKIP_EXPECTED" + # Simplified data for testing Build-bot command sequences only + _do_test_build_bot_check_messages_file 9999 "[windows]=release" '[windows]="skip" [developer]="release"' + # Test some bad inputs + _do_test_build_bot_check_messages_inline 1 "[windows]=release" '[windows]="release"' '{}' '[{ "commit": { "message": "maint(common): test\nBuild-bot: foo windows\n" }}]' + # empty body, 'foo windows' in commit + _do_test_build_bot_check_messages_inline 2 "[windows]=release" '[windows]="release"' '{ "body": "" }' '[{ "commit": { "message": "maint(common): test\nBuild-bot: foo windows\n" }}]' + # attempts to escape jail + _do_test_build_bot_check_messages_inline 3 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: '"'"'echo foo" }' '[{ "commit": { "message": "maint(common): test\n" }}]' + _do_test_build_bot_check_messages_inline 4 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: echo *" }' '[{ "commit": { "message": "maint(common): test\n" }}]' + _do_test_build_bot_check_messages_inline 5 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: \\0" }' '[{ "commit": { "message": "maint(common): test\n" }}]' + _do_test_build_bot_check_messages_inline 5 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: `echo escaped`" }' '[{ "commit": { "message": "maint(common): test\n" }}]' + _do_test_build_bot_check_messages_inline 6 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: ' '[{ "commit": { "message": "maint(common): test\n" }}]' + # incomplete command + _do_test_build_bot_check_messages_inline 7 "[windows]=release" '[windows]="release"' '{ "body": "Build-bot: " }' '[{ "commit": { "message": "maint(common): test\n" }}]' + + builder_echo end test_build_bot_check_messages success 'SUCCESS: build_bot_check_messages' +} + +# +# Test a set of Build-bot commands from a file +# +# Parameters: +# 1: PR number +# 2: Input build platforms based on touched files in PR +# 3: Expected build command +_do_test_build_bot_check_messages_file() { + local prnum=$1 + eval "declare -gA build_platforms=($2)" + eval "declare -A expected_build_platforms=($3)" + + build_bot_check_messages $prnum "$(cat ${THIS_SCRIPT_PATH}/pr-$prnum-data.txt)" "$(cat ${THIS_SCRIPT_PATH}/pr-$prnum-commits.txt)" + + for i in "${!expected_build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done + for i in "${!build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done +} + +# +# Test a set of Build-bot commands from parameters +# +# Parameters: +# 1: PR number +# 2: Input build platforms based on touched files in PR +# 3: Expected build command +# 4: JSON PR details (GitHub PR format) +# 5: JSON commit messages (GitHub PR format) +_do_test_build_bot_check_messages_inline() { + local prnum=$1 + eval "declare -gA build_platforms=($2)" + eval "declare -A expected_build_platforms=($3)" + + local prinfo="$4" + local prcommits="$5" + + build_bot_check_messages $prnum "$prinfo" "$prcommits" + + for i in "${!expected_build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done + for i in "${!build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done +} + +#---------------------------------------------------------------------------------------------------- +# Test parsing of a single Build-bot command +#---------------------------------------------------------------------------------------------------- + +test_build_bot_update_commands() { + builder_echo start test_build_bot_update_commands 'START TEST: build_bot_update_commands' + _do_test_build_bot_update_commands '[windows]="release"' "skip windows" '[windows]="skip"' + _do_test_build_bot_update_commands '[windows]="release"' "skip windows,developer" '[windows]="skip" [developer]="skip"' + _do_test_build_bot_update_commands '[windows]="release"' "build developer" '[windows]="release" [developer]="build"' + _do_test_build_bot_update_commands '[windows]="release"' "skip windows" '[windows]="skip"' + _do_test_build_bot_update_commands '[windows]="release"' "access foo" '[windows]="release"' + _do_test_build_bot_update_commands '[windows]="release"' "build foo" '[windows]="release"' + _do_test_build_bot_update_commands '[windows]="release"' "build common" '[common]="build" [windows]="release"' + _do_test_build_bot_update_commands '[windows]="release"' "build all" "$ALL_BUILD_PLATFORMS_BUILD_EXPECTED" + builder_echo end test_build_bot_update_commands success 'SUCCESS: build_bot_update_commands' +} + +# +# Test a command +# +# Parameters: +# 1: starting build array based on PR files changed +# 2: build-bot command +# 3: expected finishing build array +# +_do_test_build_bot_update_commands() { + eval "declare -gA build_platforms=($1)" + local update_command="$2" + eval "declare -A expected_build_platforms=($3)" + + build_bot_update_commands $update_command + + for i in "${!expected_build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "build_platforms[$i]" + done + for i in "${!build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "build_platforms[$i]" + done +} + +#---------------------------------------------------------------------------------------------------- + +test_build_bot_verify_platforms() { + builder_echo start test_build_bot_verify_platforms 'START TEST: build_bot_verify_platforms' + _do_test_build_bot_verify_platforms "windows mac" "windows mac" + _do_test_build_bot_verify_platforms "windows foo" "windows" + _do_test_build_bot_verify_platforms "core" "core" + _do_test_build_bot_verify_platforms "all" "${available_platforms[*]}" + builder_echo end test_build_bot_verify_platforms success 'SUCCESS: build_bot_verify_platforms' +} + +_do_test_build_bot_verify_platforms() { + local platforms=($1) + local expected_platforms=($2) + + build_bot_verify_platforms platforms + + assert-equal ${#platforms[@]} ${#expected_platforms[@]} "#platforms[@]" + for i in "${!expected_platforms[@]}"; do + assert-equal "${platforms[$i]}" "${expected_platforms[$i]}" "platforms[$i]" + done +} + +#---------------------------------------------------------------------------------------------------- + +# If we have a Test-bot: skip, or no Test-bot: command, then we downgrade +# 'release' to a 'build' + +test_test_bot_check_pr_body() { + builder_echo start test_test_bot_check_pr_body 'START TEST: test_bot_check_pr_body' + # Test-bot: skip means that we should only do a build+test, not a release build + _do_test_test_bot_check_pr_body 1 '[windows]="release"' '{ "body": "Test-bot: skip" }' '[windows]="build"' + # Empty body means that we should only do a build+test, not a release build + _do_test_test_bot_check_pr_body 2 '[windows]="release"' '{ "body": "" }' '[windows]="build"' + # '# User Testing' we will assume means there are unit tests + _do_test_test_bot_check_pr_body 3 '[windows]="release"' '{ "body": "Some text\n# User Testing\n" }' '[windows]="release"' + # Invalid test-bot command, treat as a skip + _do_test_test_bot_check_pr_body 4 '[windows]="release"' '{ "body": "Test-bot: " }' '[windows]="build"' + builder_echo end test_test_bot_check_pr_body success 'SUCCESS: test_bot_check_pr_body' +} + +_do_test_test_bot_check_pr_body() { + local prnum=$1 + eval "declare -gA build_platforms=($2)" + local prinfo="$3" + eval "declare -A expected_build_platforms=($4)" + + test_bot_check_pr_body $prnum "$prinfo" + + for i in "${!expected_build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done + for i in "${!build_platforms[@]}"; do + assert-equal "${build_platforms[$i]}" "${expected_build_platforms[$i]}" "PR #$prnum: build_platforms[$i]" + done +} + +#---------------------------------------------------------------------------------------------------- + +test_build_bot_verify_platforms +test_build_bot_update_commands +test_build_bot_check_messages +test_test_bot_check_pr_body \ No newline at end of file diff --git a/resources/build/test/test-utils.inc.sh b/resources/build/test/test-utils.inc.sh index 47f0aca33e..a73f46773a 100644 --- a/resources/build/test/test-utils.inc.sh +++ b/resources/build/test/test-utils.inc.sh @@ -7,8 +7,8 @@ function assert-equal() { fi if [[ "$actual" != "$expected" ]]; then - builder_die "FAIL: ${message}expected actual '$actual' to equal expected '$expected'" + builder_die " ✕ FAIL: ${message}actual result '$actual' should equal expected '$expected'" else - builder_echo green "PASS: ${message}expected actual '$actual' to be equal to expected '$expected'" + builder_echo green " ✓ PASS: ${message}result '$actual' is correct" fi } diff --git a/resources/build/trigger-build-bot.inc.sh b/resources/build/trigger-build-bot.inc.sh new file mode 100644 index 0000000000..d55ac473ae --- /dev/null +++ b/resources/build/trigger-build-bot.inc.sh @@ -0,0 +1,163 @@ +#!/usr/bin/env bash + +# set -eu + +# . ./trigger-definitions.inc.sh + +# +# Check the Test-bot command in the PR body for commands relevant to the build +# bot, and update global build_platforms accordingly +# +# If the Test-bot command is 'skip', or there are no test bot instructions, then we +# will default to a 'build' for all default build platforms, instead of +# 'release'; this can be overridden by any Build-bot commands in commits or in +# the PR body. +# +# Parameters: +# 1: PR number (not currently used) +# 2: PR JSON data from api.github.com/repos/keymanapp/keyman/pulls/# +# +function test_bot_check_pr_body() { + local PRNUM=$1 + local prinfo="$2" + + set -o noglob + IFS=$'\n' + local prbody="$(echo "$prinfo" | "${JQ}" -r '.body')" + local prTestCommand="$(echo "$prbody" | grep 'Test-bot:' | cut -d: -f 2 - | cut -d' ' -f 1 -)" + local prTestBody="$(echo "$prbody" | grep -i '# User Testing')" + unset IFS + set +o noglob + + if ([[ "$prTestCommand" == skip ]] || [[ -z "${prTestCommand// }" ]]) && [[ -z "${prTestBody// }" ]]; then + local platform + for platform in "${!build_platforms[@]}"; do + build_platforms[$platform]=build + done + fi +} + +# +# Check PR commit messages for Build-bot commands Later commands override +# earlier ones. Also checks PR body for any overriding commands. Note, only +# checks the first 250 commits, so later build commands will be ignored; in this +# situation, use the PR body command. Also ignores build commands in PR +# comments, for sake of performance +# +# The bot will also check the Test-bot: trailer in the PR body, if it exists, but +# will not check any other commits. If the Test-bot: command is just 'skip', then +# by default, all builds will be set to 'build' instead of 'release' +# +# Parameters: +# 1: PR number to check +# 2: PR JSON data from api.github.com/repos/keymanapp/keyman/pulls/# +# 3: Commit JSON data from api.github.com/repos/keymanapp/keyman/pulls/#/commits +# +function build_bot_check_messages() { + local PRNUM=$1 + local prinfo="$2" + local prcommits="$3" + + # We don't want any globbing happening in our parse + + set -o noglob + + # Extract the Build-bot commands from commit messages and the PR body + + + IFS=$'\n' + local buildBotCommands=($(echo "$prcommits" | "${JQ}" -r '.[].commit.message' | grep 'Build-bot:' | cut -d: -f 2 -)) + local prCommands=($(echo "$prinfo" | "${JQ}" -r '.body' | tr -d '\r' | grep 'Build-bot:' | cut -d: -f 2 -)) + unset IFS + + # The PR body Build-bot comment will be read last, which allows it to override + # all previous commands + + if [[ ${#prCommands[@]} -gt 0 ]]; then + buildBotCommands+=("${prCommands[@]}") + fi + + # We now know that our command has only a-z, comma and space, so we can parse + # without risking escaping our bash jail + + for buildBotCommand in "${buildBotCommands[@]}"; do + # Block illegal Build-bot: commands + if [[ ! "$buildBotCommand" =~ ^[a-z,\ ]+$ ]]; then + builder_echo warning "WARNING[Build-bot]: ignoring invalid command: '${buildBotCommand}'" + continue + fi + + if [[ ! -z "${buildBotCommand// }" ]]; then + build_bot_update_commands $buildBotCommand + fi + done + + set +o noglob +} + +# +# parses a 'Build-bot: [platform...]' command and modifies +# the global build_platforms associative array with new levels +# note that this function assumes that inputs are sanitized, see +# build_bot_check_messages +# +function build_bot_update_commands() { + local level= + local platforms= + local command="$*" + + if [[ $# == 1 ]]; then + level=$1 + platforms=all + else + level=$1 + shift + + # remaining parameters are comma/space separated platforms + IFS=', ' + read -r -a platforms <<< "$*" + unset IFS + fi + + if [[ ! $level =~ ^$valid_build_levels$ ]]; then + # Just skip this build command + builder_echo warning "WARNING[Build-bot]: ignoring invalid build level '$level' in command '$command'" + return 0 + fi + + build_bot_verify_platforms platforms + + # a build command should be [platform[, platform...]] + + local platform + for platform in "${platforms[@]}"; do + builder_echo "Build-bot: Updating build level for $platform to $level" + build_platforms[$platform]=$level + done +} + +# +# Strip any unrecognized platforms and expand 'all' to actual platforms +# +# Parameters: +# 1: name of platforms array parameter (byref) +# +function build_bot_verify_platforms() { + local -n input_platforms=$1 + local output_platforms=() + local platform + for platform in "${input_platforms[@]}"; do + # We'll emit a warning with invalid platforms, then remove them from the array + if [[ ! $platform =~ ^(all|$available_platforms_regex)$ ]]; then + builder_echo warning "WARNING[Build-bot]: ignoring invalid platform '$platform'" + elif [[ $platform == all ]]; then + input_platforms=(${available_platforms[@]}) + return + else + if [[ ! "${output_platforms[@]}" =~ $platform ]]; then + output_platforms+=($platform) + fi + fi + done + input_platforms=("${output_platforms[@]}") +} diff --git a/resources/build/trigger-builds.inc.sh b/resources/build/trigger-builds.inc.sh index 639c3d240b..44427170a3 100644 --- a/resources/build/trigger-builds.inc.sh +++ b/resources/build/trigger-builds.inc.sh @@ -1,10 +1,9 @@ #!/usr/bin/env bash # -# Tell TeamCity to trigger new builds +# Tell TeamCity to trigger new release builds # - -function triggerBuilds() { +function triggerReleaseBuilds() { local base=`git branch --show-current` # convert stable-14.0 to stable_14_0 to fit in with the definitions # in trigger-definitions.inc.sh @@ -19,38 +18,44 @@ function triggerBuilds() { if [[ $build == "" ]]; then continue; fi if [ "${build:(-7)}" == "_GitHub" ]; then local job=${build%_GitHub} - echo Triggering GitHub action build "$job" "$base" - triggerGitHubActionsBuild false "$job" "$base" + echo "Triggering GitHub action release build (isTestBuild=false) (level=release) $job $base" + triggerGitHubActionsBuild false release "$job" "$base" else - echo Triggering TeamCity build false $build $TEAMCITY_VCS_ID $base - triggerTeamCityBuild false $build $TEAMCITY_VCS_ID $base + echo "Triggering TeamCity release build (isTestBuild=false) (level=release) $build $TEAMCITY_VCS_ID $base" + triggerTeamCityBuild false release $build $TEAMCITY_VCS_ID $base fi done done } +# +# Trigger a build on TeamCity +# +# Parameters: +# 1: 'true' if this is for a PR branch, otherwise 'false' (for master/beta/stable-x.y) +# 2: 'skip' - don't run build; 'build' - run build and unit tests; 'release' - run build, unit tests, and deploy +# 3: TeamCity build configuration name +# 4: TeamCity VCS id, which is different for PR test configurations +# 5: branch name in git +# function triggerTeamCityBuild() { local isTestBuild="$1" - local TEAMCITY_BUILDTYPE="$2" - local TEAMCITY_VCS_ID="$3" - - if [[ $# -gt 3 ]]; then - local TEAMCITY_BRANCH_NAME="$4" - #debug echo " Triggering build for: $TEAMCITY_BRANCH_NAME" - TEAMCITY_BRANCH_NAME="branchName='$TEAMCITY_BRANCH_NAME' defaultBranch='false'" - else - local TEAMCITY_BRANCH_NAME= - fi + local buildLevel="$2" + local TEAMCITY_BUILDTYPE="$3" + local TEAMCITY_VCS_ID="$4" + local TEAMCITY_BRANCH_NAME="$5" local GIT_OID=`git rev-parse HEAD` local TEAMCITY_SERVER=https://build.palaso.org local command + # TODO: add buildLevel parameter + if $isTestBuild; then - command="" + command="" else - command="" + command="" fi echo "TeamCity Build Command: $command" @@ -66,10 +71,21 @@ function triggerTeamCityBuild() { echo } +# +# Trigger a build on GitHub Actions +# +# Parameters: +# 1: 'true' if this is for a PR branch, otherwise 'false' (for master/beta/stable-x.y) +# 2: 'skip' - don't run build; 'build' - run build and unit tests; 'test' - run build, unit tests, and deploy +# 3: Action name +# 4: branch name in git +# function triggerGitHubActionsBuild() { local IS_TEST_BUILD="$1" - local GITHUB_ACTION="$2" - local GIT_BRANCH="${3:-master}" + local BUILD_LEVEL="$2" + local GITHUB_ACTION="$3" + local GIT_BRANCH="$4" + # TODO: support BUILD_LEVEL local GIT_BASE_BRANCH="${GIT_BRANCH}" local GIT_USER="keyman-server" local GIT_BUILD_SHA GIT_BASE_REF JSON diff --git a/resources/build/trigger-definitions.inc.sh b/resources/build/trigger-definitions.inc.sh index e4ed49d90d..dc0338ffb8 100644 --- a/resources/build/trigger-definitions.inc.sh +++ b/resources/build/trigger-definitions.inc.sh @@ -5,9 +5,34 @@ # Maps to ci/cancel-builds/trigger-definitions.mjs and must be kept in sync # +# +# Build levels +# + +readonly build_level_skip=skip +readonly build_level_build=build +readonly build_level_release=release +readonly valid_build_levels="$build_level_skip|$build_level_build|$build_level_release" + +# +# Target platforms +# available_platforms=(android common_web common_windows common_mac common_linux ios linux mac web windows developer) +declare -Ag main_branch_platform_build_levels +for available_platforms_i in "${available_platforms[@]}"; do + main_branch_platform_build_levels[$available_platforms_i]=$build_level_build +done +readonly main_branch_platform_build_levels +readonly available_platforms + + +available_platforms_regex=`echo "${available_platforms[@]}" | sed 's/ /|/g'` + +# We also allow 'common' and 'core' platforms for Build-bot: commands +readonly available_platforms_regex="$available_platforms_regex|common|core" + # the base folder for each pattern does not need to be included, nor oem folders # e.g. android='common/models|common/predictive-text' # will expand into android='^(android|(oem/[^/]+/android)|common/models|common/predictive-text)' @@ -57,6 +82,13 @@ bc_test_common_windows=(Keyman_Test_Common_Windows) bc_test_common_mac=(Keyman_Test_Common_Mac) bc_test_common_linux=(Keyman_Test_Common_Linux) +# These configuration arrays are triggered only by Build-bot commands: + +bc_test_common=(Keyman_Test_Common_Web Keyman_Test_Common_Windows Keyman_Test_Common_Mac Keyman_Test_Common_Linux) +bc_test_core=(Keyman_Common_KPAPI_TestPullRequests_Linux Keyman_Common_KPAPI_TestPullRequests_macOS Keyman_Common_KPAPI_TestPullRequests_Windows) + +# Core is tested directly for target platforms + # Keymanweb_TestPullRequestRegressions : currently this is timing out so disabled until we have # time to investigate further From ee6958a8963589ae9b106fe54743ed6d09e3c76c Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Fri, 13 Jun 2025 16:10:15 -0500 Subject: [PATCH 03/17] feat(developer): test fixes for line numbers in layr compiler Fixes #13940 --- .../test/fixtures/sections/layr/invalid-missing-layer.xml | 2 +- developer/src/kmc-ldml/test/layr.tests.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/developer/src/kmc-ldml/test/fixtures/sections/layr/invalid-missing-layer.xml b/developer/src/kmc-ldml/test/fixtures/sections/layr/invalid-missing-layer.xml index 211961d616..4525675fe9 100644 --- a/developer/src/kmc-ldml/test/fixtures/sections/layr/invalid-missing-layer.xml +++ b/developer/src/kmc-ldml/test/fixtures/sections/layr/invalid-missing-layer.xml @@ -8,7 +8,7 @@ - + diff --git a/developer/src/kmc-ldml/test/layr.tests.ts b/developer/src/kmc-ldml/test/layr.tests.ts index a1f3c5e184..64e4a3d373 100644 --- a/developer/src/kmc-ldml/test/layr.tests.ts +++ b/developer/src/kmc-ldml/test/layr.tests.ts @@ -108,13 +108,13 @@ describe('layr', function () { { // missing layer element subpath: 'sections/layr/invalid-missing-layer.xml', - errors: [LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement(withOffset(258))], + errors: [LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement(withOffset(40))], retainOffsetInMessages: true, }, { // missing layer element subpath: 'sections/layr/invalid-missing-layer2.xml', - errors: [LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement()], + errors: [LdmlCompilerMessages.Error_MustBeAtLeastOneLayerElement(withOffset(40))], retainOffsetInMessages: true, }, { From 9896fb878fc4f8d9a4bebf55c4d09a65ca6b5bfd Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Sat, 14 Jun 2025 07:29:31 +1000 Subject: [PATCH 04/17] maint(common): pass buildLevel to TeamCity / GHA --- resources/build/trigger-builds.inc.sh | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/resources/build/trigger-builds.inc.sh b/resources/build/trigger-builds.inc.sh index 44427170a3..aa07a30089 100644 --- a/resources/build/trigger-builds.inc.sh +++ b/resources/build/trigger-builds.inc.sh @@ -45,18 +45,18 @@ function triggerTeamCityBuild() { local TEAMCITY_VCS_ID="$4" local TEAMCITY_BRANCH_NAME="$5" - local GIT_OID=`git rev-parse HEAD` local TEAMCITY_SERVER=https://build.palaso.org - local command + local commandProperties="" + local commandLastChanges= - # TODO: add buildLevel parameter - - if $isTestBuild; then - command="" - else - command="" + if ! $isTestBuild; then + local GIT_OID=`git rev-parse HEAD` + commandLastChanges="" fi + + local command="$commandLastChanges$commandProperties" + echo "TeamCity Build Command: $command" # adjust indentation for output of curl @@ -85,7 +85,6 @@ function triggerGitHubActionsBuild() { local BUILD_LEVEL="$2" local GITHUB_ACTION="$3" local GIT_BRANCH="$4" - # TODO: support BUILD_LEVEL local GIT_BASE_BRANCH="${GIT_BRANCH}" local GIT_USER="keyman-server" local GIT_BUILD_SHA GIT_BASE_REF JSON @@ -97,7 +96,8 @@ function triggerGitHubActionsBuild() { GIT_BUILD_SHA="$(git rev-parse "refs/tags/release@$KEYMAN_VERSION_WITH_TAG")" GIT_BASE_REF="$(git rev-parse "${GIT_BUILD_SHA}^")" GIT_EVENT_TYPE="${GITHUB_ACTION}: release@${KEYMAN_VERSION_WITH_TAG}" - elif [[ $GIT_BRANCH != stable-* ]] && [[ $GIT_BRANCH =~ [0-9]+ ]]; then + elif [[ $GIT_BRANCH =~ ^[0-9]+$ ]]; then + # pull request local JSON=$(call_curl "${GITHUB_SERVER}/pulls/${GIT_BRANCH}" --header "Authorization: token $GITHUB_TOKEN") GIT_BUILD_SHA="$(echo "$JSON" | $JQ -r '.head.sha')" GIT_EVENT_TYPE="${GITHUB_ACTION}: PR #${GIT_BRANCH}" @@ -106,6 +106,7 @@ function triggerGitHubActionsBuild() { GIT_BASE_REF="$(echo "$JSON" | $JQ -r '.base.sha')" GIT_BRANCH="PR-${GIT_BRANCH}" else + # another branch: stable-x.y, beta, or master GIT_BUILD_SHA="$(git rev-parse "refs/heads/${GIT_BRANCH}")" GIT_BASE_REF="$(git rev-parse "${GIT_BUILD_SHA}^")" GIT_EVENT_TYPE="${GITHUB_ACTION}: ${GIT_BRANCH}" @@ -119,7 +120,8 @@ function triggerGitHubActionsBuild() { \"baseBranch\": \"$GIT_BASE_BRANCH\", \ \"baseRef\": \"$GIT_BASE_REF\", \ \"user\": \"$GIT_USER\", \ - \"isTestBuild\": \"$IS_TEST_BUILD\" \ + \"isTestBuild\": \"$IS_TEST_BUILD\", \ + \"buildLevel\": \"$BUILD_LEVEL\" \ }}" echo "GitHub Action Data: $DATA" From d4fd05f4707a1a2dbc2bc45b3646d63d0e248fd6 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Sat, 14 Jun 2025 07:29:49 +1000 Subject: [PATCH 05/17] docs(common): add build-bot documentation --- docs/build-bot.md | 136 +++++++++++++++++++++ resources/build/trigger-definitions.inc.sh | 7 +- 2 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 docs/build-bot.md diff --git a/docs/build-bot.md b/docs/build-bot.md new file mode 100644 index 0000000000..8f06e7d75f --- /dev/null +++ b/docs/build-bot.md @@ -0,0 +1,136 @@ +# Controlling builds in CI with the Keyman build bot + +The Keyman CI test infrastructure can be controlled by use of a `Build-bot:` +commit trailer, or a PR body `Build-bot:` trailer. This allows you to specify +what is built for any given platform. The primary purpose of the build bot is to +reduce the build agent load, but it can also be used to ensure that specific +artifacts are available for the purposes of testing. + +The Keyman build bot is only available for test builds on pull requests. It is +not used for any other builds, either test builds on target branches (master, +beta, stable-x.y), or for release builds. + +The default set of platform builds is determined by the files touched in the +pull request; see /resources/build/trigger-definitions.inc.sh. The default build +level for this set is 'build' (see [Build Level] section). This is known as the +'build set'. + +You may choose to increase or decrease what is built -- for example, for a +documentation-only change, you may decide that nothing needs to be built at all, +with: + +``` +Build-bot: skip +``` + +Or you may want to ensure that an artifact is built for Windows: + +``` +Build-bot: release windows +``` + +## Controlling the build bot with trailers + +The build bot respects commit trailers and trailers in the PR body. The commands +are cumulative and applied in order; the Build-bot trailer in the PR body is +applied after any trailers in commit messages. + +If no platform is specified, then the command applies to all platforms in the +current build set, overriding any previous Build-bot commands. Any platforms not +in the current build set will remain 'skipped'. + +If a platform is specified, then the command will apply only to that platform, +and the platform will be added to the build set if not already present (and +thus, subsequent Build-bot commands will be applied to this new platform as +well). + +It is important to note that the Build-bot trailers are read when builds are +triggered, which happens within 2 minutes of a PR being opened or commits being +pushed. Editing the PR body after the build trigger has run will have no effect +on existing builds, until another commit is pushed, or the test build trigger is +run manually from TeamCity. Thus, do not rely on editing the PR body after PR +creation to control the build bot; either include your build bot trailers in +commit messages, or include them in the PR body submitted when creating the PR. + +## Interactions with Test Bot + +The Build-bot has limited interactions with the Keyman test bot (aka +keymanapp-test-bot): if a 'User Testing' section is found in the PR body, the +default build level will be upgraded from 'build' to 'release'. + +Build bot trailers found in the commits or in the PR body are applied after the +test bot command. + +WARNING: The build bot does not check PR comments for Test-bot commands. + +## Example Build-bot interactions + +Say we have a PR that touches `/android/build.sh`. The default build set will be +`(android:build)`. + +The PR body has a User Testing section: `# User Testing`. The build set is +upgraded to: `(android:release)`. + +The first commit includes a Build-bot command: `Build-bot: build ios`. The build +set is now `(android:release ios:build)`. + +In a subsequent commit, the PR author decides that nothing needs to be built, +after all: `Build-bot: skip`. The build set is now `(android:skip ios:skip)`. +Note that other platforms are still 'skip' but not included in the build set. + +Finally, the PR author pushes another commit, with `Build-bot: release windows`. +The build set is now: `(android:skip ios:skip windows:release)`. + +## Build Level + +The build level specifies what we want to be run for a test build on a PR. + +There is a bit of nomenclature overlap with a 'release build'. A 'release' +buildLevel for a 'test build' is roughly equivalent to what is performed in a +'release build', however, a test build is only ever uploaded to test endpoints +(i.e. TestFlight, Play Store 'test' streams), and never to *.keyman.com, or to +other release distribution endpoints. + +The build level is controlled by the Build-bot commit trailer and PR body +Build-bot/Test-bot trailers. The default build level will be 'build'. + +For target branch builds, the build level will always be 'build', and Build-bot: +commit trailers are ignored. + +### 'skip' build level + +Don't do a build at all. This would be appropriate for documentation PRs, for +example, or changes only to comments in source files. + +### 'build' build level + +Build the code and run unit tests, but don't create artifacts. What this looks +like will vary from platform to platform, but there are some common things we +won't do: +* we won't upload artifacts to TeamCity or *.keyman.com +* we won't upload artifacts to any endpoint such as Play Store +* we won't upload symbols to Sentry +* we won't codesign + +However, we _will_ still build an installer (skipping codesigning), as this is +part of the 'build' buildLevel rather than the 'release' buildLevel. + +For a platform-specific example, on macOS we will also skip notarizing, as this +is costly and depends on external network resources, making it fragile. + +### 'release' build level + +A full test build will be run, roughly equivalent to a release build. We will do +the following steps: +* codesign (many platforms) and notarization (macOS) +* upload artifacts to TeamCity (all platforms) +* upload builds to TestFlight / Play Store 'test' endpoints (iOS/Android) +* upload symbols to Sentry + +For a 'release' build level: +* we won't upload artifacts to *.keyman.com +* we won't upload artifacts to any release endpoint such as Debian, + packages.sil.org, etc, or to the release areas for Play Store or App Store + + +[Build Level]: #Build_Level \ No newline at end of file diff --git a/resources/build/trigger-definitions.inc.sh b/resources/build/trigger-definitions.inc.sh index dc0338ffb8..db879b95e8 100644 --- a/resources/build/trigger-definitions.inc.sh +++ b/resources/build/trigger-definitions.inc.sh @@ -6,12 +6,15 @@ # # -# Build levels +# # Build levels +# +# See /docs/build-bot.md # readonly build_level_skip=skip readonly build_level_build=build readonly build_level_release=release +# TODO: future build_level_fulltest=fulltest --> do all expensive e2e tests as well as producing release artifacts readonly valid_build_levels="$build_level_skip|$build_level_build|$build_level_release" # @@ -20,6 +23,8 @@ readonly valid_build_levels="$build_level_skip|$build_level_build|$build_level_r available_platforms=(android common_web common_windows common_mac common_linux ios linux mac web windows developer) +# For test builds on master, beta, and stable-x.y branches, we always "build", +# not "release" -- that is, we don't produce artifacts declare -Ag main_branch_platform_build_levels for available_platforms_i in "${available_platforms[@]}"; do main_branch_platform_build_levels[$available_platforms_i]=$build_level_build From 11a558e926370253db37026c95b7ff5a6aa1e8fc Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Sat, 14 Jun 2025 15:22:15 +1000 Subject: [PATCH 06/17] maint(developer): support buildLevel Relates-to: 14125 Build-bot: build Test-bot: skip --- developer/src/kmc/build.sh | 13 ++++---- resources/build/win/environment.inc.sh | 20 +++++++++++++ resources/builder.inc.sh | 29 ++++++++++++++++++ .../keyman-developer-test-windows.sh | 30 +++++++++++-------- 4 files changed, 75 insertions(+), 17 deletions(-) diff --git a/developer/src/kmc/build.sh b/developer/src/kmc/build.sh index 15e8e18302..b7f06852c4 100755 --- a/developer/src/kmc/build.sh +++ b/developer/src/kmc/build.sh @@ -84,11 +84,14 @@ function do_bundle() { mkdir -p build/dist node build-bundler.js - sentry-cli sourcemaps inject \ - --org keyman \ - --project keyman-developer \ - --release "$KEYMAN_VERSION_GIT_TAG" \ - build/dist/ "${SOURCEMAP_PATHS[@]}" + if builder_is_ci_build && builder_is_ci_build_level_release; then + # Only inject sourcemaps for release builds + sentry-cli sourcemaps inject \ + --org keyman \ + --project keyman-developer \ + --release "$KEYMAN_VERSION_GIT_TAG" \ + build/dist/ "${SOURCEMAP_PATHS[@]}" + fi # Manually copy over kmcmplib module cp ../kmc-kmn/build/src/import/kmcmplib/wasm-host.wasm build/dist/ diff --git a/resources/build/win/environment.inc.sh b/resources/build/win/environment.inc.sh index 6da5ad039f..3ae6bb9269 100644 --- a/resources/build/win/environment.inc.sh +++ b/resources/build/win/environment.inc.sh @@ -73,6 +73,11 @@ run_in_delphi_env() { } sentrytool_delphiprep() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping sentrytool_delphiprep - buildLevel=build: $@" + return 0 + fi + local EXE_PATH="$1" local DPR_PATH="$2" ( @@ -83,6 +88,11 @@ sentrytool_delphiprep() { } tds2dbg() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping tds2dbg - buildLevel=build: $@" + return 0 + fi + "$TDS2DBG" "$@" } @@ -108,6 +118,11 @@ clean_windows_project_files() { } wrap-signcode() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping code signing - buildLevel=build: $@" + return 0 + fi + # CI will usually pass in a full path for signtool.exe; for local builds we # will hopefully find what we want on the path already if [[ -z "${SIGNTOOL+x}" ]]; then @@ -117,6 +132,11 @@ wrap-signcode() { } wrap-symstore() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping symstore - buildLevel=build" + return 0 + fi + if [[ -z "${KEYMAN_SYMSTOREPATH+x}" ]]; then builder_warn "\$KEYMAN_SYMSTOREPATH is not set. Skipping symstore for $@" return 0 diff --git a/resources/builder.inc.sh b/resources/builder.inc.sh index 25c9b5994c..7798eb2484 100755 --- a/resources/builder.inc.sh +++ b/resources/builder.inc.sh @@ -2221,6 +2221,35 @@ builder_is_ci_test_build() { return 1 } +# +# Returns 0 if current ci build is a release-level build. Do not use for non-ci +# builds. +# +builder_is_ci_build_level_release() { + if builder_is_ci_release_build; then + return 0 + fi + if [[ "$KEYMAN_BUILD_LEVEL" == release ]]; then + return 0 + fi + return 1 +} + +# +# Returns 0 if current ci build is a build-level build. Do not use for non-ci +# builds. +# +builder_is_ci_build_level_build() { + if builder_is_ci_release_build; then + return 1 + fi + if builder_is_ci_build_level_release; then + # KEYMAN_BUILD_LEVEL == release, i.e. not build + return 1 + fi + return 0 +} + ################################################################################ # Final initialization ################################################################################ diff --git a/resources/teamcity/developer/keyman-developer-test-windows.sh b/resources/teamcity/developer/keyman-developer-test-windows.sh index 75bb60b4ac..604acb86b6 100755 --- a/resources/teamcity/developer/keyman-developer-test-windows.sh +++ b/resources/teamcity/developer/keyman-developer-test-windows.sh @@ -19,12 +19,17 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe \ "Build Keyman Developer on Windows" \ - "all run all actions" \ + "all run all actions (used by TeamCity build configuration)" \ "build build Keyman Developer and test keyboards" \ "publish publish debug information files to sentry" builder_parse "$@" +if ! is_windows; then + builder_echo error "This script is intended to be run on Windows only." + exit 1 +fi + # shellcheck disable=SC2154 cd "${KEYMAN_ROOT}/developer/src" @@ -34,11 +39,11 @@ function build_developer_action() { } function _build_developer() { - builder_echo start "build developer" "Building Keyman Developer" + builder_echo start "build developer" "Building and testing Keyman Developer" - ./build.sh configure build test api publish --dry-run + ./build.sh configure build test - builder_echo end "build developer" success "Finished building Keyman Developer" + builder_echo end "build developer" success "Finished building and testing Keyman Developer" } function _build_testkeyboards() { @@ -50,21 +55,22 @@ function _build_testkeyboards() { } function publish_sentry_action() { + builder_echo start "publish" "Dry-run publish and api" + ./build.sh api publish --dry-run + builder_echo end "publish" "Dry-run publish and api" + builder_echo start "publish sentry" "Publishing debug information files to Sentry" - + # TODO: move this into build.sh publish? re-scope --dry-run into build.sh? "${KEYMAN_ROOT}/developer/src/tools/sentry-upload-difs.sh" - builder_echo end "publish sentry" success "Finished publishing debug information files to Sentry" } -if ! is_windows; then - builder_echo error "This script is intended to be run on Windows only." - exit 1 -fi - if builder_has_action all; then + # TODO: control codesign by KEYMAN_BUILD_LEVEL build_developer_action - publish_sentry_action + if builder_is_ci_build_level_release; then + publish_sentry_action + fi else builder_run_action build build_developer_action builder_run_action publish publish_sentry_action From 870d37f56b489ef5067b4352a06505369d9038e0 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Jun 2025 05:40:30 +1000 Subject: [PATCH 07/17] maint(developer): only copy .dbg/.pdb on release buildLevel --- developer/src/kmanalyze/build.sh | 2 +- developer/src/kmconvert/build.sh | 2 +- developer/src/kmdbrowserhost/build.sh | 4 +--- developer/src/kmdecomp/build.sh | 2 +- developer/src/samples/imsample/build.sh | 4 ++-- developer/src/setup/build.sh | 9 ++------- developer/src/tike/build.sh | 7 +++---- resources/build/win/environment.inc.sh | 8 ++++++++ windows/src/desktop/insthelp/build.sh | 2 +- windows/src/desktop/kmbrowserhost/build.sh | 2 +- windows/src/desktop/kmconfig/build.sh | 2 +- windows/src/desktop/kmshell/build.sh | 2 +- windows/src/desktop/setup/build.sh | 2 +- windows/src/engine/insthelper/build.sh | 2 +- windows/src/engine/keyman/build.sh | 2 +- windows/src/engine/keyman32/build.sh | 4 ++-- windows/src/engine/keymanx64/build.sh | 2 +- windows/src/engine/kmcomapi/build.sh | 2 +- windows/src/engine/kmrefresh/build.sh | 4 ++-- windows/src/engine/kmtip/build.sh | 4 ++-- windows/src/engine/mcompile/build.sh | 2 +- windows/src/engine/tsysinfo/build.sh | 2 +- windows/src/support/etl2log/build.sh | 2 +- windows/src/support/texteditor/build.sh | 4 ++-- 24 files changed, 39 insertions(+), 39 deletions(-) diff --git a/developer/src/kmanalyze/build.sh b/developer/src/kmanalyze/build.sh index 0e07044ffc..6f77aee381 100755 --- a/developer/src/kmanalyze/build.sh +++ b/developer/src/kmanalyze/build.sh @@ -32,7 +32,7 @@ function do_build() { build_version.res vs_msbuild kmanalyze.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - cp "$WIN32_TARGET_PATH/kmanalyze.pdb" "$DEVELOPER_DEBUGPATH" + if_release_build_level cp "$WIN32_TARGET_PATH/kmanalyze.pdb" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/kmconvert/build.sh b/developer/src/kmconvert/build.sh index 599379565f..4bd68423f1 100755 --- a/developer/src/kmconvert/build.sh +++ b/developer/src/kmconvert/build.sh @@ -33,7 +33,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - cp "$WIN32_TARGET_PATH/kmconvert.dbg" "$DEVELOPER_DEBUGPATH" + if_release_build_level cp "$WIN32_TARGET_PATH/kmconvert.dbg" "$DEVELOPER_DEBUGPATH" rm -rf "$DEVELOPER_PROGRAM/projects/templates" mkdir -p "$DEVELOPER_PROGRAM/projects/templates" diff --git a/developer/src/kmdbrowserhost/build.sh b/developer/src/kmdbrowserhost/build.sh index b00a60735a..a7bb2d4449 100755 --- a/developer/src/kmdbrowserhost/build.sh +++ b/developer/src/kmdbrowserhost/build.sh @@ -32,9 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if [[ -f "$WIN32_TARGET_PATH/kmdbrowserhost.dbg" ]]; then - cp "$WIN32_TARGET_PATH/kmdbrowserhost.dbg" "$DEVELOPER_DEBUGPATH" - fi + if_release_build_level cp "$WIN32_TARGET_PATH/kmdbrowserhost.dbg" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/kmdecomp/build.sh b/developer/src/kmdecomp/build.sh index a6b903fbc8..9922add612 100755 --- a/developer/src/kmdecomp/build.sh +++ b/developer/src/kmdecomp/build.sh @@ -33,7 +33,7 @@ function do_build() { build_version.res vs_msbuild kmdecomp.sln //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - cp "$WIN32_TARGET_PATH/kmdecomp.pdb" "$DEVELOPER_DEBUGPATH" + if_release_build_level cp "$WIN32_TARGET_PATH/kmdecomp.pdb" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/samples/imsample/build.sh b/developer/src/samples/imsample/build.sh index 2c0c402e28..4c7535ec1f 100755 --- a/developer/src/samples/imsample/build.sh +++ b/developer/src/samples/imsample/build.sh @@ -32,11 +32,11 @@ function do_build() { build_version.res vs_msbuild imsample.sln //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - cp "$WIN32_TARGET_PATH/imsample.pdb" "$DEVELOPER_DEBUGPATH" + if_release_build_level cp "$WIN32_TARGET_PATH/imsample.pdb" "$DEVELOPER_DEBUGPATH" vs_msbuild imsample.sln //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$DEVELOPER_PROGRAM" - cp "$X64_TARGET_PATH/imsample.x64.pdb" "$DEVELOPER_DEBUGPATH" + if_release_build_level cp "$X64_TARGET_PATH/imsample.x64.pdb" "$DEVELOPER_DEBUGPATH" } # TODO diff --git a/developer/src/setup/build.sh b/developer/src/setup/build.sh index 5dfe102363..45e1816046 100755 --- a/developer/src/setup/build.sh +++ b/developer/src/setup/build.sh @@ -33,13 +33,8 @@ function do_build() { sentrytool_delphiprep "$WIN32_TARGET" setup.dpr tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if [[ -f "$WIN32_TARGET_PATH/setup.dbg" ]]; then - cp "$WIN32_TARGET_PATH/setup.dbg" "$DEVELOPER_DEBUGPATH/devsetup.dbg" - fi - rm -f "$WIN32_TARGET_PATH/devsetup.dbg" - if [[ -f "$WIN32_TARGET_PATH/setup.dbg" ]]; then - mv "$WIN32_TARGET_PATH/setup.dbg" "$WIN32_TARGET_PATH/devsetup.dbg" - fi + if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$DEVELOPER_DEBUGPATH/devsetup.dbg" + if_release_build_level mv "$WIN32_TARGET_PATH/setup.dbg" "$WIN32_TARGET_PATH/devsetup.dbg" } function do_publish() { diff --git a/developer/src/tike/build.sh b/developer/src/tike/build.sh index d0e5800fc3..9dab71a904 100755 --- a/developer/src/tike/build.sh +++ b/developer/src/tike/build.sh @@ -76,11 +76,10 @@ function do_build() { cp kmlmp.cmd "$DEVELOPER_PROGRAM" cp kmc.cmd "$DEVELOPER_PROGRAM" cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_DLL" "$DEVELOPER_PROGRAM" - if [[ -f "$WIN32_TARGET_PATH/tike.dbg" ]]; then - cp "$WIN32_TARGET_PATH/tike.dbg" "$DEVELOPER_DEBUGPATH" - fi + if_release_build_level cp "$WIN32_TARGET_PATH/tike.dbg" "$DEVELOPER_DEBUGPATH" + cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_DLL" "$WIN32_TARGET_PATH" - cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_PDB" "$WIN32_TARGET_PATH" + if_release_build_level cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_PDB" "$WIN32_TARGET_PATH" cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" "$DEVELOPER_PROGRAM/" cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.x64.dll" "$DEVELOPER_PROGRAM/" diff --git a/resources/build/win/environment.inc.sh b/resources/build/win/environment.inc.sh index 3ae6bb9269..5463a1af5e 100644 --- a/resources/build/win/environment.inc.sh +++ b/resources/build/win/environment.inc.sh @@ -87,6 +87,14 @@ sentrytool_delphiprep() { ) } +if_release_build_level() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping - buildLevel=build: $@" + return 0 + fi + "$@" +} + tds2dbg() { if builder_is_ci_build && builder_is_ci_build_level_build; then builder_echo "Skipping tds2dbg - buildLevel=build: $@" diff --git a/windows/src/desktop/insthelp/build.sh b/windows/src/desktop/insthelp/build.sh index de21cb4014..86d94f9648 100755 --- a/windows/src/desktop/insthelp/build.sh +++ b/windows/src/desktop/insthelp/build.sh @@ -33,7 +33,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - cp "$WIN32_TARGET_PATH/insthelp.dbg" "$WINDOWS_DEBUGPATH_APP/insthelp.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/insthelp.dbg" "$WINDOWS_DEBUGPATH_APP/insthelp.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmbrowserhost/build.sh b/windows/src/desktop/kmbrowserhost/build.sh index f716c29b74..56a0de331f 100755 --- a/windows/src/desktop/kmbrowserhost/build.sh +++ b/windows/src/desktop/kmbrowserhost/build.sh @@ -32,7 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - cp "$WIN32_TARGET_PATH/kmbrowserhost.dbg" "$WINDOWS_DEBUGPATH_APP/kmbrowserhost.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/kmbrowserhost.dbg" "$WINDOWS_DEBUGPATH_APP/kmbrowserhost.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmconfig/build.sh b/windows/src/desktop/kmconfig/build.sh index 8507f68ac5..704067ddc1 100755 --- a/windows/src/desktop/kmconfig/build.sh +++ b/windows/src/desktop/kmconfig/build.sh @@ -32,7 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - cp "$WIN32_TARGET_PATH/kmconfig.dbg" "$WINDOWS_DEBUGPATH_APP/kmconfig.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/kmconfig.dbg" "$WINDOWS_DEBUGPATH_APP/kmconfig.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmshell/build.sh b/windows/src/desktop/kmshell/build.sh index 3ce57b9088..0f3d7c9e69 100755 --- a/windows/src/desktop/kmshell/build.sh +++ b/windows/src/desktop/kmshell/build.sh @@ -39,7 +39,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - cp "$WIN32_TARGET_PATH/kmshell.dbg" "$WINDOWS_DEBUGPATH_APP/kmshell.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/kmshell.dbg" "$WINDOWS_DEBUGPATH_APP/kmshell.dbg" do_build_data } diff --git a/windows/src/desktop/setup/build.sh b/windows/src/desktop/setup/build.sh index bb72965c86..8415dd4734 100755 --- a/windows/src/desktop/setup/build.sh +++ b/windows/src/desktop/setup/build.sh @@ -43,7 +43,7 @@ function do_build() { cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" # setup-redist.exe does not get signed as it is intended for a bundled installer cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP/setup-redist.exe" - cp "$WIN32_TARGET_PATH/setup.dbg" "$WINDOWS_DEBUGPATH_APP/setup.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$WINDOWS_DEBUGPATH_APP/setup.dbg" } function do_build_debug_manifest() { diff --git a/windows/src/engine/insthelper/build.sh b/windows/src/engine/insthelper/build.sh index a31fc605fc..470b183748 100755 --- a/windows/src/engine/insthelper/build.sh +++ b/windows/src/engine/insthelper/build.sh @@ -31,7 +31,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/insthelper.dbg" "$WINDOWS_DEBUGPATH_ENGINE/insthelper.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/insthelper.dbg" "$WINDOWS_DEBUGPATH_ENGINE/insthelper.dbg" } function do_publish() { diff --git a/windows/src/engine/keyman/build.sh b/windows/src/engine/keyman/build.sh index 5f142c350c..adf924ee2a 100755 --- a/windows/src/engine/keyman/build.sh +++ b/windows/src/engine/keyman/build.sh @@ -42,7 +42,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/keyman.dbg" "$WINDOWS_DEBUGPATH_ENGINE/keyman.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/keyman.dbg" "$WINDOWS_DEBUGPATH_ENGINE/keyman.dbg" # Also copy sentry files here cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" \ diff --git a/windows/src/engine/keyman32/build.sh b/windows/src/engine/keyman32/build.sh index c452809958..47d77b718d 100755 --- a/windows/src/engine/keyman32/build.sh +++ b/windows/src/engine/keyman32/build.sh @@ -41,7 +41,7 @@ function do_build_x86() { build_version.res vs_msbuild keyman32.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/keyman32.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$WIN32_TARGET_PATH/keyman32.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_build_x64() { @@ -49,7 +49,7 @@ function do_build_x64() { run_in_vs_env rc version64.rc vs_msbuild keyman32.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$X64_TARGET_PATH/keyman64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$X64_TARGET_PATH/keyman64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish_x86() { diff --git a/windows/src/engine/keymanx64/build.sh b/windows/src/engine/keymanx64/build.sh index 35c7ad470b..d4dcbbee17 100755 --- a/windows/src/engine/keymanx64/build.sh +++ b/windows/src/engine/keymanx64/build.sh @@ -33,7 +33,7 @@ function do_build() { build_manifest.res vs_msbuild keymanx64.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/kmcomapi/build.sh b/windows/src/engine/kmcomapi/build.sh index b808bc4d5b..ca3b0285ce 100755 --- a/windows/src/engine/kmcomapi/build.sh +++ b/windows/src/engine/kmcomapi/build.sh @@ -44,7 +44,7 @@ function do_build() { mv -f "$WIN64_TARGET_PATH/kmcomapi.dll" "$WIN64_TARGET_PATH/kmcomapi.x64.dll" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_DEBUGPATH_ENGINE/kmcomapi.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_DEBUGPATH_ENGINE/kmcomapi.dbg" cp "$WIN64_TARGET_PATH/kmcomapi.x64.dll" "$WINDOWS_PROGRAM_ENGINE/kmcomapi.x64.dll" # x64 Delphi symbols not supported: cp "$WIN64_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_PROGRAM_ENGINE/kmcomapi.x64.dbg" diff --git a/windows/src/engine/kmrefresh/build.sh b/windows/src/engine/kmrefresh/build.sh index b04d53f043..7ce32e3f28 100755 --- a/windows/src/engine/kmrefresh/build.sh +++ b/windows/src/engine/kmrefresh/build.sh @@ -34,9 +34,9 @@ function do_build() { vs_msbuild kmrefresh.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmrefresh.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/kmrefresh.x86.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$WIN32_TARGET_PATH/kmrefresh.x86.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$X64_TARGET_PATH/kmrefresh.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$X64_TARGET_PATH/kmrefresh.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 346a2a9678..9e7b9b928c 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -35,9 +35,9 @@ function do_build() { vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/mcompile/build.sh b/windows/src/engine/mcompile/build.sh index f3a79e0079..e25b87a42e 100755 --- a/windows/src/engine/mcompile/build.sh +++ b/windows/src/engine/mcompile/build.sh @@ -33,7 +33,7 @@ function do_build() { build_manifest.res vs_msbuild mcompile.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - cp "$WIN32_TARGET_PATH/mcompile.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + if_release_build_level cp "$WIN32_TARGET_PATH/mcompile.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/tsysinfo/build.sh b/windows/src/engine/tsysinfo/build.sh index 01688a6a70..df259a99d9 100755 --- a/windows/src/engine/tsysinfo/build.sh +++ b/windows/src/engine/tsysinfo/build.sh @@ -47,7 +47,7 @@ function do_build() { cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" cp *.xslt "$WINDOWS_PROGRAM_ENGINE/" - cp "$WIN32_TARGET_PATH/tsysinfo.dbg" "$WINDOWS_DEBUGPATH_ENGINE/tsysinfo.dbg" + if_release_build_level cp "$WIN32_TARGET_PATH/tsysinfo.dbg" "$WINDOWS_DEBUGPATH_ENGINE/tsysinfo.dbg" } function do_publish() { diff --git a/windows/src/support/etl2log/build.sh b/windows/src/support/etl2log/build.sh index e2fdee1acd..09f5967d87 100755 --- a/windows/src/support/etl2log/build.sh +++ b/windows/src/support/etl2log/build.sh @@ -31,7 +31,7 @@ function do_build() { build_version.res vs_msbuild etl2log.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_SUPPORT" - cp "$WIN32_TARGET_PATH/etl2log.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + if_release_build_level cp "$WIN32_TARGET_PATH/etl2log.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" } builder_run_action clean:project do_clean diff --git a/windows/src/support/texteditor/build.sh b/windows/src/support/texteditor/build.sh index 312ee1d0f4..354144faa6 100755 --- a/windows/src/support/texteditor/build.sh +++ b/windows/src/support/texteditor/build.sh @@ -34,8 +34,8 @@ function do_build() { vs_msbuild Editor.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_SUPPORT" cp "$X64_TARGET" "$WINDOWS_PROGRAM_SUPPORT" - cp "$WIN32_TARGET_PATH/editor32.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" - cp "$X64_TARGET_PATH/editor64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + if_release_build_level cp "$WIN32_TARGET_PATH/editor32.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + if_release_build_level cp "$X64_TARGET_PATH/editor64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" } builder_run_action clean:project do_clean From f3136d5ab2c939629a0538dc6746b050631ffce3 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Jun 2025 05:54:33 +1000 Subject: [PATCH 08/17] maint(developer): skip signature check on buildLevel build --- developer/src/inst/build.sh | 4 ++-- oem/firstvoices/windows/src/inst/build.sh | 2 +- resources/build/win/environment.inc.sh | 2 +- windows/src/desktop/inst/build.sh | 5 +++-- windows/src/engine/inst/build.sh | 9 +++++++-- 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/developer/src/inst/build.sh b/developer/src/inst/build.sh index 8f5b722506..21b43bf765 100755 --- a/developer/src/inst/build.sh +++ b/developer/src/inst/build.sh @@ -51,7 +51,7 @@ function do_clean() { #------------------------------------------------------------------------------------------------------------------- function do_publish() { - verify-program-signatures + if_release_build_level verify-program-signatures verify-node-installer-version "$KEYMAN_ROOT/common/windows/cef-checkout.sh" @@ -80,7 +80,7 @@ function do_publish() { copy-kmdev - verify-installer-signatures + if_release_build_level verify-installer-signatures } function do_test() { diff --git a/oem/firstvoices/windows/src/inst/build.sh b/oem/firstvoices/windows/src/inst/build.sh index f427c0dfc0..f57907f409 100755 --- a/oem/firstvoices/windows/src/inst/build.sh +++ b/oem/firstvoices/windows/src/inst/build.sh @@ -105,7 +105,7 @@ function copy-installer() { cp firstvoices.msi "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/firstvoices.msi" cp firstvoices.exe "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/firstvoices-${KEYMAN_VERSION}.exe" - verify-installer-signatures + if_release_build_level verify-installer-signatures } function verify-installer-signatures() { diff --git a/resources/build/win/environment.inc.sh b/resources/build/win/environment.inc.sh index 5463a1af5e..14ccc1c2ed 100644 --- a/resources/build/win/environment.inc.sh +++ b/resources/build/win/environment.inc.sh @@ -32,7 +32,7 @@ COMMON_ROOT="$KEYMAN_ROOT/common/windows/delphi" OUTLIB="$WINDOWS_ROOT/lib" COMMON_OUTLIB="$KEYMAN_ROOT/common/windows/lib" -if builder_is_debug_build || [[ $KEYMAN_VERSION_ENVIRONMENT == local ]] || [[ ! -z ${TEAMCITY_PR_NUMBER+x} ]]; then +if builder_is_debug_build || [[ $KEYMAN_VERSION_ENVIRONMENT == local ]] || builder_is_ci_test_build; then # We do a fast build for debug builds, local builds, test PR builds but not for master/beta/stable release builds GO_FAST=1 else diff --git a/windows/src/desktop/inst/build.sh b/windows/src/desktop/inst/build.sh index bcedcef95c..f3a5795c6e 100755 --- a/windows/src/desktop/inst/build.sh +++ b/windows/src/desktop/inst/build.sh @@ -53,7 +53,7 @@ function do_build_desktop_resources() { } function do_publish() { - verify-program-signatures + if_release_build_level verify-program-signatures "$KEYMAN_ROOT/common/windows/cef-checkout.sh" @@ -73,6 +73,7 @@ function do_publish() { -sice:ICE82 -sice:ICE80 \ -nologo \ -dWixUILicenseRtf=License.rtf \ + "$WIXLIGHTCOMPRESSION" \ -out keymandesktop.msi -ext WixUIExtension \ keymandesktop.wixobj desktopui.wixobj cef.wixobj locale.wixobj @@ -106,7 +107,7 @@ function copy-installer() { cp keymandesktop.exe "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/keyman-${KEYMAN_VERSION}.exe" cp "$WINDOWS_PROGRAM_APP/setup.exe" "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/setup.exe" - verify-installer-signatures + if_release_build_level verify-installer-signatures # Copy the unsigned setup.exe for use in bundling scenarios; zip it up for clarity wzzip "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/setup-redist.zip" "$WINDOWS_PROGRAM_APP/setup-redist.exe" diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index 22cd5954a6..9891958cdd 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -30,7 +30,7 @@ fi #------------------------------------------------------------------------------------------------------------------- function do_publish() { - verify-program-signatures + if_release_build_level verify-program-signatures # # Build the installation archive @@ -38,7 +38,12 @@ function do_publish() { "$WIXCANDLE" -dKEYMAN_VERSION=$KEYMAN_VERSION_WIN -dRELEASE=$KEYMAN_VERSION_RELEASE -ext WixUtilExtension keymanengine.wxs components.wxs # warning 1072 relates to Error table defined by WixUtilExtension. Doesn't really affect us. - "$WIXLIGHT" -sw1072 -ext WixUtilExtension keymanengine.wixobj components.wixobj -o keymanengine.msm + "$WIXLIGHT" \ + -sw1072 \ + -ext WixUtilExtension \ + "$WIXLIGHTCOMPRESSION" \ + keymanengine.wixobj components.wixobj \ + -o keymanengine.msm # # Sign the installation archive From 156bdcdd8ae73ed8c9de18207706974334a303cd Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Jun 2025 06:45:42 +1000 Subject: [PATCH 09/17] maint(common): rename and move builder_if_release_build_level --- developer/src/inst/build.sh | 4 ++-- developer/src/kmanalyze/build.sh | 2 +- developer/src/kmconvert/build.sh | 2 +- developer/src/kmdbrowserhost/build.sh | 2 +- developer/src/kmdecomp/build.sh | 2 +- developer/src/samples/imsample/build.sh | 4 ++-- developer/src/setup/build.sh | 4 ++-- developer/src/tike/build.sh | 4 ++-- oem/firstvoices/windows/src/inst/build.sh | 2 +- resources/build/win/environment.inc.sh | 15 +-------------- resources/builder.inc.sh | 12 ++++++++++++ windows/src/desktop/inst/build.sh | 4 ++-- windows/src/desktop/insthelp/build.sh | 2 +- windows/src/desktop/kmbrowserhost/build.sh | 2 +- windows/src/desktop/kmconfig/build.sh | 2 +- windows/src/desktop/kmshell/build.sh | 2 +- windows/src/desktop/setup/build.sh | 2 +- windows/src/engine/inst/build.sh | 2 +- windows/src/engine/insthelper/build.sh | 2 +- windows/src/engine/keyman/build.sh | 2 +- windows/src/engine/keyman32/build.sh | 4 ++-- windows/src/engine/keymanx64/build.sh | 2 +- windows/src/engine/kmcomapi/build.sh | 2 +- windows/src/engine/kmrefresh/build.sh | 4 ++-- windows/src/engine/kmtip/build.sh | 4 ++-- windows/src/engine/mcompile/build.sh | 2 +- windows/src/engine/tsysinfo/build.sh | 2 +- windows/src/support/etl2log/build.sh | 2 +- windows/src/support/texteditor/build.sh | 4 ++-- 29 files changed, 49 insertions(+), 50 deletions(-) diff --git a/developer/src/inst/build.sh b/developer/src/inst/build.sh index 21b43bf765..a8eb8b849f 100755 --- a/developer/src/inst/build.sh +++ b/developer/src/inst/build.sh @@ -51,7 +51,7 @@ function do_clean() { #------------------------------------------------------------------------------------------------------------------- function do_publish() { - if_release_build_level verify-program-signatures + builder_if_release_build_level verify-program-signatures verify-node-installer-version "$KEYMAN_ROOT/common/windows/cef-checkout.sh" @@ -80,7 +80,7 @@ function do_publish() { copy-kmdev - if_release_build_level verify-installer-signatures + builder_if_release_build_level verify-installer-signatures } function do_test() { diff --git a/developer/src/kmanalyze/build.sh b/developer/src/kmanalyze/build.sh index 6f77aee381..ecd9fd263f 100755 --- a/developer/src/kmanalyze/build.sh +++ b/developer/src/kmanalyze/build.sh @@ -32,7 +32,7 @@ function do_build() { build_version.res vs_msbuild kmanalyze.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/kmanalyze.pdb" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmanalyze.pdb" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/kmconvert/build.sh b/developer/src/kmconvert/build.sh index 4bd68423f1..3ba94c21dc 100755 --- a/developer/src/kmconvert/build.sh +++ b/developer/src/kmconvert/build.sh @@ -33,7 +33,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/kmconvert.dbg" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmconvert.dbg" "$DEVELOPER_DEBUGPATH" rm -rf "$DEVELOPER_PROGRAM/projects/templates" mkdir -p "$DEVELOPER_PROGRAM/projects/templates" diff --git a/developer/src/kmdbrowserhost/build.sh b/developer/src/kmdbrowserhost/build.sh index a7bb2d4449..55e7ae8d14 100755 --- a/developer/src/kmdbrowserhost/build.sh +++ b/developer/src/kmdbrowserhost/build.sh @@ -32,7 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/kmdbrowserhost.dbg" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmdbrowserhost.dbg" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/kmdecomp/build.sh b/developer/src/kmdecomp/build.sh index 9922add612..494b8afde5 100755 --- a/developer/src/kmdecomp/build.sh +++ b/developer/src/kmdecomp/build.sh @@ -33,7 +33,7 @@ function do_build() { build_version.res vs_msbuild kmdecomp.sln //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/kmdecomp.pdb" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmdecomp.pdb" "$DEVELOPER_DEBUGPATH" } function do_publish() { diff --git a/developer/src/samples/imsample/build.sh b/developer/src/samples/imsample/build.sh index 4c7535ec1f..2cdd11ac70 100755 --- a/developer/src/samples/imsample/build.sh +++ b/developer/src/samples/imsample/build.sh @@ -32,11 +32,11 @@ function do_build() { build_version.res vs_msbuild imsample.sln //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/imsample.pdb" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/imsample.pdb" "$DEVELOPER_DEBUGPATH" vs_msbuild imsample.sln //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$X64_TARGET_PATH/imsample.x64.pdb" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$X64_TARGET_PATH/imsample.x64.pdb" "$DEVELOPER_DEBUGPATH" } # TODO diff --git a/developer/src/setup/build.sh b/developer/src/setup/build.sh index 45e1816046..ef84122fdb 100755 --- a/developer/src/setup/build.sh +++ b/developer/src/setup/build.sh @@ -33,8 +33,8 @@ function do_build() { sentrytool_delphiprep "$WIN32_TARGET" setup.dpr tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$DEVELOPER_DEBUGPATH/devsetup.dbg" - if_release_build_level mv "$WIN32_TARGET_PATH/setup.dbg" "$WIN32_TARGET_PATH/devsetup.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$DEVELOPER_DEBUGPATH/devsetup.dbg" + builder_if_release_build_level mv "$WIN32_TARGET_PATH/setup.dbg" "$WIN32_TARGET_PATH/devsetup.dbg" } function do_publish() { diff --git a/developer/src/tike/build.sh b/developer/src/tike/build.sh index 9dab71a904..b06fd1f847 100755 --- a/developer/src/tike/build.sh +++ b/developer/src/tike/build.sh @@ -76,10 +76,10 @@ function do_build() { cp kmlmp.cmd "$DEVELOPER_PROGRAM" cp kmc.cmd "$DEVELOPER_PROGRAM" cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_DLL" "$DEVELOPER_PROGRAM" - if_release_build_level cp "$WIN32_TARGET_PATH/tike.dbg" "$DEVELOPER_DEBUGPATH" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/tike.dbg" "$DEVELOPER_DEBUGPATH" cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_DLL" "$WIN32_TARGET_PATH" - if_release_build_level cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_PDB" "$WIN32_TARGET_PATH" + builder_if_release_build_level cp "$KEYMAN_ROOT/core/build/x86/$TARGET_PATH/src/$KEYMANCORE_PDB" "$WIN32_TARGET_PATH" cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" "$DEVELOPER_PROGRAM/" cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.x64.dll" "$DEVELOPER_PROGRAM/" diff --git a/oem/firstvoices/windows/src/inst/build.sh b/oem/firstvoices/windows/src/inst/build.sh index f57907f409..ac6c309554 100755 --- a/oem/firstvoices/windows/src/inst/build.sh +++ b/oem/firstvoices/windows/src/inst/build.sh @@ -105,7 +105,7 @@ function copy-installer() { cp firstvoices.msi "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/firstvoices.msi" cp firstvoices.exe "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/firstvoices-${KEYMAN_VERSION}.exe" - if_release_build_level verify-installer-signatures + builder_if_release_build_level verify-installer-signatures } function verify-installer-signatures() { diff --git a/resources/build/win/environment.inc.sh b/resources/build/win/environment.inc.sh index 14ccc1c2ed..40c4de6db5 100644 --- a/resources/build/win/environment.inc.sh +++ b/resources/build/win/environment.inc.sh @@ -87,21 +87,8 @@ sentrytool_delphiprep() { ) } -if_release_build_level() { - if builder_is_ci_build && builder_is_ci_build_level_build; then - builder_echo "Skipping - buildLevel=build: $@" - return 0 - fi - "$@" -} - tds2dbg() { - if builder_is_ci_build && builder_is_ci_build_level_build; then - builder_echo "Skipping tds2dbg - buildLevel=build: $@" - return 0 - fi - - "$TDS2DBG" "$@" + builder_if_release_build_level "$TDS2DBG" "$@" } delphi_msbuild() { diff --git a/resources/builder.inc.sh b/resources/builder.inc.sh index 7798eb2484..fc741e4081 100755 --- a/resources/builder.inc.sh +++ b/resources/builder.inc.sh @@ -2250,6 +2250,18 @@ builder_is_ci_build_level_build() { return 0 } +# +# Executes statement if a ci build level of 'release', and for local builds, but +# not for a ci build level of 'build' +# +builder_if_release_build_level() { + if builder_is_ci_build && builder_is_ci_build_level_build; then + builder_echo "Skipping - buildLevel=build: $@" + return 0 + fi + "$@" +} + ################################################################################ # Final initialization ################################################################################ diff --git a/windows/src/desktop/inst/build.sh b/windows/src/desktop/inst/build.sh index f3a5795c6e..ca8df31c65 100755 --- a/windows/src/desktop/inst/build.sh +++ b/windows/src/desktop/inst/build.sh @@ -53,7 +53,7 @@ function do_build_desktop_resources() { } function do_publish() { - if_release_build_level verify-program-signatures + builder_if_release_build_level verify-program-signatures "$KEYMAN_ROOT/common/windows/cef-checkout.sh" @@ -107,7 +107,7 @@ function copy-installer() { cp keymandesktop.exe "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/keyman-${KEYMAN_VERSION}.exe" cp "$WINDOWS_PROGRAM_APP/setup.exe" "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/setup.exe" - if_release_build_level verify-installer-signatures + builder_if_release_build_level verify-installer-signatures # Copy the unsigned setup.exe for use in bundling scenarios; zip it up for clarity wzzip "$KEYMAN_ROOT/windows/release/${KEYMAN_VERSION}/setup-redist.zip" "$WINDOWS_PROGRAM_APP/setup-redist.exe" diff --git a/windows/src/desktop/insthelp/build.sh b/windows/src/desktop/insthelp/build.sh index 86d94f9648..16b2a50e40 100755 --- a/windows/src/desktop/insthelp/build.sh +++ b/windows/src/desktop/insthelp/build.sh @@ -33,7 +33,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - if_release_build_level cp "$WIN32_TARGET_PATH/insthelp.dbg" "$WINDOWS_DEBUGPATH_APP/insthelp.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/insthelp.dbg" "$WINDOWS_DEBUGPATH_APP/insthelp.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmbrowserhost/build.sh b/windows/src/desktop/kmbrowserhost/build.sh index 56a0de331f..dd3521f094 100755 --- a/windows/src/desktop/kmbrowserhost/build.sh +++ b/windows/src/desktop/kmbrowserhost/build.sh @@ -32,7 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - if_release_build_level cp "$WIN32_TARGET_PATH/kmbrowserhost.dbg" "$WINDOWS_DEBUGPATH_APP/kmbrowserhost.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmbrowserhost.dbg" "$WINDOWS_DEBUGPATH_APP/kmbrowserhost.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmconfig/build.sh b/windows/src/desktop/kmconfig/build.sh index 704067ddc1..a9f69bea21 100755 --- a/windows/src/desktop/kmconfig/build.sh +++ b/windows/src/desktop/kmconfig/build.sh @@ -32,7 +32,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - if_release_build_level cp "$WIN32_TARGET_PATH/kmconfig.dbg" "$WINDOWS_DEBUGPATH_APP/kmconfig.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmconfig.dbg" "$WINDOWS_DEBUGPATH_APP/kmconfig.dbg" } function do_publish() { diff --git a/windows/src/desktop/kmshell/build.sh b/windows/src/desktop/kmshell/build.sh index 0f3d7c9e69..6459a67fc6 100755 --- a/windows/src/desktop/kmshell/build.sh +++ b/windows/src/desktop/kmshell/build.sh @@ -39,7 +39,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" - if_release_build_level cp "$WIN32_TARGET_PATH/kmshell.dbg" "$WINDOWS_DEBUGPATH_APP/kmshell.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmshell.dbg" "$WINDOWS_DEBUGPATH_APP/kmshell.dbg" do_build_data } diff --git a/windows/src/desktop/setup/build.sh b/windows/src/desktop/setup/build.sh index 8415dd4734..a2b3310c3d 100755 --- a/windows/src/desktop/setup/build.sh +++ b/windows/src/desktop/setup/build.sh @@ -43,7 +43,7 @@ function do_build() { cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP" # setup-redist.exe does not get signed as it is intended for a bundled installer cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_APP/setup-redist.exe" - if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$WINDOWS_DEBUGPATH_APP/setup.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/setup.dbg" "$WINDOWS_DEBUGPATH_APP/setup.dbg" } function do_build_debug_manifest() { diff --git a/windows/src/engine/inst/build.sh b/windows/src/engine/inst/build.sh index 9891958cdd..0152644941 100755 --- a/windows/src/engine/inst/build.sh +++ b/windows/src/engine/inst/build.sh @@ -30,7 +30,7 @@ fi #------------------------------------------------------------------------------------------------------------------- function do_publish() { - if_release_build_level verify-program-signatures + builder_if_release_build_level verify-program-signatures # # Build the installation archive diff --git a/windows/src/engine/insthelper/build.sh b/windows/src/engine/insthelper/build.sh index 470b183748..85a9be91ea 100755 --- a/windows/src/engine/insthelper/build.sh +++ b/windows/src/engine/insthelper/build.sh @@ -31,7 +31,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/insthelper.dbg" "$WINDOWS_DEBUGPATH_ENGINE/insthelper.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/insthelper.dbg" "$WINDOWS_DEBUGPATH_ENGINE/insthelper.dbg" } function do_publish() { diff --git a/windows/src/engine/keyman/build.sh b/windows/src/engine/keyman/build.sh index adf924ee2a..561c277b9f 100755 --- a/windows/src/engine/keyman/build.sh +++ b/windows/src/engine/keyman/build.sh @@ -42,7 +42,7 @@ function do_build() { tds2dbg "$WIN32_TARGET" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/keyman.dbg" "$WINDOWS_DEBUGPATH_ENGINE/keyman.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/keyman.dbg" "$WINDOWS_DEBUGPATH_ENGINE/keyman.dbg" # Also copy sentry files here cp "$KEYMAN_ROOT/common/windows/delphi/ext/sentry/sentry.dll" \ diff --git a/windows/src/engine/keyman32/build.sh b/windows/src/engine/keyman32/build.sh index 47d77b718d..55da1ef003 100755 --- a/windows/src/engine/keyman32/build.sh +++ b/windows/src/engine/keyman32/build.sh @@ -41,7 +41,7 @@ function do_build_x86() { build_version.res vs_msbuild keyman32.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/keyman32.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/keyman32.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_build_x64() { @@ -49,7 +49,7 @@ function do_build_x64() { run_in_vs_env rc version64.rc vs_msbuild keyman32.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$X64_TARGET_PATH/keyman64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$X64_TARGET_PATH/keyman64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish_x86() { diff --git a/windows/src/engine/keymanx64/build.sh b/windows/src/engine/keymanx64/build.sh index d4dcbbee17..4398c062fb 100755 --- a/windows/src/engine/keymanx64/build.sh +++ b/windows/src/engine/keymanx64/build.sh @@ -33,7 +33,7 @@ function do_build() { build_manifest.res vs_msbuild keymanx64.vcxproj //t:Build "//p:Platform=x64" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$X64_TARGET_PATH/keymanx64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/kmcomapi/build.sh b/windows/src/engine/kmcomapi/build.sh index ca3b0285ce..83f0e164a1 100755 --- a/windows/src/engine/kmcomapi/build.sh +++ b/windows/src/engine/kmcomapi/build.sh @@ -44,7 +44,7 @@ function do_build() { mv -f "$WIN64_TARGET_PATH/kmcomapi.dll" "$WIN64_TARGET_PATH/kmcomapi.x64.dll" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_DEBUGPATH_ENGINE/kmcomapi.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_DEBUGPATH_ENGINE/kmcomapi.dbg" cp "$WIN64_TARGET_PATH/kmcomapi.x64.dll" "$WINDOWS_PROGRAM_ENGINE/kmcomapi.x64.dll" # x64 Delphi symbols not supported: cp "$WIN64_TARGET_PATH/kmcomapi.dbg" "$WINDOWS_PROGRAM_ENGINE/kmcomapi.x64.dbg" diff --git a/windows/src/engine/kmrefresh/build.sh b/windows/src/engine/kmrefresh/build.sh index 7ce32e3f28..257f9dc636 100755 --- a/windows/src/engine/kmrefresh/build.sh +++ b/windows/src/engine/kmrefresh/build.sh @@ -34,9 +34,9 @@ function do_build() { vs_msbuild kmrefresh.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmrefresh.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/kmrefresh.x86.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmrefresh.x86.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$X64_TARGET_PATH/kmrefresh.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$X64_TARGET_PATH/kmrefresh.x64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/kmtip/build.sh b/windows/src/engine/kmtip/build.sh index 9e7b9b928c..3289f5b6ed 100755 --- a/windows/src/engine/kmtip/build.sh +++ b/windows/src/engine/kmtip/build.sh @@ -35,9 +35,9 @@ function do_build() { vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=Win32" vs_msbuild kmtip.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/kmtip.pdb" "$WINDOWS_DEBUGPATH_ENGINE" cp "$X64_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$X64_TARGET_PATH/kmtip64.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/mcompile/build.sh b/windows/src/engine/mcompile/build.sh index e25b87a42e..d302e740bc 100755 --- a/windows/src/engine/mcompile/build.sh +++ b/windows/src/engine/mcompile/build.sh @@ -33,7 +33,7 @@ function do_build() { build_manifest.res vs_msbuild mcompile.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" - if_release_build_level cp "$WIN32_TARGET_PATH/mcompile.pdb" "$WINDOWS_DEBUGPATH_ENGINE" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/mcompile.pdb" "$WINDOWS_DEBUGPATH_ENGINE" } function do_publish() { diff --git a/windows/src/engine/tsysinfo/build.sh b/windows/src/engine/tsysinfo/build.sh index df259a99d9..51f233487a 100755 --- a/windows/src/engine/tsysinfo/build.sh +++ b/windows/src/engine/tsysinfo/build.sh @@ -47,7 +47,7 @@ function do_build() { cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_ENGINE" cp *.xslt "$WINDOWS_PROGRAM_ENGINE/" - if_release_build_level cp "$WIN32_TARGET_PATH/tsysinfo.dbg" "$WINDOWS_DEBUGPATH_ENGINE/tsysinfo.dbg" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/tsysinfo.dbg" "$WINDOWS_DEBUGPATH_ENGINE/tsysinfo.dbg" } function do_publish() { diff --git a/windows/src/support/etl2log/build.sh b/windows/src/support/etl2log/build.sh index 09f5967d87..b7fd91c9b9 100755 --- a/windows/src/support/etl2log/build.sh +++ b/windows/src/support/etl2log/build.sh @@ -31,7 +31,7 @@ function do_build() { build_version.res vs_msbuild etl2log.vcxproj //t:Build "//p:Platform=Win32" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_SUPPORT" - if_release_build_level cp "$WIN32_TARGET_PATH/etl2log.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/etl2log.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" } builder_run_action clean:project do_clean diff --git a/windows/src/support/texteditor/build.sh b/windows/src/support/texteditor/build.sh index 354144faa6..997d8e6f24 100755 --- a/windows/src/support/texteditor/build.sh +++ b/windows/src/support/texteditor/build.sh @@ -34,8 +34,8 @@ function do_build() { vs_msbuild Editor.vcxproj //t:Build "//p:Platform=x64" cp "$WIN32_TARGET" "$WINDOWS_PROGRAM_SUPPORT" cp "$X64_TARGET" "$WINDOWS_PROGRAM_SUPPORT" - if_release_build_level cp "$WIN32_TARGET_PATH/editor32.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" - if_release_build_level cp "$X64_TARGET_PATH/editor64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + builder_if_release_build_level cp "$WIN32_TARGET_PATH/editor32.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" + builder_if_release_build_level cp "$X64_TARGET_PATH/editor64.pdb" "$WINDOWS_DEBUGPATH_SUPPORT" } builder_run_action clean:project do_clean From deb18b48119d79ef35ae0f45bbb1620def39ad1e Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 16 Jun 2025 14:40:50 +1000 Subject: [PATCH 10/17] maint(resources): add pr-build-status check run GHA Adds a check run to verify the outcome of all builds on the branch, so that we can add branch protection rules. Fixes: #14172 Build-bot: skip --- .github/workflows/pr-build-status.yml | 183 + resources/build/pr-build-status/build.sh | 16 + ...53db37026c95b7ff5a6aa1e8fc-check-runs.json | 384 +++ ...0253db37026c95b7ff5a6aa1e8fc-statuses.json | 3005 +++++++++++++++++ ...066c9dcf71d25afa4c66efa17f-check-runs.json | 1 + ...c6066c9dcf71d25afa4c66efa17f-statuses.json | 1 + ...a56a8f2a534b42a49ee1f21ca1-check-runs.json | 246 ++ ...9fa56a8f2a534b42a49ee1f21ca1-statuses.json | 2972 ++++++++++++++++ ...f5067b4352a06505369d9038e0-check-runs.json | 246 ++ ...9ef5067b4352a06505369d9038e0-statuses.json | 2906 ++++++++++++++++ ...d6a780d8bcf862380e7a89aefb-check-runs.json | 246 ++ ...85d6a780d8bcf862380e7a89aefb-statuses.json | 35 + .../build/pr-build-status/package-lock.json | 1528 +++++++++ resources/build/pr-build-status/package.json | 20 + .../build/pr-build-status/pr-build-status.mjs | 188 ++ .../pr-build-status/pr-build-status.tests.mjs | 44 + resources/build/run-required-test-builds.sh | 34 +- 17 files changed, 12045 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/pr-build-status.yml create mode 100755 resources/build/pr-build-status/build.sh create mode 100644 resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-check-runs.json create mode 100644 resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-statuses.json create mode 100644 resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-check-runs.json create mode 100644 resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-statuses.json create mode 100644 resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-check-runs.json create mode 100644 resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-statuses.json create mode 100644 resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-check-runs.json create mode 100644 resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-statuses.json create mode 100644 resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-check-runs.json create mode 100644 resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-statuses.json create mode 100644 resources/build/pr-build-status/package-lock.json create mode 100644 resources/build/pr-build-status/package.json create mode 100644 resources/build/pr-build-status/pr-build-status.mjs create mode 100644 resources/build/pr-build-status/pr-build-status.tests.mjs diff --git a/.github/workflows/pr-build-status.yml b/.github/workflows/pr-build-status.yml new file mode 100644 index 0000000000..f8de2f7adf --- /dev/null +++ b/.github/workflows/pr-build-status.yml @@ -0,0 +1,183 @@ +name: Keyman Build Summary +on: + # push: + # branches: + # - "maint/resources/14172-pr-build-status-2" + + check_run: + types: [completed] + +jobs: + run_pr_build_status: + name: Summarize build status checks + runs-on: ubuntu-latest + steps: + - name: Check PR build status + id: run_pr_build_status_script + uses: actions/github-script@v7 + with: + script: | + // This code is copied out of resources/build/pr-build-status/pr-build-status.mjs + // where it is tested. It is copied inline here in order to avoid requiring the + // repository to be checked out, which dramatically reduces the run time of the + // check. + // + // Note: we don't currently look at check runs, only statuses + // + // Verify the following statuses: + // 'user_testing' + // 'API Verification' (github-actions[bot]) + // + // At least 1 of the following statuses must be found: + // 'Test*' (keyman-server), e.g. 'Test Build (Keyman)' + // 'Ubuntu Packaging' (github-actions[bot]) + // + // Ignore the following statuses: + // check/web/file-size + // + + function reduceStatuses(statuses) { + const filtered_statuses = statuses.reduce((o, status) => { + if(status.creator?.login == 'keyman-server' && status.context.startsWith('Test')) { + if(!o[status.context]) o[status.context] = {type: 'build', state: status.state}; + } else if(status.creator?.login == 'keymanapp-test-bot[bot]' && status.context == 'user_testing') { + if(!o[status.context]) o[status.context] = {type: 'user-test', state: status.state};; + } else if(status.context == 'API Verification') { + if(!o[status.context]) o[status.context] = {type: 'check', state: status.state}; + } else if(status.context == 'Ubuntu Packaging') { + if(!o[status.context]) o[status.context] = {type: 'build', state: status.state}; + } else if(status.context == 'check/web/file-size') { + // Ignore check/web/file-size -- we won't block automerge for this at this point + } else { + // We fail with an 'unknown status' response if we get a new status check + // so we can be sure we are not skipping known status checks + o[status.context] = {type: 'unknown', state: status.state}; + } + return o; + + }, {}); + return filtered_statuses; + } + + // + // Given the collection of status checks we care about, return + // an aggregate status -- error, failed, pending, or success, + // and a summary description + // + function calculateFinalStatus(filtered_statuses) { + const counts = {}; + let hasBuilds = false; + for(const context of Object.keys(filtered_statuses)) { + const { state, type } = filtered_statuses[context]; + if(type == 'unknown') { + // We special-case for unknown status checks, and never permit them + return [ + 'error', `An unknown context ${context} was found, cannot calculate build status.` + ]; + } + if(type == 'build') { + hasBuilds = true; + } + counts[state] = counts[state] ? counts[state] + 1 : 1; + } + + // If we do not have any statuses yet, we wait + if(Object.keys(filtered_statuses).length == 0 || !hasBuilds) { + return ['pending', 'Checks have not yet been triggered ⌛']; + } + + const state = + counts.error ? 'error' : + counts.failed ? 'failed' : + counts.pending ? 'pending' : + 'success'; + + let description = ''; //; + function appendDescription(count, state) { + if(!count) return; + if(description != '') description += '; '; + description += `${count} check${count == 1 ? '' : 's'} ${state}`; + } + appendDescription(counts.error, 'in an error state ❌'); + appendDescription(counts.failed, 'failed ❌'); + appendDescription(counts.pending, 'pending ⌛'); + appendDescription(counts.success, 'completed successfully ✅'); + + return [ state, description ]; + } + + async function getCommitStatuses(github, owner, repo, sha) { + const statuses = await github.paginate('GET /repos/{owner}/{repo}/commits/{sha}/statuses', { + owner, + repo, + sha, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + return statuses; + } + + async function getCommitCheckRuns(github, owner, repo, sha) { + const statuses = await github.paginate('GET /repos/{owner}/{repo}/commits/{sha}/check-runs', { + owner, + repo, + sha, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + return statuses; + } + + function calculateCheckResult(statuses) { + if(!Array.isArray(statuses)) { + return ['error', 'Failed to retrieve status checks from GitHub ❌']; + } + + const filtered_statuses = reduceStatuses(statuses); + + const result = calculateFinalStatus(filtered_statuses); + return result; + } + + async function test(github, owner, repo, sha) { + // Get statuses from sha + const statuses = await getCommitStatuses(github, owner, repo, sha); + return calculateCheckResult(statuses); + } + + async function createCheck(github, owner, repo, sha) { + const check = await github.rest.checks.create({ + owner, + repo, + head_sha: sha, + name: 'Build Outcome', + status: 'in_progress', + }); + return check.data.id; + } + + async function updateCheck(github, owner, repo, checkRunId, status, description) { + // To ensure that + const checkStatus = status == 'pending' ? 'in_progress' : 'completed'; + const conclusion = checkStatus == 'in_progress' ? undefined : (status == 'success' ? 'success' : 'failure'); + + await github.rest.checks.update({ + owner, + repo, + check_run_id: checkRunId, + status: checkStatus, + conclusion, + output: { + title: description, + summary: '' + } + }); + } + + const { owner, repo } = context.repo; + const sha = context.payload?.check_suite?.sha || context.sha; + const checkRunId = await createCheck(github, owner, repo, sha); + const res = await test(github, owner, repo, sha); + await updateCheck(github, owner, repo, checkRunId, res[0], res[1]); diff --git a/resources/build/pr-build-status/build.sh b/resources/build/pr-build-status/build.sh new file mode 100755 index 0000000000..7672bb286c --- /dev/null +++ b/resources/build/pr-build-status/build.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +## START STANDARD BUILD SCRIPT INCLUDE +# adjust relative paths as necessary +THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" +. "${THIS_SCRIPT%/*}/../../../resources/build/builder.inc.sh" +## END STANDARD BUILD SCRIPT INCLUDE + +builder_describe "Test the pr-build-status.yml GHA" test + +builder_parse "$@" + +# TODO: consider generating the .yml from here? + +builder_run_action test npm test + diff --git a/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-check-runs.json b/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-check-runs.json new file mode 100644 index 0000000000..46f4415c17 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-check-runs.json @@ -0,0 +1,384 @@ +[ + { + "id": 44090590145, + "name": "build", + "node_id": "CR_kwDOAY2xT88AAAAKRAEDwQ", + "head_sha": "11a558e926370253db37026c95b7ff5a6aa1e8fc", + "external_id": "389dd74c-044c-5be6-a27d-4b4819c2ff55", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090590145", + "html_url": "https://github.com/keymanapp/keyman/actions/runs/15648814574/job/44090590145", + "details_url": "https://github.com/keymanapp/keyman/actions/runs/15648814574/job/44090590145", + "status": "completed", + "conclusion": "skipped", + "started_at": "2025-06-14T05:23:18Z", + "completed_at": "2025-06-14T05:23:18Z", + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090590145/annotations" + }, + "check_suite": { + "id": 40118324763 + }, + "app": { + "id": 15368, + "client_id": "Iv1.05c79e9ad1f6bdfa", + "slug": "github-actions", + "node_id": "MDM6QXBwMTUzNjg=", + "owner": { + "login": "github", + "id": 9919, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2025-03-07T16:35:00Z", + "permissions": { + "actions": "write", + "administration": "read", + "attestations": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "discussions": "write", + "issues": "write", + "merge_queues": "write", + "metadata": "read", + "models": "read", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "branch_protection_rule", + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "discussion", + "discussion_comment", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "merge_group", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + }, + { + "id": 44090590129, + "name": "triage", + "node_id": "CR_kwDOAY2xT88AAAAKRAEDsQ", + "head_sha": "11a558e926370253db37026c95b7ff5a6aa1e8fc", + "external_id": "d467db85-960e-541c-a8c1-5f09c33904f5", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090590129", + "html_url": "https://github.com/keymanapp/keyman/actions/runs/15648814560/job/44090590129", + "details_url": "https://github.com/keymanapp/keyman/actions/runs/15648814560/job/44090590129", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-14T05:23:21Z", + "completed_at": "2025-06-14T05:23:29Z", + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090590129/annotations" + }, + "check_suite": { + "id": 40118324747 + }, + "app": { + "id": 15368, + "client_id": "Iv1.05c79e9ad1f6bdfa", + "slug": "github-actions", + "node_id": "MDM6QXBwMTUzNjg=", + "owner": { + "login": "github", + "id": 9919, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2025-03-07T16:35:00Z", + "permissions": { + "actions": "write", + "administration": "read", + "attestations": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "discussions": "write", + "issues": "write", + "merge_queues": "write", + "metadata": "read", + "models": "read", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "branch_protection_rule", + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "discussion", + "discussion_comment", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "merge_group", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + }, + { + "id": 44090589932, + "name": "GitGuardian Security Checks", + "node_id": "CR_kwDOAY2xT88AAAAKRAEC7A", + "head_sha": "11a558e926370253db37026c95b7ff5a6aa1e8fc", + "external_id": "", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090589932", + "html_url": "https://github.com/keymanapp/keyman/runs/44090589932", + "details_url": "https://dashboard.gitguardian.com", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-14T05:23:17Z", + "completed_at": "2025-06-14T05:23:20Z", + "output": { + "title": "No secrets detected ✅", + "summary": "**1** commit was scanned without uncovering any secrets.\n", + "text": "Commit scanned: **1**\n\n\n\n- Pull request #14196: `maint/developer/support-buildLevel` 👉 `maint/common/pr-build-bot`\n \n\n🦉 [GitGuardian](https://dashboard.gitguardian.com/auth/login/?utm_medium=checkruns&utm_source=github&utm_campaign=cr1) detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
\n", + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44090589932/annotations" + }, + "check_suite": { + "id": 40118324322 + }, + "app": { + "id": 46505, + "client_id": "Iv1.ec3c001966b4cc5a", + "slug": "gitguardian", + "node_id": "MDM6QXBwNDY1MDU=", + "owner": { + "login": "GitGuardian", + "id": 27360172, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI3MzYwMTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/27360172?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GitGuardian", + "html_url": "https://github.com/GitGuardian", + "followers_url": "https://api.github.com/users/GitGuardian/followers", + "following_url": "https://api.github.com/users/GitGuardian/following{/other_user}", + "gists_url": "https://api.github.com/users/GitGuardian/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GitGuardian/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GitGuardian/subscriptions", + "organizations_url": "https://api.github.com/users/GitGuardian/orgs", + "repos_url": "https://api.github.com/users/GitGuardian/repos", + "events_url": "https://api.github.com/users/GitGuardian/events{/privacy}", + "received_events_url": "https://api.github.com/users/GitGuardian/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitGuardian", + "description": "# 🦉 What is GitGuardian?\r\n\r\nGitGuardian Secrets Detection detects and fixes vulnerabilities in source code at every step of the software development lifecycle, covering 350+ types of secrets like API keys, database connection strings, private keys, certificates, and more. The platform’s policy engine enables security teams to monitor and enforce rules across their VCS, DevOps tools, and infrastructure-as-code configurations. Our automated remediation playbooks and collaboration features bring security and development teams together to resolve incidents fast and in full.\r\n\r\n## 1. Scan your codebase for 350+ types of secrets\r\nGitGuardian scans your GitHub repositories and raises alerts only for critical secrets, such as API keys or other credentials. At scale, GitGuardian’s detection algorithm has been battle-tested on over three years of activity in all public GitHub repositories – totaling over 1 billion scanned commits!\r\n\r\n## 2. Quickly remediate your hard-coded secrets\r\nIf you ever experience a leak involving a credential, we have a complete remediation guide used by 100k+ developers each year. We’ll show you how to revoke the secret and remove it from your git history.\r\n\r\n## 3. Prevent secrets from reaching GitHub\r\nInstall ggshield, the GitGuardian CLI, and add secrets detection to your local development workflow using pre-commit and pre-push git hooks integrations.\r\n\r\n# 🙋‍♂️ FAQ\r\n\r\n**What is your pricing?**\r\nGitGuardian is free for teams under 25 developers and offers a 30-day trial for larger teams.\r\n\r\n**How can I be sure that GitGuardian won’t raise too many false positives?**\r\nWe have scanned billions of commits, sent millions of alerts since 2018, and integrated each feedback to improve our algorithm. Our alerts currently receive 91% “true positive” feedback from developers.\r\n\r\n**My repositories are private; why should I install automated secret detection?**\r\nImagine if there were a plain text file with all your credit card numbers inside, you wouldn’t put this file inside your company’s git repository. Secrets are just as sensitive and should be handled with special care.\r\n\r\n**Is GitGuardian available to be installed on-premise?**\r\nYes, you can contact one of our security specialists to look over the possibility of installing GitGuardian on-premise on your repositories.\r\n\r\n# ⚒️ Installation notes \r\n\r\nYou should install GitGuardian directly through your [GitGuardian](https://dashboard.gitguardian.com/) workspace on the Integration settings page. \r\n\r\nSo that you know, your GitHub organization or GitHub account can only be associated with a single GitGuardian workspace.\r\n\r\n# 👋 Support\r\n\r\nIf you experience any difficulties or have any questions, please reach out to us by email ([support@gitguardian.com](mailto:support@gitguardian.com)).", + "external_url": "https://dashboard.gitguardian.com", + "html_url": "https://github.com/apps/gitguardian", + "created_at": "2019-11-12T15:44:31Z", + "updated_at": "2023-07-18T09:06:22Z", + "permissions": { + "checks": "write", + "contents": "read", + "emails": "read", + "issues": "write", + "members": "read", + "metadata": "read", + "organization_hooks": "write", + "pull_requests": "write" + }, + "events": [ + "check_run", + "check_suite", + "commit_comment", + "create", + "delete", + "organization", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "repository" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-statuses.json b/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-statuses.json new file mode 100644 index 0000000000..02f629220d --- /dev/null +++ b/resources/build/pr-build-status/fixtures/11a558e926370253db37026c95b7ff5a6aa1e8fc-statuses.json @@ -0,0 +1,3005 @@ +[ + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974475031, + "node_id": "SC_kwDOAY2xT88AAAAIm9m3Fw", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557042", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-14T05:58:17Z", + "updated_at": "2025-06-14T05:58:17Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974472547, + "node_id": "SC_kwDOAY2xT88AAAAIm9mtYw", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557042", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-14T05:57:36Z", + "updated_at": "2025-06-14T05:57:36Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974455323, + "node_id": "SC_kwDOAY2xT88AAAAIm9lqGw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:52:43Z", + "updated_at": "2025-06-14T05:52:43Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974455007, + "node_id": "SC_kwDOAY2xT88AAAAIm9lo3w", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557030", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-14T05:52:37Z", + "updated_at": "2025-06-14T05:52:37Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974447591, + "node_id": "SC_kwDOAY2xT88AAAAIm9lL5w", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:50:28Z", + "updated_at": "2025-06-14T05:50:28Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974447340, + "node_id": "SC_kwDOAY2xT88AAAAIm9lK7A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557030", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-14T05:50:24Z", + "updated_at": "2025-06-14T05:50:24Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974447314, + "node_id": "SC_kwDOAY2xT88AAAAIm9lK0g", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557041", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-14T05:50:24Z", + "updated_at": "2025-06-14T05:50:24Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974436093, + "node_id": "SC_kwDOAY2xT88AAAAIm9ke_Q", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:47:10Z", + "updated_at": "2025-06-14T05:47:10Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974435704, + "node_id": "SC_kwDOAY2xT88AAAAIm9kdeA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557041", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-14T05:47:04Z", + "updated_at": "2025-06-14T05:47:04Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974435663, + "node_id": "SC_kwDOAY2xT88AAAAIm9kdTw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557043", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-14T05:47:03Z", + "updated_at": "2025-06-14T05:47:03Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974428929, + "node_id": "SC_kwDOAY2xT88AAAAIm9kDAQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:45:14Z", + "updated_at": "2025-06-14T05:45:14Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974428773, + "node_id": "SC_kwDOAY2xT88AAAAIm9kCZQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557025", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-14T05:45:12Z", + "updated_at": "2025-06-14T05:45:12Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974413112, + "node_id": "SC_kwDOAY2xT88AAAAIm9jFOA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:41:03Z", + "updated_at": "2025-06-14T05:41:03Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974413052, + "node_id": "SC_kwDOAY2xT88AAAAIm9jE_A", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:41:02Z", + "updated_at": "2025-06-14T05:41:02Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974412786, + "node_id": "SC_kwDOAY2xT88AAAAIm9jD8g", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557043", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-14T05:40:57Z", + "updated_at": "2025-06-14T05:40:57Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974412759, + "node_id": "SC_kwDOAY2xT88AAAAIm9jD1w", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557035", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-14T05:40:57Z", + "updated_at": "2025-06-14T05:40:57Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974412521, + "node_id": "SC_kwDOAY2xT88AAAAIm9jC6Q", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557028", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-14T05:40:53Z", + "updated_at": "2025-06-14T05:40:53Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974397722, + "node_id": "SC_kwDOAY2xT88AAAAIm9iJGg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:36:41Z", + "updated_at": "2025-06-14T05:36:41Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974397485, + "node_id": "SC_kwDOAY2xT88AAAAIm9iILQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557044", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-14T05:36:37Z", + "updated_at": "2025-06-14T05:36:37Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974394397, + "node_id": "SC_kwDOAY2xT88AAAAIm9h8HQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:35:45Z", + "updated_at": "2025-06-14T05:35:45Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974393913, + "node_id": "SC_kwDOAY2xT88AAAAIm9h6OQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557035", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-14T05:35:38Z", + "updated_at": "2025-06-14T05:35:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974393881, + "node_id": "SC_kwDOAY2xT88AAAAIm9h6GQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557034", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-14T05:35:38Z", + "updated_at": "2025-06-14T05:35:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974392050, + "node_id": "SC_kwDOAY2xT88AAAAIm9hy8g", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:35:07Z", + "updated_at": "2025-06-14T05:35:07Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974391695, + "node_id": "SC_kwDOAY2xT88AAAAIm9hxjw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557045", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-14T05:35:02Z", + "updated_at": "2025-06-14T05:35:02Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974389314, + "node_id": "SC_kwDOAY2xT88AAAAIm9hoQg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:34:21Z", + "updated_at": "2025-06-14T05:34:21Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974389188, + "node_id": "SC_kwDOAY2xT88AAAAIm9hnxA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557045", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-14T05:34:19Z", + "updated_at": "2025-06-14T05:34:19Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974389160, + "node_id": "SC_kwDOAY2xT88AAAAIm9hnqA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557040", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-14T05:34:19Z", + "updated_at": "2025-06-14T05:34:19Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974387372, + "node_id": "SC_kwDOAY2xT88AAAAIm9hgrA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557038", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-14T05:33:48Z", + "updated_at": "2025-06-14T05:33:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974382289, + "node_id": "SC_kwDOAY2xT88AAAAIm9hM0Q", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:32:25Z", + "updated_at": "2025-06-14T05:32:25Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36974380961, + "node_id": "SC_kwDOAY2xT88AAAAIm9hHoQ", + "state": "success", + "description": "API verification succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15648875895", + "context": "API Verification", + "created_at": "2025-06-14T05:32:07Z", + "updated_at": "2025-06-14T05:32:07Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974379441, + "node_id": "SC_kwDOAY2xT88AAAAIm9hBsQ", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557036", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-14T05:31:44Z", + "updated_at": "2025-06-14T05:31:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974379408, + "node_id": "SC_kwDOAY2xT88AAAAIm9hBkA", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557036", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-14T05:31:44Z", + "updated_at": "2025-06-14T05:31:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974377063, + "node_id": "SC_kwDOAY2xT88AAAAIm9g4Zw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:31:10Z", + "updated_at": "2025-06-14T05:31:10Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974376865, + "node_id": "SC_kwDOAY2xT88AAAAIm9g3oQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557034", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-14T05:31:08Z", + "updated_at": "2025-06-14T05:31:08Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974376840, + "node_id": "SC_kwDOAY2xT88AAAAIm9g3iA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557032", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-14T05:31:08Z", + "updated_at": "2025-06-14T05:31:08Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36974376415, + "node_id": "SC_kwDOAY2xT88AAAAIm9g13w", + "state": "pending", + "description": "API verification started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15648875895", + "context": "API Verification", + "created_at": "2025-06-14T05:31:03Z", + "updated_at": "2025-06-14T05:31:03Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974375823, + "node_id": "SC_kwDOAY2xT88AAAAIm9gzjw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:30:55Z", + "updated_at": "2025-06-14T05:30:55Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36974375684, + "node_id": "SC_kwDOAY2xT88AAAAIm9gzBA", + "state": "success", + "description": "Package build succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15648818384", + "context": "Ubuntu Packaging", + "created_at": "2025-06-14T05:30:53Z", + "updated_at": "2025-06-14T05:30:53Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974375142, + "node_id": "SC_kwDOAY2xT88AAAAIm9gw5g", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:30:46Z", + "updated_at": "2025-06-14T05:30:46Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974374835, + "node_id": "SC_kwDOAY2xT88AAAAIm9gvsw", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557042", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-14T05:30:42Z", + "updated_at": "2025-06-14T05:30:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974374814, + "node_id": "SC_kwDOAY2xT88AAAAIm9gvng", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557039", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-14T05:30:41Z", + "updated_at": "2025-06-14T05:30:41Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974374101, + "node_id": "SC_kwDOAY2xT88AAAAIm9gs1Q", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:30:32Z", + "updated_at": "2025-06-14T05:30:32Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974373619, + "node_id": "SC_kwDOAY2xT88AAAAIm9gq8w", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557044", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-14T05:30:26Z", + "updated_at": "2025-06-14T05:30:26Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974373603, + "node_id": "SC_kwDOAY2xT88AAAAIm9gq4w", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557027", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-14T05:30:25Z", + "updated_at": "2025-06-14T05:30:25Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974373412, + "node_id": "SC_kwDOAY2xT88AAAAIm9gqJA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:30:23Z", + "updated_at": "2025-06-14T05:30:23Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974373339, + "node_id": "SC_kwDOAY2xT88AAAAIm9gp2w", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:30:22Z", + "updated_at": "2025-06-14T05:30:22Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974373229, + "node_id": "SC_kwDOAY2xT88AAAAIm9gpbQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557032", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-14T05:30:20Z", + "updated_at": "2025-06-14T05:30:20Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974373203, + "node_id": "SC_kwDOAY2xT88AAAAIm9gpUw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557026", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-14T05:30:20Z", + "updated_at": "2025-06-14T05:30:20Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974373081, + "node_id": "SC_kwDOAY2xT88AAAAIm9go2Q", + "state": "success", + "description": "⚠️ Warning: keymanweb.js is 62 bytes (0%) larger than 19.0.57, now 428,785 bytes", + "target_url": null, + "context": "check/web/file-size", + "created_at": "2025-06-14T05:30:19Z", + "updated_at": "2025-06-14T05:30:19Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974369712, + "node_id": "SC_kwDOAY2xT88AAAAIm9gbsA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557040", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-14T05:29:34Z", + "updated_at": "2025-06-14T05:29:34Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974369686, + "node_id": "SC_kwDOAY2xT88AAAAIm9gblg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557031", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-14T05:29:33Z", + "updated_at": "2025-06-14T05:29:33Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974362550, + "node_id": "SC_kwDOAY2xT88AAAAIm9f_tg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:27:38Z", + "updated_at": "2025-06-14T05:27:38Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974361989, + "node_id": "SC_kwDOAY2xT88AAAAIm9f9hQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557039", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-14T05:27:30Z", + "updated_at": "2025-06-14T05:27:30Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974361954, + "node_id": "SC_kwDOAY2xT88AAAAIm9f9Yg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557033", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-14T05:27:29Z", + "updated_at": "2025-06-14T05:27:29Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974351989, + "node_id": "SC_kwDOAY2xT88AAAAIm9fWdQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:24:56Z", + "updated_at": "2025-06-14T05:24:56Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974351881, + "node_id": "SC_kwDOAY2xT88AAAAIm9fWCQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557029", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-14T05:24:54Z", + "updated_at": "2025-06-14T05:24:54Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974351855, + "node_id": "SC_kwDOAY2xT88AAAAIm9fV7w", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557031", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-14T05:24:54Z", + "updated_at": "2025-06-14T05:24:54Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974351007, + "node_id": "SC_kwDOAY2xT88AAAAIm9fSnw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:24:41Z", + "updated_at": "2025-06-14T05:24:41Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974350924, + "node_id": "SC_kwDOAY2xT88AAAAIm9fSTA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557038", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-14T05:24:39Z", + "updated_at": "2025-06-14T05:24:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974350892, + "node_id": "SC_kwDOAY2xT88AAAAIm9fSLA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557037", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-14T05:24:39Z", + "updated_at": "2025-06-14T05:24:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974350149, + "node_id": "SC_kwDOAY2xT88AAAAIm9fPRQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557036", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-14T05:24:27Z", + "updated_at": "2025-06-14T05:24:27Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36974348090, + "node_id": "SC_kwDOAY2xT88AAAAIm9fHOg", + "state": "pending", + "description": "Ubuntu packaging started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15648818384", + "context": "Ubuntu Packaging", + "created_at": "2025-06-14T05:24:00Z", + "updated_at": "2025-06-14T05:24:00Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347889, + "node_id": "SC_kwDOAY2xT88AAAAIm9fGcQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557029", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-14T05:23:57Z", + "updated_at": "2025-06-14T05:23:57Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347861, + "node_id": "SC_kwDOAY2xT88AAAAIm9fGVQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557045", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-14T05:23:56Z", + "updated_at": "2025-06-14T05:23:56Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347833, + "node_id": "SC_kwDOAY2xT88AAAAIm9fGOQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557044", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-14T05:23:56Z", + "updated_at": "2025-06-14T05:23:56Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347805, + "node_id": "SC_kwDOAY2xT88AAAAIm9fGHQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557043", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-14T05:23:55Z", + "updated_at": "2025-06-14T05:23:55Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347765, + "node_id": "SC_kwDOAY2xT88AAAAIm9fF9Q", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557042", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-14T05:23:55Z", + "updated_at": "2025-06-14T05:23:55Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347736, + "node_id": "SC_kwDOAY2xT88AAAAIm9fF2A", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557041", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-14T05:23:54Z", + "updated_at": "2025-06-14T05:23:54Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347706, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFug", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557040", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-14T05:23:54Z", + "updated_at": "2025-06-14T05:23:54Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347679, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFnw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557039", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-14T05:23:54Z", + "updated_at": "2025-06-14T05:23:54Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347658, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFig", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557038", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-14T05:23:53Z", + "updated_at": "2025-06-14T05:23:53Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347638, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFdg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557036", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-14T05:23:53Z", + "updated_at": "2025-06-14T05:23:53Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347608, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFWA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557037", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-14T05:23:52Z", + "updated_at": "2025-06-14T05:23:52Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347589, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFRQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557037", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-14T05:23:52Z", + "updated_at": "2025-06-14T05:23:52Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347556, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFJA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557035", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-14T05:23:52Z", + "updated_at": "2025-06-14T05:23:52Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347542, + "node_id": "SC_kwDOAY2xT88AAAAIm9fFFg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557033", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-14T05:23:51Z", + "updated_at": "2025-06-14T05:23:51Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347519, + "node_id": "SC_kwDOAY2xT88AAAAIm9fE_w", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557034", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-14T05:23:51Z", + "updated_at": "2025-06-14T05:23:51Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347502, + "node_id": "SC_kwDOAY2xT88AAAAIm9fE7g", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557033", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-14T05:23:51Z", + "updated_at": "2025-06-14T05:23:51Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347461, + "node_id": "SC_kwDOAY2xT88AAAAIm9fExQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557032", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-14T05:23:50Z", + "updated_at": "2025-06-14T05:23:50Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347432, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEqA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557030", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-14T05:23:49Z", + "updated_at": "2025-06-14T05:23:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347412, + "node_id": "SC_kwDOAY2xT88AAAAIm9fElA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557031", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-14T05:23:49Z", + "updated_at": "2025-06-14T05:23:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347397, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEhQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557028", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-14T05:23:49Z", + "updated_at": "2025-06-14T05:23:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347378, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEcg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557029", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-14T05:23:48Z", + "updated_at": "2025-06-14T05:23:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347351, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEVw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557028", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-14T05:23:48Z", + "updated_at": "2025-06-14T05:23:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347323, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEOw", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557027", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-14T05:23:47Z", + "updated_at": "2025-06-14T05:23:47Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347304, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEKA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557026", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-14T05:23:47Z", + "updated_at": "2025-06-14T05:23:47Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347268, + "node_id": "SC_kwDOAY2xT88AAAAIm9fEBA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557027", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-14T05:23:46Z", + "updated_at": "2025-06-14T05:23:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347252, + "node_id": "SC_kwDOAY2xT88AAAAIm9fD9A", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557026", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-14T05:23:46Z", + "updated_at": "2025-06-14T05:23:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347236, + "node_id": "SC_kwDOAY2xT88AAAAIm9fD5A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557025", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-14T05:23:46Z", + "updated_at": "2025-06-14T05:23:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36974347211, + "node_id": "SC_kwDOAY2xT88AAAAIm9fDyw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557025", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-14T05:23:45Z", + "updated_at": "2025-06-14T05:23:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/11a558e926370253db37026c95b7ff5a6aa1e8fc", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36974345720, + "node_id": "SC_kwDOAY2xT88AAAAIm9e9-A", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-14T05:23:18Z", + "updated_at": "2025-06-14T05:23:18Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-check-runs.json b/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-check-runs.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-check-runs.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-statuses.json b/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-statuses.json new file mode 100644 index 0000000000..0637a088a0 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/153683cfb007c6066c9dcf71d25afa4c66efa17f-statuses.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-check-runs.json b/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-check-runs.json new file mode 100644 index 0000000000..6333cf0c88 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-check-runs.json @@ -0,0 +1,246 @@ +[ + { + "id": 44134134750, + "name": "triage", + "node_id": "CR_kwDOAY2xT88AAAAKRplz3g", + "head_sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "external_id": "aece869f-5587-5930-867f-8649375f3d24", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44134134750", + "html_url": "https://github.com/keymanapp/keyman/actions/runs/15667765443/job/44134134750", + "details_url": "https://github.com/keymanapp/keyman/actions/runs/15667765443/job/44134134750", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-15T21:54:36Z", + "completed_at": "2025-06-15T21:54:41Z", + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44134134750/annotations" + }, + "check_suite": { + "id": 40159371625 + }, + "app": { + "id": 15368, + "client_id": "Iv1.05c79e9ad1f6bdfa", + "slug": "github-actions", + "node_id": "MDM6QXBwMTUzNjg=", + "owner": { + "login": "github", + "id": 9919, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2025-03-07T16:35:00Z", + "permissions": { + "actions": "write", + "administration": "read", + "attestations": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "discussions": "write", + "issues": "write", + "merge_queues": "write", + "metadata": "read", + "models": "read", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "branch_protection_rule", + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "discussion", + "discussion_comment", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "merge_group", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + }, + { + "id": 44134134737, + "name": "GitGuardian Security Checks", + "node_id": "CR_kwDOAY2xT88AAAAKRplz0Q", + "head_sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "external_id": "", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44134134737", + "html_url": "https://github.com/keymanapp/keyman/runs/44134134737", + "details_url": "https://dashboard.gitguardian.com", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-15T21:54:32Z", + "completed_at": "2025-06-15T21:54:44Z", + "output": { + "title": "No secrets detected ✅", + "summary": "**5** commits were scanned without uncovering any secrets.\n", + "text": "Commits scanned: **5**\n\n\n\n- Pull request #14196: `maint/developer/support-buildLevel` 👉 `maint/common/pr-build-bot`\n \n\n🦉 [GitGuardian](https://dashboard.gitguardian.com/auth/login/?utm_medium=checkruns&utm_source=github&utm_campaign=cr1) detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
\n", + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44134134737/annotations" + }, + "check_suite": { + "id": 40159371205 + }, + "app": { + "id": 46505, + "client_id": "Iv1.ec3c001966b4cc5a", + "slug": "gitguardian", + "node_id": "MDM6QXBwNDY1MDU=", + "owner": { + "login": "GitGuardian", + "id": 27360172, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI3MzYwMTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/27360172?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GitGuardian", + "html_url": "https://github.com/GitGuardian", + "followers_url": "https://api.github.com/users/GitGuardian/followers", + "following_url": "https://api.github.com/users/GitGuardian/following{/other_user}", + "gists_url": "https://api.github.com/users/GitGuardian/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GitGuardian/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GitGuardian/subscriptions", + "organizations_url": "https://api.github.com/users/GitGuardian/orgs", + "repos_url": "https://api.github.com/users/GitGuardian/repos", + "events_url": "https://api.github.com/users/GitGuardian/events{/privacy}", + "received_events_url": "https://api.github.com/users/GitGuardian/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitGuardian", + "description": "# 🦉 What is GitGuardian?\r\n\r\nGitGuardian Secrets Detection detects and fixes vulnerabilities in source code at every step of the software development lifecycle, covering 350+ types of secrets like API keys, database connection strings, private keys, certificates, and more. The platform’s policy engine enables security teams to monitor and enforce rules across their VCS, DevOps tools, and infrastructure-as-code configurations. Our automated remediation playbooks and collaboration features bring security and development teams together to resolve incidents fast and in full.\r\n\r\n## 1. Scan your codebase for 350+ types of secrets\r\nGitGuardian scans your GitHub repositories and raises alerts only for critical secrets, such as API keys or other credentials. At scale, GitGuardian’s detection algorithm has been battle-tested on over three years of activity in all public GitHub repositories – totaling over 1 billion scanned commits!\r\n\r\n## 2. Quickly remediate your hard-coded secrets\r\nIf you ever experience a leak involving a credential, we have a complete remediation guide used by 100k+ developers each year. We’ll show you how to revoke the secret and remove it from your git history.\r\n\r\n## 3. Prevent secrets from reaching GitHub\r\nInstall ggshield, the GitGuardian CLI, and add secrets detection to your local development workflow using pre-commit and pre-push git hooks integrations.\r\n\r\n# 🙋‍♂️ FAQ\r\n\r\n**What is your pricing?**\r\nGitGuardian is free for teams under 25 developers and offers a 30-day trial for larger teams.\r\n\r\n**How can I be sure that GitGuardian won’t raise too many false positives?**\r\nWe have scanned billions of commits, sent millions of alerts since 2018, and integrated each feedback to improve our algorithm. Our alerts currently receive 91% “true positive” feedback from developers.\r\n\r\n**My repositories are private; why should I install automated secret detection?**\r\nImagine if there were a plain text file with all your credit card numbers inside, you wouldn’t put this file inside your company’s git repository. Secrets are just as sensitive and should be handled with special care.\r\n\r\n**Is GitGuardian available to be installed on-premise?**\r\nYes, you can contact one of our security specialists to look over the possibility of installing GitGuardian on-premise on your repositories.\r\n\r\n# ⚒️ Installation notes \r\n\r\nYou should install GitGuardian directly through your [GitGuardian](https://dashboard.gitguardian.com/) workspace on the Integration settings page. \r\n\r\nSo that you know, your GitHub organization or GitHub account can only be associated with a single GitGuardian workspace.\r\n\r\n# 👋 Support\r\n\r\nIf you experience any difficulties or have any questions, please reach out to us by email ([support@gitguardian.com](mailto:support@gitguardian.com)).", + "external_url": "https://dashboard.gitguardian.com", + "html_url": "https://github.com/apps/gitguardian", + "created_at": "2019-11-12T15:44:31Z", + "updated_at": "2023-07-18T09:06:22Z", + "permissions": { + "checks": "write", + "contents": "read", + "emails": "read", + "issues": "write", + "members": "read", + "metadata": "read", + "organization_hooks": "write", + "pull_requests": "write" + }, + "events": [ + "check_run", + "check_suite", + "commit_comment", + "create", + "delete", + "organization", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "repository" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-statuses.json b/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-statuses.json new file mode 100644 index 0000000000..1f4182dc20 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1-statuses.json @@ -0,0 +1,2972 @@ +[ + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984353753, + "node_id": "SC_kwDOAY2xT88AAAAInHBz2Q", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:41:11Z", + "updated_at": "2025-06-15T22:41:11Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984353236, + "node_id": "SC_kwDOAY2xT88AAAAInHBx1A", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557231", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T22:41:03Z", + "updated_at": "2025-06-15T22:41:03Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984254223, + "node_id": "SC_kwDOAY2xT88AAAAInG7vDw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:18:11Z", + "updated_at": "2025-06-15T22:18:11Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984254010, + "node_id": "SC_kwDOAY2xT88AAAAInG7uOg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557232", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T22:18:08Z", + "updated_at": "2025-06-15T22:18:08Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984252185, + "node_id": "SC_kwDOAY2xT88AAAAInG7nGQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:17:41Z", + "updated_at": "2025-06-15T22:17:41Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984251922, + "node_id": "SC_kwDOAY2xT88AAAAInG7mEg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557214", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T22:17:38Z", + "updated_at": "2025-06-15T22:17:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984248491, + "node_id": "SC_kwDOAY2xT88AAAAInG7Yqw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:16:51Z", + "updated_at": "2025-06-15T22:16:51Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984247979, + "node_id": "SC_kwDOAY2xT88AAAAInG7Wqw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557227", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T22:16:44Z", + "updated_at": "2025-06-15T22:16:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984233127, + "node_id": "SC_kwDOAY2xT88AAAAInG6cpw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:13:17Z", + "updated_at": "2025-06-15T22:13:17Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984232856, + "node_id": "SC_kwDOAY2xT88AAAAInG6bmA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557217", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T22:13:14Z", + "updated_at": "2025-06-15T22:13:14Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984231138, + "node_id": "SC_kwDOAY2xT88AAAAInG6U4g", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:12:52Z", + "updated_at": "2025-06-15T22:12:52Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984230601, + "node_id": "SC_kwDOAY2xT88AAAAInG6SyQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557232", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T22:12:45Z", + "updated_at": "2025-06-15T22:12:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984230570, + "node_id": "SC_kwDOAY2xT88AAAAInG6Sqg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557224", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T22:12:45Z", + "updated_at": "2025-06-15T22:12:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984220675, + "node_id": "SC_kwDOAY2xT88AAAAInG5sAw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:10:32Z", + "updated_at": "2025-06-15T22:10:32Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984220470, + "node_id": "SC_kwDOAY2xT88AAAAInG5rNg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557230", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T22:10:29Z", + "updated_at": "2025-06-15T22:10:29Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984218600, + "node_id": "SC_kwDOAY2xT88AAAAInG5j6A", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:10:08Z", + "updated_at": "2025-06-15T22:10:08Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984217727, + "node_id": "SC_kwDOAY2xT88AAAAInG5gfw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557219", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T22:09:57Z", + "updated_at": "2025-06-15T22:09:57Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984211579, + "node_id": "SC_kwDOAY2xT88AAAAInG5Iew", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:08:35Z", + "updated_at": "2025-06-15T22:08:35Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984211442, + "node_id": "SC_kwDOAY2xT88AAAAInG5H8g", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557233", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T22:08:33Z", + "updated_at": "2025-06-15T22:08:33Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984207708, + "node_id": "SC_kwDOAY2xT88AAAAInG45XA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:07:48Z", + "updated_at": "2025-06-15T22:07:48Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984207645, + "node_id": "SC_kwDOAY2xT88AAAAInG45HQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:07:47Z", + "updated_at": "2025-06-15T22:07:47Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984207493, + "node_id": "SC_kwDOAY2xT88AAAAInG44hQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557224", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T22:07:46Z", + "updated_at": "2025-06-15T22:07:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984207460, + "node_id": "SC_kwDOAY2xT88AAAAInG44ZA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557223", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T22:07:46Z", + "updated_at": "2025-06-15T22:07:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984207050, + "node_id": "SC_kwDOAY2xT88AAAAInG42yg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557219", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T22:07:42Z", + "updated_at": "2025-06-15T22:07:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984207015, + "node_id": "SC_kwDOAY2xT88AAAAInG42pw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557234", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T22:07:42Z", + "updated_at": "2025-06-15T22:07:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984204314, + "node_id": "SC_kwDOAY2xT88AAAAInG4sGg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:07:09Z", + "updated_at": "2025-06-15T22:07:09Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984203436, + "node_id": "SC_kwDOAY2xT88AAAAInG4orA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557234", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T22:06:59Z", + "updated_at": "2025-06-15T22:06:59Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984203395, + "node_id": "SC_kwDOAY2xT88AAAAInG4ogw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557229", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T22:06:59Z", + "updated_at": "2025-06-15T22:06:59Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984193091, + "node_id": "SC_kwDOAY2xT88AAAAInG4AQw", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557230", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T22:04:49Z", + "updated_at": "2025-06-15T22:04:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984193063, + "node_id": "SC_kwDOAY2xT88AAAAInG4AJw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557226", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T22:04:48Z", + "updated_at": "2025-06-15T22:04:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984191748, + "node_id": "SC_kwDOAY2xT88AAAAInG37BA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:04:32Z", + "updated_at": "2025-06-15T22:04:32Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36984191351, + "node_id": "SC_kwDOAY2xT88AAAAInG35dw", + "state": "success", + "description": "API verification succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15667824216", + "context": "API Verification", + "created_at": "2025-06-15T22:04:26Z", + "updated_at": "2025-06-15T22:04:26Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984190410, + "node_id": "SC_kwDOAY2xT88AAAAInG31yg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:04:14Z", + "updated_at": "2025-06-15T22:04:14Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984190004, + "node_id": "SC_kwDOAY2xT88AAAAInG30NA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557226", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T22:04:09Z", + "updated_at": "2025-06-15T22:04:09Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984189970, + "node_id": "SC_kwDOAY2xT88AAAAInG30Eg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557225", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T22:04:09Z", + "updated_at": "2025-06-15T22:04:09Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36984187184, + "node_id": "SC_kwDOAY2xT88AAAAInG3pMA", + "state": "pending", + "description": "API verification started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15667824216", + "context": "API Verification", + "created_at": "2025-06-15T22:03:30Z", + "updated_at": "2025-06-15T22:03:30Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984186913, + "node_id": "SC_kwDOAY2xT88AAAAInG3oIQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:03:26Z", + "updated_at": "2025-06-15T22:03:26Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984186835, + "node_id": "SC_kwDOAY2xT88AAAAInG3n0w", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:03:25Z", + "updated_at": "2025-06-15T22:03:25Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36984186600, + "node_id": "SC_kwDOAY2xT88AAAAInG3m6A", + "state": "success", + "description": "Package build succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15667775701", + "context": "Ubuntu Packaging", + "created_at": "2025-06-15T22:03:21Z", + "updated_at": "2025-06-15T22:03:21Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984186234, + "node_id": "SC_kwDOAY2xT88AAAAInG3leg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557223", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T22:03:17Z", + "updated_at": "2025-06-15T22:03:17Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984186202, + "node_id": "SC_kwDOAY2xT88AAAAInG3lWg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557221", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T22:03:17Z", + "updated_at": "2025-06-15T22:03:17Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984185678, + "node_id": "SC_kwDOAY2xT88AAAAInG3jTg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:03:11Z", + "updated_at": "2025-06-15T22:03:11Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984184605, + "node_id": "SC_kwDOAY2xT88AAAAInG3fHQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557233", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T22:02:56Z", + "updated_at": "2025-06-15T22:02:56Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984184566, + "node_id": "SC_kwDOAY2xT88AAAAInG3e9g", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557216", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T22:02:55Z", + "updated_at": "2025-06-15T22:02:55Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984184251, + "node_id": "SC_kwDOAY2xT88AAAAInG3duw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:02:51Z", + "updated_at": "2025-06-15T22:02:51Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984184103, + "node_id": "SC_kwDOAY2xT88AAAAInG3dJw", + "state": "success", + "description": "⚠️ Warning: keymanweb.js is 62 bytes (0%) larger than 19.0.57, now 428,785 bytes", + "target_url": null, + "context": "check/web/file-size", + "created_at": "2025-06-15T22:02:49Z", + "updated_at": "2025-06-15T22:02:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984183056, + "node_id": "SC_kwDOAY2xT88AAAAInG3ZEA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:02:35Z", + "updated_at": "2025-06-15T22:02:35Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984182886, + "node_id": "SC_kwDOAY2xT88AAAAInG3YZg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557221", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T22:02:33Z", + "updated_at": "2025-06-15T22:02:33Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984182860, + "node_id": "SC_kwDOAY2xT88AAAAInG3YTA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557215", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T22:02:32Z", + "updated_at": "2025-06-15T22:02:32Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984181495, + "node_id": "SC_kwDOAY2xT88AAAAInG3S9w", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:02:17Z", + "updated_at": "2025-06-15T22:02:17Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984181448, + "node_id": "SC_kwDOAY2xT88AAAAInG3SyA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557231", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T22:02:17Z", + "updated_at": "2025-06-15T22:02:17Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984181302, + "node_id": "SC_kwDOAY2xT88AAAAInG3SNg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557229", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T22:02:15Z", + "updated_at": "2025-06-15T22:02:15Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984181257, + "node_id": "SC_kwDOAY2xT88AAAAInG3SCQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557228", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T22:02:15Z", + "updated_at": "2025-06-15T22:02:15Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984178388, + "node_id": "SC_kwDOAY2xT88AAAAInG3G1A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557228", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T22:01:38Z", + "updated_at": "2025-06-15T22:01:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984178364, + "node_id": "SC_kwDOAY2xT88AAAAInG3GvA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557220", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T22:01:38Z", + "updated_at": "2025-06-15T22:01:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984170092, + "node_id": "SC_kwDOAY2xT88AAAAInG2mbA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T22:00:10Z", + "updated_at": "2025-06-15T22:00:10Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984169654, + "node_id": "SC_kwDOAY2xT88AAAAInG2ktg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557227", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T22:00:06Z", + "updated_at": "2025-06-15T22:00:06Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984169587, + "node_id": "SC_kwDOAY2xT88AAAAInG2kcw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557222", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T22:00:06Z", + "updated_at": "2025-06-15T22:00:06Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984159445, + "node_id": "SC_kwDOAY2xT88AAAAInG181Q", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557220", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T21:57:25Z", + "updated_at": "2025-06-15T21:57:25Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984159423, + "node_id": "SC_kwDOAY2xT88AAAAInG18vw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557218", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T21:57:25Z", + "updated_at": "2025-06-15T21:57:25Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36984156173, + "node_id": "SC_kwDOAY2xT88AAAAInG1wDQ", + "state": "pending", + "description": "Ubuntu packaging started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15667775701", + "context": "Ubuntu Packaging", + "created_at": "2025-06-15T21:56:36Z", + "updated_at": "2025-06-15T21:56:36Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155853, + "node_id": "SC_kwDOAY2xT88AAAAInG1uzQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557218", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T21:56:30Z", + "updated_at": "2025-06-15T21:56:30Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155827, + "node_id": "SC_kwDOAY2xT88AAAAInG1usw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557234", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T21:56:30Z", + "updated_at": "2025-06-15T21:56:30Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155798, + "node_id": "SC_kwDOAY2xT88AAAAInG1ulg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557233", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T21:56:29Z", + "updated_at": "2025-06-15T21:56:29Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155777, + "node_id": "SC_kwDOAY2xT88AAAAInG1ugQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557232", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T21:56:29Z", + "updated_at": "2025-06-15T21:56:29Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155742, + "node_id": "SC_kwDOAY2xT88AAAAInG1uXg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557231", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T21:56:28Z", + "updated_at": "2025-06-15T21:56:28Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155711, + "node_id": "SC_kwDOAY2xT88AAAAInG1uPw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557230", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T21:56:28Z", + "updated_at": "2025-06-15T21:56:28Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155689, + "node_id": "SC_kwDOAY2xT88AAAAInG1uKQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557229", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T21:56:28Z", + "updated_at": "2025-06-15T21:56:28Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155669, + "node_id": "SC_kwDOAY2xT88AAAAInG1uFQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557228", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T21:56:27Z", + "updated_at": "2025-06-15T21:56:27Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155637, + "node_id": "SC_kwDOAY2xT88AAAAInG1t9Q", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557227", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T21:56:27Z", + "updated_at": "2025-06-15T21:56:27Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155605, + "node_id": "SC_kwDOAY2xT88AAAAInG1t1Q", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557226", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T21:56:26Z", + "updated_at": "2025-06-15T21:56:26Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155570, + "node_id": "SC_kwDOAY2xT88AAAAInG1tsg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557225", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T21:56:26Z", + "updated_at": "2025-06-15T21:56:26Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155549, + "node_id": "SC_kwDOAY2xT88AAAAInG1tnQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557225", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T21:56:26Z", + "updated_at": "2025-06-15T21:56:26Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155522, + "node_id": "SC_kwDOAY2xT88AAAAInG1tgg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557224", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T21:56:25Z", + "updated_at": "2025-06-15T21:56:25Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155500, + "node_id": "SC_kwDOAY2xT88AAAAInG1tbA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557222", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T21:56:25Z", + "updated_at": "2025-06-15T21:56:25Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155480, + "node_id": "SC_kwDOAY2xT88AAAAInG1tWA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557223", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T21:56:24Z", + "updated_at": "2025-06-15T21:56:24Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155462, + "node_id": "SC_kwDOAY2xT88AAAAInG1tRg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557222", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T21:56:24Z", + "updated_at": "2025-06-15T21:56:24Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155426, + "node_id": "SC_kwDOAY2xT88AAAAInG1tIg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557221", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T21:56:23Z", + "updated_at": "2025-06-15T21:56:23Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155407, + "node_id": "SC_kwDOAY2xT88AAAAInG1tDw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557220", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T21:56:23Z", + "updated_at": "2025-06-15T21:56:23Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155384, + "node_id": "SC_kwDOAY2xT88AAAAInG1s-A", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557219", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T21:56:23Z", + "updated_at": "2025-06-15T21:56:23Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155354, + "node_id": "SC_kwDOAY2xT88AAAAInG1s2g", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557218", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T21:56:22Z", + "updated_at": "2025-06-15T21:56:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155338, + "node_id": "SC_kwDOAY2xT88AAAAInG1syg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557217", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T21:56:22Z", + "updated_at": "2025-06-15T21:56:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155309, + "node_id": "SC_kwDOAY2xT88AAAAInG1srQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557217", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T21:56:22Z", + "updated_at": "2025-06-15T21:56:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155280, + "node_id": "SC_kwDOAY2xT88AAAAInG1skA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557215", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T21:56:21Z", + "updated_at": "2025-06-15T21:56:21Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155248, + "node_id": "SC_kwDOAY2xT88AAAAInG1scA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557216", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T21:56:21Z", + "updated_at": "2025-06-15T21:56:21Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155224, + "node_id": "SC_kwDOAY2xT88AAAAInG1sWA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557216", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T21:56:20Z", + "updated_at": "2025-06-15T21:56:20Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155205, + "node_id": "SC_kwDOAY2xT88AAAAInG1sRQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557215", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T21:56:20Z", + "updated_at": "2025-06-15T21:56:20Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155182, + "node_id": "SC_kwDOAY2xT88AAAAInG1sLg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557214", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T21:56:19Z", + "updated_at": "2025-06-15T21:56:19Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36984155164, + "node_id": "SC_kwDOAY2xT88AAAAInG1sHA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557214", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T21:56:19Z", + "updated_at": "2025-06-15T21:56:19Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36984148130, + "node_id": "SC_kwDOAY2xT88AAAAInG1Qog", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T21:54:33Z", + "updated_at": "2025-06-15T21:54:33Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-check-runs.json b/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-check-runs.json new file mode 100644 index 0000000000..9b31414480 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-check-runs.json @@ -0,0 +1,246 @@ +[ + { + "id": 44131811673, + "name": "GitGuardian Security Checks", + "node_id": "CR_kwDOAY2xT88AAAAKRnYBWQ", + "head_sha": "870d37f56b489ef5067b4352a06505369d9038e0", + "external_id": "", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44131811673", + "html_url": "https://github.com/keymanapp/keyman/runs/44131811673", + "details_url": "https://dashboard.gitguardian.com", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-15T19:40:57Z", + "completed_at": "2025-06-15T19:41:28Z", + "output": { + "title": "No secrets detected ✅", + "summary": "**2** commits were scanned without uncovering any secrets.\n", + "text": "Commits scanned: **2**\n\n\n\n- Pull request #14196: `maint/developer/support-buildLevel` 👉 `maint/common/pr-build-bot`\n \n\n🦉 [GitGuardian](https://dashboard.gitguardian.com/auth/login/?utm_medium=checkruns&utm_source=github&utm_campaign=cr1) detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
\n", + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44131811673/annotations" + }, + "check_suite": { + "id": 40157100674 + }, + "app": { + "id": 46505, + "client_id": "Iv1.ec3c001966b4cc5a", + "slug": "gitguardian", + "node_id": "MDM6QXBwNDY1MDU=", + "owner": { + "login": "GitGuardian", + "id": 27360172, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI3MzYwMTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/27360172?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GitGuardian", + "html_url": "https://github.com/GitGuardian", + "followers_url": "https://api.github.com/users/GitGuardian/followers", + "following_url": "https://api.github.com/users/GitGuardian/following{/other_user}", + "gists_url": "https://api.github.com/users/GitGuardian/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GitGuardian/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GitGuardian/subscriptions", + "organizations_url": "https://api.github.com/users/GitGuardian/orgs", + "repos_url": "https://api.github.com/users/GitGuardian/repos", + "events_url": "https://api.github.com/users/GitGuardian/events{/privacy}", + "received_events_url": "https://api.github.com/users/GitGuardian/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitGuardian", + "description": "# 🦉 What is GitGuardian?\r\n\r\nGitGuardian Secrets Detection detects and fixes vulnerabilities in source code at every step of the software development lifecycle, covering 350+ types of secrets like API keys, database connection strings, private keys, certificates, and more. The platform’s policy engine enables security teams to monitor and enforce rules across their VCS, DevOps tools, and infrastructure-as-code configurations. Our automated remediation playbooks and collaboration features bring security and development teams together to resolve incidents fast and in full.\r\n\r\n## 1. Scan your codebase for 350+ types of secrets\r\nGitGuardian scans your GitHub repositories and raises alerts only for critical secrets, such as API keys or other credentials. At scale, GitGuardian’s detection algorithm has been battle-tested on over three years of activity in all public GitHub repositories – totaling over 1 billion scanned commits!\r\n\r\n## 2. Quickly remediate your hard-coded secrets\r\nIf you ever experience a leak involving a credential, we have a complete remediation guide used by 100k+ developers each year. We’ll show you how to revoke the secret and remove it from your git history.\r\n\r\n## 3. Prevent secrets from reaching GitHub\r\nInstall ggshield, the GitGuardian CLI, and add secrets detection to your local development workflow using pre-commit and pre-push git hooks integrations.\r\n\r\n# 🙋‍♂️ FAQ\r\n\r\n**What is your pricing?**\r\nGitGuardian is free for teams under 25 developers and offers a 30-day trial for larger teams.\r\n\r\n**How can I be sure that GitGuardian won’t raise too many false positives?**\r\nWe have scanned billions of commits, sent millions of alerts since 2018, and integrated each feedback to improve our algorithm. Our alerts currently receive 91% “true positive” feedback from developers.\r\n\r\n**My repositories are private; why should I install automated secret detection?**\r\nImagine if there were a plain text file with all your credit card numbers inside, you wouldn’t put this file inside your company’s git repository. Secrets are just as sensitive and should be handled with special care.\r\n\r\n**Is GitGuardian available to be installed on-premise?**\r\nYes, you can contact one of our security specialists to look over the possibility of installing GitGuardian on-premise on your repositories.\r\n\r\n# ⚒️ Installation notes \r\n\r\nYou should install GitGuardian directly through your [GitGuardian](https://dashboard.gitguardian.com/) workspace on the Integration settings page. \r\n\r\nSo that you know, your GitHub organization or GitHub account can only be associated with a single GitGuardian workspace.\r\n\r\n# 👋 Support\r\n\r\nIf you experience any difficulties or have any questions, please reach out to us by email ([support@gitguardian.com](mailto:support@gitguardian.com)).", + "external_url": "https://dashboard.gitguardian.com", + "html_url": "https://github.com/apps/gitguardian", + "created_at": "2019-11-12T15:44:31Z", + "updated_at": "2023-07-18T09:06:22Z", + "permissions": { + "checks": "write", + "contents": "read", + "emails": "read", + "issues": "write", + "members": "read", + "metadata": "read", + "organization_hooks": "write", + "pull_requests": "write" + }, + "events": [ + "check_run", + "check_suite", + "commit_comment", + "create", + "delete", + "organization", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "repository" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + }, + { + "id": 44131810574, + "name": "triage", + "node_id": "CR_kwDOAY2xT88AAAAKRnX9Dg", + "head_sha": "870d37f56b489ef5067b4352a06505369d9038e0", + "external_id": "3d143feb-b3d7-59b2-ae1b-fe551167c2b4", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44131810574", + "html_url": "https://github.com/keymanapp/keyman/actions/runs/15666730139/job/44131810574", + "details_url": "https://github.com/keymanapp/keyman/actions/runs/15666730139/job/44131810574", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-15T19:40:57Z", + "completed_at": "2025-06-15T19:41:04Z", + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44131810574/annotations" + }, + "check_suite": { + "id": 40157101634 + }, + "app": { + "id": 15368, + "client_id": "Iv1.05c79e9ad1f6bdfa", + "slug": "github-actions", + "node_id": "MDM6QXBwMTUzNjg=", + "owner": { + "login": "github", + "id": 9919, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2025-03-07T16:35:00Z", + "permissions": { + "actions": "write", + "administration": "read", + "attestations": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "discussions": "write", + "issues": "write", + "merge_queues": "write", + "metadata": "read", + "models": "read", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "branch_protection_rule", + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "discussion", + "discussion_comment", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "merge_group", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14196", + "id": 2591938321, + "number": 14196, + "head": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/common/pr-build-bot", + "sha": "81c941313bcccd8405364731ce61672588285d5d", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-statuses.json b/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-statuses.json new file mode 100644 index 0000000000..8d1f51ab95 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/870d37f56b489ef5067b4352a06505369d9038e0-statuses.json @@ -0,0 +1,2906 @@ +[ + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983658542, + "node_id": "SC_kwDOAY2xT88AAAAInGXYLg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557139", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T20:01:57Z", + "updated_at": "2025-06-15T20:01:57Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632832, + "node_id": "SC_kwDOAY2xT88AAAAInGVzwA", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557124", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T19:56:39Z", + "updated_at": "2025-06-15T19:56:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632813, + "node_id": "SC_kwDOAY2xT88AAAAInGVzrQ", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557136", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T19:56:39Z", + "updated_at": "2025-06-15T19:56:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632795, + "node_id": "SC_kwDOAY2xT88AAAAInGVzmw", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557134", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T19:56:38Z", + "updated_at": "2025-06-15T19:56:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632768, + "node_id": "SC_kwDOAY2xT88AAAAInGVzgA", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557138", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T19:56:38Z", + "updated_at": "2025-06-15T19:56:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632744, + "node_id": "SC_kwDOAY2xT88AAAAInGVzaA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Mac/557139", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T19:56:38Z", + "updated_at": "2025-06-15T19:56:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632727, + "node_id": "SC_kwDOAY2xT88AAAAInGVzVw", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557131", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T19:56:37Z", + "updated_at": "2025-06-15T19:56:37Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632705, + "node_id": "SC_kwDOAY2xT88AAAAInGVzQQ", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557121", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T19:56:37Z", + "updated_at": "2025-06-15T19:56:37Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632677, + "node_id": "SC_kwDOAY2xT88AAAAInGVzJQ", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557124", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T19:56:36Z", + "updated_at": "2025-06-15T19:56:36Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632642, + "node_id": "SC_kwDOAY2xT88AAAAInGVzAg", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557136", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T19:56:36Z", + "updated_at": "2025-06-15T19:56:36Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632616, + "node_id": "SC_kwDOAY2xT88AAAAInGVy6A", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557134", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T19:56:36Z", + "updated_at": "2025-06-15T19:56:36Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632594, + "node_id": "SC_kwDOAY2xT88AAAAInGVy0g", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557121", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T19:56:35Z", + "updated_at": "2025-06-15T19:56:35Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632571, + "node_id": "SC_kwDOAY2xT88AAAAInGVyuw", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557138", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T19:56:35Z", + "updated_at": "2025-06-15T19:56:35Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983632552, + "node_id": "SC_kwDOAY2xT88AAAAInGVyqA", + "state": "error", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557131", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T19:56:35Z", + "updated_at": "2025-06-15T19:56:35Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983628513, + "node_id": "SC_kwDOAY2xT88AAAAInGVi4Q", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557126", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T19:55:34Z", + "updated_at": "2025-06-15T19:55:34Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983625834, + "node_id": "SC_kwDOAY2xT88AAAAInGVYag", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557140", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T19:54:56Z", + "updated_at": "2025-06-15T19:54:56Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983624327, + "node_id": "SC_kwDOAY2xT88AAAAInGVShw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:54:35Z", + "updated_at": "2025-06-15T19:54:35Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983624184, + "node_id": "SC_kwDOAY2xT88AAAAInGVR-A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_macOS/557131", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T19:54:33Z", + "updated_at": "2025-06-15T19:54:33Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983624159, + "node_id": "SC_kwDOAY2xT88AAAAInGVR3w", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557130", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T19:54:32Z", + "updated_at": "2025-06-15T19:54:32Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983619684, + "node_id": "SC_kwDOAY2xT88AAAAInGVAZA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:53:27Z", + "updated_at": "2025-06-15T19:53:27Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983619407, + "node_id": "SC_kwDOAY2xT88AAAAInGU_Tw", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Linux_Test_Integration/557126", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T19:53:22Z", + "updated_at": "2025-06-15T19:53:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983619369, + "node_id": "SC_kwDOAY2xT88AAAAInGU_KQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557137", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T19:53:22Z", + "updated_at": "2025-06-15T19:53:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983616186, + "node_id": "SC_kwDOAY2xT88AAAAInGUyug", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:52:33Z", + "updated_at": "2025-06-15T19:52:33Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36983616063, + "node_id": "SC_kwDOAY2xT88AAAAInGUyPw", + "state": "success", + "description": "API verification succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15666798530", + "context": "API Verification", + "created_at": "2025-06-15T19:52:32Z", + "updated_at": "2025-06-15T19:52:32Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36983610230, + "node_id": "SC_kwDOAY2xT88AAAAInGUbdg", + "state": "pending", + "description": "API verification started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15666798530", + "context": "API Verification", + "created_at": "2025-06-15T19:51:16Z", + "updated_at": "2025-06-15T19:51:16Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36983609435, + "node_id": "SC_kwDOAY2xT88AAAAInGUYWw", + "state": "success", + "description": "Package build succeeded", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15666742710", + "context": "Ubuntu Packaging", + "created_at": "2025-06-15T19:51:06Z", + "updated_at": "2025-06-15T19:51:06Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983605706, + "node_id": "SC_kwDOAY2xT88AAAAInGUJyg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:50:11Z", + "updated_at": "2025-06-15T19:50:11Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983605635, + "node_id": "SC_kwDOAY2xT88AAAAInGUJgw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:50:10Z", + "updated_at": "2025-06-15T19:50:10Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983605090, + "node_id": "SC_kwDOAY2xT88AAAAInGUHYg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestSamplesAndTestProjects/557137", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T19:50:02Z", + "updated_at": "2025-06-15T19:50:02Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983605068, + "node_id": "SC_kwDOAY2xT88AAAAInGUHTA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557141", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T19:50:02Z", + "updated_at": "2025-06-15T19:50:02Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983604926, + "node_id": "SC_kwDOAY2xT88AAAAInGUGvg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_KeymanMac_PullRequests/557130", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T19:49:59Z", + "updated_at": "2025-06-15T19:49:59Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983604910, + "node_id": "SC_kwDOAY2xT88AAAAInGUGrg", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557128", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T19:49:58Z", + "updated_at": "2025-06-15T19:49:58Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983603034, + "node_id": "SC_kwDOAY2xT88AAAAInGT_Wg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:49:30Z", + "updated_at": "2025-06-15T19:49:30Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983602960, + "node_id": "SC_kwDOAY2xT88AAAAInGT_EA", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:49:29Z", + "updated_at": "2025-06-15T19:49:29Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983602862, + "node_id": "SC_kwDOAY2xT88AAAAInGT-rg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:49:28Z", + "updated_at": "2025-06-15T19:49:28Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983602710, + "node_id": "SC_kwDOAY2xT88AAAAInGT-Fg", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:49:26Z", + "updated_at": "2025-06-15T19:49:26Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983602571, + "node_id": "SC_kwDOAY2xT88AAAAInGT9iw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:49:24Z", + "updated_at": "2025-06-15T19:49:24Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983602429, + "node_id": "SC_kwDOAY2xT88AAAAInGT8_Q", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Linux/557141", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T19:49:22Z", + "updated_at": "2025-06-15T19:49:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983602406, + "node_id": "SC_kwDOAY2xT88AAAAInGT85g", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557123", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T19:49:22Z", + "updated_at": "2025-06-15T19:49:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983602349, + "node_id": "SC_kwDOAY2xT88AAAAInGT8rQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Developer_Linux/557140", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T19:49:21Z", + "updated_at": "2025-06-15T19:49:21Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983602329, + "node_id": "SC_kwDOAY2xT88AAAAInGT8mQ", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557127", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T19:49:20Z", + "updated_at": "2025-06-15T19:49:20Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983601809, + "node_id": "SC_kwDOAY2xT88AAAAInGT6kQ", + "state": "success", + "description": "⚠️ Warning: keymanweb.js is 62 bytes (0%) larger than 19.0.57, now 428,785 bytes", + "target_url": null, + "context": "check/web/file-size", + "created_at": "2025-06-15T19:49:13Z", + "updated_at": "2025-06-15T19:49:13Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983601796, + "node_id": "SC_kwDOAY2xT88AAAAInGT6hA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Developer_Test/557138", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T19:49:13Z", + "updated_at": "2025-06-15T19:49:13Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983601768, + "node_id": "SC_kwDOAY2xT88AAAAInGT6aA", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557135", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T19:49:13Z", + "updated_at": "2025-06-15T19:49:13Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983601746, + "node_id": "SC_kwDOAY2xT88AAAAInGT6Ug", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Mac/557128", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T19:49:12Z", + "updated_at": "2025-06-15T19:49:12Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983601711, + "node_id": "SC_kwDOAY2xT88AAAAInGT6Lw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557122", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T19:49:12Z", + "updated_at": "2025-06-15T19:49:12Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983599703, + "node_id": "SC_kwDOAY2xT88AAAAInGTyVw", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanAndroid_TestPullRequests/557136", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T19:48:45Z", + "updated_at": "2025-06-15T19:48:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983599672, + "node_id": "SC_kwDOAY2xT88AAAAInGTyOA", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557132", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T19:48:44Z", + "updated_at": "2025-06-15T19:48:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983599495, + "node_id": "SC_kwDOAY2xT88AAAAInGTxhw", + "state": "failure", + "description": "TeamCity build failed", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557132", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T19:48:42Z", + "updated_at": "2025-06-15T19:48:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983589963, + "node_id": "SC_kwDOAY2xT88AAAAInGTMSw", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:46:26Z", + "updated_at": "2025-06-15T19:46:26Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983589728, + "node_id": "SC_kwDOAY2xT88AAAAInGTLYA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Web/557135", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T19:46:22Z", + "updated_at": "2025-06-15T19:46:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983589703, + "node_id": "SC_kwDOAY2xT88AAAAInGTLRw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557129", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T19:46:22Z", + "updated_at": "2025-06-15T19:46:22Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983585767, + "node_id": "SC_kwDOAY2xT88AAAAInGS75w", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:45:21Z", + "updated_at": "2025-06-15T19:45:21Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983585609, + "node_id": "SC_kwDOAY2xT88AAAAInGS7SQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Linux/557127", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T19:45:18Z", + "updated_at": "2025-06-15T19:45:18Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983585591, + "node_id": "SC_kwDOAY2xT88AAAAInGS7Nw", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557125", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T19:45:18Z", + "updated_at": "2025-06-15T19:45:18Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983582448, + "node_id": "SC_kwDOAY2xT88AAAAInGSu8A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_Windows/557134", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T19:44:31Z", + "updated_at": "2025-06-15T19:44:31Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983582422, + "node_id": "SC_kwDOAY2xT88AAAAInGSu1g", + "state": "success", + "description": "TeamCity build finished", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557133", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T19:44:30Z", + "updated_at": "2025-06-15T19:44:30Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "id": 36983576025, + "node_id": "SC_kwDOAY2xT88AAAAInGSV2Q", + "state": "pending", + "description": "Ubuntu packaging started", + "target_url": "https://github.com/keymanapp/keyman/actions/runs/15666742710", + "context": "Ubuntu Packaging", + "created_at": "2025-06-15T19:42:56Z", + "updated_at": "2025-06-15T19:42:56Z", + "creator": { + "login": "github-actions[bot]", + "id": 41898282, + "node_id": "MDM6Qm90NDE4OTgyODI=", + "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github-actions%5Bbot%5D", + "html_url": "https://github.com/apps/github-actions", + "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575722, + "node_id": "SC_kwDOAY2xT88AAAAInGSUqg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanLinux_TestPullRequests/557125", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T19:42:51Z", + "updated_at": "2025-06-15T19:42:51Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575673, + "node_id": "SC_kwDOAY2xT88AAAAInGSUeQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557141", + "context": "Test: Common - Linux (Common)", + "created_at": "2025-06-15T19:42:50Z", + "updated_at": "2025-06-15T19:42:50Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575616, + "node_id": "SC_kwDOAY2xT88AAAAInGSUQA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557140", + "context": "Test - Linux (Keyman - Developer)", + "created_at": "2025-06-15T19:42:49Z", + "updated_at": "2025-06-15T19:42:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575600, + "node_id": "SC_kwDOAY2xT88AAAAInGSUMA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557139", + "context": "Test - macOS (Keyman - Developer)", + "created_at": "2025-06-15T19:42:49Z", + "updated_at": "2025-06-15T19:42:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575548, + "node_id": "SC_kwDOAY2xT88AAAAInGST_A", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557138", + "context": "Test - Windows (Keyman - Developer)", + "created_at": "2025-06-15T19:42:49Z", + "updated_at": "2025-06-15T19:42:49Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575518, + "node_id": "SC_kwDOAY2xT88AAAAInGST3g", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557137", + "context": "Test: Samples and Test projects (Keyman - Android)", + "created_at": "2025-06-15T19:42:48Z", + "updated_at": "2025-06-15T19:42:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575497, + "node_id": "SC_kwDOAY2xT88AAAAInGSTyQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557136", + "context": "Test (Keyman - Android)", + "created_at": "2025-06-15T19:42:48Z", + "updated_at": "2025-06-15T19:42:48Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575434, + "node_id": "SC_kwDOAY2xT88AAAAInGSTig", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557135", + "context": "Test: Common - Web (Common)", + "created_at": "2025-06-15T19:42:47Z", + "updated_at": "2025-06-15T19:42:47Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575393, + "node_id": "SC_kwDOAY2xT88AAAAInGSTYQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557134", + "context": "Test: Keyman Core - Windows (Common)", + "created_at": "2025-06-15T19:42:46Z", + "updated_at": "2025-06-15T19:42:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575369, + "node_id": "SC_kwDOAY2xT88AAAAInGSTSQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557133", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T19:42:46Z", + "updated_at": "2025-06-15T19:42:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575348, + "node_id": "SC_kwDOAY2xT88AAAAInGSTNA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPrRenderOnScreenKeyboards/557133", + "context": "Test: Render On Screen Keyboards (Keyman - Windows)", + "created_at": "2025-06-15T19:42:46Z", + "updated_at": "2025-06-15T19:42:46Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575293, + "node_id": "SC_kwDOAY2xT88AAAAInGSS_Q", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557132", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T19:42:45Z", + "updated_at": "2025-06-15T19:42:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575270, + "node_id": "SC_kwDOAY2xT88AAAAInGSS5g", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/KeymanDesktop_TestPullRequests/557132", + "context": "Test (Keyman - Windows)", + "created_at": "2025-06-15T19:42:45Z", + "updated_at": "2025-06-15T19:42:45Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575236, + "node_id": "SC_kwDOAY2xT88AAAAInGSSxA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557131", + "context": "Test: Keyman Core - macOS (Common)", + "created_at": "2025-06-15T19:42:44Z", + "updated_at": "2025-06-15T19:42:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575200, + "node_id": "SC_kwDOAY2xT88AAAAInGSSoA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557130", + "context": "Test (Keyman - macOS)", + "created_at": "2025-06-15T19:42:44Z", + "updated_at": "2025-06-15T19:42:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575170, + "node_id": "SC_kwDOAY2xT88AAAAInGSSgg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557129", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T19:42:44Z", + "updated_at": "2025-06-15T19:42:44Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575149, + "node_id": "SC_kwDOAY2xT88AAAAInGSSbQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Test_Common_Windows/557129", + "context": "Test: Common - Windows (Common)", + "created_at": "2025-06-15T19:42:43Z", + "updated_at": "2025-06-15T19:42:43Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575110, + "node_id": "SC_kwDOAY2xT88AAAAInGSSRg", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557128", + "context": "Test: Common - macOS (Common)", + "created_at": "2025-06-15T19:42:43Z", + "updated_at": "2025-06-15T19:42:43Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575083, + "node_id": "SC_kwDOAY2xT88AAAAInGSSKw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557127", + "context": "Test: Keyman Core - Linux (Common)", + "created_at": "2025-06-15T19:42:42Z", + "updated_at": "2025-06-15T19:42:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575057, + "node_id": "SC_kwDOAY2xT88AAAAInGSSEQ", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557126", + "context": "Test:Integration (Keyman - Linux)", + "created_at": "2025-06-15T19:42:42Z", + "updated_at": "2025-06-15T19:42:42Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575027, + "node_id": "SC_kwDOAY2xT88AAAAInGSR8w", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/build/557125", + "context": "Test (Keyman - Linux)", + "created_at": "2025-06-15T19:42:41Z", + "updated_at": "2025-06-15T19:42:41Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983575008, + "node_id": "SC_kwDOAY2xT88AAAAInGSR4A", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557124", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T19:42:41Z", + "updated_at": "2025-06-15T19:42:41Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574980, + "node_id": "SC_kwDOAY2xT88AAAAInGSRxA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_Common_KPAPI_TestPullRequests_WASM/557124", + "context": "Test: Keyman Core - WASM (Common)", + "created_at": "2025-06-15T19:42:41Z", + "updated_at": "2025-06-15T19:42:41Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574948, + "node_id": "SC_kwDOAY2xT88AAAAInGSRpA", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557123", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T19:42:40Z", + "updated_at": "2025-06-15T19:42:40Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574923, + "node_id": "SC_kwDOAY2xT88AAAAInGSRiw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keymanweb_TestPullRequests/557123", + "context": "Test (Keyman - Web)", + "created_at": "2025-06-15T19:42:40Z", + "updated_at": "2025-06-15T19:42:40Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574902, + "node_id": "SC_kwDOAY2xT88AAAAInGSRdg", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557122", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T19:42:39Z", + "updated_at": "2025-06-15T19:42:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574872, + "node_id": "SC_kwDOAY2xT88AAAAInGSRWA", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestSamplesAndTestProjects/557122", + "context": "Test: Samples and Test Projects (Keyman - iOS)", + "created_at": "2025-06-15T19:42:39Z", + "updated_at": "2025-06-15T19:42:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574841, + "node_id": "SC_kwDOAY2xT88AAAAInGSROQ", + "state": "pending", + "description": "TeamCity build started", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557121", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T19:42:39Z", + "updated_at": "2025-06-15T19:42:39Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "id": 36983574807, + "node_id": "SC_kwDOAY2xT88AAAAInGSRFw", + "state": "pending", + "description": "TeamCity build was queued", + "target_url": "https://build.palaso.org/buildConfiguration/Keyman_iOS_TestPullRequests/557121", + "context": "Test (Keyman - iOS)", + "created_at": "2025-06-15T19:42:38Z", + "updated_at": "2025-06-15T19:42:38Z", + "creator": { + "login": "keyman-server", + "id": 7018967, + "node_id": "MDQ6VXNlcjcwMTg5Njc=", + "avatar_url": "https://avatars.githubusercontent.com/u/7018967?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keyman-server", + "html_url": "https://github.com/keyman-server", + "followers_url": "https://api.github.com/users/keyman-server/followers", + "following_url": "https://api.github.com/users/keyman-server/following{/other_user}", + "gists_url": "https://api.github.com/users/keyman-server/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keyman-server/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keyman-server/subscriptions", + "organizations_url": "https://api.github.com/users/keyman-server/orgs", + "repos_url": "https://api.github.com/users/keyman-server/repos", + "events_url": "https://api.github.com/users/keyman-server/events{/privacy}", + "received_events_url": "https://api.github.com/users/keyman-server/received_events", + "type": "User", + "user_view_type": "public", + "site_admin": false + } + }, + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/870d37f56b489ef5067b4352a06505369d9038e0", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 36983566808, + "node_id": "SC_kwDOAY2xT88AAAAInGRx2A", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14196#issuecomment-2972280376", + "context": "user_testing", + "created_at": "2025-06-15T19:40:53Z", + "updated_at": "2025-06-15T19:40:53Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-check-runs.json b/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-check-runs.json new file mode 100644 index 0000000000..c7a120e18f --- /dev/null +++ b/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-check-runs.json @@ -0,0 +1,246 @@ +[ + { + "id": 44207248981, + "name": "triage", + "node_id": "CR_kwDOAY2xT88AAAAKSvUWVQ", + "head_sha": "8fd5ccc9026b85d6a780d8bcf862380e7a89aefb", + "external_id": "08ccda57-e306-5823-a607-291b5482a6f2", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44207248981", + "html_url": "https://github.com/keymanapp/keyman/actions/runs/15691412642/job/44207248981", + "details_url": "https://github.com/keymanapp/keyman/actions/runs/15691412642/job/44207248981", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-16T20:38:08Z", + "completed_at": "2025-06-16T20:38:12Z", + "output": { + "title": null, + "summary": null, + "text": null, + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44207248981/annotations" + }, + "check_suite": { + "id": 40219154773 + }, + "app": { + "id": 15368, + "client_id": "Iv1.05c79e9ad1f6bdfa", + "slug": "github-actions", + "node_id": "MDM6QXBwMTUzNjg=", + "owner": { + "login": "github", + "id": 9919, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", + "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/github", + "html_url": "https://github.com/github", + "followers_url": "https://api.github.com/users/github/followers", + "following_url": "https://api.github.com/users/github/following{/other_user}", + "gists_url": "https://api.github.com/users/github/gists{/gist_id}", + "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/github/subscriptions", + "organizations_url": "https://api.github.com/users/github/orgs", + "repos_url": "https://api.github.com/users/github/repos", + "events_url": "https://api.github.com/users/github/events{/privacy}", + "received_events_url": "https://api.github.com/users/github/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitHub Actions", + "description": "Automate your workflow from idea to production", + "external_url": "https://help.github.com/en/actions", + "html_url": "https://github.com/apps/github-actions", + "created_at": "2018-07-30T09:30:17Z", + "updated_at": "2025-03-07T16:35:00Z", + "permissions": { + "actions": "write", + "administration": "read", + "attestations": "write", + "checks": "write", + "contents": "write", + "deployments": "write", + "discussions": "write", + "issues": "write", + "merge_queues": "write", + "metadata": "read", + "models": "read", + "packages": "write", + "pages": "write", + "pull_requests": "write", + "repository_hooks": "write", + "repository_projects": "write", + "security_events": "write", + "statuses": "write", + "vulnerability_alerts": "read" + }, + "events": [ + "branch_protection_rule", + "check_run", + "check_suite", + "create", + "delete", + "deployment", + "deployment_status", + "discussion", + "discussion_comment", + "fork", + "gollum", + "issues", + "issue_comment", + "label", + "merge_group", + "milestone", + "page_build", + "project", + "project_card", + "project_column", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "registry_package", + "release", + "repository", + "repository_dispatch", + "status", + "watch", + "workflow_dispatch", + "workflow_run" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14199", + "id": 2594414200, + "number": 14199, + "head": { + "ref": "maint/resources/14172-pr-build-status-2", + "sha": "c0d28233302cbc22c7d7625dfba5930006ad7d0b", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + }, + { + "id": 44207248005, + "name": "GitGuardian Security Checks", + "node_id": "CR_kwDOAY2xT88AAAAKSvUShQ", + "head_sha": "8fd5ccc9026b85d6a780d8bcf862380e7a89aefb", + "external_id": "", + "url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44207248005", + "html_url": "https://github.com/keymanapp/keyman/runs/44207248005", + "details_url": "https://dashboard.gitguardian.com", + "status": "completed", + "conclusion": "success", + "started_at": "2025-06-16T20:38:03Z", + "completed_at": "2025-06-16T20:38:06Z", + "output": { + "title": "No secrets detected ✅", + "summary": "**8** commits were scanned without uncovering any secrets.\n", + "text": "Commits scanned: **8**\n\n\n\n- Pull request #14199: `maint/resources/14172-pr-build-status-2` 👉 `maint/developer/support-buildLevel`\n \n\n🦉 [GitGuardian](https://dashboard.gitguardian.com/auth/login/?utm_medium=checkruns&utm_source=github&utm_campaign=cr1) detects secrets in your source code to help developers and security teams secure the modern development process. You are seeing this because you or someone else with access to this repository has authorized GitGuardian to scan your pull request.
\n", + "annotations_count": 0, + "annotations_url": "https://api.github.com/repos/keymanapp/keyman/check-runs/44207248005/annotations" + }, + "check_suite": { + "id": 40219152500 + }, + "app": { + "id": 46505, + "client_id": "Iv1.ec3c001966b4cc5a", + "slug": "gitguardian", + "node_id": "MDM6QXBwNDY1MDU=", + "owner": { + "login": "GitGuardian", + "id": 27360172, + "node_id": "MDEyOk9yZ2FuaXphdGlvbjI3MzYwMTcy", + "avatar_url": "https://avatars.githubusercontent.com/u/27360172?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/GitGuardian", + "html_url": "https://github.com/GitGuardian", + "followers_url": "https://api.github.com/users/GitGuardian/followers", + "following_url": "https://api.github.com/users/GitGuardian/following{/other_user}", + "gists_url": "https://api.github.com/users/GitGuardian/gists{/gist_id}", + "starred_url": "https://api.github.com/users/GitGuardian/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/GitGuardian/subscriptions", + "organizations_url": "https://api.github.com/users/GitGuardian/orgs", + "repos_url": "https://api.github.com/users/GitGuardian/repos", + "events_url": "https://api.github.com/users/GitGuardian/events{/privacy}", + "received_events_url": "https://api.github.com/users/GitGuardian/received_events", + "type": "Organization", + "user_view_type": "public", + "site_admin": false + }, + "name": "GitGuardian", + "description": "# 🦉 What is GitGuardian?\r\n\r\nGitGuardian Secrets Detection detects and fixes vulnerabilities in source code at every step of the software development lifecycle, covering 350+ types of secrets like API keys, database connection strings, private keys, certificates, and more. The platform’s policy engine enables security teams to monitor and enforce rules across their VCS, DevOps tools, and infrastructure-as-code configurations. Our automated remediation playbooks and collaboration features bring security and development teams together to resolve incidents fast and in full.\r\n\r\n## 1. Scan your codebase for 350+ types of secrets\r\nGitGuardian scans your GitHub repositories and raises alerts only for critical secrets, such as API keys or other credentials. At scale, GitGuardian’s detection algorithm has been battle-tested on over three years of activity in all public GitHub repositories – totaling over 1 billion scanned commits!\r\n\r\n## 2. Quickly remediate your hard-coded secrets\r\nIf you ever experience a leak involving a credential, we have a complete remediation guide used by 100k+ developers each year. We’ll show you how to revoke the secret and remove it from your git history.\r\n\r\n## 3. Prevent secrets from reaching GitHub\r\nInstall ggshield, the GitGuardian CLI, and add secrets detection to your local development workflow using pre-commit and pre-push git hooks integrations.\r\n\r\n# 🙋‍♂️ FAQ\r\n\r\n**What is your pricing?**\r\nGitGuardian is free for teams under 25 developers and offers a 30-day trial for larger teams.\r\n\r\n**How can I be sure that GitGuardian won’t raise too many false positives?**\r\nWe have scanned billions of commits, sent millions of alerts since 2018, and integrated each feedback to improve our algorithm. Our alerts currently receive 91% “true positive” feedback from developers.\r\n\r\n**My repositories are private; why should I install automated secret detection?**\r\nImagine if there were a plain text file with all your credit card numbers inside, you wouldn’t put this file inside your company’s git repository. Secrets are just as sensitive and should be handled with special care.\r\n\r\n**Is GitGuardian available to be installed on-premise?**\r\nYes, you can contact one of our security specialists to look over the possibility of installing GitGuardian on-premise on your repositories.\r\n\r\n# ⚒️ Installation notes \r\n\r\nYou should install GitGuardian directly through your [GitGuardian](https://dashboard.gitguardian.com/) workspace on the Integration settings page. \r\n\r\nSo that you know, your GitHub organization or GitHub account can only be associated with a single GitGuardian workspace.\r\n\r\n# 👋 Support\r\n\r\nIf you experience any difficulties or have any questions, please reach out to us by email ([support@gitguardian.com](mailto:support@gitguardian.com)).", + "external_url": "https://dashboard.gitguardian.com", + "html_url": "https://github.com/apps/gitguardian", + "created_at": "2019-11-12T15:44:31Z", + "updated_at": "2023-07-18T09:06:22Z", + "permissions": { + "checks": "write", + "contents": "read", + "emails": "read", + "issues": "write", + "members": "read", + "metadata": "read", + "organization_hooks": "write", + "pull_requests": "write" + }, + "events": [ + "check_run", + "check_suite", + "commit_comment", + "create", + "delete", + "organization", + "public", + "pull_request", + "pull_request_review", + "pull_request_review_comment", + "push", + "repository" + ] + }, + "pull_requests": [ + { + "url": "https://api.github.com/repos/keymanapp/keyman/pulls/14199", + "id": 2594414200, + "number": 14199, + "head": { + "ref": "maint/resources/14172-pr-build-status-2", + "sha": "c0d28233302cbc22c7d7625dfba5930006ad7d0b", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + }, + "base": { + "ref": "maint/developer/support-buildLevel", + "sha": "825f7d2df0069fa56a8f2a534b42a49ee1f21ca1", + "repo": { + "id": 26063183, + "url": "https://api.github.com/repos/keymanapp/keyman", + "name": "keyman" + } + } + } + ] + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-statuses.json b/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-statuses.json new file mode 100644 index 0000000000..1d1798bdd3 --- /dev/null +++ b/resources/build/pr-build-status/fixtures/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb-statuses.json @@ -0,0 +1,35 @@ +[ + { + "url": "https://api.github.com/repos/keymanapp/keyman/statuses/8fd5ccc9026b85d6a780d8bcf862380e7a89aefb", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "id": 37011551277, + "node_id": "SC_kwDOAY2xT88AAAAIng90LQ", + "state": "success", + "description": "User tests are not required", + "target_url": "https://github.com/keymanapp/keyman/pull/14199#issuecomment-2975084272", + "context": "user_testing", + "created_at": "2025-06-16T20:38:04Z", + "updated_at": "2025-06-16T20:38:04Z", + "creator": { + "login": "keymanapp-test-bot[bot]", + "id": 89363325, + "node_id": "MDM6Qm90ODkzNjMzMjU=", + "avatar_url": "https://avatars.githubusercontent.com/in/133554?v=4", + "gravatar_id": "", + "url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D", + "html_url": "https://github.com/apps/keymanapp-test-bot", + "followers_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/followers", + "following_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/following{/other_user}", + "gists_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/gists{/gist_id}", + "starred_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/subscriptions", + "organizations_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/orgs", + "repos_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/repos", + "events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/events{/privacy}", + "received_events_url": "https://api.github.com/users/keymanapp-test-bot%5Bbot%5D/received_events", + "type": "Bot", + "user_view_type": "public", + "site_admin": false + } + } +] \ No newline at end of file diff --git a/resources/build/pr-build-status/package-lock.json b/resources/build/pr-build-status/package-lock.json new file mode 100644 index 0000000000..ff65ee2506 --- /dev/null +++ b/resources/build/pr-build-status/package-lock.json @@ -0,0 +1,1528 @@ +{ + "name": "@keymanapp/pr-build-status", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@keymanapp/pr-build-status", + "license": "MIT", + "dependencies": { + "@actions/core": "^1.9.1", + "@actions/github": "^6.0.1" + }, + "devDependencies": { + "chai": "^5.1.0", + "mocha": "^11.2.2", + "mocha-teamcity-reporter": "^4.0.0" + } + }, + "node_modules/@actions/core": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz", + "integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==", + "license": "MIT", + "dependencies": { + "@actions/exec": "^1.1.1", + "@actions/http-client": "^2.0.1" + } + }, + "node_modules/@actions/exec": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", + "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", + "license": "MIT", + "dependencies": { + "@actions/io": "^1.0.1" + } + }, + "node_modules/@actions/github": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.1.tgz", + "integrity": "sha512-xbZVcaqD4XnQAe35qSQqskb3SqIAfRyLBrHMd/8TuL7hJSz2QtbDwnNM8zWx4zO5l2fnGtseNE3MbEvD7BxVMw==", + "license": "MIT", + "dependencies": { + "@actions/http-client": "^2.2.0", + "@octokit/core": "^5.0.1", + "@octokit/plugin-paginate-rest": "^9.2.2", + "@octokit/plugin-rest-endpoint-methods": "^10.4.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "undici": "^5.28.5" + } + }, + "node_modules/@actions/http-client": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz", + "integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==", + "license": "MIT", + "dependencies": { + "tunnel": "^0.0.6", + "undici": "^5.25.4" + } + }, + "node_modules/@actions/io": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz", + "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==", + "license": "MIT" + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.1.tgz", + "integrity": "sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz", + "integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz", + "integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^12.6.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz", + "integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz", + "integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^20.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/types": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", + "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^24.2.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "license": "Apache-2.0" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chai": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "license": "ISC" + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz", + "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.6.0.tgz", + "integrity": "sha512-i0JVb+OUBqw63X/1pC3jCyJsqYisgxySBbsQa8TKvefpA1oEnw7JXxXnftfMHRsw7bEEVGRtVlHcDYXBa7FzVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha-teamcity-reporter": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mocha-teamcity-reporter/-/mocha-teamcity-reporter-4.2.0.tgz", + "integrity": "sha512-H08IvAIsiCcdXAEObzp/VvJHFfLummxt5wpr0gU4yxx6pTb7ZmKnVjyXkFi+3gYi3bu/j2iJdoK9Aknz16mbBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "mocha": ">=6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "license": "MIT", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/undici": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "license": "ISC" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", + "integrity": "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/resources/build/pr-build-status/package.json b/resources/build/pr-build-status/package.json new file mode 100644 index 0000000000..5e9dc1bc70 --- /dev/null +++ b/resources/build/pr-build-status/package.json @@ -0,0 +1,20 @@ +{ + "description": "CHeck pull request build status - development area", + "type": "module", + "dependencies": { + "@actions/core": "^1.9.1", + "@actions/github": "^6.0.1" + }, + "devDependencies": { + "mocha": "^11.2.2", + "mocha-teamcity-reporter": "^4.0.0", + "chai": "^5.1.0" + }, + "license": "MIT", + "main": "pr-build-status.mjs", + "name": "@keymanapp/pr-build-status", + "private": true, + "scripts": { + "test": "mocha pr-build-status.tests.mjs" + } +} diff --git a/resources/build/pr-build-status/pr-build-status.mjs b/resources/build/pr-build-status/pr-build-status.mjs new file mode 100644 index 0000000000..cfd0dbd8c0 --- /dev/null +++ b/resources/build/pr-build-status/pr-build-status.mjs @@ -0,0 +1,188 @@ +/* + * Keyman is copyright (C) SIL Global. MIT License. + * + * Clone of the pr-build-status.yml file for unit testing and development. The + * indented section of this file below is copied verbatim into + * .github/workflows/pr-build-status.yml, and allows us to develop the YAML + * script without introducing a dependency on the repository. + */ + +// Copy the indented section into the step for pr-build-status.mjs. + +// START OF CLONED SECTION + + // This code is copied out of resources/build/pr-build-status/pr-build-status.mjs + // where it is tested. It is copied inline here in order to avoid requiring the + // repository to be checked out, which dramatically reduces the run time of the + // check. + // + // Note: we don't currently look at check runs, only statuses + // + // Verify the following statuses: + // 'user_testing' + // 'API Verification' (github-actions[bot]) + // + // At least 1 of the following statuses must be found: + // 'Test*' (keyman-server), e.g. 'Test Build (Keyman)' + // 'Ubuntu Packaging' (github-actions[bot]) + // + // Ignore the following statuses: + // check/web/file-size + // + + function reduceStatuses(statuses) { + const filtered_statuses = statuses.reduce((o, status) => { + if(status.creator?.login == 'keyman-server' && status.context.startsWith('Test')) { + if(!o[status.context]) o[status.context] = {type: 'build', state: status.state}; + } else if(status.creator?.login == 'keymanapp-test-bot[bot]' && status.context == 'user_testing') { + if(!o[status.context]) o[status.context] = {type: 'user-test', state: status.state};; + } else if(status.context == 'API Verification') { + if(!o[status.context]) o[status.context] = {type: 'check', state: status.state}; + } else if(status.context == 'Ubuntu Packaging') { + if(!o[status.context]) o[status.context] = {type: 'build', state: status.state}; + } else if(status.context == 'check/web/file-size') { + // Ignore check/web/file-size -- we won't block automerge for this at this point + } else { + // We fail with an 'unknown status' response if we get a new status check + // so we can be sure we are not skipping known status checks + o[status.context] = {type: 'unknown', state: status.state}; + } + return o; + + }, {}); + return filtered_statuses; + } + + // + // Given the collection of status checks we care about, return + // an aggregate status -- error, failed, pending, or success, + // and a summary description + // + function calculateFinalStatus(filtered_statuses) { + const counts = {}; + let hasBuilds = false; + for(const context of Object.keys(filtered_statuses)) { + const { state, type } = filtered_statuses[context]; + if(type == 'unknown') { + // We special-case for unknown status checks, and never permit them + return [ + 'error', `An unknown context ${context} was found, cannot calculate build status.` + ]; + } + if(type == 'build') { + hasBuilds = true; + } + counts[state] = counts[state] ? counts[state] + 1 : 1; + } + + // If we do not have any statuses yet, we wait + if(Object.keys(filtered_statuses).length == 0 || !hasBuilds) { + return ['pending', 'Checks have not yet been triggered ⌛']; + } + + const state = + counts.error ? 'error' : + counts.failed ? 'failed' : + counts.pending ? 'pending' : + 'success'; + + let description = ''; //; + function appendDescription(count, state) { + if(!count) return; + if(description != '') description += '; '; + description += `${count} check${count == 1 ? '' : 's'} ${state}`; + } + appendDescription(counts.error, 'in an error state ❌'); + appendDescription(counts.failed, 'failed ❌'); + appendDescription(counts.pending, 'pending ⌛'); + appendDescription(counts.success, 'completed successfully ✅'); + + return [ state, description ]; + } + + async function getCommitStatuses(github, owner, repo, sha) { + const statuses = await github.paginate('GET /repos/{owner}/{repo}/commits/{sha}/statuses', { + owner, + repo, + sha, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + return statuses; + } + + async function getCommitCheckRuns(github, owner, repo, sha) { + const statuses = await github.paginate('GET /repos/{owner}/{repo}/commits/{sha}/check-runs', { + owner, + repo, + sha, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }); + return statuses; + } + + function calculateCheckResult(statuses) { + if(!Array.isArray(statuses)) { + return ['error', 'Failed to retrieve status checks from GitHub ❌']; + } + + const filtered_statuses = reduceStatuses(statuses); + + const result = calculateFinalStatus(filtered_statuses); + return result; + } + + async function test(github, owner, repo, sha) { + // Get statuses from sha + const statuses = await getCommitStatuses(github, owner, repo, sha); + return calculateCheckResult(statuses); + } + + async function createCheck(github, owner, repo, sha) { + const check = await github.rest.checks.create({ + owner, + repo, + head_sha: sha, + name: 'Build Outcome', + status: 'in_progress', + }); + return check.data.id; + } + + async function updateCheck(github, owner, repo, checkRunId, status, description) { + // To ensure that + const checkStatus = status == 'pending' ? 'in_progress' : 'completed'; + const conclusion = checkStatus == 'in_progress' ? undefined : (status == 'success' ? 'success' : 'failure'); + + await github.rest.checks.update({ + owner, + repo, + check_run_id: checkRunId, + status: checkStatus, + conclusion, + output: { + title: description, + summary: '' + } + }); + } + +// END OF CLONED SECTION +// THIS SECTION MUST BE INCLUDED, UNCOMMENTED IN THE .yml + + // const { owner, repo } = context.repo; + // const sha = context.payload?.check_suite?.sha || context.sha; + // const checkRunId = await createCheck(github, owner, repo, sha); + // const res = await test(github, owner, repo, sha); + // await updateCheck(github, owner, repo, checkRunId, res[0], res[1]); + +// END OF COMMENTED SECTION + +// Following code is used only for unit testing; do not include in the .yml + +export const unitTestEndpoints = { + getCommitStatuses, calculateCheckResult, getCommitCheckRuns +}; \ No newline at end of file diff --git a/resources/build/pr-build-status/pr-build-status.tests.mjs b/resources/build/pr-build-status/pr-build-status.tests.mjs new file mode 100644 index 0000000000..b9a4429eac --- /dev/null +++ b/resources/build/pr-build-status/pr-build-status.tests.mjs @@ -0,0 +1,44 @@ +import * as fs from 'node:fs'; +import 'mocha'; +import { assert } from 'chai'; + +import { unitTestEndpoints } from './pr-build-status.mjs'; + +// debug only +import { getOctokit } from '@actions/github'; +import * as process from 'node:process'; + +const commits = { + '825f7d2df0069fa56a8f2a534b42a49ee1f21ca1': [ 'success', '24 checks completed successfully ✅' ], + '870d37f56b489ef5067b4352a06505369d9038e0': [ 'error', '6 checks in an error state ❌; 17 checks completed successfully ✅' ], + '11a558e926370253db37026c95b7ff5a6aa1e8fc': [ 'success', '22 checks completed successfully ✅' ], + '8fd5ccc9026b85d6a780d8bcf862380e7a89aefb': [ 'pending', 'Checks have not yet been triggered ⌛' ], + '153683cfb007c6066c9dcf71d25afa4c66efa17f': [ 'pending', 'Checks have not yet been triggered ⌛' ], +}; + +// When adding new SHAs to test, run this to collect data from GitHub +const debug = false; +if(debug) { + + async function writeTestFile(sha) { + fs.writeFileSync('fixtures/' + sha + '-statuses.json', + JSON.stringify(await unitTestEndpoints.getCommitStatuses(octokit, 'keymanapp', 'keyman', sha), null, 2), 'utf-8'); + fs.writeFileSync('fixtures/' + sha + '-check-runs.json', + JSON.stringify(await unitTestEndpoints.getCommitCheckRuns(octokit, 'keymanapp', 'keyman', sha), null, 2), 'utf-8'); + } + + const octokit = getOctokit(process.env['GITHUB_TOKEN']); + for(const sha of Object.keys(commits)) await writeTestFile(sha); +} + +describe('pr-build-status', function () { + for(const sha of Object.keys(commits)) { + it(`should return '${commits[sha][1]}' for sha ${sha}`, function () { + const json = JSON.parse(fs.readFileSync(`fixtures/${sha}-statuses.json`,'utf-8')); + const status = unitTestEndpoints.calculateCheckResult(json); + assert.isNotNull(status); + assert.isArray(status); + assert.deepStrictEqual(status, commits[sha]); + }); + } +}); diff --git a/resources/build/run-required-test-builds.sh b/resources/build/run-required-test-builds.sh index bc9b307c62..03f782dfeb 100755 --- a/resources/build/run-required-test-builds.sh +++ b/resources/build/run-required-test-builds.sh @@ -65,6 +65,8 @@ function triggerTestBuilds() { local -n platforms=$1 local branch="$2" + local found_build=false + # Cancel any already running builds for this branch if builder_has_option --dry-run; then builder_echo "DRY RUN: cancel current builds for $branch" @@ -83,6 +85,7 @@ function triggerTestBuilds() { eval test_builds='(${'bc_test_$platform'[@]})' for test_build in "${test_builds[@]}"; do if [[ $test_build == "" ]]; then continue; fi + found_build=true if [ "${test_build:(-7)}" == "_GitHub" ]; then local job=${test_build%_GitHub} @@ -102,6 +105,26 @@ function triggerTestBuilds() { fi done done + + if [[ $found_build == false ]]; then + postSkippedBuildsStatusResult + fi +} + +# +# Add a 'Test Build (Keyman)' successful status check to the commit +# +function postSkippedBuildsStatusResult() { + if builder_has_option --dry-run; then + builder_echo "DRY RUN: write successful status check 'Skipping since no platform builds necessary'" + else + curl --silent --write-out '\n' \ + --request POST \ + --header "Accept: application/vnd.github+json" \ + --header "Authorization: token $GITHUB_TOKEN" \ + --data '{"state":"success","description":"Skipping since no platform builds necessary","context":"Test Build (Keyman)"}' \ + "https://api.github.com/repos/keymanapp/keyman/statuses/${BUILD_VCS_NUMBER}" + fi } # @@ -241,16 +264,7 @@ if (( ${#build_platforms[@]} > 0)); then triggerTestBuilds build_platforms $PRNUM else builder_echo heading "No builds to start" - if builder_has_option --dry-run; then - builder_echo "DRY RUN: write successful status check 'Skipping since no platform builds necessary'" - else - curl --silent --write-out '\n' \ - --request POST \ - --header "Accept: application/vnd.github+json" \ - --header "Authorization: token $GITHUB_TOKEN" \ - --data '{"state":"success","description":"Skipping since no platform builds necessary","context":"Test Build (Keyman)"}' \ - "https://api.github.com/repos/keymanapp/keyman/statuses/${BUILD_VCS_NUMBER}" - fi + postSkippedBuildsStatusResult fi exit 0 From 876fa29df810fde6250578e41016bf5a90ea6742 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Thu, 19 Jun 2025 07:37:48 +1000 Subject: [PATCH 11/17] chore(resources): temporarily test GHA on push to current branch --- .github/workflows/pr-build-status.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-build-status.yml b/.github/workflows/pr-build-status.yml index f8de2f7adf..3c4c865c72 100644 --- a/.github/workflows/pr-build-status.yml +++ b/.github/workflows/pr-build-status.yml @@ -1,8 +1,9 @@ name: Keyman Build Summary on: - # push: - # branches: - # - "maint/resources/14172-pr-build-status-2" + # Temporary for testing: + push: + branches: + - "maint/resources/14172-pr-build-status-2" check_run: types: [completed] From ba8dd1a17e38f6cd933b5b24ea749cbc4be76320 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Sat, 21 Jun 2025 14:44:07 -0500 Subject: [PATCH 12/17] chore(developer): document findInstanceObject() return value per code review Fixes: #14099 --- developer/src/common/web/utils/src/xml-utils.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/developer/src/common/web/utils/src/xml-utils.ts b/developer/src/common/web/utils/src/xml-utils.ts index 1d2b01c71e..721e503f9e 100644 --- a/developer/src/common/web/utils/src/xml-utils.ts +++ b/developer/src/common/web/utils/src/xml-utils.ts @@ -364,6 +364,7 @@ export class KeymanXMLWriter { * traverse an AJV instancePath and map to an object if possible * @param source object tree root (contains the root object) * @param path ajv split instancePath, such as '/keyboard3/layers/0'.split('/') + * @returns undefined if the path was not present, null if path went to something that wasn't an object, otherwise the compileContext object is returned. */ export function findInstanceObject(source: any, path: string[]) : any { if(!path || !source || path.length == 0) { From a84ede81b0d77d5c6c6683c19f3070c0b189260b Mon Sep 17 00:00:00 2001 From: Keyman Build Agent Date: Sun, 22 Jun 2025 14:01:22 -0400 Subject: [PATCH 13/17] auto: increment master version to 19.0.68 --- HISTORY.md | 4 ++++ VERSION.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/HISTORY.md b/HISTORY.md index 06cd831c72..be1a83fb18 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -1,5 +1,9 @@ # Keyman Version History +## 19.0.67 alpha 2025-06-22 + +* chore(developer): ldml: additional line numbers (#14104) + ## 19.0.66 alpha 2025-06-16 * fix(windows): add values wucUpdateAvailable and wucNotChecked to TRemoteUpdateCheckResult enum (#14123) diff --git a/VERSION.md b/VERSION.md index f0d2c39d19..bf865b419e 100644 --- a/VERSION.md +++ b/VERSION.md @@ -1 +1 @@ -19.0.67 \ No newline at end of file +19.0.68 \ No newline at end of file From 94cdf834dfe293b618e9dda4fa7825f48ebbf27b Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Mon, 23 Jun 2025 05:05:01 +1000 Subject: [PATCH 14/17] maint(common): polish docs and add tests for build-bot --- docs/build-bot.md | 103 +++++++++--------- resources/build/run-required-test-builds.sh | 4 +- .../test/build-bot/trigger-build-bot.test.sh | 4 + resources/build/trigger-build-bot.inc.sh | 13 ++- resources/build/trigger-builds.inc.sh | 8 +- 5 files changed, 72 insertions(+), 60 deletions(-) diff --git a/docs/build-bot.md b/docs/build-bot.md index 8f06e7d75f..06c34d4333 100644 --- a/docs/build-bot.md +++ b/docs/build-bot.md @@ -29,6 +29,59 @@ Or you may want to ensure that an artifact is built for Windows: Build-bot: release windows ``` +## Build Level + +The build level specifies what we want to be run for a test build on a PR. + +There is a bit of nomenclature overlap with a 'release build'. A 'release' +buildLevel for a 'test build' is roughly equivalent to what is performed in a +'release build', however, a test build is only ever uploaded to test endpoints +(i.e. TestFlight, Play Store 'test' streams), and never to *.keyman.com, or to +other release distribution endpoints. + +The build level is controlled by the Build-bot commit trailer and PR body +Build-bot/Test-bot trailers. The default build level will be 'build'. + +For target branch builds, the build level will always be 'build', and Build-bot: +commit trailers are ignored. + +### 'skip' build level + +Don't do a build at all. This would be appropriate for documentation PRs, for +example, or changes only to comments in source files. + +### 'build' build level + +Build the code and run unit tests, but don't create artifacts. What this looks +like will vary from platform to platform, but there are some common things we +won't do: +* we won't upload artifacts to TeamCity or *.keyman.com +* we won't upload artifacts to any endpoint such as Play Store +* we won't upload symbols to Sentry +* we won't codesign + +However, we _will_ still build an installer (skipping codesigning), as this is +part of the 'build' buildLevel rather than the 'release' buildLevel. The +installer will be thrown away for 'build' build level -- it will not be +available for download as an artifact. + +For a platform-specific example, on macOS we will also skip notarizing, as this +is costly and depends on external network resources, making it fragile. + +### 'release' build level + +A full test build will be run, roughly equivalent to a release build. We will do +the following steps: +* codesign (many platforms) and notarization (macOS) +* upload artifacts to TeamCity (all platforms) +* upload builds to TestFlight / Play Store 'test' endpoints (iOS/Android) +* upload symbols to Sentry + +For a 'release' build level: +* we won't upload artifacts to *.keyman.com +* we won't upload artifacts to any release endpoint such as Debian, + packages.sil.org, etc, or to the release areas for Play Store or App Store + ## Controlling the build bot with trailers The build bot respects commit trailers and trailers in the PR body. The commands @@ -81,56 +134,6 @@ Note that other platforms are still 'skip' but not included in the build set. Finally, the PR author pushes another commit, with `Build-bot: release windows`. The build set is now: `(android:skip ios:skip windows:release)`. -## Build Level - -The build level specifies what we want to be run for a test build on a PR. - -There is a bit of nomenclature overlap with a 'release build'. A 'release' -buildLevel for a 'test build' is roughly equivalent to what is performed in a -'release build', however, a test build is only ever uploaded to test endpoints -(i.e. TestFlight, Play Store 'test' streams), and never to *.keyman.com, or to -other release distribution endpoints. - -The build level is controlled by the Build-bot commit trailer and PR body -Build-bot/Test-bot trailers. The default build level will be 'build'. - -For target branch builds, the build level will always be 'build', and Build-bot: -commit trailers are ignored. - -### 'skip' build level - -Don't do a build at all. This would be appropriate for documentation PRs, for -example, or changes only to comments in source files. - -### 'build' build level - -Build the code and run unit tests, but don't create artifacts. What this looks -like will vary from platform to platform, but there are some common things we -won't do: -* we won't upload artifacts to TeamCity or *.keyman.com -* we won't upload artifacts to any endpoint such as Play Store -* we won't upload symbols to Sentry -* we won't codesign - -However, we _will_ still build an installer (skipping codesigning), as this is -part of the 'build' buildLevel rather than the 'release' buildLevel. - -For a platform-specific example, on macOS we will also skip notarizing, as this -is costly and depends on external network resources, making it fragile. - -### 'release' build level - -A full test build will be run, roughly equivalent to a release build. We will do -the following steps: -* codesign (many platforms) and notarization (macOS) -* upload artifacts to TeamCity (all platforms) -* upload builds to TestFlight / Play Store 'test' endpoints (iOS/Android) -* upload symbols to Sentry - -For a 'release' build level: -* we won't upload artifacts to *.keyman.com -* we won't upload artifacts to any release endpoint such as Debian, - packages.sil.org, etc, or to the release areas for Play Store or App Store [Build Level]: #Build_Level \ No newline at end of file diff --git a/resources/build/run-required-test-builds.sh b/resources/build/run-required-test-builds.sh index bc9b307c62..4426e46bf8 100755 --- a/resources/build/run-required-test-builds.sh +++ b/resources/build/run-required-test-builds.sh @@ -19,7 +19,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")" builder_describe "Run test builds for the given pull request/primary branch" \ "--dry-run,-n Only report back which builds would be started" \ - "--branch,-b=PRNUM Branch (master,beta) or pull-request to test" + "--branch,-b=PRNUM Branch (master,beta,stable-x.y) or pull-request to test" if [[ $# -eq 1 ]] && [[ "$1" =~ ^[0-9]+$ ]]; then # For transitional period, when build configuration on TC needs to support @@ -110,7 +110,7 @@ function triggerTestBuilds() { # if [[ ! "$PRNUM" =~ ^[[:digit:]]+$ ]]; then - # branch name is 'master', 'beta' [, or 'stable' -- in the future] + # branch name is 'master', 'beta', or 'stable-x.y' builder_echo "Branch $PRNUM needs to pass tests on all platforms." triggerTestBuilds main_branch_platform_build_levels $PRNUM exit 0 diff --git a/resources/build/test/build-bot/trigger-build-bot.test.sh b/resources/build/test/build-bot/trigger-build-bot.test.sh index c0d914a6ce..3629cc3c6a 100755 --- a/resources/build/test/build-bot/trigger-build-bot.test.sh +++ b/resources/build/test/build-bot/trigger-build-bot.test.sh @@ -28,6 +28,10 @@ test_build_bot_check_messages() { _do_test_build_bot_check_messages_file 14013 "[windows]=release" "$ALL_BUILD_PLATFORMS_SKIP_EXPECTED" # Simplified data for testing Build-bot command sequences only _do_test_build_bot_check_messages_file 9999 "[windows]=release" '[windows]="skip" [developer]="release"' + + # test another sequence of commands + _do_test_build_bot_check_messages_inline 8 "[windows]=release" '[common]="release" [windows]="skip" [developer]="build"' '{ "body": "Build-bot: skip windows\nBuild-bot: build developer\nBuild-bot: release common" }' '[]' + # Test some bad inputs _do_test_build_bot_check_messages_inline 1 "[windows]=release" '[windows]="release"' '{}' '[{ "commit": { "message": "maint(common): test\nBuild-bot: foo windows\n" }}]' # empty body, 'foo windows' in commit diff --git a/resources/build/trigger-build-bot.inc.sh b/resources/build/trigger-build-bot.inc.sh index d55ac473ae..f9b428be35 100644 --- a/resources/build/trigger-build-bot.inc.sh +++ b/resources/build/trigger-build-bot.inc.sh @@ -38,7 +38,7 @@ function test_bot_check_pr_body() { } # -# Check PR commit messages for Build-bot commands Later commands override +# Check PR commit messages for Build-bot commands. Later commands override # earlier ones. Also checks PR body for any overriding commands. Note, only # checks the first 250 commits, so later build commands will be ignored; in this # situation, use the PR body command. Also ignores build commands in PR @@ -77,9 +77,6 @@ function build_bot_check_messages() { buildBotCommands+=("${prCommands[@]}") fi - # We now know that our command has only a-z, comma and space, so we can parse - # without risking escaping our bash jail - for buildBotCommand in "${buildBotCommands[@]}"; do # Block illegal Build-bot: commands if [[ ! "$buildBotCommand" =~ ^[a-z,\ ]+$ ]]; then @@ -87,6 +84,9 @@ function build_bot_check_messages() { continue fi + # We now know that our command has only a-z, comma and space, so we can + # parse without risking escaping our bash jail + if [[ ! -z "${buildBotCommand// }" ]]; then build_bot_update_commands $buildBotCommand fi @@ -97,8 +97,9 @@ function build_bot_check_messages() { # # parses a 'Build-bot: [platform...]' command and modifies -# the global build_platforms associative array with new levels -# note that this function assumes that inputs are sanitized, see +# the global build_platforms associative array with new levels. +# +# Note that this function assumes that inputs are sanitized, see # build_bot_check_messages # function build_bot_update_commands() { diff --git a/resources/build/trigger-builds.inc.sh b/resources/build/trigger-builds.inc.sh index aa07a30089..bfea20bb1a 100644 --- a/resources/build/trigger-builds.inc.sh +++ b/resources/build/trigger-builds.inc.sh @@ -32,8 +32,12 @@ function triggerReleaseBuilds() { # Trigger a build on TeamCity # # Parameters: -# 1: 'true' if this is for a PR branch, otherwise 'false' (for master/beta/stable-x.y) -# 2: 'skip' - don't run build; 'build' - run build and unit tests; 'release' - run build, unit tests, and deploy +# 1: isTestBuild: 'true' if this is for a PR branch or a test build +# for a primary branch; false is this is a release +# build for a primary branch (master/beta/stable-x.y) +# 2: buildLevel: 'skip' - don't run build; +# 'build' - run build and unit tests; +# 'release' - run build, unit tests, and deploy # 3: TeamCity build configuration name # 4: TeamCity VCS id, which is different for PR test configurations # 5: branch name in git From d49bc2efdb336156390997f92271ef74d2906da2 Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 24 Jun 2025 08:51:12 +1000 Subject: [PATCH 15/17] chore(resources): remove redundant comments --- .github/workflows/pr-build-status.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/pr-build-status.yml b/.github/workflows/pr-build-status.yml index 3c4c865c72..d755eca9b7 100644 --- a/.github/workflows/pr-build-status.yml +++ b/.github/workflows/pr-build-status.yml @@ -93,7 +93,7 @@ jobs: counts.pending ? 'pending' : 'success'; - let description = ''; //; + let description = ''; function appendDescription(count, state) { if(!count) return; if(description != '') description += '; '; @@ -160,7 +160,6 @@ jobs: } async function updateCheck(github, owner, repo, checkRunId, status, description) { - // To ensure that const checkStatus = status == 'pending' ? 'in_progress' : 'completed'; const conclusion = checkStatus == 'in_progress' ? undefined : (status == 'success' ? 'success' : 'failure'); From 7915793d9e6fb6bb7266198146c67d7a6aca008d Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 24 Jun 2025 08:52:05 +1000 Subject: [PATCH 16/17] docs(common): clarify when release builds are run Build-bot: skip --- docs/build-bot.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/build-bot.md b/docs/build-bot.md index 06c34d4333..e879154a96 100644 --- a/docs/build-bot.md +++ b/docs/build-bot.md @@ -82,6 +82,8 @@ For a 'release' build level: * we won't upload artifacts to any release endpoint such as Debian, packages.sil.org, etc, or to the release areas for Play Store or App Store +(uploading to *.keyman.com and to release endpoints happens in the release TC build config/GHA) + ## Controlling the build bot with trailers The build bot respects commit trailers and trailers in the PR body. The commands From 0f4a1cdfe75f91e265aa06a6d1bc40049e677bfe Mon Sep 17 00:00:00 2001 From: Marc Durdin Date: Tue, 24 Jun 2025 09:03:28 +1000 Subject: [PATCH 17/17] fix(resources): allow branch names in run-required-test-builds shortcut call This is a transitional patch while we wait for the Build-bot changes to flow through all the open PRs. Fixes the broken master test build. --- resources/build/run-required-test-builds.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/build/run-required-test-builds.sh b/resources/build/run-required-test-builds.sh index 4426e46bf8..3e8b60d951 100755 --- a/resources/build/run-required-test-builds.sh +++ b/resources/build/run-required-test-builds.sh @@ -21,7 +21,7 @@ builder_describe "Run test builds for the given pull request/primary branch" \ "--dry-run,-n Only report back which builds would be started" \ "--branch,-b=PRNUM Branch (master,beta,stable-x.y) or pull-request to test" -if [[ $# -eq 1 ]] && [[ "$1" =~ ^[0-9]+$ ]]; then +if [[ $# -eq 1 ]] && [[ "$1" =~ ^([0-9]+|master|beta|stable-[0-9]+\.[0-9]+)$ ]]; then # For transitional period, when build configuration on TC needs to support # both forms, we will pass a modified set of params to builder_parse #