feat: Add --ignore-warnings flag to pub publish --dry-run (#4698)

diff --git a/lib/src/command/lish.dart b/lib/src/command/lish.dart
index a2d405f..b2adb58 100644
--- a/lib/src/command/lish.dart
+++ b/lib/src/command/lish.dart
@@ -124,6 +124,11 @@
       help: 'Run this in the directory <dir>.',
       valueHelp: 'dir',
     );
+    argParser.addFlag(
+      'ignore-warnings',
+      help: 'Do not treat warnings as fatal.',
+      negatable: false,
+    );
   }
 
   Future<void> _publishUsingClient(
@@ -299,6 +304,10 @@
     if (_toArchive != null && force) {
       usageException('Cannot use both --to-archive and --force.');
     }
+
+    if (argResults.wasParsed('ignore-warnings') && !dryRun) {
+      usageException('`--ignore-warnings` can only be used with `--dry-run`.');
+    }
   }
 
   Future<_Publication> _publicationFromEntrypoint() async {
@@ -490,7 +499,8 @@
             : _publicationFromArchive(_fromArchive));
     if (dryRun) {
       log.message(publication.warningsCountMessage);
-      if (publication.warningCount != 0) {
+      if (publication.warningCount != 0 &&
+          !argResults.flag('ignore-warnings')) {
         overrideExitCode(DATA);
       }
       return;
diff --git a/test/lish/ignore_warnings_test.dart b/test/lish/ignore_warnings_test.dart
new file mode 100644
index 0000000..f78019e
--- /dev/null
+++ b/test/lish/ignore_warnings_test.dart
@@ -0,0 +1,65 @@
+// Copyright (c) 2023, 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.
+
+import 'package:pub/src/exit_codes.dart' as exit_codes;
+import 'package:test/test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+void main() {
+  test('dry-run with warnings exits with DATA error by default', () async {
+    (await servePackages()).serve('foo', '1.0.0');
+    await d
+        .validPackage(
+          pubspecExtras: {
+            'dependencies': {'foo': 'any'},
+          },
+        )
+        .create();
+
+    await runPub(
+      args: ['publish', '--dry-run'],
+      output: contains('Package has 1 warning.'),
+      exitCode: exit_codes.DATA,
+    );
+  });
+
+  test(
+    'dry-run with --ignore-warnings and warnings exits with SUCCESS',
+    () async {
+      (await servePackages()).serve('foo', '1.0.0');
+      await d
+          .validPackage(
+            pubspecExtras: {
+              'dependencies': {'foo': 'any'},
+            },
+          )
+          .create();
+
+      await runPub(
+        args: ['publish', '--dry-run', '--ignore-warnings'],
+        output: contains('Package has 1 warning.'),
+        exitCode: exit_codes.SUCCESS,
+      );
+    },
+  );
+
+  test('--ignore-warnings without --dry-run is a usage error', () async {
+    (await servePackages()).serve('foo', '1.0.0');
+    await d
+        .validPackage(
+          pubspecExtras: {
+            'dependencies': {'foo': 'any'},
+          },
+        )
+        .create();
+
+    await runPub(
+      args: ['publish', '--ignore-warnings'],
+      error: contains('`--ignore-warnings` can only be used with `--dry-run`.'),
+      exitCode: exit_codes.USAGE,
+    );
+  });
+}
diff --git a/test/testdata/goldens/help_test/pub publish --help.txt b/test/testdata/goldens/help_test/pub publish --help.txt
index 30ebb01..5af5e6f 100644
--- a/test/testdata/goldens/help_test/pub publish --help.txt
+++ b/test/testdata/goldens/help_test/pub publish --help.txt
@@ -10,6 +10,7 @@
 -f, --force              Publish without confirmation if there are no errors.
     --skip-validation    Publish without validation and resolution (this will ignore errors).
 -C, --directory=<dir>    Run this in the directory <dir>.
+    --ignore-warnings    Do not treat warnings as fatal.
 
 Run "pub help" to see global options.
 See https://dart.dev/tools/pub/cmd/pub-lish for detailed documentation.