blob: cd3f22145b5f70c44e957965dc13fc264eac4e7c [file] [log] [blame]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// Run this script to update to the latest google/protobuf and googleapis
/// protobufs.
library;
import 'dart:io';
void main(List<String> args) async {
final cacheDir = Directory('.dart_tool/protoc_plugin');
final protobufDir = Directory('${cacheDir.path}/protobuf');
final googleapisDir = Directory('${cacheDir.path}/googleapis');
final destDir = Directory('protos');
// Update from protocolbuffers/protobuf.
if (protobufDir.existsSync()) {
await git(['pull'], cwd: protobufDir);
} else {
await git([
'clone',
'https://github.com/protocolbuffers/protobuf.git',
'--depth',
'1',
], cwd: cacheDir);
}
copy(protobufDir, destDir, 'src', [
'google/protobuf/compiler/plugin.proto',
'google/protobuf/descriptor.proto',
'google/protobuf/duration.proto',
]);
// Update from googleapis/googleapis.
if (googleapisDir.existsSync()) {
await git(['pull'], cwd: googleapisDir);
} else {
await git([
'clone',
'https://github.com/googleapis/googleapis.git',
'--depth',
'1',
], cwd: cacheDir);
}
copy(googleapisDir, destDir, '', [
'google/api/client.proto',
'google/api/http.proto',
'google/api/launch_stage.proto',
'google/api/routing.proto',
]);
}
Future<void> git(List<String> args, {required Directory cwd}) async {
print('[${cwd.path}] git ${args.join(' ')}');
if (!cwd.existsSync()) {
cwd.createSync(recursive: true);
}
final result = await Process.run('git', args, workingDirectory: cwd.path);
stdout.write(result.stdout);
stderr.write(result.stderr);
if (result.exitCode != 0) {
exitCode = result.exitCode;
throw 'git exited with ${result.exitCode}';
}
}
void copy(Directory from, Directory to, String fromPrefix, List<String> files) {
print('copying ${from.path} => ${to.path}');
if (fromPrefix.isNotEmpty) {
fromPrefix = '$fromPrefix/';
}
for (final file in files) {
final source = File('${from.path}/$fromPrefix$file');
final target = File('${to.path}/$file');
if (!target.parent.existsSync()) {
target.parent.createSync(recursive: true);
}
final sourceContents = source.readAsStringSync();
if (!target.existsSync() || target.readAsStringSync() != sourceContents) {
print(' => $file');
target.writeAsStringSync(sourceContents);
}
}
print('');
}