Skip to content
Merged
  •  
  •  
  •  
22 changes: 18 additions & 4 deletions app/lib/core/patch_capture.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,22 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:crypto/crypto.dart';
import 'package:dart_arena/runner/subprocess_environment.dart';

const patchBaselineRef = 'arena_baseline';

class PatchCaptureResult {
const PatchCaptureResult({required this.patch, required this.status});
const PatchCaptureResult({
required this.patch,
required this.status,
required this.patchSha256,
});

final String patch;
final String status;
final String patchSha256;

bool get hasMeaningfulDiff => patch.trim().isNotEmpty;
}
Expand All @@ -27,19 +36,24 @@ class PatchCapture {
final Duration timeout;
final int maxOutputChars;

Future<PatchCaptureResult> capture(Directory workspace) async {
Future<PatchCaptureResult> capture(
Directory workspace, {
String baselineRef = patchBaselineRef,
}) async {
const addIntentArgs = ['add', '-N', '.'];
final intentToAdd = await _runGit(workspace, addIntentArgs);
_checkGitResult(intentToAdd, addIntentArgs);
const statusArgs = ['status', '--porcelain'];
const diffArgs = ['diff', '--binary'];
final diffArgs = ['diff', baselineRef, '--binary'];
final status = await _runGit(workspace, statusArgs);
final diff = await _runGit(workspace, diffArgs);
_checkGitResult(status, statusArgs);
_checkGitResult(diff, diffArgs);
final patch = diff.stdout.toString();
return PatchCaptureResult(
patch: diff.stdout.toString(),
patch: patch,
status: status.stdout.toString(),
patchSha256: sha256.convert(utf8.encode(patch)).toString(),
);
}

Expand Down
3 changes: 3 additions & 0 deletions app/lib/core/task_run_result.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class TaskRunResult extends Equatable {
this.patchText,
this.trajectoryLogPath,
this.planId,
this.provenance = const {},
});

final String runId;
Expand All @@ -40,6 +41,7 @@ class TaskRunResult extends Equatable {
final String? patchText;
final String? trajectoryLogPath;
final String? planId;
final Map<String, Object?> provenance;

@override
List<Object?> get props => [
Expand All @@ -60,5 +62,6 @@ class TaskRunResult extends Equatable {
patchText,
trajectoryLogPath,
planId,
provenance,
];
}
31 changes: 31 additions & 0 deletions app/lib/export/leaderboard_exporter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,12 @@ Future<Map<String, Object?>> buildLeaderboardExport(
evaluationsByTaskRunId,
modelConfigIndex,
);
final taskBundleDigests = _corpusManifestTaskBundleDigests(corpusManifest);
final tasks = _buildTaskRows(
selected.taskRuns,
warnings,
evaluationsByTaskRunId,
taskBundleDigests,
);
final taskModelCells = _buildTaskModelCells(
selected.taskRuns,
Expand Down Expand Up @@ -427,6 +429,7 @@ List<Map<String, Object?>> _buildTaskRows(
List<TaskRun> taskRuns,
List<String> warnings,
Map<String, List<Evaluation>> evaluationsByTaskRunId,
Map<String, String> taskBundleDigests,
) {
final groups = <String, List<TaskRun>>{};
for (final taskRun in taskRuns) {
Expand Down Expand Up @@ -468,6 +471,12 @@ List<Map<String, Object?>> _buildTaskRows(
rows.add(<String, Object?>{
'taskId': group.first.taskId,
'taskVersion': group.first.taskVersion,
if (taskBundleDigests[_taskManifestKey(
group.first.taskId,
group.first.taskVersion,
)]
case final taskBundleDigest?)
'taskBundleDigest': taskBundleDigest,
'benchmarkTrack': group.first.benchmarkTrack,
'trialCount': sampleCount,
'sampleCount': sampleCount,
Expand Down Expand Up @@ -503,6 +512,28 @@ List<Map<String, Object?>> _buildTaskRows(
return rows;
}

Map<String, String> _corpusManifestTaskBundleDigests(
Map<String, Object?>? corpusManifest,
) {
if (corpusManifest == null) return const {};
final digests = <String, String>{};
for (final entry in _objectList(corpusManifest['tasks'])) {
final taskId = entry['taskId'];
final taskVersion = entry['taskVersion'];
final taskBundleDigest = entry['taskBundleDigest'];
if (taskId is! String ||
taskVersion is! int ||
taskBundleDigest is! String) {
continue;
}
digests[_taskManifestKey(taskId, taskVersion)] = taskBundleDigest;
}
return digests;
}

String _taskManifestKey(String taskId, int taskVersion) =>
'$taskId@v$taskVersion';

List<Map<String, Object?>> _buildTaskModelCells(
List<TaskRun> taskRuns,
Map<String, List<Evaluation>> evaluationsByTaskRunId,
Expand Down
Loading
Loading