function update()

in lib/cmds/update.ts [73:213]


function update(options: Options): Promise<void> {
  let promises: q.IPromise<void>[] = [];
  let standalone = options[Opt.STANDALONE].getBoolean();
  let chrome = options[Opt.CHROME].getBoolean();
  let gecko = options[Opt.GECKO].getBoolean();
  let ie32: boolean = false;
  let ie64: boolean = false;
  if (options[Opt.IE]) {
    ie32 = ie32 || options[Opt.IE].getBoolean();
  }
  if (options[Opt.IE32]) {
    ie32 = ie32 || options[Opt.IE32].getBoolean();
  }
  if (options[Opt.IE64]) {
    ie64 = options[Opt.IE64].getBoolean();
  }
  let android: boolean = options[Opt.ANDROID].getBoolean();
  let ios: boolean = false;
  if (options[Opt.IOS]) {
    ios = options[Opt.IOS].getBoolean();
  }
  let outputDir = options[Opt.OUT_DIR].getString();

  try {
    browserFile =
        JSON.parse(fs.readFileSync(path.resolve(outputDir, 'update-config.json')).toString());
  } catch (err) {
    browserFile = {};
  }

  let android_api_levels: string[] = options[Opt.ANDROID_API_LEVELS].getString().split(',');
  let android_architectures: string[] = options[Opt.ANDROID_ARCHITECTURES].getString().split(',');
  let android_platforms: string[] = options[Opt.ANDROID_PLATFORMS].getString().split(',');
  let android_accept_licenses: boolean = options[Opt.ANDROID_ACCEPT_LICENSES].getBoolean();
  if (options[Opt.OUT_DIR].getString()) {
    if (path.isAbsolute(options[Opt.OUT_DIR].getString())) {
      outputDir = options[Opt.OUT_DIR].getString();
    } else {
      outputDir = path.resolve(Config.getBaseDir(), options[Opt.OUT_DIR].getString());
    }
    FileManager.makeOutputDirectory(outputDir);
  }
  let ignoreSSL = options[Opt.IGNORE_SSL].getBoolean();
  let proxy = options[Opt.PROXY].getString();
  HttpUtils.assignOptions({ignoreSSL, proxy});
  let verbose = options[Opt.VERBOSE].getBoolean();

  // setup versions for binaries
  let binaries = FileManager.setupBinaries(options[Opt.ALTERNATE_CDN].getString());
  binaries[Standalone.id].versionCustom = options[Opt.VERSIONS_STANDALONE].getString();
  binaries[ChromeDriver.id].versionCustom = options[Opt.VERSIONS_CHROME].getString();
  if (options[Opt.VERSIONS_IE]) {
    binaries[IEDriver.id].versionCustom = options[Opt.VERSIONS_IE].getString();
  }
  if (options[Opt.VERSIONS_GECKO]) {
    binaries[GeckoDriver.id].versionCustom = options[Opt.VERSIONS_GECKO].getString();
  }
  binaries[AndroidSDK.id].versionCustom = options[Opt.VERSIONS_ANDROID].getString();
  binaries[Appium.id].versionCustom = options[Opt.VERSIONS_APPIUM].getString();

  // if the file has not been completely downloaded, download it
  // else if the file has already been downloaded, unzip the file, rename it, and give it
  // permissions
  if (standalone) {
    let binary: Standalone = binaries[Standalone.id];
    promises.push(FileManager.downloadFile(binary, outputDir)
                      .then<void>((downloaded: boolean) => {
                        if (!downloaded) {
                          logger.info(
                              binary.name + ': file exists ' +
                              path.resolve(outputDir, binary.filename()));
                          logger.info(binary.name + ': ' + binary.filename() + ' up to date');
                        }
                      })
                      .then(() => {
                        updateBrowserFile(binary, outputDir);
                      }));
  }
  if (chrome) {
    let binary: ChromeDriver = binaries[ChromeDriver.id];
    promises.push(updateBinary(binary, outputDir, proxy, ignoreSSL).then(() => {
      return Promise.resolve(updateBrowserFile(binary, outputDir));
    }));
  }
  if (gecko) {
    let binary: GeckoDriver = binaries[GeckoDriver.id];
    promises.push(updateBinary(binary, outputDir, proxy, ignoreSSL).then(() => {
      return Promise.resolve(updateBrowserFile(binary, outputDir));
    }));
  }
  if (ie64) {
    let binary: IEDriver = binaries[IEDriver.id];
    binary.osarch = Config.osArch();  // Win32 or x64
    promises.push(updateBinary(binary, outputDir, proxy, ignoreSSL).then(() => {
      return Promise.resolve(updateBrowserFile(binary, outputDir));
    }));
  }
  if (ie32) {
    let binary: IEDriver = binaries[IEDriver.id];
    binary.osarch = 'Win32';
    promises.push(updateBinary(binary, outputDir, proxy, ignoreSSL).then(() => {
      return Promise.resolve(updateBrowserFile(binary, outputDir));
    }));
  }
  if (android) {
    let binary = binaries[AndroidSDK.id];
    let sdk_path = path.resolve(outputDir, binary.executableFilename());
    let oldAVDList: string;

    updateBrowserFile(binary, outputDir);
    promises.push(q.nfcall(fs.readFile, path.resolve(sdk_path, 'available_avds.json'))
                      .then(
                          (oldAVDs: string) => {
                            oldAVDList = oldAVDs;
                          },
                          () => {
                            oldAVDList = '[]';
                          })
                      .then(() => {
                        return updateBinary(binary, outputDir, proxy, ignoreSSL);
                      })
                      .then<void>(() => {
                        initializeAndroid(
                            path.resolve(outputDir, binary.executableFilename()),
                            android_api_levels, android_architectures, android_platforms,
                            android_accept_licenses, binaries[AndroidSDK.id].versionCustom,
                            JSON.parse(oldAVDList), logger, verbose);
                      }));
  }
  if (ios) {
    checkIOS(logger);
  }
  if (android || ios) {
    installAppium(binaries[Appium.id], outputDir);
    updateBrowserFile(binaries[Appium.id], outputDir);
  }

  return Promise.all(promises).then(() => {
    writeBrowserFile(outputDir);
  });
}