Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d474447e54 | ||
|
|
15ec8f1be1 | ||
|
|
f5f287da54 | ||
|
|
9c4b8cbdd7 | ||
|
|
9ad402876d | ||
|
|
55b7a02b85 | ||
|
|
ae2024ef55 |
@@ -672,7 +672,8 @@ cd android
|
|||||||
### Release auf Gitea veroeffentlichen
|
### Release auf Gitea veroeffentlichen
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./release.sh 1.2.0
|
./release.sh # Version automatisch +1 (0.2.6.1 → 0.2.6.2, 0.2.6.9 → 0.2.7.0)
|
||||||
|
./release.sh 1.2.0 # oder Version selbst setzen
|
||||||
```
|
```
|
||||||
|
|
||||||
Das Script macht alles in einem Schritt:
|
Das Script macht alles in einem Schritt:
|
||||||
@@ -706,7 +707,7 @@ die VM voll laeuft:
|
|||||||
|
|
||||||
Die App prueft beim Start ob eine neuere Version auf dem RVS liegt.
|
Die App prueft beim Start ob eine neuere Version auf dem RVS liegt.
|
||||||
Der Update-Flow:
|
Der Update-Flow:
|
||||||
1. `./release.sh 0.0.3.0` → APK wird auf RVS kopiert (via scp)
|
1. `./release.sh` (Version automatisch +1) → APK wird auf RVS kopiert (via scp)
|
||||||
2. Alternativ: `git pull` auf dem RVS-Server → APK in `rvs/updates/`
|
2. Alternativ: `git pull` auf dem RVS-Server → APK in `rvs/updates/`
|
||||||
3. App sendet `update_check` mit aktueller Version
|
3. App sendet `update_check` mit aktueller Version
|
||||||
4. RVS vergleicht → sendet `update_available`
|
4. RVS vergleicht → sendet `update_available`
|
||||||
@@ -1238,7 +1239,7 @@ cd host-agent/android && ./build.sh # Docker (Android-SDK + Gradle)
|
|||||||
# -> dist/aria-android-agent.apk
|
# -> dist/aria-android-agent.apk
|
||||||
|
|
||||||
# Release mit allen Agent-Artefakten (Linux/Windows/Android) als Gitea-Assets:
|
# Release mit allen Agent-Artefakten (Linux/Windows/Android) als Gitea-Assets:
|
||||||
cd host-agent && ./release_agent.sh 0.0.1.4
|
cd host-agent && ./release_agent.sh # Version automatisch +1
|
||||||
```
|
```
|
||||||
|
|
||||||
Der Signaturschluessel liegt fest in `host-agent/android/aria-agent.keystore`
|
Der Signaturschluessel liegt fest in `host-agent/android/aria-agent.keystore`
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ android {
|
|||||||
applicationId "com.ariacockpit"
|
applicationId "com.ariacockpit"
|
||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
versionCode 20600
|
versionCode 20601
|
||||||
versionName "0.2.6.0"
|
versionName "0.2.6.1"
|
||||||
// Fallback fuer Libraries mit Product Flavors
|
// Fallback fuer Libraries mit Product Flavors
|
||||||
missingDimensionStrategy 'react-native-camera', 'general'
|
missingDimensionStrategy 'react-native-camera', 'general'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aria-cockpit",
|
"name": "aria-cockpit",
|
||||||
"version": "0.2.6.0",
|
"version": "0.2.6.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"android": "react-native run-android",
|
"android": "react-native run-android",
|
||||||
|
|||||||
@@ -2539,8 +2539,7 @@ const SettingsScreen: React.FC = () => {
|
|||||||
style={[styles.connectButton, {marginTop: 12}]}
|
style={[styles.connectButton, {marginTop: 12}]}
|
||||||
onPress={() => {
|
onPress={() => {
|
||||||
const updateService = require('../services/updater').default;
|
const updateService = require('../services/updater').default;
|
||||||
updateService.checkForUpdate();
|
updateService.checkForUpdateManual();
|
||||||
Alert.alert('Update-Check', 'Pruefe auf neue Version...');
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Text style={styles.connectButtonText}>Auf Updates pr{'\u00FC'}fen</Text>
|
<Text style={styles.connectButtonText}>Auf Updates pr{'\u00FC'}fen</Text>
|
||||||
|
|||||||
@@ -50,6 +50,9 @@ class UpdateService {
|
|||||||
private progressListeners: ProgressCallback[] = [];
|
private progressListeners: ProgressCallback[] = [];
|
||||||
private progress: UpdateProgress = { active: false, version: '', fraction: -1, receivedMB: 0, totalMB: 0, status: '' };
|
private progress: UpdateProgress = { active: false, version: '', fraction: -1, receivedMB: 0, totalMB: 0, status: '' };
|
||||||
private jobId: number | null = null;
|
private jobId: number | null = null;
|
||||||
|
/** Laeuft gerade eine Pruefung per Knopf? Dann geht die Antwort NUR dorthin
|
||||||
|
* (sonst zeigt der ChatScreen-Listener denselben Dialog ein zweites Mal). */
|
||||||
|
private manualWaiter: ((r: { type: 'available'; info: UpdateInfo } | { type: 'none'; latest: string }) => void) | null = null;
|
||||||
private cancelled = false;
|
private cancelled = false;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -66,10 +69,19 @@ class UpdateService {
|
|||||||
downloadUrl: (msg.payload.downloadUrl as string) || '',
|
downloadUrl: (msg.payload.downloadUrl as string) || '',
|
||||||
size: (msg.payload.size as number) || 0,
|
size: (msg.payload.size as number) || 0,
|
||||||
};
|
};
|
||||||
|
if (this.manualWaiter) {
|
||||||
|
const w = this.manualWaiter; this.manualWaiter = null;
|
||||||
|
if (info.version && this.isNewer(info.version)) w({ type: 'available', info });
|
||||||
|
else w({ type: 'none', latest: info.version });
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (info.version && this.isNewer(info.version)) {
|
if (info.version && this.isNewer(info.version)) {
|
||||||
console.log(`[Update] Neue Version verfuegbar: ${info.version} (aktuell: ${APP_VERSION})`);
|
console.log(`[Update] Neue Version verfuegbar: ${info.version} (aktuell: ${APP_VERSION})`);
|
||||||
this.listeners.forEach(cb => cb(info));
|
this.listeners.forEach(cb => cb(info));
|
||||||
}
|
}
|
||||||
|
} else if ((msg.type as string) === 'update_none' && this.manualWaiter) {
|
||||||
|
const w = this.manualWaiter; this.manualWaiter = null;
|
||||||
|
w({ type: 'none', latest: String(msg.payload.latest || '') });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -150,6 +162,64 @@ class UpdateService {
|
|||||||
setTimeout(() => { this.checking = false; }, 10000);
|
setTimeout(() => { this.checking = false; }, 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pruefung per Knopf (Einstellungen → Ueber): sagt IMMER etwas —
|
||||||
|
* neue Version (Update-Dialog), "keine neue Version" mit der Version auf dem
|
||||||
|
* Server, oder warum der Update-Server nicht erreichbar ist (mit Details).
|
||||||
|
*/
|
||||||
|
async checkForUpdateManual(): Promise<void> {
|
||||||
|
const cfg = rvs.getConfig();
|
||||||
|
const where = cfg ? `${cfg.useTLS ? 'wss' : 'ws'}://${cfg.host}:${cfg.port}` : '(nicht eingerichtet)';
|
||||||
|
if (!cfg) {
|
||||||
|
Alert.alert('Update-Server nicht erreichbar', 'Es ist noch kein Server eingerichtet (Einstellungen → Verbindung).');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!rvs.isSocketOpen()) {
|
||||||
|
const lastErr = [...rvs.getConnectionLog()].reverse().find(e => e.level === 'error');
|
||||||
|
Alert.alert('Update-Server nicht erreichbar',
|
||||||
|
`Keine Verbindung zu ${where}.\n\nZustand: ${rvs.getState()}`
|
||||||
|
+ (lastErr ? `\nLetzter Fehler (${new Date(lastErr.timestamp).toLocaleTimeString()}):\n${lastErr.message}` : ''));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await new Promise<{ type: 'available'; info: UpdateInfo } | { type: 'none'; latest: string } | { type: 'timeout' }>(resolve => {
|
||||||
|
const t = setTimeout(() => { this.manualWaiter = null; resolve({ type: 'timeout' }); }, 10_000);
|
||||||
|
this.manualWaiter = (r) => { clearTimeout(t); resolve(r); };
|
||||||
|
rvs.send('update_check' as any, { version: APP_VERSION });
|
||||||
|
});
|
||||||
|
|
||||||
|
if (result.type === 'available') {
|
||||||
|
this.promptUpdate(result.info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (result.type === 'timeout') {
|
||||||
|
Alert.alert('Update-Server antwortet nicht',
|
||||||
|
`Verbunden mit ${where}, aber nach 10 s keine Antwort auf die Update-Anfrage.\n\n`
|
||||||
|
+ 'Moeglicherweise laeuft auf dem Server eine alte RVS-Version.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keine neue Version — zusaetzlich pruefen, ob der Download-Weg funktioniert
|
||||||
|
let dl = '';
|
||||||
|
try {
|
||||||
|
const ctrl = new AbortController();
|
||||||
|
const t = setTimeout(() => ctrl.abort(), 10_000);
|
||||||
|
const r = await fetch(`${cfg.useTLS ? 'https' : 'http'}://${cfg.host}:${cfg.port}/update/latest.apk`,
|
||||||
|
{ method: 'HEAD', headers: { 'X-RVS-Token': cfg.token }, signal: ctrl.signal });
|
||||||
|
clearTimeout(t);
|
||||||
|
dl = r.ok ? 'Download-Weg: erreichbar ✓'
|
||||||
|
: r.status === 404 && result.latest ? 'Download-Weg: vom Server noch nicht unterstuetzt (alter RVS)'
|
||||||
|
: r.status === 404 ? 'Download-Weg: erreichbar, aber auf dem Server liegt keine APK'
|
||||||
|
: `Download-Weg: Fehler HTTP ${r.status}`;
|
||||||
|
} catch (e: any) {
|
||||||
|
dl = `Download-Weg: nicht erreichbar (${e?.name === 'AbortError' ? 'Zeitueberschreitung' : (e?.message || e)})`;
|
||||||
|
}
|
||||||
|
Alert.alert('Keine neue Version',
|
||||||
|
`Installiert: ${APP_VERSION}\n`
|
||||||
|
+ `Neueste auf dem Server: ${result.latest || '(keine APK hinterlegt)'}\n\n`
|
||||||
|
+ `Update-Server: ${where} ✓\n${dl}`);
|
||||||
|
}
|
||||||
|
|
||||||
/** Callback registrieren */
|
/** Callback registrieren */
|
||||||
onUpdateAvailable(callback: UpdateCallback): () => void {
|
onUpdateAvailable(callback: UpdateCallback): () => void {
|
||||||
this.listeners.push(callback);
|
this.listeners.push(callback);
|
||||||
|
|||||||
@@ -18,7 +18,16 @@ WORKDIR /work
|
|||||||
|
|
||||||
# nssm — Non-Sucking Service Manager (public domain): macht aus der Konsolen-.exe
|
# nssm — Non-Sucking Service Manager (public domain): macht aus der Konsolen-.exe
|
||||||
# einen sauberen Windows-Dienst (die .exe selbst spricht das SCM nicht).
|
# einen sauberen Windows-Dienst (die .exe selbst spricht das SCM nicht).
|
||||||
RUN curl -fsSL https://nssm.cc/release/nssm-2.24.zip -o /tmp/nssm.zip \
|
# nssm.cc faellt oefter aus (503) — dann Ersatz aus dem Internet Archive.
|
||||||
|
# Beide liefern dieselbe Datei; die Pruefsumme stellt das sicher.
|
||||||
|
ARG NSSM_SHA256=727d1e42275c605e0f04aba98095c38a8e1e46def453cdffce42869428aa6743
|
||||||
|
RUN for url in https://nssm.cc/release/nssm-2.24.zip \
|
||||||
|
"https://web.archive.org/web/2024id_/https://nssm.cc/release/nssm-2.24.zip"; do \
|
||||||
|
curl -fsSL --retry 3 --retry-delay 5 --retry-all-errors "$url" -o /tmp/nssm.zip \
|
||||||
|
&& echo "$NSSM_SHA256 /tmp/nssm.zip" | sha256sum -c - && break; \
|
||||||
|
echo "nssm: $url fehlgeschlagen, versuche naechste Quelle" >&2; rm -f /tmp/nssm.zip; \
|
||||||
|
done \
|
||||||
|
&& test -f /tmp/nssm.zip \
|
||||||
&& unzip -q /tmp/nssm.zip -d /tmp \
|
&& unzip -q /tmp/nssm.zip -d /tmp \
|
||||||
&& cp /tmp/nssm-2.24/win64/nssm.exe ./nssm.exe \
|
&& cp /tmp/nssm-2.24/win64/nssm.exe ./nssm.exe \
|
||||||
&& rm -rf /tmp/nssm*
|
&& rm -rf /tmp/nssm*
|
||||||
|
|||||||
@@ -142,12 +142,13 @@ Danach die `.env` unter `%ProgramData%\ARIA-Host-Agent\` mit RVS-Zugang +
|
|||||||
|
|
||||||
## Release (Binaries als Gitea-Assets)
|
## Release (Binaries als Gitea-Assets)
|
||||||
|
|
||||||
`release_agent.sh <version>` baut alles Docker-Baubare und hängt es als
|
`release_agent.sh [version]` baut alles Docker-Baubare und hängt es als
|
||||||
**Release-Asset** an den Tag `agent-v<version>` — nichts landet im Git-Tree:
|
**Release-Asset** an den Tag `agent-v<version>` — nichts landet im Git-Tree:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./release_agent.sh 0.2.0 # Linux + Android + Windows (Wine)
|
./release_agent.sh # Version automatisch +1 (0.0.1.6 → 0.0.1.7)
|
||||||
SKIP_WINDOWS=1 ./release_agent.sh 0.2.0 # ohne Windows (schneller)
|
./release_agent.sh 0.2.0 # Version selbst setzen; Linux + Android + Windows (Wine)
|
||||||
|
SKIP_WINDOWS=1 ./release_agent.sh # ohne Windows (schneller)
|
||||||
```
|
```
|
||||||
|
|
||||||
Assets: `aria-host-agent-linux-x64`, `aria-host-agent-android-agent-v<v>.apk`,
|
Assets: `aria-host-agent-linux-x64`, `aria-host-agent-android-agent-v<v>.apk`,
|
||||||
|
|||||||
@@ -246,7 +246,7 @@ es wird als **Release-Asset** an einen Tag gehaengt. Das macht `release_agent.sh
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd host-agent
|
cd host-agent
|
||||||
./release_agent.sh 0.2.0
|
./release_agent.sh # Version automatisch +1 (oder: ./release_agent.sh 0.2.0)
|
||||||
```
|
```
|
||||||
|
|
||||||
Das Skript (wie die `release.sh` der Haupt-App, Version als Parameter):
|
Das Skript (wie die `release.sh` der Haupt-App, Version als Parameter):
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ android {
|
|||||||
applicationId 'de.hackersoft.ariaagent'
|
applicationId 'de.hackersoft.ariaagent'
|
||||||
minSdk 26
|
minSdk 26
|
||||||
targetSdk 33 // 33 vermeidet die Foreground-Service-Typ-Pflicht von 34
|
targetSdk 33 // 33 vermeidet die Foreground-Service-Typ-Pflicht von 34
|
||||||
versionCode 105
|
versionCode 107
|
||||||
versionName '0.0.1.5'
|
versionName '0.0.1.7'
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fester Signaturschlüssel: jeder Build signiert mit DEMSELBEN Key, damit
|
// Fester Signaturschlüssel: jeder Build signiert mit DEMSELBEN Key, damit
|
||||||
|
|||||||
@@ -162,7 +162,7 @@ OUT_MAX_CHARS_HARD = int(os.environ.get("OUT_MAX_CHARS_HARD", "200000") or "2000
|
|||||||
FILE_MAX_BYTES = int(os.environ.get("FILE_MAX_BYTES", str(10 * 1024 * 1024)) or str(10 * 1024 * 1024))
|
FILE_MAX_BYTES = int(os.environ.get("FILE_MAX_BYTES", str(10 * 1024 * 1024)) or str(10 * 1024 * 1024))
|
||||||
|
|
||||||
# Version (wird von release_agent.sh beim Release gesetzt).
|
# Version (wird von release_agent.sh beim Release gesetzt).
|
||||||
AGENT_VERSION = "0.0.1.5"
|
AGENT_VERSION = "0.0.1.7"
|
||||||
|
|
||||||
HEARTBEAT_SEC = 25
|
HEARTBEAT_SEC = 25
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,8 @@
|
|||||||
# Gitea-Release-Assets an einen Tag. NICHTS wandert in den Git-Tree —
|
# Gitea-Release-Assets an einen Tag. NICHTS wandert in den Git-Tree —
|
||||||
# Binaries leben nur unter "Releases" (blaeht clone/History nicht auf).
|
# Binaries leben nur unter "Releases" (blaeht clone/History nicht auf).
|
||||||
#
|
#
|
||||||
# Verwendung: ./release_agent.sh <version> (z.B. ./release_agent.sh 0.2.0)
|
# Verwendung: ./release_agent.sh (Version automatisch +1)
|
||||||
|
# ./release_agent.sh 0.1.0.0 (Version selbst setzen)
|
||||||
#
|
#
|
||||||
# Artefakte:
|
# Artefakte:
|
||||||
# - Linux-x64-Binary (Docker, PyInstaller) -> immer
|
# - Linux-x64-Binary (Docker, PyInstaller) -> immer
|
||||||
@@ -31,8 +32,38 @@ ROOT_DIR="$(cd .. && pwd)"
|
|||||||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m'
|
||||||
|
|
||||||
# ── Parameter ────────────────────────────────────────────────────────
|
# ── Parameter ────────────────────────────────────────────────────────
|
||||||
VERSION=${1:?"Usage: ./release_agent.sh <version> (z.B. 0.2.0)"}
|
# Ohne Angabe: letzte Stelle automatisch hochzaehlen. Mit Angabe: genau diese.
|
||||||
|
|
||||||
|
# Naechste Version: hoechste aus Datei-Version und letztem Git-Tag, dann wie
|
||||||
|
# ein Kilometerzaehler +1: hintere Stellen laufen 0..9 und uebertragen nach
|
||||||
|
# vorne (0.2.6.9 → 0.2.7.0, 0.2.9.9 → 0.3.0.0), die vorderste zaehlt einfach
|
||||||
|
# weiter (9.9.9.9 → 10.0.0.0). Aufruf: next_version <aktuelle> <tag-prefix>
|
||||||
|
next_version() {
|
||||||
|
local cur="$1" prefix="$2" tagv best
|
||||||
|
tagv=$(git tag -l "${prefix}*" | sed "s/^${prefix}//" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1)
|
||||||
|
best=$(printf '%s\n%s\n' "$cur" "$tagv" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1)
|
||||||
|
[ -z "$best" ] && best="0.0.0.0"
|
||||||
|
awk -F. -v OFS=. '{
|
||||||
|
for (i = NF; i >= 1; i--) {
|
||||||
|
if (i == 1 || $i < 9) { $i = $i + 1; break }
|
||||||
|
$i = 0 # 9 → 0, Uebertrag nach vorne
|
||||||
|
}
|
||||||
|
print
|
||||||
|
}' <<< "$best"
|
||||||
|
}
|
||||||
|
|
||||||
|
CURRENT=$(grep -m1 "versionName" android/app/build.gradle | sed -E "s/.*versionName '([^']*)'.*/\1/")
|
||||||
|
VERSION=${1:-$(next_version "$CURRENT" "agent-v")}
|
||||||
|
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+)+$ ]]; then
|
||||||
|
echo -e "${RED}Ungueltige Version: $VERSION (z.B. 0.0.1.7)${NC}"; exit 1
|
||||||
|
fi
|
||||||
TAG="agent-v$VERSION"
|
TAG="agent-v$VERSION"
|
||||||
|
if git rev-parse "$TAG" &>/dev/null; then
|
||||||
|
echo -e "${RED}Tag $TAG gibt es schon — andere Version angeben.${NC}"; exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${CYAN}Agent-Version: $CURRENT → ${GREEN}$VERSION${NC}"
|
||||||
|
read -p "Release $VERSION bauen? [J/n] " OK
|
||||||
|
[[ "$OK" =~ ^[nN] ]] && { echo "Abgebrochen."; exit 0; }
|
||||||
|
|
||||||
# ── Gitea-Konfiguration (env > host-agent/.env > Repo-Wurzel-.env) ────
|
# ── Gitea-Konfiguration (env > host-agent/.env > Repo-Wurzel-.env) ────
|
||||||
[ -f "$SCRIPT_DIR/.env" ] && source "$SCRIPT_DIR/.env"
|
[ -f "$SCRIPT_DIR/.env" ] && source "$SCRIPT_DIR/.env"
|
||||||
@@ -86,11 +117,13 @@ if [ "${SKIP_WINDOWS:-0}" = "1" ]; then
|
|||||||
echo -e " ${YELLOW}Windows-Build uebersprungen (SKIP_WINDOWS=1)${NC}"
|
echo -e " ${YELLOW}Windows-Build uebersprungen (SKIP_WINDOWS=1)${NC}"
|
||||||
else
|
else
|
||||||
echo -e " ${CYAN}…${NC} Windows-.exe + setup.exe bauen (Wine, kann dauern)"
|
echo -e " ${CYAN}…${NC} Windows-.exe + setup.exe bauen (Wine, kann dauern)"
|
||||||
if ./build-win.sh "$VERSION" >/dev/null 2>&1; then
|
WIN_LOG="$SCRIPT_DIR/dist/build-win.log"
|
||||||
|
if ./build-win.sh "$VERSION" >"$WIN_LOG" 2>&1; then
|
||||||
echo -e " ${GREEN}✓${NC} Windows-.exe + setup.exe"
|
echo -e " ${GREEN}✓${NC} Windows-.exe + setup.exe"
|
||||||
else
|
else
|
||||||
echo -e " ${YELLOW}Windows-Build fehlgeschlagen — Release laeuft ohne Windows weiter.${NC}"
|
echo -e " ${YELLOW}Windows-Build fehlgeschlagen — Release laeuft ohne Windows weiter.${NC}"
|
||||||
echo -e " ${YELLOW}(Einzeln testen: ./build-win.sh $VERSION)${NC}"
|
echo -e " ${YELLOW}Letzte Zeilen (ganzes Log: $WIN_LOG):${NC}"
|
||||||
|
tail -n 8 "$WIN_LOG" | sed 's/^/ /'
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
+33
-2
@@ -2,7 +2,8 @@
|
|||||||
# ════════════════════════════════════════════════
|
# ════════════════════════════════════════════════
|
||||||
# ARIA — Release Script
|
# ARIA — Release Script
|
||||||
# Baut APK, taggt, erstellt Gitea Release
|
# Baut APK, taggt, erstellt Gitea Release
|
||||||
# Verwendung: ./release.sh 1.2.0
|
# Verwendung: ./release.sh (Version automatisch +1)
|
||||||
|
# ./release.sh 0.3.0.0 (Version selbst setzen)
|
||||||
# Gitea-Kennwort wird interaktiv abgefragt.
|
# Gitea-Kennwort wird interaktiv abgefragt.
|
||||||
# ════════════════════════════════════════════════
|
# ════════════════════════════════════════════════
|
||||||
|
|
||||||
@@ -16,8 +17,38 @@ CYAN='\033[0;36m'
|
|||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
|
|
||||||
# ── Parameter ─────────────────────────────────
|
# ── Parameter ─────────────────────────────────
|
||||||
VERSION=${1:?"Usage: ./release.sh <version> (z.B. 1.2.0)"}
|
# Ohne Angabe: letzte Stelle automatisch hochzaehlen. Mit Angabe: genau diese.
|
||||||
|
|
||||||
|
# Naechste Version: hoechste aus Datei-Version und letztem Git-Tag, dann wie
|
||||||
|
# ein Kilometerzaehler +1: hintere Stellen laufen 0..9 und uebertragen nach
|
||||||
|
# vorne (0.2.6.9 → 0.2.7.0, 0.2.9.9 → 0.3.0.0), die vorderste zaehlt einfach
|
||||||
|
# weiter (9.9.9.9 → 10.0.0.0). Aufruf: next_version <aktuelle> <tag-prefix>
|
||||||
|
next_version() {
|
||||||
|
local cur="$1" prefix="$2" tagv best
|
||||||
|
tagv=$(git tag -l "${prefix}*" | sed "s/^${prefix}//" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1)
|
||||||
|
best=$(printf '%s\n%s\n' "$cur" "$tagv" | grep -E '^[0-9]+(\.[0-9]+)+$' | sort -V | tail -1)
|
||||||
|
[ -z "$best" ] && best="0.0.0.0"
|
||||||
|
awk -F. -v OFS=. '{
|
||||||
|
for (i = NF; i >= 1; i--) {
|
||||||
|
if (i == 1 || $i < 9) { $i = $i + 1; break }
|
||||||
|
$i = 0 # 9 → 0, Uebertrag nach vorne
|
||||||
|
}
|
||||||
|
print
|
||||||
|
}' <<< "$best"
|
||||||
|
}
|
||||||
|
|
||||||
|
CURRENT=$(grep -m1 '"version"' android/package.json | sed -E 's/.*"version": *"([^"]*)".*/\1/')
|
||||||
|
VERSION=${1:-$(next_version "$CURRENT" "v")}
|
||||||
|
if ! [[ "$VERSION" =~ ^[0-9]+(\.[0-9]+)+$ ]]; then
|
||||||
|
echo -e "${RED}Ungueltige Version: $VERSION (z.B. 0.2.6.2)${NC}"; exit 1
|
||||||
|
fi
|
||||||
TAG="v$VERSION"
|
TAG="v$VERSION"
|
||||||
|
if git rev-parse "$TAG" &>/dev/null; then
|
||||||
|
echo -e "${RED}Tag $TAG gibt es schon — andere Version angeben.${NC}"; exit 1
|
||||||
|
fi
|
||||||
|
echo -e "${CYAN}App-Version: $CURRENT → ${GREEN}$VERSION${NC}"
|
||||||
|
read -p "Release $VERSION bauen? [J/n] " OK
|
||||||
|
[[ "$OK" =~ ^[nN] ]] && { echo "Abgebrochen."; exit 0; }
|
||||||
|
|
||||||
# ── Gitea-Konfiguration ──────────────────────
|
# ── Gitea-Konfiguration ──────────────────────
|
||||||
# Aus .env lesen falls vorhanden (GITEA_URL, GITEA_REPO, GITEA_USER)
|
# Aus .env lesen falls vorhanden (GITEA_URL, GITEA_REPO, GITEA_USER)
|
||||||
|
|||||||
+9
-1
@@ -27,7 +27,7 @@ const ALLOWED_TYPES = new Set([
|
|||||||
"chat", "audio", "file", "location", "mode", "log", "event", "heartbeat",
|
"chat", "audio", "file", "location", "mode", "log", "event", "heartbeat",
|
||||||
"file_request", "file_response", "file_saved", "stt_result", "config", "tts_request",
|
"file_request", "file_response", "file_saved", "stt_result", "config", "tts_request",
|
||||||
"xtts_request", "xtts_response", "xtts_list_voices", "xtts_voices_list", "voice_upload", "xtts_voice_saved",
|
"xtts_request", "xtts_response", "xtts_list_voices", "xtts_voices_list", "voice_upload", "xtts_voice_saved",
|
||||||
"update_check", "update_available", "update_download", "update_data",
|
"update_check", "update_available", "update_none", "update_download", "update_data",
|
||||||
"agent_activity", "cancel_request", "interject",
|
"agent_activity", "cancel_request", "interject",
|
||||||
"audio_pcm",
|
"audio_pcm",
|
||||||
"file_from_aria",
|
"file_from_aria",
|
||||||
@@ -614,6 +614,14 @@ function registerClient(ws, token) {
|
|||||||
},
|
},
|
||||||
timestamp: Date.now(),
|
timestamp: Date.now(),
|
||||||
}));
|
}));
|
||||||
|
} else {
|
||||||
|
// Auch "nichts Neues" beantworten — die App zeigt dann, dass der
|
||||||
|
// Update-Server erreichbar ist und welche Version er hat
|
||||||
|
ws.send(JSON.stringify({
|
||||||
|
type: "update_none",
|
||||||
|
payload: { latest: apkInfo ? apkInfo.version : "", current: clientVersion },
|
||||||
|
timestamp: Date.now(),
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user