| // 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(''); |
| } |