Update roll_dev to work with new version numbers (#54015)

diff --git a/dev/tools/lib/roll_dev.dart b/dev/tools/lib/roll_dev.dart
index b073e3e..b37e992 100644
--- a/dev/tools/lib/roll_dev.dart
+++ b/dev/tools/lib/roll_dev.dart
@@ -105,10 +105,10 @@
     exit(1);
   }
 
-  final List<int> parts = match.groups(<int>[1, 2, 3]).map<int>(int.parse).toList();
+  final List<int> parts = match.groups(<int>[1, 2, 3, 4, 5]).map<int>(int.parse).toList();
 
-  if (match.group(4) == '0') {
-    print('This commit has already been released, as version ${parts.join(".")}.');
+  if (match.group(6) == '0') {
+    print('This commit has already been released, as version ${getVersionFromParts(parts)}.');
     exit(0);
   }
 
@@ -117,19 +117,25 @@
       parts[0] += 1;
       parts[1] = 0;
       parts[2] = 0;
+      parts[3] = 0;
+      parts[4] = 0;
       break;
     case kY:
       parts[1] += 1;
       parts[2] = 0;
+      parts[3] = 0;
+      parts[4] = 0;
       break;
     case kZ:
-      parts[2] += 1;
+      parts[2] = 0;
+      parts[3] += 1;
+      parts[4] = 0;
       break;
     default:
       print('Unknown increment level. The valid values are "$kX", "$kY", and "$kZ".');
       exit(1);
   }
-  version = parts.join('.');
+  version = getVersionFromParts(parts);
 
   if (justPrint) {
     print(version);
@@ -138,7 +144,7 @@
 
   final String hash = getGitOutput('rev-parse HEAD', 'Get git hash for $commit');
 
-  runGit('tag v$version', 'tag the commit with the version label');
+  runGit('tag $version', 'tag the commit with the version label');
 
   // PROMPT
 
@@ -149,29 +155,38 @@
       'to the "dev" channel.');
     stdout.write('Are you? [yes/no] ');
     if (stdin.readLineSync() != 'yes') {
-      runGit('tag -d v$version', 'remove the tag you did not want to publish');
+      runGit('tag -d $version', 'remove the tag you did not want to publish');
       print('The dev roll has been aborted.');
       exit(0);
     }
   }
 
-  runGit('push $origin v$version', 'publish the version');
+  runGit('push $origin $version', 'publish the version');
   runGit('push $origin HEAD:dev', 'land the new version on the "dev" branch');
   print('Flutter version $version has been rolled to the "dev" channel!');
 }
 
 String getFullTag() {
   return getGitOutput(
-    'describe --match v*.*.* --first-parent --long --tags',
+    'describe --match *.*.*-dev.*.* --first-parent --long --tags',
     'obtain last released version number',
   );
 }
 
 Match parseFullTag(String version) {
-  final RegExp versionPattern = RegExp(r'^v([0-9]+)\.([0-9]+)\.([0-9]+)-([0-9]+)-g([a-f0-9]+)$');
+  final RegExp versionPattern = RegExp(r'^([0-9]+)\.([0-9]+)\.([0-9]+)-dev\.([0-9]+)\.([0-9]+)-([0-9]+)-g([a-f0-9]+)$');
   return versionPattern.matchAsPrefix(version);
 }
 
+String getVersionFromParts(List<int> parts) {
+  assert(parts.length == 5);
+  final StringBuffer buf = StringBuffer()
+    ..write(parts.take(3).join('.'))
+    ..write('-dev.')
+    ..write(parts.skip(3).join('.'));
+  return buf.toString();
+}
+
 String getGitOutput(String command, String explanation) {
   final ProcessResult result = _runGit(command);
   if ((result.stderr as String).isEmpty && result.exitCode == 0)