Skip to content

Commit

Permalink
feat: decouple static-data from friendsofshopware (#457)
Browse files Browse the repository at this point in the history
  • Loading branch information
shyim authored Jan 22, 2025
1 parent 12f1fd9 commit e3a0752
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 13 deletions.
54 changes: 54 additions & 0 deletions .github/workflows/static-data.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Static Data Deployment
on:
push:
branches:
- main
paths:
- 'static-data/**'
workflow_dispatch:

permissions:
contents: read
pages: write
id-token: write

jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
concurrency:
group: static-data
cancel-in-progress: false
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '23'

- name: Fetch current tags
working-directory: static-data
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: node generate.ts

- name: Delete script
working-directory: static-data
run: rm generate.ts

- name: Setup Pages
uses: actions/configure-pages@v5

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: 'static-data'

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
Binary file added extension/composer-info.zip.zst
Binary file not shown.
29 changes: 29 additions & 0 deletions extension/composer_info.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package extension

import (
"archive/zip"
"bytes"
_ "embed"
"io"

"github.com/klauspost/compress/zstd"
)

//go:embed composer-info.zip.zst
var composerInfoFile []byte

func getComposerInfoFS() (*zip.Reader, error) {
zstReader, err := zstd.NewReader(bytes.NewReader(composerInfoFile))
if err != nil {
return nil, err
}

defer zstReader.Close()

uncompressed, err := io.ReadAll(zstReader)
if err != nil {
return nil, err
}

return zip.NewReader(bytes.NewReader(uncompressed), int64(len(uncompressed)))
}
24 changes: 11 additions & 13 deletions extension/zip.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ func PrepareFolderForZipping(ctx context.Context, path string, ext Extension, ex
}

// Add replacements
composer, err = addComposerReplacements(ctx, composer, minVersion)
composer, err = addComposerReplacements(composer, minVersion)
if err != nil {
return fmt.Errorf("add composer replacements: %w", err)
}
Expand Down Expand Up @@ -351,7 +351,7 @@ func filterRequires(composer map[string]interface{}, extCfg *Config) map[string]
return composer
}

func addComposerReplacements(ctx context.Context, composer map[string]interface{}, minVersion string) (map[string]interface{}, error) {
func addComposerReplacements(composer map[string]interface{}, minVersion string) (map[string]interface{}, error) {
if _, ok := composer["replace"]; !ok {
composer["replace"] = make(map[string]interface{})
}
Expand All @@ -365,27 +365,27 @@ func addComposerReplacements(ctx context.Context, composer map[string]interface{

components := []string{"core", "administration", "storefront", "administration"}

composerInfo, err := getComposerInfoFS()
if err != nil {
return nil, fmt.Errorf("get composer info fs: %w", err)
}

for _, component := range components {
packageName := fmt.Sprintf("shopware/%s", component)

if _, ok := require.(map[string]interface{})[packageName]; ok {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("https://swagger.docs.fos.gg/composer/%s/%s.json", minVersion, component), http.NoBody)
composerFile, err := composerInfo.Open(fmt.Sprintf("%s/%s.json", minVersion, component))
if err != nil {
return nil, fmt.Errorf("create component request: %w", err)
return nil, fmt.Errorf("open composer file: %w", err)
}

resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, fmt.Errorf("get packte version %s: %w", component, err)
}
defer composerFile.Close()

composerPartByte, err := io.ReadAll(resp.Body)
composerPartByte, err := io.ReadAll(composerFile)
if err != nil {
return nil, fmt.Errorf("read component version body: %w", err)
}

_ = resp.Body.Close()

var composerPart map[string]string
err = json.Unmarshal(composerPartByte, &composerPart)
if err != nil {
Expand Down Expand Up @@ -505,7 +505,6 @@ func PrepareExtensionForRelease(ctx context.Context, sourceRoot, extensionRoot s
manifestPath := filepath.Join(extensionRoot, "manifest.xml")

bytes, err := os.ReadFile(manifestPath)

if err != nil {
return err
}
Expand All @@ -521,7 +520,6 @@ func PrepareExtensionForRelease(ctx context.Context, sourceRoot, extensionRoot s
}

newManifest, err := xml.MarshalIndent(manifest, "", " ")

if err != nil {
return fmt.Errorf("cannot marshal manifest failed: %w", err)
}
Expand Down
59 changes: 59 additions & 0 deletions static-data/generate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { writeFileSync } from 'node:fs';

async function fetchTagsPage(page: number, headers: Record<string, string>): Promise<Array<{ name: string }>> {
const response = await fetch(`https://api.github.com/repos/shopware/shopware/tags?per_page=100&page=${page}`, {
headers
});

if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}

return await response.json() as Array<{ name: string }>;
}

async function fetchShopwareTags(): Promise<void> {
const tags: string[] = [];

try {
const headers: Record<string, string> = {
'User-Agent': 'Shopware-CLI Bot'
};

if (process.env.GITHUB_TOKEN) {
headers['Authorization'] = `token ${process.env.GITHUB_TOKEN}`;
}

let page = 1;
let hasMorePages = true;

while (hasMorePages) {
const data = await fetchTagsPage(page, headers);

if (data.length === 0) {
hasMorePages = false;
} else {
for (const tag of data) {
if (tag.name.startsWith('v') && tag.name.indexOf('rc') === -1 && tag.name.indexOf('RC') === -1&& tag.name.indexOf('+ea') === -1 && tag.name.indexOf('+dp') === -1) {
tags.push(tag.name.substring(1));
}
}
page++;
}
}

if (!tags.includes('6.7.0.0')) {
tags.unshift('6.7.0.0');
}

writeFileSync('versions.json', JSON.stringify(tags, null, 2));
console.log('Successfully wrote versions.json');

} catch (error) {
console.error('Error:', error);
process.exit(1);
}
}

// Execute the function
fetchShopwareTags();

0 comments on commit e3a0752

Please sign in to comment.