镜像自地址
https://github.com/JGZYES/ParlzPackageManger.git
已同步 2026-09-11 05:42:44 +08:00
release: ppdm v0.0.1 + PMM v0.5.5 — bundle ppdm dev tool
- 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.
这个提交包含在:
@@ -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
|
||||
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# PMM v0.5.5
|
||||
|
||||
## 新增:ppdm (ParlzPackageDevManager) v0.0.1
|
||||
独立的开发/发布工具,随本 release 一并产出(资产 `ppdm` / `ppdm.exe`),与 PMM 二进制版本独立。
|
||||
- `ppdm register <email> <password>`:注册账号(本地算术人机验证)
|
||||
- `ppdm login` / `logout` / `whoami`
|
||||
- `ppdm pack <dir> [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`。
|
||||
+70
-31
@@ -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 <email> <password> create an account (local arithmetic captcha)
|
||||
* pmu login <email> <password> 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 <email> <password> create an account (local arithmetic captcha)
|
||||
* ppdm login <email> <password> 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifndef PPDM_VERSION
|
||||
#define PPDM_VERSION "0.0.1" /* ppdm has its own version, independent of PMM */
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <direct.h>
|
||||
#define PMU_MKDIR(p) _mkdir(p)
|
||||
#define PPDM_MKDIR(p) _mkdir(p)
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#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 <email> <password> 注册账号(本地算术人机验证)\n"
|
||||
" pmu login <email> <password> 登录并保存 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 <email> <password> 注册账号(本地算术人机验证)\n"
|
||||
" ppdm login <email> <password> 登录并保存 token\n"
|
||||
" ppdm logout 撤销并清除本地 token\n"
|
||||
" ppdm whoami 当前登录邮箱 + 服务器\n"
|
||||
" ppdm pack <dir> [out] 把 <dir> 打包成 .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 <email> <password>\n"); return 1; }
|
||||
if (argc < 4) { pmm_error("用法: ppdm register <email> <password>\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 <email> <password>\n"); return 1; }
|
||||
if (argc < 4) { pmm_error("用法: ppdm login <email> <password>\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 <dir> [out] : build a .pdm from a staging dir (pdm-control required) ---- */
|
||||
if (strcmp(argv[1], "pack") == 0) {
|
||||
if (argc < 3) { pmm_error("用法: ppdm pack <dir> [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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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 = [
|
||||
|
||||
+7
-7
@@ -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
|
||||
```
|
||||
|
||||
|
||||
+4
-4
@@ -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
|
||||
```
|
||||
|
||||
## 装好后
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
# ---- 检测平台 ----
|
||||
|
||||
+1
-1
@@ -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"
|
||||
|
||||
# ---- 检测平台 ----
|
||||
|
||||
在新工单中引用
屏蔽一个用户