Skip to content

Commit

Permalink
Merge branch 'flutter:main' into main
Browse files Browse the repository at this point in the history
ricardoamador authored Nov 9, 2023
2 parents bda6333 + db39fec commit 1a1a89a
Showing 43 changed files with 13,578 additions and 283 deletions.
15 changes: 15 additions & 0 deletions .ci.yaml
Original file line number Diff line number Diff line change
@@ -31,6 +31,19 @@ targets:
recipe: cocoon/cocoon
properties:
add_recipes_cq: "true"
runIf:
- .ci.yaml
- analyze/**
- app_dart/**
- auto_submit/**
- cipd_packages/**
- cloud_build/**
- dashboard/**
- dev/**
- licenses/**
- packages/**
- test_utilities/**
- tooling/**

- name: Linux device_doctor
recipe: cocoon/cipd
@@ -145,3 +158,5 @@ targets:
recipe: infra/ci_yaml
properties:
backfill: "false"
runIf:
- .ci.yaml
5 changes: 5 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -82,3 +82,8 @@ updates:
- "autosubmit"
allow:
- dependency-name: "github.com/slsa-framework/slsa-verifier/v2"
# Npm ecosystem.
- package-ecosystem: 'npm'
directory: '/gh_actions/third_party/no-response'
schedule:
interval: 'daily'
40 changes: 40 additions & 0 deletions .github/workflows/no-response_publish.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: no-response-publish

# Declare default permissions as read only.
permissions: read-all

on:
release:
types: [published, edited]
branches:
- main
paths:
- 'gh_actions/third_party/no-response/**'
- '.github/workflows/no-response_test.yaml'
- '.github/workflows/no-response_publish.yaml'
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
if: ${{ github.repository == 'flutter/cocoon' }}
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
ref: ${{ github.event.release.tag_name }}
sparse-checkout: 'gh_actions/third_party/no-response'
sparse-checkout-cone-mode: false
- name: move_package_to_root
run: |
mv -f gh_actions/third_party/no-response/{.[!.],}* ./
rm -rf gh_actions
- name: ls
run: ls -la
- name: npm_ci
run: npm ci
- name: npm_run_build
run: npm run build
- uses: JasonEtco/build-and-tag-action@dd5e4991048c325f6d85b4155e586fc211c644da
env:
GITHUB_TOKEN: ${{ secrets.FLUTTERGITHUBBOT_TOKEN }}
34 changes: 34 additions & 0 deletions .github/workflows/no-response_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: no-response-test

# Declare default permissions as read only.
permissions: read-all

on:
pull_request:
paths:
- 'gh_actions/third_party/no-response/**'
- '.github/workflows/no-response_test.yaml'
- '.github/workflows/no-response_publish.yaml'
jobs:
unitTest:
runs-on: ubuntu-latest
if: ${{ github.repository == 'flutter/cocoon' }}
steps:
- name: Checkout
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
with:
ref: ${{ github.event.release.tag_name }}
sparse-checkout: 'gh_actions/third_party/no-response'
sparse-checkout-cone-mode: false
- name: move_package_to_root
run: |
mv -f gh_actions/third_party/no-response/{.[!.],}* ./
rm -rf gh_actions
- name: ls
run: ls -la
- name: npm_ci
run: npm ci
- name: npm_run_ci
run: npm run ci
- name: npm_run_build
run: npm run build
3 changes: 3 additions & 0 deletions CODEOWNERS
This CODEOWNERS file contains errors

CODEOWNERS errors

  • Unknown owner on line 8: make sure @keyonghan exists and has write access to the repository
    …builders.dart                 @keyonghan
  • Unknown owner on line 9: make sure @CaseyHillers exists and has write access to the repository
    …h.dart                        @CaseyHillers
  • Unknown owner on line 10: make sure @drewroengoogle exists and has write access to the repository
    …l_subscription.dart           @drewroengoogle
  • Unknown owner on line 11: make sure @keyonghan exists and has write access to the repository
    …ssue_and_pr.dart              @keyonghan
  • Unknown owner on line 12: make sure @keyonghan exists and has write access to the repository
    …dart                          @keyonghan
  • Unknown owner on line 13: make sure @keyonghan exists and has write access to the repository
    …atus.dart                     @keyonghan
  • Unknown owner on line 14: make sure @CaseyHillers exists and has write access to the repository
    …branches.dart                 @CaseyHillers
  • Unknown owner on line 15: make sure @keyonghan exists and has write access to the repository
    …rt                            @keyonghan
  • Unknown owner on line 16: make sure @keyonghan exists and has write access to the repository
    …art                           @keyonghan
  • Unknown owner on line 17: make sure @XilaiZhang exists and has write access to the repository
    …mmits.dart                    @XilaiZhang
  • Unknown owner on line 18: make sure @keyonghan exists and has write access to the repository
    …limit_status.dart             @keyonghan
  • Unknown owner on line 19: make sure @keyonghan exists and has write access to the repository
    …ok.dart                       @keyonghan
  • Unknown owner on line 20: make sure @keyonghan exists and has write access to the repository
    …ok_subscription.dart          @keyonghan
  • Unknown owner on line 21: make sure @keyonghan exists and has write access to the repository
    …ci_subscription.dart          @keyonghan
  • Unknown owner on line 22: make sure @keyonghan exists and has write access to the repository
    …uci_subscription.dart         @keyonghan
  • Unknown owner on line 23: make sure @keyonghan exists and has write access to the repository
    …tatus_to_github.dart          @keyonghan
  • Unknown owner on line 24: make sure @Piinks exists and has write access to the repository
    …atus_to_github.dart           @Piinks
  • Unknown owner on line 25: make sure @keyonghan exists and has write access to the repository
    …ask.dart                      @keyonghan
  • Unknown owner on line 26: make sure @keyonghan exists and has write access to the repository
    …sk.dart                       @keyonghan
  • Unknown owner on line 27: make sure @keyonghan exists and has write access to the repository
    …tch_backfiller.dart           @keyonghan
  • Unknown owner on line 28: make sure @keyonghan exists and has write access to the repository
    …quest_subscription.dart       @keyonghan
  • Unknown owner on line 29: make sure @keyonghan exists and has write access to the repository
    …cuum_stale_tasks.dart         @keyonghan
  • Unknown owner on line 30: make sure @keyonghan exists and has write access to the repository
    …ing_flaky_issues.dart         @keyonghan
  • Unknown owner on line 31: make sure @keyonghan exists and has write access to the repository
    …status.dart                   @keyonghan
  • Unknown owner on line 32: make sure @keyonghan exists and has write access to the repository
    …b_commits.dart                @keyonghan
  • Unknown owner on line 38: make sure @XilaiZhang exists and has write access to the repository
    @XilaiZhang
  • Unknown owner on line 39: make sure @yusuf-goog exists and has write access to the repository
    @yusuf-goog
  • Unknown owner on line 40: make sure @gspencergoog exists and has write access to the repository
    @gspencergoog
  • Unknown owner on line 41: make sure @godofredoc exists and has write access to the repository
    @godofredoc
  • Unknown owner on line 44: make sure @godofredoc exists and has write access to the repository
    @godofredoc
Original file line number Diff line number Diff line change
@@ -39,3 +39,6 @@ cipd_packages/codesign/** @Xil
cipd_packages/device_doctor/** @yusuf-goog
cipd_packages/doxygen/** @gspencergoog
cipd_packages/ruby/** @godofredoc

## gh_actions
gh_actions/third_party/no-response/** @godofredoc
2 changes: 1 addition & 1 deletion app_dart/integration_test/data/cocoon_config.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"targets":[{"name":"Linux Cocoon","properties":{"add_recipes_cq":"true"},"recipe":"cocoon/cocoon"},{"name":"Linux device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/linux-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-amd64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-arm64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Windows device_doctor","properties":{"script":"cipd_packages\\device_doctor\\tool\\build.bat","cipd_name":"flutter/device_doctor/windows-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux doxygen","properties":{"script":"cipd_packages/doxygen/tool/build.sh","cipd_name":"flutter/doxygen/linux-amd64","dependencies":"[\n {\"dependency\": \"cmake\", \"version\": \"build_id:8787856497187628321\"}\n]"},"runIf":["cipd_packages/doxygen/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-amd64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-arm64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-amd64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-arm64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux ci_yaml roller","properties":{"backfill":"false"},"recipe":"infra/ci_yaml"}],"enabledBranches":["main"],"platformProperties":{"linux":{"properties":{"os":"Linux","device_type":"none"}},"mac":{"properties":{"os":"Mac-12|Mac-13","cpu":"x86"}},"mac_arm64":{"properties":{"os":"Mac-12|Mac-13","cpu":"arm64"}},"windows":{"properties":{"os":"Windows","device_type":"none"}}}}
{"targets":[{"name":"Linux Cocoon","properties":{"add_recipes_cq":"true"},"runIf":[".ci.yaml","analyze/**","app_dart/**","auto_submit/**","cipd_packages/**","cloud_build/**","dashboard/**","dev/**","licenses/**","packages/**","test_utilities/**","tooling/**"],"recipe":"cocoon/cocoon"},{"name":"Linux device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/linux-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-amd64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 device_doctor","properties":{"script":"cipd_packages/device_doctor/tool/build.sh","cipd_name":"flutter/device_doctor/mac-arm64","device_type":"none"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Windows device_doctor","properties":{"script":"cipd_packages\\device_doctor\\tool\\build.bat","cipd_name":"flutter/device_doctor/windows-amd64"},"runIf":["cipd_packages/device_doctor/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux doxygen","properties":{"script":"cipd_packages/doxygen/tool/build.sh","cipd_name":"flutter/doxygen/linux-amd64","dependencies":"[\n {\"dependency\": \"cmake\", \"version\": \"build_id:8787856497187628321\"}\n]"},"runIf":["cipd_packages/doxygen/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-amd64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 codesign","properties":{"script":"cipd_packages/codesign/tool/build.sh","cipd_name":"flutter/codesign/mac-arm64","device_type":"none"},"runIf":["cipd_packages/codesign/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-amd64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Mac_arm64 ruby","timeout":60,"properties":{"script":"cipd_packages/ruby/tools/build.sh","cipd_name":"flutter/ruby/mac-arm64","device_os":"iOS","contexts":"[\n \"osx_sdk_devicelab\"\n]","$flutter/osx_sdk":"{\n \"sdk_version\": \"14e300c\"\n}"},"runIf":["cipd_packages/ruby/**",".ci.yaml"],"recipe":"cocoon/cipd"},{"name":"Linux ci_yaml roller","properties":{"backfill":"false"},"runIf":[".ci.yaml"],"recipe":"infra/ci_yaml"}],"enabledBranches":["main"],"platformProperties":{"linux":{"properties":{"os":"Linux","device_type":"none"}},"mac":{"properties":{"os":"Mac-12|Mac-13","cpu":"x86"}},"mac_arm64":{"properties":{"os":"Mac-12|Mac-13","cpu":"arm64"}},"windows":{"properties":{"os":"Windows","device_type":"none"}}}}
11 changes: 8 additions & 3 deletions app_dart/lib/src/model/appengine/task.dart
Original file line number Diff line number Diff line change
@@ -449,10 +449,15 @@ class Task extends Model<int> {
return status = statusSucceeded;
case Result.canceled:
return status = statusCancelled;
case Result.infraFailure:
return status = statusInfraFailure;
case Result.failure:
return status = statusFailed;
// Note that `Result` does not support `infraFailure`:
// https://github.com/luci/luci-go/blob/main/common/api/buildbucket/buildbucket/v1/buildbucket-gen.go#L247-L251
// To determine an infra failure status, we need to combine `Result.failure` and `FailureReason.infraFailure`.
if (build.failureReason == FailureReason.infraFailure) {
return status = statusInfraFailure;
} else {
return status = statusFailed;
}
default:
throw BadRequestException('${build.result} is unknown');
}
2 changes: 0 additions & 2 deletions app_dart/lib/src/model/luci/push_message.dart
Original file line number Diff line number Diff line change
@@ -319,8 +319,6 @@ enum Result {
canceled,
@JsonValue('FAILURE')
failure,
@JsonValue('INFRA_FAILURE')
infraFailure,
@JsonValue('SUCCESS')
success,
}
1 change: 0 additions & 1 deletion app_dart/lib/src/model/luci/push_message.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -379,6 +379,9 @@ class GithubWebhookSubscription extends SubscriptionHandler {
// Exempt paths.
filename.startsWith('dev/devicelab/lib/versions/gallery.dart') ||
filename.startsWith('dev/integration_tests') ||
filename.startsWith('impeller/fixtures') ||
filename.startsWith('impeller/golden_tests') ||
filename.startsWith('impeller/playground') ||
filename.startsWith('shell/platform/embedder/tests') ||
filename.startsWith('shell/platform/embedder/fixtures');
}
11 changes: 10 additions & 1 deletion app_dart/lib/src/request_handlers/github_rate_limit_status.dart
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ import '../foundation/utils.dart';
import '../request_handling/body.dart';
import '../request_handling/request_handler.dart';
import '../service/github_service.dart';
import '../service/logging.dart';

@immutable

@@ -35,10 +36,18 @@ class GithubRateLimitStatus extends RequestHandler<Body> {
final Map<String, dynamic> quotaUsage = (await githubService.getRateLimit()).toJson();
quotaUsage['timestamp'] = DateTime.now().toIso8601String();

final int remainingQuota = quotaUsage['remaining'] as int;
final int quotaLimit = quotaUsage['limit'] as int;
const double githubQuotaUsageSLO = 0.5;
if (remainingQuota < githubQuotaUsageSLO * quotaLimit) {
log.warning(
'Remaining GitHub quota is $remainingQuota, which is less than quota usage SLO ${githubQuotaUsageSLO * quotaLimit} (${githubQuotaUsageSLO * 100}% of the limit $quotaLimit)).',
);
}

/// Insert quota usage to BigQuery
const String githubQuotaTable = 'GithubQuotaUsage';
await insertBigquery(githubQuotaTable, quotaUsage, await config.createTabledataResourceApi());

return Body.forJson(quotaUsage);
}
}
1 change: 0 additions & 1 deletion app_dart/lib/src/service/github_checks_service.dart
Original file line number Diff line number Diff line change
@@ -181,7 +181,6 @@ class GithubChecksService {
// tasks when builds timeout.
return github.CheckRunConclusion.failure;
case push_message.Result.failure:
case push_message.Result.infraFailure:
return github.CheckRunConclusion.failure;
case push_message.Result.success:
return github.CheckRunConclusion.success;
4 changes: 2 additions & 2 deletions app_dart/lib/src/service/luci_build_service.dart
Original file line number Diff line number Diff line change
@@ -479,7 +479,7 @@ class LuciBuildService {
Set<String> availableBuilderSet;
try {
availableBuilderSet = await getAvailableBuilderSet(project: 'flutter', bucket: 'prod');
} on BuildBucketException catch (error) {
} catch (error) {
log.severe('Failed to get buildbucket builder list due to $error');
return toBeScheduled;
}
@@ -506,7 +506,7 @@ class LuciBuildService {
try {
messageIds = await pubsub.publish('scheduler-requests', batchRequest);
log.info('Published $messageIds for commit ${commit.sha}');
} on DetailedApiRequestError catch (error) {
} catch (error) {
log.severe('Failed to publish message to pub/sub due to $error');
return toBeScheduled;
}
18 changes: 18 additions & 0 deletions app_dart/test/model/task_test.dart
Original file line number Diff line number Diff line change
@@ -180,6 +180,24 @@ void main() {
task.updateFromBuild(build);
expect(task.status, Task.statusCancelled);
});

test('handles infra failed build', () {
final pm.Build build = generatePushMessageBuild(
1,
status: pm.Status.completed,
result: pm.Result.failure,
failureReason: pm.FailureReason.infraFailure,
);
final Task task = generateTask(
1,
buildNumber: 1,
status: Task.statusNew,
);

expect(task.status, Task.statusNew);
task.updateFromBuild(build);
expect(task.status, Task.statusInfraFailure);
});
});
});

Original file line number Diff line number Diff line change
@@ -609,6 +609,9 @@ void main() {
(_) => Stream<PullRequestFile>.fromIterable(<PullRequestFile>[
PullRequestFile()..filename = 'dev/devicelab/lib/versions/gallery.dart',
PullRequestFile()..filename = 'dev/integration_tests/some_package/android/build.gradle',
PullRequestFile()..filename = 'impeller/fixtures/dart_tests.dart',
PullRequestFile()..filename = 'impeller/golden_tests/golden_tests.cc',
PullRequestFile()..filename = 'impeller/playground/playground.cc',
PullRequestFile()..filename = 'shell/platform/embedder/tests/embedder_test_context.cc',
PullRequestFile()..filename = 'shell/platform/embedder/fixtures/main.dart',
]),
Original file line number Diff line number Diff line change
@@ -249,7 +249,8 @@ void main() {
tester.message = createBuildbucketPushMessage(
'COMPLETED',
builderName: 'Linux A',
result: 'INFRA_FAILURE',
result: 'FAILURE',
failureReason: 'INFRA_FAILURE',
userData: '{\\"task_key\\":\\"${task.key.id}\\", \\"commit_key\\":\\"${task.key.parent?.id}\\"}',
);

2 changes: 2 additions & 0 deletions app_dart/test/src/utilities/entity_generators.dart
Original file line number Diff line number Diff line change
@@ -167,6 +167,7 @@ push_message.Build generatePushMessageBuild(
DateTime? completedTimestamp,
DateTime? createdTimestamp,
DateTime? startedTimestamp,
push_message.FailureReason? failureReason,
}) {
tags ??= <String>[];
tags.add('build_address:luci.flutter.prod/$name/$buildNumber');
@@ -181,6 +182,7 @@ push_message.Build generatePushMessageBuild(
completedTimestamp: completedTimestamp,
startedTimestamp: startedTimestamp,
tags: tags,
failureReason: failureReason,
);
}

2 changes: 1 addition & 1 deletion cipd_packages/codesign/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ dev_dependencies:
lints: 3.0.0
test: 1.24.9
dependencies:
archive: 3.4.6
archive: 3.4.9
args: 2.4.2
crypto: 3.0.3
fake_async: 1.3.1
4 changes: 4 additions & 0 deletions cron.yaml
Original file line number Diff line number Diff line change
@@ -30,6 +30,10 @@ cron:
url: /api/push-build-status-to-github?repo=flutter/engine
schedule: every 2 minutes

- description: sends build status to GitHub to annotate packages PRs and commits
url: /api/push-build-status-to-github?repo=flutter/packages
schedule: every 2 minutes

- description: push github rate limit history to bigquery
url: /api/public/github-rate-limit-status
schedule: every 1 minutes
31 changes: 31 additions & 0 deletions dashboard/README.md
Original file line number Diff line number Diff line change
@@ -78,3 +78,34 @@ The tests require a linux host to be updated:
```sh
flutter test --update-goldens
```

## Deploying

### Web

Cocoon has a daily Cloud Build trigger that will publish this to
https://flutter-dashboard-appspot.com.

### Playstore

#### Set up

Download signing key from Valentine (under dashboards@flutter.dev). Save to
`$HOME/upload-keystore.jks`

Create `android/key.properties`

```sh
storePassword=$password
keyPassword=$password
keyAlias=upload
storeFile=$HOME/upload-keystore.jks
```

#### Publishing

`flutter build appbundle`

We ship debug mode as it makes it easy to debug issues in production.

In the Play Console for dashboards@flutter.dev, upload the new app.aab output.
26 changes: 19 additions & 7 deletions dashboard/android/app/build.gradle
Original file line number Diff line number Diff line change
@@ -22,6 +22,12 @@ if (flutterVersionName == null) {
flutterVersionName = '1.0'
}

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
namespace "com.appspot.flutter_dashboard.dashboard"
compileSdkVersion flutter.compileSdkVersion
@@ -50,13 +56,19 @@ android {
versionName flutterVersionName
}

buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}

flutter {
Binary file modified dashboard/assets/linux.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified dashboard/assets/windows.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 11 additions & 7 deletions dashboard/lib/widgets/task_icon.dart
Original file line number Diff line number Diff line change
@@ -48,37 +48,41 @@ class TaskIcon extends StatelessWidget {
);
}

if (qualifiedTask.task!.toLowerCase().contains('_fuchsia')) {
final String matchedName = qualifiedTask.task!.toLowerCase();
final bool isWebTest = matchedName.contains('_web') || matchedName.contains('web_');
final bool isToolTest = matchedName.contains('_tool') || matchedName.contains('tool_');

if (matchedName.contains('_fuchsia')) {
return Padding(
padding: const EdgeInsets.all(2.0),
child: Image.asset(
'assets/fuchsia.png',
color: blendFilter,
),
);
} else if (qualifiedTask.task!.toLowerCase().contains('_web')) {
} else if (isWebTest && !isToolTest) {
return Padding(
padding: const EdgeInsets.all(2.0),
child: Image.asset(
'assets/chromium.png',
color: blendFilter,
),
);
} else if (qualifiedTask.task!.toLowerCase().contains('_android')) {
} else if (matchedName.contains('_android')) {
return Icon(
Icons.android,
color: blendFilter,
);
} else if (qualifiedTask.task!.toLowerCase().startsWith('linux')) {
} else if (matchedName.startsWith('linux')) {
return Padding(
padding: const EdgeInsets.all(2.0),
child: Image.asset(
'assets/linux.png',
color: blendFilter,
),
);
} else if (qualifiedTask.task!.toLowerCase().startsWith('mac')) {
if (qualifiedTask.task!.toLowerCase().contains('_ios')) {
} else if (matchedName.startsWith('mac')) {
if (matchedName.contains('_ios')) {
return Icon(
Icons.phone_iphone,
color: blendFilter,
@@ -92,7 +96,7 @@ class TaskIcon extends StatelessWidget {
),
);
}
} else if (qualifiedTask.task!.toLowerCase().startsWith('win')) {
} else if (matchedName.startsWith('win')) {
return Image.asset(
'assets/windows.png',
color: blendFilter,
3 changes: 3 additions & 0 deletions gh_actions/third_party/no-response/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dist/
lib/
node_modules/
55 changes: 55 additions & 0 deletions gh_actions/third_party/no-response/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{
"plugins": ["jest", "@typescript-eslint"],
"extends": ["plugin:github/recommended"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 9,
"sourceType": "module",
"project": "./tsconfig.json"
},
"rules": {
"eslint-comments/no-use": "off",
"i18n-text/no-en": "off",
"import/no-namespace": "off",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/explicit-member-accessibility": ["error", {"accessibility": "no-public"}],
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/array-type": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-comment": "error",
"camelcase": "off",
"@typescript-eslint/consistent-type-assertions": "error",
"@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
"@typescript-eslint/func-call-spacing": ["error", "never"],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-assertion": "warn",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/prefer-for-of": "warn",
"@typescript-eslint/prefer-function-type": "warn",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-string-starts-ends-with": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/require-array-sort-compare": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"semi": "off",
"@typescript-eslint/semi": ["error", "never"],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unbound-method": "error"
},
"env": {
"node": true,
"es6": true,
"jest/globals": true
}
}
1 change: 1 addition & 0 deletions gh_actions/third_party/no-response/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
dist/** -diff linguist-generated=true
3 changes: 3 additions & 0 deletions gh_actions/third_party/no-response/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dist/
lib/
node_modules/
3 changes: 3 additions & 0 deletions gh_actions/third_party/no-response/.prettierignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dist/
lib/
node_modules/
4 changes: 4 additions & 0 deletions gh_actions/third_party/no-response/.prettierrc.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
printWidth: 100
semi: false
singleQuote: true
trailingComma: none
20 changes: 20 additions & 0 deletions gh_actions/third_party/no-response/LICENSE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
The MIT License (MIT)

Copyright &copy; 2021 [Lee Dohm](https://www.lee-dohm.com)

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
75 changes: 75 additions & 0 deletions gh_actions/third_party/no-response/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# No Response

A GitHub Action that closes Issues where the author hasn't responded to a request for more information.

## Use

Recommended basic configuration:

```yaml
name: No Response

# Both `issue_comment` and `scheduled` event types are required for this Action
# to work properly.
on:
issue_comment:
types: [created]
schedule:
# Schedule for five minutes after the hour, every hour
- cron: '5 * * * *'

jobs:
noResponse:
runs-on: ubuntu-latest
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
```
### Inputs
See [`action.yml`](action.yml) for defaults.

- `closeComment` &mdash; Markdown text to post as a comment when an issue is going to be closed. Set to `false` to disable commenting when closing an issue.
- `daysUntilClose` &mdash; Number of days to wait for a response from the original author before closing.
- `responseRequiredColor` &mdash; Color for the `responseRequiredLabel`. **Only** used when creating the label if it does not already exist.
- `responseRequiredLabel` &mdash; Text of the label used to indicate that a response from the original author is required.
- `token` &mdash; Token used to access repo information. The default GitHub Actions token is sufficient.

### Outputs

None.

## Action flow

The intent of this Action is to close issues that have not received a response to a maintainer's request for more information. Many times issues will be filed without enough information to be properly investigated. This Action allows maintainers to label an issue as requiring more information from the original author. If the information is not received in a timely manner, the issue will be closed. If the original author comes back and gives more information, the label is removed and the issue is reopened, if necessary.

### Scheduled

At the scheduled times, it searches for issues that are:

- Open
- Have a label named the same as the `responseRequiredLabel` value in the configuration
- The `responseRequiredLabel` was applied more than `daysUntilClose` ago

For each issue found, it:

1. If `closeComment` is not `false`, posts the contents of `closeComment`
1. Closes the issue

### `issue_comment` Event

When an `issue_comment` event is received, if all of the following are true:

- The author of the comment is the original author of the issue
- The issue has a label named the same as the `responseRequiredLabel` value in the configuration

It will:

1. Remove the `responseRequiredLabel`
1. Reopen the issue if it was closed by someone other than the original author of the issue

## License

[MIT](LICENSE.md)
26 changes: 26 additions & 0 deletions gh_actions/third_party/no-response/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: no-response
description: Closes Issues where the original author doesn't respond to a request for information
inputs:
closeComment:
description: Comment to post when closing an Issue for lack of response. Set to `false` to disable.
default: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that is currently in the issue, we don't have enough information
to take action. Please reach out if you have or find the answers we need so
that we can investigate further.
daysUntilClose:
description: Number of days of inactivity before an Issue is closed for lack of response
default: 14
responseRequiredColor:
description: Color for the `responseRequiredLabel`
default: ffffff
responseRequiredLabel:
description: Label indicating that a response from the original author is required
default: more-information-needed
token:
description: Token to access the GitHub API
required: true
runs:
using: node12
main: 'dist/index.js'
11 changes: 11 additions & 0 deletions gh_actions/third_party/no-response/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
module.exports = {
clearMocks: true,
moduleFileExtensions: ['js', 'ts'],
testEnvironment: 'node',
testMatch: ['**/*.test.ts'],
testRunner: 'jest-circus/runner',
transform: {
'^.+\\.ts$': 'ts-jest'
},
verbose: true
}
12,427 changes: 12,427 additions & 0 deletions gh_actions/third_party/no-response/package-lock.json

Large diffs are not rendered by default.

49 changes: 49 additions & 0 deletions gh_actions/third_party/no-response/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"name": "no-response",
"version": "0.0.0",
"private": true,
"description": "A GitHub Action that closes Issues where the author hasn't responded to a request for more information",
"main": "dist/index.js",
"scripts": {
"build": "npx ncc build ./src/main.ts",
"ci": "npm run format-check && npm run lint && npm test",
"format": "prettier --write **/*.ts **/*.md **/*.yml",
"format-check": "prettier --check **/*.ts **/*.md **/*.yml",
"lint": "npx eslint src/**/*.ts",
"start": "npx ncc run ./src/main.ts",
"test": "jest"
},
"repository": {
"type": "git",
"url": "git+https://github.com/flutter/cocoon/tree/main/gh_actions/third_party/no-response"
},
"keywords": [
"actions",
"node",
"setup"
],
"author": "lee-dohm",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
"eslint-plugin-prettier": "^5.0.1",
"scramjet": "^4.37.0"
},
"devDependencies": {
"@octokit/webhooks-types": "^7.3.1",
"@types/jest": "^29.5.8",
"@types/node": "^20.9.0",
"@typescript-eslint/parser": "^6.10.0",
"@vercel/ncc": "^0.38.1",
"eslint": "^8.53.0",
"eslint-plugin-github": "^4.10.1",
"eslint-plugin-jest": "^27.6.0",
"extract-pr-titles": "^1.1.0",
"jest": "^29.7.0",
"js-yaml": "^4.1.0",
"prettier": "3.0.3",
"ts-jest": "^29.1.1",
"typescript": "^5.2.2"
}
}
66 changes: 66 additions & 0 deletions gh_actions/third_party/no-response/src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import * as core from '@actions/core'
import * as github from '@actions/github'

const defaultCloseComment = `
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that is currently in the issue, we don't have enough information
to take action. Please reach out if you have or find the answers we need so
that we can investigate further.
`

interface Repo {
owner: string
repo: string
}

/**
* Reads, interprets, and encapsulates the configuration for the current run of the Action.
*/
export default class Config {
/** Comment to use when closing an issue, if any. */
closeComment: string | undefined

/** How old an issue should be in days before it gets closed. */
daysUntilClose: number

/** Repository to operate on. */
repo: Repo

/** Color to use when creating the label, encoded as a hex string. */
responseRequiredColor: string

/** Name of the label to use for issues that need more information or clarification. */
responseRequiredLabel: string

/** GitHub token to use when performing API operations. */
token: string

constructor() {
this.closeComment = this.valueOrDefault(core.getInput('closeComment'), defaultCloseComment)

if (this.closeComment === 'false') {
this.closeComment = undefined
}

this.daysUntilClose = parseInt(this.valueOrDefault(core.getInput('daysUntilClose'), '14'))

this.repo = github.context.repo

this.responseRequiredColor = this.valueOrDefault(
core.getInput('responseRequiredColor'),
'ffffff'
)

this.responseRequiredLabel = this.valueOrDefault(
core.getInput('responseRequiredLabel'),
'more-information-needed'
)

this.token = core.getInput('token', { required: true })
}

valueOrDefault(value: string, defaultValue: string): string {
return value !== '' ? value : defaultValue
}
}
25 changes: 25 additions & 0 deletions gh_actions/third_party/no-response/src/main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import * as core from '@actions/core'

import Config from './config'
import NoResponse from './no-response'

async function run(): Promise<void> {
try {
const eventName = process.env['GITHUB_EVENT_NAME']

const config = new Config()
const noResponse = new NoResponse(config)

if (eventName === 'schedule') {
noResponse.sweep()
} else if (eventName === 'issue_comment') {
noResponse.unmark()
} else {
core.error(`Unrecognized event: ${eventName}`)
}
} catch (error) {
core.setFailed(error.message)
}
}

run()
198 changes: 198 additions & 0 deletions gh_actions/third_party/no-response/src/no-response.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
import * as core from '@actions/core'
import * as fs from 'fs'
import * as github from '@actions/github'
import * as scramjet from 'scramjet'

import Config from './config'
import { GitHub } from '@actions/github/lib/utils'

/* eslint-disable import/no-unresolved */
import { IssueCommentEvent } from '@octokit/webhooks-types'
import { RequestInterface } from '@octokit/types'
/* eslint-enable */

const fsp = fs.promises

interface Issue {
issue_number: number
owner: string
repo: string
}

interface LabeledEvent {
created_at: number
event: string
label: {
name: string
}
}

interface RestIssue {
number: number
}

export default class NoResponse {
config: Config
octokit: InstanceType<typeof GitHub>

constructor(config: Config) {
this.config = config
this.octokit = github.getOctokit(this.config.token)
}

async sweep(): Promise<void> {
core.debug('Starting sweep')

await this.ensureLabelExists()

const issues = await this.getCloseableIssues()

for (const issue of issues) {
this.close({ issue_number: issue.number, ...this.config.repo })
}
}

async unmark(): Promise<void> {
core.debug('Starting unmark')

const { responseRequiredLabel } = this.config
const payload: IssueCommentEvent = await this.readPayload()
const owner = payload.repository.owner.login
const repo = payload.repository.name
const { number } = payload.issue
const comment = payload.comment
const issue = { owner, repo, issue_number: number }

const issueInfo = await this.octokit.rest.issues.get(issue)
const isMarked = await this.hasResponseRequiredLabel(issue)

if (isMarked && issueInfo.data.user?.login === comment.user.login) {
core.info(`${owner}/${repo}#${number} is being unmarked`)

await this.octokit.rest.issues.removeLabel({
owner,
repo,
issue_number: number,
name: responseRequiredLabel
})

if (
issueInfo.data.state === 'closed' &&
issueInfo.data.user.login !== issueInfo.data.closed_by?.login
) {
this.octokit.rest.issues.update({ owner, repo, issue_number: number, state: 'open' })
}
}
}

async close(issue: Issue): Promise<void> {
const { closeComment } = this.config

core.info(`${issue.owner}/${issue.repo}#${issue.issue_number} is being closed`)

if (closeComment) {
await this.octokit.rest.issues.createComment({ body: closeComment, ...issue })
}

await this.octokit.rest.issues.update({ state: 'closed', ...issue })
}

async ensureLabelExists(): Promise<void> {
try {
await this.octokit.rest.issues.getLabel({
name: this.config.responseRequiredLabel,
...this.config.repo
})
} catch (e) {
this.octokit.rest.issues.createLabel({
name: this.config.responseRequiredLabel,
color: this.config.responseRequiredColor,
...this.config.repo
})
}
}

async findLastLabeledEvent(issue: Issue): Promise<LabeledEvent | undefined> {
const { responseRequiredLabel } = this.config
const events: LabeledEvent[] = await this.octokit.paginate(
(await this.octokit.rest.issues.listEvents({
...issue,
per_page: 100
})) as unknown as RequestInterface<object>
)

return events
.reverse()
.find((event) => event.event === 'labeled' && event.label.name === responseRequiredLabel)
}

async getCloseableIssues(): Promise<RestIssue[]> {
const { owner, repo } = this.config.repo
const { daysUntilClose, responseRequiredLabel } = this.config
const q = `repo:${owner}/${repo} is:issue is:open label:"${responseRequiredLabel}"`
const labeledEarlierThan = this.since(daysUntilClose)

const issues = await this.octokit.rest.search.issuesAndPullRequests({
q,
sort: 'updated',
order: 'asc',
per_page: 30
})

core.debug(`Issues to check for closing:`)
core.debug(JSON.stringify(issues, null, 2))

const closableIssues = await scramjet
.fromArray(issues.data.items)
.filter(async (issue) => {
const event = await this.findLastLabeledEvent({
issue_number: issue.number,
...this.config.repo
})

if (!event) {
return false
}

core.debug(`Checking: ${JSON.stringify(issue, null, 2)}`)
core.debug(`Using: ${JSON.stringify(event, null, 2)}`)

const creationDate = new Date(event.created_at)

core.debug(
`${creationDate.toISOString()} < ${labeledEarlierThan.toISOString()} === ${
creationDate < labeledEarlierThan
}`
)

return creationDate < labeledEarlierThan
})
.toArray()

core.debug(`Closeable: ${JSON.stringify(closableIssues, null, 2)}`)

return closableIssues
}

async hasResponseRequiredLabel(issue: Issue): Promise<boolean> {
const labels = await this.octokit.rest.issues.listLabelsOnIssue({ ...issue })

return labels.data.map((label) => label.name).includes(this.config.responseRequiredLabel)
}

async readPayload(): Promise<IssueCommentEvent> {
if (!process.env.GITHUB_EVENT_PATH) {
throw new Error('GITHUB_EVENT_PATH is not defined')
}

const text = (await fsp.readFile(process.env.GITHUB_EVENT_PATH)).toString()

return JSON.parse(text)
}

since(days: number): Date {
const ttl = days * 24 * 60 * 60 * 1000

return new Date(new Date().getTime() - ttl)
}
}
96 changes: 96 additions & 0 deletions gh_actions/third_party/no-response/test/config.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import * as core from '@actions/core'

import Config from '../src/config'

describe('Config', () => {
describe('constructor', () => {
beforeEach(() => {
process.env['INPUT_TOKEN'] = '123456789abcdef'
process.env['GITHUB_REPOSITORY'] = 'test-owner/test-repo'
})

it('initializes closeComment to input value', () => {
process.env['INPUT_CLOSECOMMENT'] = 'foo'
const config = new Config()

expect(config.closeComment).toEqual('foo')
})

it('initializes closeComment as undefined if "false" is passed in as input', () => {
process.env['INPUT_CLOSECOMMENT'] = 'false'
const config = new Config()

expect(config.closeComment).toBeUndefined()
})

it('initializes closeComment with the default otherwise', () => {
delete process.env.INPUT_CLOSECOMMENT
const config = new Config()

expect(config.closeComment).toContain('This issue has been automatically closed')
})

it('initializes daysUntilClose with the integer value of the input', () => {
process.env['INPUT_DAYSUNTILCLOSE'] = '100'
const config = new Config()

expect(config.daysUntilClose).toEqual(100)
})

it('initializes daysUntilClose with the default otherwise', () => {
delete process.env.INPUT_DAYSUNTILCLOSE
const config = new Config()

expect(config.daysUntilClose).toEqual(14)
})

it('initializes repo with the repository information', () => {
const config = new Config()

expect(config.repo.owner).toEqual('test-owner')
expect(config.repo.repo).toEqual('test-repo')
})

it('initializes responseRequiredColor with the value of the input', () => {
process.env['INPUT_RESPONSEREQUIREDCOLOR'] = '000000'
const config = new Config()

expect(config.responseRequiredColor).toEqual('000000')
})

it('initializes responseRequiredColor with the default otherwise', () => {
delete process.env.INPUT_RESPONSEREQUIREDCOLOR
const config = new Config()

expect(config.responseRequiredColor).toEqual('ffffff')
})

it('initializes responseRequiredLabel with the value of the input', () => {
process.env['INPUT_RESPONSEREQUIREDLABEL'] = 'label-name'
const config = new Config()

expect(config.responseRequiredLabel).toEqual('label-name')
})

it('initializes responseRequiredLabel with the default otherwise', () => {
delete process.env.INPUT_RESPONSEREQUIREDLABEL
const config = new Config()

expect(config.responseRequiredLabel).toEqual('more-information-needed')
})

it('initializes token with the value of the input', () => {
const config = new Config()

expect(config.token).toEqual('123456789abcdef')
})

it('raises an error if no token is given', () => {
delete process.env.INPUT_TOKEN

expect(() => {
new Config()
}).toThrow()
})
})
})
14 changes: 14 additions & 0 deletions gh_actions/third_party/no-response/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
"outDir": "./lib", /* Redirect output structure to the directory. */
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
"moduleResolution": "node",
"useUnknownInCatchVariables": false
},
"exclude": ["node_modules", "**/*.test.ts"]
}
149 changes: 76 additions & 73 deletions tooling/go.mod
Original file line number Diff line number Diff line change
@@ -2,10 +2,10 @@ module cocoon-tooling

go 1.18

require github.com/slsa-framework/slsa-verifier/v2 v2.4.0
require github.com/slsa-framework/slsa-verifier/v2 v2.4.1

require (
cloud.google.com/go/compute v1.19.0 // indirect
cloud.google.com/go/compute v1.23.0 // indirect
cloud.google.com/go/compute/metadata v0.2.3 // indirect
filippo.io/edwards25519 v1.0.0 // indirect
github.com/AliyunContainerService/ack-ram-tool/pkg/credentials/alibabacloudsdkgo/helper v0.2.0 // indirect
@@ -18,7 +18,7 @@ require (
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230518184743-7afd39499903 // indirect
github.com/ThalesIgnite/crypto11 v1.2.5 // indirect
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect
github.com/alibabacloud-go/cr-20160607 v1.0.1 // indirect
@@ -32,82 +32,82 @@ require (
github.com/alibabacloud-go/tea-xml v1.1.2 // indirect
github.com/aliyun/credentials-go v1.2.3 // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go-v2 v1.18.0 // indirect
github.com/aws/aws-sdk-go-v2/config v1.18.23 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.13.22 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.3 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect
github.com/aws/aws-sdk-go-v2 v1.20.0 // indirect
github.com/aws/aws-sdk-go-v2/config v1.18.32 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect
github.com/aws/aws-sdk-go-v2/service/ecr v1.15.0 // indirect
github.com/aws/aws-sdk-go-v2/service/ecrpublic v1.12.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.27 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.12.10 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.18.11 // indirect
github.com/aws/smithy-go v1.13.5 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect
github.com/aws/smithy-go v1.14.0 // indirect
github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20220228164355-396b2034c795 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/chrismellard/docker-credential-acr-env v0.0.0-20220119192733-fe33c00cee21 // indirect
github.com/clbanning/mxj/v2 v2.5.6 // indirect
github.com/cloudflare/circl v1.1.0 // indirect
github.com/cloudflare/circl v1.3.3 // indirect
github.com/common-nighthawk/go-figure v0.0.0-20210622060536-734e95fb86be // indirect
github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect
github.com/coreos/go-oidc/v3 v3.5.0 // indirect
github.com/coreos/go-oidc/v3 v3.6.0 // indirect
github.com/cyberphone/json-canonicalization v0.0.0-20220623050100-57a0ce2678a7 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/digitorus/pkcs7 v0.0.0-20221212123742-001c36b64ec3 // indirect
github.com/digitorus/timestamp v0.0.0-20221019182153-ef3b63b79b31 // indirect
github.com/digitorus/pkcs7 v0.0.0-20230818184609-3a137a874352 // indirect
github.com/digitorus/timestamp v0.0.0-20230821155606-d1ad5ca9624c // indirect
github.com/dimchansky/utfbom v1.1.1 // indirect
github.com/docker/cli v23.0.1+incompatible // indirect
github.com/docker/distribution v2.8.1+incompatible // indirect
github.com/docker/docker v23.0.3+incompatible // indirect
github.com/docker/cli v24.0.0+incompatible // indirect
github.com/docker/distribution v2.8.2+incompatible // indirect
github.com/docker/docker v24.0.0+incompatible // indirect
github.com/docker/docker-credential-helpers v0.7.0 // indirect
github.com/docker/go v1.5.1-1 // indirect
github.com/emicklei/go-restful/v3 v3.8.0 // indirect
github.com/emicklei/go-restful/v3 v3.10.2 // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-chi/chi v4.1.2+incompatible // indirect
github.com/go-jose/go-jose/v3 v3.0.0 // indirect
github.com/go-logr/logr v1.2.4 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.21.4 // indirect
github.com/go-openapi/errors v0.20.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/errors v0.20.4 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/jsonreference v0.20.2 // indirect
github.com/go-openapi/loads v0.21.2 // indirect
github.com/go-openapi/runtime v0.26.0 // indirect
github.com/go-openapi/spec v0.20.9 // indirect
github.com/go-openapi/strfmt v0.21.7 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
github.com/go-openapi/swag v0.22.4 // indirect
github.com/go-openapi/validate v0.22.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
github.com/go-playground/validator/v10 v10.15.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/certificate-transparency-go v1.1.4 // indirect
github.com/google/certificate-transparency-go v1.1.6 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/go-cmp v0.5.9 // indirect
github.com/google/go-containerregistry v0.14.1-0.20230409045903-ed5c185df419 // indirect
github.com/google/go-github/v50 v50.2.0 // indirect
github.com/google/go-containerregistry v0.16.1 // indirect
github.com/google/go-github/v53 v53.2.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/trillian v1.5.2 // indirect
github.com/google/uuid v1.3.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.2 // indirect
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
github.com/imdario/mergo v0.3.15 // indirect
github.com/in-toto/in-toto-golang v0.9.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jedisct1/go-minisign v0.0.0-20211028175153-1c139d1cc84b // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.16.0 // indirect
github.com/klauspost/compress v1.16.5 // indirect
github.com/leodido/go-urn v1.2.4 // indirect
github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf // indirect
github.com/magiconair/properties v1.8.7 // indirect
@@ -119,72 +119,75 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mozillazg/docker-credential-acr-helper v0.3.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nozzle/throttler v0.0.0-20180817012639-2ea982251481 // indirect
github.com/oklog/ulid v1.3.1 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
github.com/opencontainers/image-spec v1.1.0-rc4 // indirect
github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.6 // indirect
github.com/pelletier/go-toml/v2 v2.0.8 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sassoftware/relic v7.2.1+incompatible // indirect
github.com/secure-systems-lab/go-securesystemslib v0.6.0 // indirect
github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect
github.com/segmentio/ksuid v1.0.4 // indirect
github.com/shibumi/go-pathspec v1.3.0 // indirect
github.com/sigstore/cosign/v2 v2.0.2 // indirect
github.com/sigstore/fulcio v1.2.0 // indirect
github.com/sigstore/cosign/v2 v2.2.0 // indirect
github.com/sigstore/fulcio v1.4.0 // indirect
github.com/sigstore/protobuf-specs v0.1.1-0.20230518173429-5ef54068bb53 // indirect
github.com/sigstore/rekor v1.2.0 // indirect
github.com/sigstore/sigstore v1.6.4 // indirect
github.com/sigstore/timestamp-authority v1.0.0 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect
github.com/sigstore/rekor v1.2.2 // indirect
github.com/sigstore/sigstore v1.7.2 // indirect
github.com/sigstore/timestamp-authority v1.1.2 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 // indirect
github.com/slsa-framework/slsa-github-generator v1.4.0 // indirect
github.com/spf13/afero v1.9.3 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/afero v1.9.5 // indirect
github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/cobra v1.7.0 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spf13/viper v1.15.0 // indirect
github.com/spf13/viper v1.16.0 // indirect
github.com/subosito/gotenv v1.4.2 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/thales-e-security/pool v0.0.2 // indirect
github.com/theupdateframework/go-tuf v0.5.2 // indirect
github.com/theupdateframework/go-tuf v0.6.1 // indirect
github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect
github.com/tjfoc/gmsm v1.3.2 // indirect
github.com/transparency-dev/merkle v0.0.2 // indirect
github.com/vbatts/tar-split v0.11.2 // indirect
github.com/xanzy/go-gitlab v0.83.0 // indirect
github.com/vbatts/tar-split v0.11.3 // indirect
github.com/xanzy/go-gitlab v0.90.0 // indirect
go.mongodb.org/mongo-driver v1.11.3 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.step.sm/crypto v0.30.0 // indirect
go.uber.org/atomic v1.10.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
go.uber.org/zap v1.24.0 // indirect
golang.org/x/crypto v0.9.0 // indirect
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
golang.org/x/mod v0.10.0 // indirect
golang.org/x/net v0.10.0 // indirect
golang.org/x/oauth2 v0.7.0 // indirect
golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.8.0 // indirect
golang.org/x/term v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect
go.opentelemetry.io/otel v1.16.0 // indirect
go.opentelemetry.io/otel/metric v1.16.0 // indirect
go.opentelemetry.io/otel/trace v1.16.0 // indirect
go.step.sm/crypto v0.35.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.25.0 // indirect
golang.org/x/crypto v0.12.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/net v0.14.0 // indirect
golang.org/x/oauth2 v0.11.0 // indirect
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.13.0 // indirect
golang.org/x/term v0.11.0 // indirect
golang.org/x/text v0.12.0 // indirect
golang.org/x/time v0.3.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect
google.golang.org/grpc v1.55.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20230803162519-f966b187b2e5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect
google.golang.org/grpc v1.57.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/api v0.26.1 // indirect
k8s.io/apimachinery v0.26.1 // indirect
k8s.io/client-go v0.25.4 // indirect
k8s.io/api v0.27.3 // indirect
k8s.io/apimachinery v0.27.3 // indirect
k8s.io/client-go v0.27.3 // indirect
k8s.io/klog/v2 v2.100.1 // indirect
k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 // indirect
k8s.io/utils v0.0.0-20230115233650-391b47cb4029 // indirect
k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect
k8s.io/utils v0.0.0-20230505201702-9f6742963106 // indirect
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
sigs.k8s.io/release-utils v0.7.4 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
397 changes: 214 additions & 183 deletions tooling/go.sum

Large diffs are not rendered by default.

0 comments on commit 1a1a89a

Please sign in to comment.