From 21534939f9fcc1065f4877467387605350f7ca07 Mon Sep 17 00:00:00 2001 From: JGZYES Date: Sun, 6 Sep 2026 12:32:24 +0800 Subject: [PATCH] =?UTF-8?q?release:=20ppdm=20v0.0.1=20+=20PMM=20v0.5.5=20?= =?UTF-8?q?=E2=80=94=20bundle=20ppdm=20dev=20tool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/ppdm.c: own PPDM_VERSION (0.0.1, overridable) + 'ppdm -v'; rename pmu->ppdm with pack/update commands (see previous commit). - release.yml: build ppdm with -DPPDM_VERSION=\"0.0.1\" (own version, independent of PMM). - PMM site version -> 0.5.5 (this release also ships the ppdm 0.0.1 asset). - CHANGELOG/0.5.5.md. --- .github/workflows/release.yml | 4 +- CHANGELOG/0.5.5.md | 14 +++++ src/ppdm.c | 101 +++++++++++++++++++++++----------- web/_common.php | 2 +- web/docs/md/download.md | 14 ++--- web/docs/md/install.md | 8 +-- web/download/install.sh | 2 +- web/install.sh | 2 +- 8 files changed, 100 insertions(+), 47 deletions(-) create mode 100644 CHANGELOG/0.5.5.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f5135e2..499b408 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -56,8 +56,8 @@ jobs: ${{ matrix.cc }} -O2 -Wall -static -std=c11 -D_GNU_SOURCE -D_FORTIFY_SOURCE=0 -U_FORTIFY_SOURCE -DPMM_VERSION=\"$VER\" -o out/${{ matrix.bin }} \ src/main.c src/json.c src/ini.c src/pmm.c src/http.c src/repo.c src/install.c \ src/sha256.c src/sha1.c src/mirrors.c src/pdm.c src/out.c src/i18n.c - # -- ppdm package dev tool (register/login/update/pack/publish) - ${{ matrix.cc }} -O2 -Wall -static -std=c11 -D_GNU_SOURCE -D_FORTIFY_SOURCE=0 -U_FORTIFY_SOURCE -o out/ppdm${{ matrix.ext }} \ + # -- ppdm package dev tool (register/login/update/pack/publish) — own version 0.0.1 + ${{ matrix.cc }} -O2 -Wall -static -std=c11 -D_GNU_SOURCE -D_FORTIFY_SOURCE=0 -U_FORTIFY_SOURCE -DPPDM_VERSION=\"0.0.1\" -o out/ppdm${{ matrix.ext }} \ src/ppdm.c src/pmm.c src/json.c src/ini.c src/http.c src/repo.c src/install.c \ src/sha256.c src/sha1.c src/mirrors.c src/pdm.c src/out.c src/i18n.c diff --git a/CHANGELOG/0.5.5.md b/CHANGELOG/0.5.5.md new file mode 100644 index 0000000..7ca566c --- /dev/null +++ b/CHANGELOG/0.5.5.md @@ -0,0 +1,14 @@ +# PMM v0.5.5 + +## 新增:ppdm (ParlzPackageDevManager) v0.0.1 +独立的开发/发布工具,随本 release 一并产出(资产 `ppdm` / `ppdm.exe`),与 PMM 二进制版本独立。 +- `ppdm register `:注册账号(本地算术人机验证) +- `ppdm login` / `logout` / `whoami` +- `ppdm pack [out]`:把含 `pdm-control` 的目录打包成 `.pdm` +- `ppdm update`:下载最新 ppdm 到 `~/.ppdm/bin/ppdm` +- `ppdm ./xxx.pdm` / `ppdm publish ./xxx.pdm`:发布包(自动生成 json) +- 服务端 `web/ppdm`(默认 `https://pmm.parlz.com/ppdm`),配置 `~/.ppdm/config` + +## 说明 +- ppdm 版本号独立(0.0.1),不受 PMM 版本影响。 +- 原名 `pmu` 已改名为 `ppdm`。 diff --git a/src/ppdm.c b/src/ppdm.c index 4a2871d..6c4292c 100644 --- a/src/ppdm.c +++ b/src/ppdm.c @@ -1,42 +1,49 @@ -/* pmu.c — PMU : package upload / publish client for the PMM registry. +/* ppdm.c — PPDM : package upload / publish client for the PMM registry. * - * pmu register create an account (local arithmetic captcha) - * pmu login log in, store a session token - * pmu logout revoke the stored token - * pmu whoami show logged-in email + server - * pmu ./foo.pdm publish a package (alias: pmu publish ./foo.pdm) - * pmu help | -h + * ppdm register create an account (local arithmetic captcha) + * ppdm login log in, store a session token + * ppdm logout revoke the stored token + * ppdm whoami show logged-in email + server + * ppdm ./foo.pdm publish a package (alias: ppdm publish ./foo.pdm) + * ppdm help | -h * - * Talks to the PHP service under {server}/ (default https://pmm.parlz.com/pmu). - * Config is stored in ~/.pmu/config (Windows: D:\.pmu\config). + * Talks to the PHP service under {server}/ (default https://pmm.parlz.com/ppdm). + * Config is stored in ~/.ppdm/config (Windows: D:\.ppdm\config). */ #include "out.h" #include "sha256.h" +#include "pdm.h" +#include "http.h" +#include "i18n.h" #include #include #include #include +#ifndef PPDM_VERSION +#define PPDM_VERSION "0.0.1" /* ppdm has its own version, independent of PMM */ +#endif + #ifdef _WIN32 #include -#define PMU_MKDIR(p) _mkdir(p) +#define PPDM_MKDIR(p) _mkdir(p) #else #include #include -#define PMU_MKDIR(p) mkdir((p), 0755) +#define PPDM_MKDIR(p) mkdir((p), 0755) #endif static int g_no_color = 0; -static const char *pmu_server_default = "https://pmm.parlz.com/pmu"; +static const char *ppdm_server_default = "https://pmm.parlz.com/ppdm"; -/* ---- config dir / file: ~/.pmu (Windows D:\.pmu) ---- */ -static void pmu_config_dir(char *buf, size_t sz) { +/* ---- config dir / file: ~/.ppdm (Windows D:\.ppdm) ---- */ +static void ppdm_config_dir(char *buf, size_t sz) { #ifdef _WIN32 - snprintf(buf, sz, "D:\\.pmu"); + snprintf(buf, sz, "D:\\.ppdm"); #else const char *home = getenv("HOME"); - snprintf(buf, sz, "%s/.pmu", home && *home ? home : "."); + snprintf(buf, sz, "%s/.ppdm", home && *home ? home : "."); #endif } @@ -47,10 +54,10 @@ static char g_email[256] = ""; static void cfg_init(void) { char dir[1024]; - pmu_config_dir(dir, sizeof(dir)); - PMU_MKDIR(dir); + ppdm_config_dir(dir, sizeof(dir)); + PPDM_MKDIR(dir); snprintf(g_cfg, sizeof(g_cfg), "%s/config", dir); - snprintf(g_server, sizeof(g_server), "%s", pmu_server_default); + snprintf(g_server, sizeof(g_server), "%s", ppdm_server_default); FILE *f = fopen(g_cfg, "r"); if (f) { char line[2400]; @@ -191,15 +198,17 @@ static void pdm_meta(const char *path, char *pkg, size_t pkgsz, } static void usage(void) { - printf("pmu — 发布 PMM 包\n\n" + printf("ppdm — 发布/打包 PMM 包\n\n" "用法:\n" - " pmu register 注册账号(本地算术人机验证)\n" - " pmu login 登录并保存 token\n" - " pmu logout 撤销并清除本地 token\n" - " pmu whoami 当前登录邮箱 + 服务器\n" - " pmu ./xxxx.pdm 发布包(自动生成 json)\n" - " pmu help | -h 帮助\n\n" - "服务端默认: %s (可用 pmu 配置 server= 覆盖)\n", pmu_server_default); + " ppdm register 注册账号(本地算术人机验证)\n" + " ppdm login 登录并保存 token\n" + " ppdm logout 撤销并清除本地 token\n" + " ppdm whoami 当前登录邮箱 + 服务器\n" + " ppdm pack [out] 把 打包成 .pdm(需含 pdm-control)\n" + " ppdm update 更新 ppdm 自身\n" + " ppdm ./xxxx.pdm 发布包(自动生成 json)\n" + " ppdm help | -h 帮助\n\n" + "服务端默认: %s (可用 ppdm 配置 server= 覆盖)\n", ppdm_server_default); } /* Detect the CPU architecture (used as the registry 'arch' field). */ @@ -229,16 +238,21 @@ static void detect_cpu_arch(char *out, size_t sz) { int main(int argc, char **argv) { g_no_color = getenv("PMM_NO_COLOR") ? 1 : 0; cfg_init(); + pmm_lang_load_active(); /* load the active locale pack or built-in fallback */ if (argc < 2) { usage(); return 1; } if (strcmp(argv[1], "help") == 0 || strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0) { usage(); return 0; } + if (strcmp(argv[1], "version") == 0 || strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) { + printf("ppdm %s\n", PPDM_VERSION); + return 0; + } char resp[8192]; char url[2300], auth[256] = ""; /* ---- register ---- */ if (strcmp(argv[1], "register") == 0) { - if (argc < 4) { pmm_error("用法: pmu register \n"); return 1; } + if (argc < 4) { pmm_error("用法: ppdm register \n"); return 1; } const char *email = argv[2], *pass = argv[3]; if (strchr(email, '\'') || strchr(pass, '\'')) { pmm_error("邮箱/密码不能含单引号\n"); return 1; } if (!captcha()) return 1; @@ -253,7 +267,7 @@ int main(int argc, char **argv) { /* ---- login ---- */ if (strcmp(argv[1], "login") == 0) { - if (argc < 4) { pmm_error("用法: pmu login \n"); return 1; } + if (argc < 4) { pmm_error("用法: ppdm login \n"); return 1; } const char *email = argv[2], *pass = argv[3]; if (strchr(email, '\'') || strchr(pass, '\'')) { pmm_error("邮箱/密码不能含单引号\n"); return 1; } snprintf(url, sizeof(url), "%s/login.php", g_server); @@ -289,12 +303,37 @@ int main(int argc, char **argv) { return 0; } + /* ---- pack [out] : build a .pdm from a staging dir (pdm-control required) ---- */ + if (strcmp(argv[1], "pack") == 0) { + if (argc < 3) { pmm_error("用法: ppdm pack [out]\n"); return 1; } + return pdm_pack(argv[2], argc >= 4 ? argv[3] : NULL) == 0 ? 0 : 1; + } + + /* ---- update : download the latest ppdm and install it under ~/.ppdm/bin/ppdm ---- */ + if (strcmp(argv[1], "update") == 0) { + char dir[1024], bin[1400], tmp[1500]; + ppdm_config_dir(dir, sizeof(dir)); + snprintf(bin, sizeof(bin), "%s/bin/ppdm", dir); + snprintf(tmp, sizeof(tmp), "%s/bin/ppdm.upd", dir); + char bdir[1200]; snprintf(bdir, sizeof(bdir), "%s/bin", dir); + PPDM_MKDIR(bdir); + pmm_info("正在下载最新 ppdm ...\n"); + if (http_download("https://github.com/JGZYES/ParlzPackageManger/releases/latest/download/ppdm", tmp) != 0) { + pmm_error("更新下载失败\n"); return 1; + } + chmod(tmp, 0755); /* ignore result; run-permission is fine on POSIX */ + remove(bin); + if (rename(tmp, bin) != 0) { pmm_error("无法替换 %s\n", bin); return 1; } + pmm_success("已更新到 %s(把 %s 加入 PATH,下次运行即新版)\n", bin, bdir); + return 0; + } + /* ---- publish ./x.pdm (or "publish") ---- */ const char *file = NULL; if (strcmp(argv[1], "publish") == 0) file = argc > 2 ? argv[2] : NULL; else if (strlen(argv[1]) > 4 && strcmp(argv[1] + strlen(argv[1]) - 4, ".pdm") == 0) file = argv[1]; if (file) { - if (!g_token[0]) { pmm_error("请先 pmu login\n"); return 1; } + if (!g_token[0]) { pmm_error("请先 ppdm login\n"); return 1; } char pkg[256], ver[128], arch[64]; pdm_meta(file, pkg, sizeof(pkg), ver, sizeof(ver), arch, sizeof(arch)); if (!pkg[0] || !ver[0]) { pmm_error("无法解析 %s 的 Package/Version\n", file); return 1; } @@ -333,6 +372,6 @@ int main(int argc, char **argv) { return js_ok(resp) ? 0 : 1; } - pmm_error("未知命令: %s (试试 pmu help)\n", argv[1]); + pmm_error("未知命令: %s (试试 ppdm help)\n", argv[1]); return 1; } diff --git a/web/_common.php b/web/_common.php index d9c6a52..7cb5dda 100644 --- a/web/_common.php +++ b/web/_common.php @@ -4,7 +4,7 @@ * then pmm_header($active,$title); ... pmm_footer(); */ if (!defined('PMM_SITE')) { http_response_code(403); exit('forbidden'); } -define('PMM_VERSION', '0.5.4'); +define('PMM_VERSION', '0.5.5'); function pmm_nav_links(string $active): string { $items = [ diff --git a/web/docs/md/download.md b/web/docs/md/download.md index a83e948..d23e711 100644 --- a/web/docs/md/download.md +++ b/web/docs/md/download.md @@ -10,21 +10,21 @@ curl -sSL https://pmm.parlz.com/download/install.sh | bash ## 各平台产物(`/download/`) -- [pmm-0.5.4-windows-amd64.zip](/download/pmm-0.5.4-windows-amd64.zip) — Windows 免安装 -- [pmm_0.5.4_amd64.deb](/download/pmm_0.5.4_amd64.deb) — Debian/Ubuntu -- [pmm-0.5.4.x86_64.rpm](/download/pmm-0.5.4.x86_64.rpm) — CentOS/RHEL -- [pmm-0.5.4.apk](/download/pmm-0.5.4.apk) — Alpine -- [pmm-0.5.4.pkg.tar.zst](/download/pmm-0.5.4.pkg.tar.zst) — Arch +- [pmm-0.5.5-windows-amd64.zip](/download/pmm-0.5.5-windows-amd64.zip) — Windows 免安装 +- [pmm_0.5.5_amd64.deb](/download/pmm_0.5.5_amd64.deb) — Debian/Ubuntu +- [pmm-0.5.5.x86_64.rpm](/download/pmm-0.5.5.x86_64.rpm) — CentOS/RHEL +- [pmm-0.5.5.apk](/download/pmm-0.5.5.apk) — Alpine +- [pmm-0.5.5.pkg.tar.zst](/download/pmm-0.5.5.pkg.tar.zst) — Arch - [pmm](/download/pmm) — Linux 二进制 - [pmm.exe](/download/pmm.exe) — Windows 二进制 - [install.sh](/download/install.sh) — 一键安装脚本 -> `.pdm` 包走镜像注册表:`pmm install pmm==0.5.4`(见 [镜像源](index.php?page=mirror))。 +> `.pdm` 包走镜像注册表:`pmm install pmm==0.5.5`(见 [镜像源](index.php?page=mirror))。 ## 用 pmm 安装(从镜像注册表) ```bash -pmm install pmm==0.5.4 +pmm install pmm==0.5.5 pmm install nodejs ``` diff --git a/web/docs/md/install.md b/web/docs/md/install.md index 284d546..8725da3 100644 --- a/web/docs/md/install.md +++ b/web/docs/md/install.md @@ -14,7 +14,7 @@ curl -sSL https://pmm.parlz.com/download/install.sh | bash ```bash # PowerShell -Invoke-WebRequest https://pmm.parlz.com/download/pmm-0.5.4-windows-amd64.zip -OutFile pmm.zip +Invoke-WebRequest https://pmm.parlz.com/download/pmm-0.5.5-windows-amd64.zip -OutFile pmm.zip Expand-Archive pmm.zip -DestinationPath pmm ``` @@ -23,21 +23,21 @@ Expand-Archive pmm.zip -DestinationPath pmm ## Debian / Ubuntu(.deb) ```bash -curl -L -o pmm.deb https://pmm.parlz.com/download/pmm_0.5.4_amd64.deb +curl -L -o pmm.deb https://pmm.parlz.com/download/pmm_0.5.5_amd64.deb sudo apt install ./pmm.deb ``` ## CentOS / RHEL(.rpm) ```bash -curl -L -o pmm.rpm https://pmm.parlz.com/download/pmm-0.5.4.x86_64.rpm +curl -L -o pmm.rpm https://pmm.parlz.com/download/pmm-0.5.5.x86_64.rpm sudo rpm -Uvh pmm.rpm ``` ## 用 pmm 安装 pmm 自身 ```bash -pmm install pmm==0.5.4 +pmm install pmm==0.5.5 ``` ## 装好后 diff --git a/web/download/install.sh b/web/download/install.sh index fe22379..dad71cd 100644 --- a/web/download/install.sh +++ b/web/download/install.sh @@ -8,7 +8,7 @@ # 下载官方 release 二进制并安装到 ~/.pmm/root/bin/pmm(与 `pmm install pmm` 自升级同一路径, # 避免 install.sh 与 pmm self-update 两处安装“串”)。 set -e -VER="0.5.4" +VER="0.5.5" REPO="JGZYES/ParlzPackageManger" # ---- 检测平台 ---- diff --git a/web/install.sh b/web/install.sh index fe22379..dad71cd 100644 --- a/web/install.sh +++ b/web/install.sh @@ -8,7 +8,7 @@ # 下载官方 release 二进制并安装到 ~/.pmm/root/bin/pmm(与 `pmm install pmm` 自升级同一路径, # 避免 install.sh 与 pmm self-update 两处安装“串”)。 set -e -VER="0.5.4" +VER="0.5.5" REPO="JGZYES/ParlzPackageManger" # ---- 检测平台 ----