in app/exec/extension/_lib/publish.ts [340:402]
public publish(): Promise<GalleryInterfaces.PublishedExtension> {
const extPackage: GalleryInterfaces.ExtensionPackage = {
extensionManifest: fs.readFileSync(this.settings.vsixPath, "base64"),
};
trace.debug("Publishing %s", this.settings.vsixPath);
// Check if the app is already published. If so, call the update endpoint. Otherwise, create.
trace.info("Checking if this extension is already published");
return this.getExtInfo().then(extInfo => {
const quitValidation = this.settings.noWaitValidation
? "You passed --no-wait-validation, so TFX is exiting."
: "You can choose to exit (Ctrl-C) if you don't want to wait.";
const noWaitHelp = this.settings.noWaitValidation
? ""
: "If you don't want TFX to wait for validation, use the --no-wait-validation parameter. ";
const extensionValidationTime = extInfo.isPublicExtension
? "Based on the package size, this can take up to 20 mins."
: "This should take only a few seconds, but in some cases may take a bit longer.";
const validationMessage = `\n== Extension Validation In Progress ==\n${extensionValidationTime} ${quitValidation} To get the validation status, you may run the command below. ${noWaitHelp}This extension will be available after validation is successful.\n\n${colors.yellow(
`tfx extension isvalid --publisher ${extInfo.publisher} --extension-id ${extInfo.id} --version ${
extInfo.version
} --service-url ${this.settings.galleryUrl} --token <your PAT>`,
)}`;
return this.createOrUpdateExtension(extPackage).then(ext => {
if (this.settings.noWaitValidation) {
trace.info(validationMessage);
return ext;
} else {
trace.info(validationMessage);
const versions = ext.versions;
versions.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());
const validationInterval = extInfo.isPublicExtension
? PackagePublisher.fullValidationInterval
: PackagePublisher.fastValidationInterval;
const validationRetries = extInfo.isPublicExtension
? PackagePublisher.fullValidationRetries
: PackagePublisher.fastValidationRetries;
const hangTightMessageRetryCount = extInfo.isPublicExtension ? -1 : 25;
return this.waitForValidation(
1000,
validationInterval,
validationRetries,
hangTightMessageRetryCount,
extInfo.publisher,
extInfo.id,
versions[0].version,
).then(result => {
if (result === PackagePublisher.validated) {
return ext;
} else {
throw new Error(
"Extension validation failed. Please address the following issues and retry publishing.\n" +
result,
);
}
});
}
});
});
}