Skip to content

Commit cd6f3e4

Browse files
authored
Merge pull request #410 from amvanbaren/feature/issue-386
Please support publishing pre-releases #386
2 parents 153a429 + a6c3cf3 commit cd6f3e4

37 files changed

+328
-226
lines changed

cli/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
This change log covers only the command line interface (CLI) of Open VSX.
44

5+
### v0.4.0 (Feb. 2022)
6+
7+
#### New Features
8+
9+
- Added CLI parameter `--pre-release` to support pre-releases ([#410](https://github.com/eclipse/openvsx/pull/410))
10+
511
### v0.3.0 (Jan. 2022)
612

713
#### Breaking Changes

cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "ovsx",
3-
"version": "0.3.0",
3+
"version": "0.4.0",
44
"description": "Command line interface for Eclipse Open VSX",
55
"keywords": [
66
"cli",

cli/src/main.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ module.exports = function (argv: string[]): void {
3939
.option('--baseContentUrl <url>', 'Prepend all relative links in README.md with this URL.')
4040
.option('--baseImagesUrl <url>', 'Prepend all relative image links in README.md with this URL.')
4141
.option('--yarn', 'Use yarn instead of npm while packing extension files.')
42-
.action((extensionFile: string, { packagePath, baseContentUrl, baseImagesUrl, yarn }) => {
42+
.option('--pre-release', 'Mark this package as a pre-release')
43+
.action((extensionFile: string, { packagePath, baseContentUrl, baseImagesUrl, yarn, preRelease }) => {
4344
if (extensionFile !== undefined && packagePath !== undefined) {
4445
console.error('\u274c Please specify either a package file or a package path, but not both.\n');
4546
publishCmd.help();
@@ -51,7 +52,7 @@ module.exports = function (argv: string[]): void {
5152
if (extensionFile !== undefined && yarn !== undefined)
5253
console.warn("Ignoring option '--yarn' for prepackaged extension.");
5354
const { registryUrl, pat } = program.opts();
54-
publish({ extensionFile, registryUrl, pat, packagePath: typeof packagePath === 'string' ? [packagePath] : packagePath, baseContentUrl, baseImagesUrl, yarn })
55+
publish({ extensionFile, registryUrl, pat, packagePath: typeof packagePath === 'string' ? [packagePath] : packagePath, baseContentUrl, baseImagesUrl, yarn, preRelease })
5556
.catch(handleError(program.debug,
5657
'See the documentation for more information:\n'
5758
+ 'https://github.com/eclipse/openvsx/wiki/Publishing-Extensions'

cli/src/publish.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
*
88
* SPDX-License-Identifier: EPL-2.0
99
********************************************************************************/
10-
1110
import { createVSIX, ICreateVSIXOptions } from 'vsce';
1211
import { createTempFile, addEnvOptions } from './util';
1312
import { Registry, RegistryOptions } from './registry';
@@ -40,6 +39,8 @@ async function doPublish(options: InternalPublishOptions = {}): Promise<void> {
4039
if (!options.extensionFile) {
4140
await packageExtension(options, registry);
4241
console.log(); // new line
42+
} else if (options.preRelease) {
43+
console.warn("Ignoring option '--pre-release' for prepackaged extension.");
4344
}
4445

4546
const extension = await registry.publish(options.extensionFile!, options.pat);
@@ -67,6 +68,10 @@ interface PublishCommonOptions extends RegistryOptions {
6768
* Should use `yarn` instead of `npm`. Only valid with `packagePath`.
6869
*/
6970
yarn?: boolean;
71+
/**
72+
* Mark this package as a pre-release. Only valid with `packagePath`.
73+
*/
74+
preRelease?: boolean;
7075
}
7176

7277
// Interface used by top level CLI
@@ -101,7 +106,8 @@ async function packageExtension(options: InternalPublishOptions, registry: Regis
101106
packagePath: options.extensionFile,
102107
baseContentUrl: options.baseContentUrl,
103108
baseImagesUrl: options.baseImagesUrl,
104-
useYarn: options.yarn
109+
useYarn: options.yarn,
110+
preRelease: options.preRelease
105111
};
106112
await createVSIX(createVSIXOptions);
107113
}

server/src/main/java/org/eclipse/openvsx/AdminService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ protected ResultJson deleteExtension(Extension extension, UserData admin) throws
106106
.collect(Collectors.joining(", ")));
107107
}
108108
extension.setLatest(null);
109-
extension.setPreview(null);
109+
extension.setLatestPreRelease(null);
110110
for (var extVersion : repositories.findVersions(extension)) {
111111
removeExtensionVersion(extVersion);
112112
}
@@ -203,6 +203,7 @@ public UserPublishInfoJson getUserPublishInfo(String provider, String loginName)
203203
var versions = repositories.findVersionsByAccessToken(accessToken);
204204
for (var version : versions) {
205205
var json = version.toExtensionJson();
206+
json.preview = version.getExtension().isPreview();
206207
json.active = version.isActive();
207208
json.files = Maps.newLinkedHashMapWithExpectedSize(6);
208209
storageUtil.addFileUrls(version, serverUrl, json.files, FileResource.DOWNLOAD, FileResource.MANIFEST,

server/src/main/java/org/eclipse/openvsx/ExtensionProcessor.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,18 @@ public boolean isPreview() {
212212
return asStringList(galleryFlags.asText(), " ").contains("Preview");
213213
}
214214

215+
public boolean isPreRelease() {
216+
loadVsixManifest();
217+
var preReleaseNode = findByIdInArray(vsixManifest.path("Metadata").path("Properties").path("Property"), "Microsoft.VisualStudio.Code.PreRelease");
218+
return preReleaseNode.path("Value").asBoolean(false);
219+
}
220+
215221
public ExtensionVersion getMetadata() {
216222
loadPackageJson();
217223
loadVsixManifest();
218224
var extension = new ExtensionVersion();
219225
extension.setVersion(vsixManifest.path("Metadata").path("Identity").path("Version").asText());
220-
extension.setPreview(isPreview());
226+
extension.setPreRelease(isPreRelease());
221227
extension.setDisplayName(vsixManifest.path("Metadata").path("DisplayName").asText());
222228
extension.setDescription(vsixManifest.path("Metadata").path("Description").path("").asText());
223229
extension.setEngines(getEngines(packageJson.path("engines")));

server/src/main/java/org/eclipse/openvsx/ExtensionService.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public ExtensionVersion publishVersion(InputStream content, PersonalAccessToken
7979
// Store file resources in the DB or external storage
8080
storeResources(extVersion, resources);
8181

82-
// Update the 'latest' / 'preview' references and the search index
82+
// Update the 'latest' / 'pre-release' references and the search index
8383
updateExtension(extVersion.getExtension());
8484

8585
return extVersion;
@@ -115,6 +115,7 @@ private ExtensionVersion createExtensionVersion(ExtensionProcessor processor, Us
115115
extension = new Extension();
116116
extension.setName(extensionName);
117117
extension.setNamespace(namespace);
118+
extension.setPreview(processor.isPreview());
118119

119120
vsCodeIdService.createPublicId(extension);
120121
entityManager.persist(extension);
@@ -205,10 +206,10 @@ private void storeResources(ExtensionVersion extVersion, List<FileResource> reso
205206
@Transactional(TxType.REQUIRED)
206207
public void updateExtension(Extension extension) {
207208
extension.setLatest(getLatestVersion(extension, false));
208-
extension.setPreview(getLatestVersion(extension, true));
209+
extension.setLatestPreRelease(getLatestVersion(extension, true));
209210
if (extension.getLatest() == null) {
210-
// Use a preview version as latest if it's the only available version
211-
extension.setLatest(extension.getPreview());
211+
// Use a pre-release version as latest if it's the only available version
212+
extension.setLatest(extension.getLatestPreRelease());
212213
}
213214

214215
if (extension.getLatest() != null) {
@@ -222,10 +223,10 @@ public void updateExtension(Extension extension) {
222223
}
223224
}
224225

225-
private ExtensionVersion getLatestVersion(Extension extension, boolean preview) {
226+
private ExtensionVersion getLatestVersion(Extension extension, boolean preRelease) {
226227
ExtensionVersion latest = null;
227228
SemanticVersion latestSemver = null;
228-
for (var extVer : repositories.findActiveVersions(extension, preview)) {
229+
for (var extVer : repositories.findActiveVersions(extension, preRelease)) {
229230
var semver = extVer.getSemanticVersion();
230231
if (latestSemver == null || latestSemver.compareTo(semver) < 0) {
231232
latest = extVer;
@@ -242,10 +243,10 @@ private ExtensionVersion getLatestVersion(Extension extension, boolean preview)
242243
@Transactional(TxType.REQUIRED)
243244
public void updateExtension(Extension extension, Iterable<ExtensionVersion> versions) {
244245
extension.setLatest(getLatestVersion(versions, false));
245-
extension.setPreview(getLatestVersion(versions, true));
246+
extension.setLatestPreRelease(getLatestVersion(versions, true));
246247
if (extension.getLatest() == null) {
247-
// Use a preview version as latest if it's the only available version
248-
extension.setLatest(extension.getPreview());
248+
// Use a pre-release version as latest if it's the only available version
249+
extension.setLatest(extension.getLatestPreRelease());
249250
}
250251

251252
if (extension.getLatest() != null) {
@@ -259,11 +260,11 @@ public void updateExtension(Extension extension, Iterable<ExtensionVersion> vers
259260
}
260261
}
261262

262-
private ExtensionVersion getLatestVersion(Iterable<ExtensionVersion> versions, boolean preview) {
263+
private ExtensionVersion getLatestVersion(Iterable<ExtensionVersion> versions, boolean preRelease) {
263264
ExtensionVersion latest = null;
264265
SemanticVersion latestSemver = null;
265266
for (var extVer : versions) {
266-
if (extVer.isActive() && extVer.isPreview() == preview) {
267+
if (extVer.isActive() && extVer.isPreRelease() == preRelease) {
267268
var semver = extVer.getSemanticVersion();
268269
if (latestSemver == null || latestSemver.compareTo(semver) < 0) {
269270
latest = extVer;

server/src/main/java/org/eclipse/openvsx/ExtensionValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private void checkVersion(String version, List<Issue> issues) {
111111
issues.add(new Issue("Version must not be empty."));
112112
return;
113113
}
114-
if (version.equals("latest") || version.equals("preview") || version.equals("reviews")) {
114+
if (version.equals("latest") || version.equals("pre-release") || version.equals("reviews")) {
115115
issues.add(new Issue("The version string '" + version + "' is reserved."));
116116
}
117117
for (var i = 0; i < version.length(); i++) {

server/src/main/java/org/eclipse/openvsx/LocalRegistryService.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,11 @@ private ExtensionVersion findVersion(String namespace, String extensionName, Str
130130
if (extension == null || !extension.isActive())
131131
return null;
132132
return extension.getLatest();
133-
} else if ("preview".equals(version)) {
133+
} else if ("pre-release".equals(version)) {
134134
var extension = repositories.findExtension(extensionName, namespace);
135135
if (extension == null || !extension.isActive())
136136
return null;
137-
return extension.getPreview();
137+
return extension.getLatestPreRelease();
138138
} else {
139139
return repositories.findVersion(version, extensionName, namespace);
140140
}
@@ -520,11 +520,12 @@ private SearchEntryJson.VersionReference toVersionReference(ExtensionVersion ext
520520
public ExtensionJson toExtensionVersionJson(ExtensionVersion extVersion, boolean onlyActive) {
521521
var extension = extVersion.getExtension();
522522
var json = extVersion.toExtensionJson();
523+
json.preview = extension.isPreview();
523524
json.versionAlias = new ArrayList<>(2);
524525
if (extVersion == extension.getLatest())
525526
json.versionAlias.add("latest");
526-
if (extVersion == extension.getPreview())
527-
json.versionAlias.add("preview");
527+
if (extVersion == extension.getLatestPreRelease())
528+
json.versionAlias.add("pre-release");
528529
json.verified = isVerified(extVersion);
529530
json.namespaceAccess = "restricted";
530531
json.unrelatedPublisher = !json.verified;
@@ -539,8 +540,8 @@ public ExtensionJson toExtensionVersionJson(ExtensionVersion extVersion, boolean
539540
json.allVersions = Maps.newLinkedHashMapWithExpectedSize(allVersions.size() + 2);
540541
if (extension.getLatest() != null)
541542
json.allVersions.put("latest", createApiUrl(serverUrl, "api", json.namespace, json.name, "latest"));
542-
if (extension.getPreview() != null)
543-
json.allVersions.put("preview", createApiUrl(serverUrl, "api", json.namespace, json.name, "preview"));
543+
if (extension.getLatestPreRelease() != null)
544+
json.allVersions.put("pre-release", createApiUrl(serverUrl, "api", json.namespace, json.name, "pre-release"));
544545
for (var version : allVersions) {
545546
String url = createApiUrl(serverUrl, "api", json.namespace, json.name, version.toString());
546547
json.allVersions.put(version.toString(), url);
@@ -573,11 +574,12 @@ public ExtensionJson toExtensionVersionJson(
573574
) {
574575
var extension = extVersion.getExtension();
575576
var json = extVersion.toExtensionJson();
577+
json.preview = extension.isPreview();
576578
json.versionAlias = new ArrayList<>(2);
577579
if (extension.getLatestId() != null && extVersion.getId() == extension.getLatestId())
578580
json.versionAlias.add("latest");
579-
if (extension.getPreviewId() != null && extVersion.getId() == extension.getPreviewId())
580-
json.versionAlias.add("preview");
581+
if (extension.getLatestPreReleaseId() != null && extVersion.getId() == extension.getLatestPreReleaseId())
582+
json.versionAlias.add("pre-release");
581583
json.verified = isVerified(extVersion, membershipsByNamespaceId);
582584
json.namespaceAccess = "restricted";
583585
json.unrelatedPublisher = !json.verified;
@@ -590,8 +592,8 @@ public ExtensionJson toExtensionVersionJson(
590592
if (extension.getLatestId() != null) {
591593
allVersions.add("latest");
592594
}
593-
if (extension.getPreviewId() != null) {
594-
allVersions.add("preview");
595+
if (extension.getLatestPreReleaseId() != null) {
596+
allVersions.add("pre-release");
595597
}
596598
if(versions != null) {
597599
allVersions.addAll(versions);

server/src/main/java/org/eclipse/openvsx/adapter/ExtensionQueryResult.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public static class Property {
9797
public static final String PROP_BRANDING_COLOR = "Microsoft.VisualStudio.Services.Branding.Color";
9898
public static final String PROP_BRANDING_THEME = "Microsoft.VisualStudio.Services.Branding.Theme";
9999
public static final String PROP_WEB_EXTENSION = "Microsoft.VisualStudio.Code.WebExtension";
100+
public static final String PROP_PRE_RELEASE = "Microsoft.VisualStudio.Code.PreRelease";
100101

101102
public String key;
102103
public String value;

server/src/main/java/org/eclipse/openvsx/adapter/VSCodeAdapter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616
import org.eclipse.openvsx.dto.FileResourceDTO;
1717
import org.eclipse.openvsx.entities.ExtensionVersion;
1818
import org.eclipse.openvsx.entities.FileResource;
19-
import org.eclipse.openvsx.repositories.ExtensionDTORepository;
20-
import org.eclipse.openvsx.repositories.ExtensionVersionDTORepository;
21-
import org.eclipse.openvsx.repositories.FileResourceDTORepository;
2219
import org.eclipse.openvsx.repositories.RepositoryService;
2320
import org.eclipse.openvsx.search.SearchUtilService;
2421
import org.eclipse.openvsx.storage.GoogleCloudStorageService;
@@ -374,7 +371,7 @@ private ExtensionQueryResult.Extension toQueryExtension(ExtensionDTO extension,
374371
// queryExt.publishedDate
375372
// queryExt.lastUpdated
376373
queryExt.categories = latest.getCategories();
377-
queryExt.flags = latest.isPreview() ? FLAG_PREVIEW : "";
374+
queryExt.flags = extension.isPreview() ? FLAG_PREVIEW : "";
378375

379376
if (test(flags, FLAG_INCLUDE_STATISTICS)) {
380377
queryExt.statistics = Lists.newArrayList();
@@ -426,6 +423,9 @@ private ExtensionQueryResult.ExtensionVersion toQueryVersion(
426423
.collect(Collectors.joining(","));
427424
queryVer.addProperty(PROP_EXTENSION_PACK, bundledExtensions);
428425
queryVer.addProperty(PROP_LOCALIZED_LANGUAGES, "");
426+
if (extVer.isPreRelease()) {
427+
queryVer.addProperty(PROP_PRE_RELEASE, "true");
428+
}
429429
if (isWebExtension(extVer)) {
430430
queryVer.addProperty(PROP_WEB_EXTENSION, "true");
431431
}

0 commit comments

Comments
 (0)