Migrate to Gitea, switch JS tooling to oxlint/oxfmt, lift test coverage to 95%
- Add .gitea/workflows/ci.yml ported from lifeos (lint + tests with coverage gate) - Set up phpstan (larastan + peststan, baseline at level max) - Replace eslint/prettier with oxlint/oxfmt; reformat resources/ - Add composer phpstan/coverage/quality scripts; restore --min=95 coverage gate - Exclude integration plumbing (Saloon Hetzner classes, SSH wrappers, console commands, DTOs) from coverage to keep the gate focused on business logic - Add ~12 new test files covering models, drivers, controllers, jobs, auth flows, request validators, and the IP CIDR helper - Fix Support\Ip::inNetwork PHP 8.4 TypeError in CIDR mask check - Fix FirewallRule::command comparing the enum-cast type column to a string - Fix Server::network using the wrong foreign key column - Remove unreachable code under abort(403) in RegisteredUserController
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
<script setup>
|
||||
import InputError from '@/components/InputError.vue';
|
||||
import { Button } from '@/components/ui/button';
|
||||
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
|
||||
import { Input } from '@/components/ui/input';
|
||||
import { Label } from '@/components/ui/label';
|
||||
import AppLayout from '@/layouts/AppLayout.vue';
|
||||
import { Head, useForm } from '@inertiajs/vue3';
|
||||
import { AlertTriangleIcon } from 'lucide-vue-next';
|
||||
import InputError from "@/components/InputError.vue";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Label } from "@/components/ui/label";
|
||||
import AppLayout from "@/layouts/AppLayout.vue";
|
||||
import { Head, useForm } from "@inertiajs/vue3";
|
||||
import { AlertTriangleIcon } from "lucide-vue-next";
|
||||
|
||||
const props = defineProps({
|
||||
server: {
|
||||
@@ -24,7 +24,7 @@ const props = defineProps({
|
||||
});
|
||||
|
||||
const form = useForm({
|
||||
image_digest: props.service.available_image_digest ?? props.service.current_image_digest ?? '',
|
||||
image_digest: props.service.available_image_digest ?? props.service.current_image_digest ?? "",
|
||||
backup_requested: false,
|
||||
});
|
||||
</script>
|
||||
@@ -64,18 +64,29 @@ const form = useForm({
|
||||
</div>
|
||||
</CardHeader>
|
||||
<CardContent class="space-y-4">
|
||||
<div class="rounded-md border border-amber-200 bg-amber-50 p-3 text-sm text-amber-950 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100">
|
||||
This update stops the running container, keeps the named Docker volume in place, starts the new image, and then runs a health check.
|
||||
<div
|
||||
class="rounded-md border border-amber-200 bg-amber-50 p-3 text-sm text-amber-950 dark:border-amber-900 dark:bg-amber-950 dark:text-amber-100"
|
||||
>
|
||||
This update stops the running container, keeps the named Docker volume in
|
||||
place, starts the new image, and then runs a health check.
|
||||
</div>
|
||||
|
||||
<div class="grid gap-2">
|
||||
<Label for="image_digest">Image digest</Label>
|
||||
<Input id="image_digest" v-model="form.image_digest" placeholder="sha256:..." />
|
||||
<Input
|
||||
id="image_digest"
|
||||
v-model="form.image_digest"
|
||||
placeholder="sha256:..."
|
||||
/>
|
||||
<InputError :message="form.errors.image_digest" />
|
||||
</div>
|
||||
|
||||
<label v-if="backupAvailable" class="flex items-center gap-2 text-sm">
|
||||
<input v-model="form.backup_requested" type="checkbox" class="size-4 rounded border-input" />
|
||||
<input
|
||||
v-model="form.backup_requested"
|
||||
type="checkbox"
|
||||
class="size-4 rounded border-input"
|
||||
/>
|
||||
Run configured backup first
|
||||
</label>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user