Skip to content

Commit b6cd506

Browse files
committed
[FIX] PostgreSQL support.
1 parent ef3776a commit b6cd506

File tree

3 files changed

+101
-2
lines changed

3 files changed

+101
-2
lines changed

internal/engine/install/engine.go

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"time"
2020

2121
"github.com/evolution-cms/installer/internal/domain"
22+
"github.com/evolution-cms/installer/internal/services/github"
2223
"github.com/evolution-cms/installer/internal/services/release"
2324
)
2425

@@ -1506,7 +1507,42 @@ func (e *Engine) maybeOfferSelfUpdate(ctx context.Context, emit func(domain.Even
15061507
CacheTTL: 12 * time.Hour,
15071508
})
15081509
if err != nil || info.HighestVersion == "" {
1509-
return false
1510+
// Fall back to GitHub's "latest" release endpoint (ignores pre-releases),
1511+
// matching the PHP bootstrapper's self-update behavior.
1512+
rel, err2 := github.FetchLatestRelease(ctx, "evolution-cms", "installer")
1513+
if err2 != nil || strings.TrimSpace(rel.TagName) == "" {
1514+
if err2 == nil {
1515+
err2 = err
1516+
}
1517+
if err2 != nil {
1518+
_ = emit(domain.Event{
1519+
Type: domain.EventWarning,
1520+
StepID: stepID,
1521+
Source: "install",
1522+
Severity: domain.SeverityWarn,
1523+
Payload: domain.LogPayload{
1524+
Message: "Unable to check for installer updates.",
1525+
Fields: map[string]string{"error": err2.Error()},
1526+
},
1527+
})
1528+
}
1529+
return false
1530+
}
1531+
1532+
tagName := strings.TrimSpace(rel.TagName)
1533+
highest := strings.TrimPrefix(strings.TrimPrefix(tagName, "v"), "V")
1534+
if highest == "" {
1535+
highest = tagName
1536+
}
1537+
tag := tagName
1538+
if !strings.HasPrefix(strings.ToLower(tag), "v") && highest != "" {
1539+
tag = "v" + highest
1540+
}
1541+
info = domain.ReleaseInfo{
1542+
Repo: "evolution-cms/installer",
1543+
Tag: tag,
1544+
HighestVersion: highest,
1545+
}
15101546
}
15111547

15121548
newMaj, newMin, newPatch, ok := parseVersionForCompare(info.HighestVersion)

internal/services/github/releases.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,41 @@ type GitHubRelease struct {
1919
Prerelease bool `json:"prerelease"`
2020
}
2121

22+
func FetchLatestRelease(ctx context.Context, owner string, repo string) (GitHubRelease, error) {
23+
u := url.URL{
24+
Scheme: "https",
25+
Host: "api.github.com",
26+
Path: fmt.Sprintf("/repos/%s/%s/releases/latest", owner, repo),
27+
}
28+
29+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u.String(), nil)
30+
if err != nil {
31+
return GitHubRelease{}, err
32+
}
33+
req.Header.Set("Accept", "application/vnd.github+json")
34+
req.Header.Set("User-Agent", "evo-installer")
35+
if token := os.Getenv("GITHUB_TOKEN"); token != "" {
36+
req.Header.Set("Authorization", "Bearer "+token)
37+
}
38+
39+
client := &http.Client{Timeout: 12 * time.Second}
40+
resp, err := client.Do(req)
41+
if err != nil {
42+
return GitHubRelease{}, err
43+
}
44+
defer resp.Body.Close()
45+
46+
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
47+
return GitHubRelease{}, fmt.Errorf("github releases latest: %s", resp.Status)
48+
}
49+
50+
var rel GitHubRelease
51+
if err := json.NewDecoder(resp.Body).Decode(&rel); err != nil {
52+
return GitHubRelease{}, err
53+
}
54+
return rel, nil
55+
}
56+
2257
func FetchReleases(ctx context.Context, owner string, repo string) ([]GitHubRelease, error) {
2358
const maxPages = 3
2459
var out []GitHubRelease

src/Concerns/HandlesCollations.php

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,35 @@ protected function isMySql8OrNewer(string $serverVersion): bool
6767
*/
6868
protected function getCharsetFromCollation(string $collation): string
6969
{
70+
$collation = trim($collation);
71+
if ($collation === '') {
72+
return 'utf8mb4';
73+
}
74+
75+
$lower = strtolower($collation);
76+
77+
// PostgreSQL / SQLite may provide charset-like values without underscore.
78+
if (in_array($lower, ['utf8', 'utf8mb4', 'latin1', 'ascii', 'utf16', 'utf32', 'ucs2'], true)) {
79+
return $lower;
80+
}
81+
82+
// SQL Server collations are not in "{charset}_{collation}" format.
83+
if (str_starts_with($lower, 'sql_')) {
84+
return 'utf8';
85+
}
86+
7087
$pos = strpos($collation, '_');
71-
return $pos !== false ? substr($collation, 0, $pos) : 'utf8mb4';
88+
if ($pos === false) {
89+
return 'utf8mb4';
90+
}
91+
92+
$candidate = substr($collation, 0, $pos);
93+
$candidateLower = strtolower($candidate);
94+
95+
if ($candidateLower === 'sql') {
96+
return 'utf8';
97+
}
98+
99+
return $candidateLower;
72100
}
73101
}

0 commit comments

Comments
 (0)