public async function mainAsync()

in src/build/UpdateTagsCLI.hack [85:148]


  public async function mainAsync(): Awaitable<int> {
    $new_tags = await Dict\map_with_key_async(
      self::REPOS_AND_TAG_PREFIXES,
      async ($product, $_) ==> await $this->getTagAsync($product),
    );

    $changes = dict[];
    foreach ($new_tags as $product => $new_tag) {
      if ((PRODUCT_TAGS[$product] ?? null) !== $new_tag) {
        $changes[$product] = $new_tag;
      }
    }
    $stdout = $this->getTerminal()->getStdout();

    if (C\is_empty($changes)) {
      await $stdout->writeAllAsync("Nothing to do.\n");
      return 0;
    }
    await $stdout->writeAllAsync(
      Dict\map_with_key(
        $changes,
        ($k, $v) ==> Str\format('%s to tag "%s"', $k, $v),
      )
        |> Str\join($$, ', and ')
        |> 'Changing '.$$."...\n",
    );

    if (C\contains_key($changes, APIProduct::HACK)) {
      await $this->updateHHVMVersionAsync($changes[APIProduct::HACK]);
    }

    $tags_file = LocalConfig::ROOT.'/src/codegen/PRODUCT_TAGS.php';
    await $stdout->writeAllAsync(' - Updating '.$tags_file."\n");
    $config = new CG\HackCodegenConfig();
    $cg = new CG\HackCodegenFactory(
      $config->withFormatter(new CG\HackfmtFormatter($config)),
    );
    $cg->codegenFile($tags_file)
      ->setNamespace("HHVM\\UserDocumentation")
      ->addConstant(
        $cg->codegenConstant('PRODUCT_TAGS')
          ->setType('dict<APIProduct, string>')
          ->setValue(
            $new_tags,
            CG\HackBuilderValues::dict(
              CG\HackBuilderKeys::lambda(
                ($_, $p) ==> 'APIProduct::'.APIProduct::getNames()[$p],
              ),
              CG\HackBuilderValues::export(),
            ),
          ),
      )
      ->save();

    await $stdout->writeAllAsync(
      "Done! Next steps:\n".
      " - update your HHVM installation if needed\n".
      " - php composer.phar update\n".
      " - hhvm bin/build.php\n".
      " - hh_client\n".
      " - hhvm vendor/bin/hacktest tests/\n",
    );
    return 0;
  }