From 8c37b8a932aafdfefa98c0e81fad05372ed0b20a Mon Sep 17 00:00:00 2001 From: JGZYES Date: Tue, 1 Sep 2026 20:46:10 +0800 Subject: [PATCH] mirrors: auto-generate default mirror.ini with sz+main mirrors when missing (v0.2.6) --- src/main.c | 2 ++ src/mirrors.c | 23 +++++++++++++++++++++++ src/mirrors.h | 2 ++ 3 files changed, 27 insertions(+) diff --git a/src/main.c b/src/main.c index b38043f..8dd0272 100644 --- a/src/main.c +++ b/src/main.c @@ -29,6 +29,7 @@ #include "repo.h" #include "install.h" #include "pdm.h" +#include "mirrors.h" typedef struct { char *registry_url; /* package registry base URL */ @@ -90,6 +91,7 @@ static const char *mirror_section_name(void) { static void load_mirror(PmmConfig *cfg, MirrorSel *sel) { char dir[1024]; pmm_config_dir(dir, sizeof(dir)); + pmm_ensure_default_mirror(dir); memset(sel, 0, sizeof(*sel)); char *path = pmm_find_config(dir, "mirror"); if (!path) return; diff --git a/src/mirrors.c b/src/mirrors.c index 94c8861..3175066 100644 --- a/src/mirrors.c +++ b/src/mirrors.c @@ -23,9 +23,32 @@ static int cmp_priority(const void *a, const void *b) { return ma->priority - mb->priority; } +/* Write a default mirror.ini (built-in sz + main mirror) when no mirror + * config exists, so a fresh install works out-of-the-box from both mirrors. */ +void pmm_ensure_default_mirror(const char *dir) { + if (pmm_find_config(dir, "mirror")) return; /* user already has a config */ + char path[1200]; + snprintf(path, sizeof(path), "%s/mirror.ini", dir); + FILE *f = fopen(path, "w"); + if (!f) return; + fputs("# PMM default mirror.ini (auto-generated)\n" + "# priority 越小越优先;default=true 为未显式指定时的默认镜像。\n" + "#\n" + "[sz]\n" + "registry = https://sz.pmm.parlz.com/mirror/packages\n" + "priority = 1\n" + "default = true\n" + "\n" + "[main]\n" + "registry = https://pmm.parlz.com/mirror/packages\n" + "priority = 20\n", f); + fclose(f); +} + MirrorList *mirrors_load(void) { char dir[1024]; pmm_config_dir(dir, sizeof(dir)); + pmm_ensure_default_mirror(dir); char *path = pmm_find_config(dir, "mirror"); if (!path) return calloc(1, sizeof(MirrorList)); Ini *ini = ini_load(path); diff --git a/src/mirrors.h b/src/mirrors.h index 1fc0f6c..1aa68ce 100644 --- a/src/mirrors.h +++ b/src/mirrors.h @@ -18,6 +18,8 @@ typedef struct { /* Load mirrors from ~/.pmm/mirror.ini / mirror.conf, sorted by priority. */ MirrorList *mirrors_load(void); void mirrors_free(MirrorList *list); +/* If no mirror config exists, write a default mirror.ini (sz + main). */ +void pmm_ensure_default_mirror(const char *dir); /* Mirror whose name matches the active selection in pmm config, or NULL. */ Mirror *mirrors_active(const MirrorList *list, const char *active_name);