Skip to content

Commit 1e01194

Browse files
authored
Merge pull request #42 from shopwareLabs/shyim/fix-cmd-fix-check
Fix cmd_fix to check if the provided path is a project
2 parents 041c1c8 + 4fc7eea commit 1e01194

File tree

5 files changed

+171
-41
lines changed

5 files changed

+171
-41
lines changed

.github/workflows/preview.yml

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
name: PR Docker Image Workflow
2+
3+
on:
4+
pull_request:
5+
types: [opened, synchronize, reopened, closed]
6+
7+
jobs:
8+
# Build and push Docker image, then comment on PR
9+
build-and-comment:
10+
if: github.event.action != 'closed'
11+
runs-on: ubuntu-latest
12+
permissions:
13+
contents: read
14+
packages: write
15+
pull-requests: write
16+
17+
steps:
18+
- name: Checkout code
19+
uses: actions/checkout@v4
20+
21+
- name: Lowercase repository name
22+
id: repo-name
23+
run: |
24+
echo "REPO_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
25+
26+
- name: Set up QEMU
27+
uses: docker/setup-qemu-action@v3
28+
29+
- name: Set up Docker Buildx
30+
uses: docker/setup-buildx-action@v3
31+
32+
- name: Login to GitHub Container Registry
33+
uses: docker/login-action@v3
34+
with:
35+
registry: ghcr.io
36+
username: ${{ github.repository_owner }}
37+
password: ${{ secrets.GITHUB_TOKEN }}
38+
39+
- name: Build and push
40+
uses: docker/build-push-action@v5
41+
with:
42+
context: .
43+
push: true
44+
platforms: linux/amd64,linux/arm64
45+
tags: ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}/pr-${{ github.event.pull_request.number }}:latest
46+
47+
- name: Comment on PR
48+
uses: actions/github-script@v7
49+
with:
50+
script: |
51+
const imageName = `ghcr.io/${{ steps.repo-name.outputs.REPO_NAME }}/pr-${context.issue.number}:latest`;
52+
const commentBody = `📦 Docker image for this PR is available at: \`${imageName}\`
53+
54+
You can pull it with:
55+
\`\`\`
56+
docker pull ${imageName}
57+
docker run ${imageName}
58+
\`\`\``;
59+
60+
// Get all comments on the PR
61+
const comments = await github.rest.issues.listComments({
62+
owner: context.repo.owner,
63+
repo: context.repo.repo,
64+
issue_number: context.issue.number
65+
});
66+
67+
// Look for an existing Docker image comment
68+
const dockerComment = comments.data.find(comment =>
69+
comment.body.includes('📦 Docker image for this PR is available at:')
70+
);
71+
72+
if (dockerComment) {
73+
// Update existing comment
74+
await github.rest.issues.updateComment({
75+
owner: context.repo.owner,
76+
repo: context.repo.repo,
77+
comment_id: dockerComment.id,
78+
body: commentBody
79+
});
80+
} else {
81+
// Create new comment
82+
await github.rest.issues.createComment({
83+
owner: context.repo.owner,
84+
repo: context.repo.repo,
85+
issue_number: context.issue.number,
86+
body: commentBody
87+
});
88+
}
89+
90+
# Delete Docker image when PR is closed/merged
91+
delete-image:
92+
if: github.event.action == 'closed'
93+
runs-on: ubuntu-latest
94+
permissions:
95+
packages: write
96+
97+
steps:
98+
- name: Lowercase repository name
99+
id: repo-name
100+
run: |
101+
echo "OWNER=$(echo '${{ github.repository_owner }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
102+
echo "REPO=$(echo '${{ github.repository }}' | cut -d '/' -f 2 | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT
103+
104+
- name: Delete Docker image
105+
uses: actions/github-script@v7
106+
with:
107+
github-token: ${{ secrets.GITHUB_TOKEN }}
108+
script: |
109+
const owner = '${{ steps.repo-name.outputs.OWNER }}';
110+
const repo = '${{ steps.repo-name.outputs.REPO }}';
111+
const package_name = `${repo}/pr-${context.issue.number}`;
112+
113+
console.log(`Attempting to delete package: ${package_name}`);
114+
115+
try {
116+
// For organization repos
117+
await github.rest.packages.deletePackageForOrg({
118+
package_type: 'container',
119+
package_name: package_name,
120+
org: owner
121+
});
122+
console.log('Package deleted successfully via org API');
123+
} catch (orgError) {
124+
console.log(`Error deleting via org API: ${orgError.message}`);
125+
126+
try {
127+
// For user repos
128+
await github.rest.packages.deletePackageForUser({
129+
package_type: 'container',
130+
package_name: package_name,
131+
username: owner
132+
});
133+
console.log('Package deleted successfully via user API');
134+
} catch (userError) {
135+
console.log(`Error deleting via user API: ${userError.message}`);
136+
}
137+
}

cmd_check.go

+7-23
Original file line numberDiff line numberDiff line change
@@ -33,35 +33,19 @@ var checkCommand = &cobra.Command{
3333
return err
3434
}
3535

36-
var ext extension.Extension
3736
var toolCfg *tool.ToolConfig
3837

3938
if stat.IsDir() {
40-
if !tool.IsProject(args[0]) {
41-
if err := copyFiles(args[0], tmpDir); err != nil {
42-
return err
43-
}
44-
45-
ext, err = extension.GetExtensionByFolder(tmpDir)
46-
47-
if err != nil {
48-
return err
49-
}
50-
51-
toolCfg, err = tool.ConvertExtensionToToolConfig(ext)
52-
53-
if err != nil {
54-
return err
55-
}
56-
} else {
57-
toolCfg, err = tool.GetConfigFromProject(args[0])
39+
if err := copyFiles(args[0], tmpDir); err != nil {
40+
return err
41+
}
5842

59-
if err != nil {
60-
return err
61-
}
43+
toolCfg, err = getToolConfig(tmpDir)
44+
if err != nil {
45+
return err
6246
}
6347
} else {
64-
ext, err = extension.GetExtensionByZip(args[0])
48+
ext, err := extension.GetExtensionByZip(args[0])
6549

6650
if err != nil {
6751
return err

cmd_fix.go

+1-9
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"path/filepath"
77

88
"github.com/shopware/extension-verifier/internal/tool"
9-
"github.com/shopware/shopware-cli/extension"
109
"github.com/spf13/cobra"
1110
"golang.org/x/sync/errgroup"
1211
)
@@ -25,14 +24,7 @@ var (
2524
}
2625
}
2726

28-
ext, err := extension.GetExtensionByFolder(args[0])
29-
30-
if err != nil {
31-
return err
32-
}
33-
34-
toolCfg, err := tool.ConvertExtensionToToolConfig(ext)
35-
27+
toolCfg, err := getToolConfig(args[0])
3628
if err != nil {
3729
return err
3830
}

cmd_format.go

+1-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package main
22

33
import (
44
"github.com/shopware/extension-verifier/internal/tool"
5-
"github.com/shopware/shopware-cli/extension"
65
"github.com/spf13/cobra"
76
"golang.org/x/sync/errgroup"
87
)
@@ -12,20 +11,13 @@ var formatCommand = &cobra.Command{
1211
Args: cobra.ExactArgs(1),
1312
Short: "Formats the Shopware extension",
1413
RunE: func(cmd *cobra.Command, args []string) error {
15-
ext, err := extension.GetExtensionByFolder(args[0])
16-
14+
toolCfg, err := getToolConfig(args[0])
1715
if err != nil {
1816
return err
1917
}
2018

2119
dryRun, _ := cmd.Flags().GetBool("dry-run")
2220

23-
toolCfg, err := tool.ConvertExtensionToToolConfig(ext)
24-
25-
if err != nil {
26-
return err
27-
}
28-
2921
var gr errgroup.Group
3022

3123
tools := tool.GetTools()

cmd_shared.go

+25
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strings"
66

77
"github.com/shopware/extension-verifier/internal/tool"
8+
"github.com/shopware/shopware-cli/extension"
89
)
910

1011
func filterTools(tools []tool.Tool, only string) ([]tool.Tool, error) {
@@ -34,3 +35,27 @@ func filterTools(tools []tool.Tool, only string) ([]tool.Tool, error) {
3435

3536
return filteredTools, nil
3637
}
38+
39+
func getToolConfig(path string) (*tool.ToolConfig, error) {
40+
var toolCfg *tool.ToolConfig
41+
var err error
42+
43+
if tool.IsProject(path) {
44+
toolCfg, err = tool.GetConfigFromProject(path)
45+
if err != nil {
46+
return nil, err
47+
}
48+
} else {
49+
ext, err := extension.GetExtensionByFolder(path)
50+
if err != nil {
51+
return nil, err
52+
}
53+
54+
toolCfg, err = tool.ConvertExtensionToToolConfig(ext)
55+
if err != nil {
56+
return nil, err
57+
}
58+
}
59+
60+
return toolCfg, nil
61+
}

0 commit comments

Comments
 (0)