Initial project scaffold for Dimma
This commit is contained in:
+100
@@ -0,0 +1,100 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
CurrentVersion = "v0.1.0"
|
||||
ReleaseURL = "https://gitea.sanplex.xyz/Sansan/dimma/releases/latest"
|
||||
)
|
||||
|
||||
type ReleaseInfo struct {
|
||||
TagName string `json:"tag_name"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
check := flag.Bool("check", false, "Check for updates")
|
||||
flag.Parse()
|
||||
|
||||
if !*check {
|
||||
flag.Usage()
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("Current version: %s\n", CurrentVersion)
|
||||
|
||||
latestVersion, err := fetchLatestVersion()
|
||||
if err != nil {
|
||||
fmt.Printf("Error fetching latest version: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("Latest version: %s\n", latestVersion)
|
||||
|
||||
if compareVersions(latestVersion, CurrentVersion) > 0 {
|
||||
fmt.Printf("Update available: %s\n", latestVersion)
|
||||
} else {
|
||||
fmt.Println("Up to date")
|
||||
}
|
||||
}
|
||||
|
||||
func fetchLatestVersion() (string, error) {
|
||||
resp, err := http.Get(ReleaseURL)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return "", fmt.Errorf("HTTP %d", resp.StatusCode)
|
||||
}
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Gitea releases API returns JSON with tag_name
|
||||
var release ReleaseInfo
|
||||
if err := json.Unmarshal(body, &release); err != nil {
|
||||
// Try to extract from HTML if not JSON
|
||||
release.TagName = extractVersionFromHTML(string(body))
|
||||
if release.TagName == "" {
|
||||
return "", fmt.Errorf("failed to parse release info")
|
||||
}
|
||||
}
|
||||
|
||||
return release.TagName, nil
|
||||
}
|
||||
|
||||
func extractVersionFromHTML(html string) string {
|
||||
// Simple extraction from HTML (fallback for non-API URLs)
|
||||
// Looks for patterns like "v0.1.0" or "0.1.0"
|
||||
parts := strings.Split(html, "v")
|
||||
for _, part := range parts {
|
||||
if len(part) > 0 && part[0] >= '0' && part[0] <= '9' {
|
||||
version := "v" + strings.Split(part, "\"")[0]
|
||||
version = strings.Split(version, " ")[0]
|
||||
version = strings.Split(version, ">")[0]
|
||||
version = strings.TrimSpace(version)
|
||||
if version != "" {
|
||||
return version
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func compareVersions(a, b string) int {
|
||||
// Simple version comparison (v0.1.0 format)
|
||||
a = strings.TrimPrefix(a, "v")
|
||||
b = strings.TrimPrefix(b, "v")
|
||||
return strings.Compare(a, b)
|
||||
}
|
||||
Reference in New Issue
Block a user