chore(release): prepare public source release

This commit is contained in:
MercuryToolbox Release
2026-07-18 15:33:01 +08:00
commit 34d6a57f38
510 changed files with 163501 additions and 0 deletions
+28
View File
@@ -0,0 +1,28 @@
[package]
name = "reposhape"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
authors.workspace = true
readme.workspace = true
publish.workspace = true
description = "Summarize repository trees into compact file, size, and extension stats."
keywords.workspace = true
categories.workspace = true
[lints]
workspace = true
[dependencies]
configsupport = { path = "../configsupport" }
ignore.workspace = true
lexopt.workspace = true
serde.workspace = true
serde_json.workspace = true
toml = "0.8.23"
[dev-dependencies]
assert_cmd.workspace = true
predicates.workspace = true
tempfile.workspace = true
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +1,5 @@
//! Binary entry point for `reposhape`.
fn main() {
std::process::exit(reposhape::main_entry());
}
+189
View File
@@ -0,0 +1,189 @@
//! Integration tests for the `reposhape` command.
use std::fs;
use assert_cmd::Command;
use predicates::prelude::*;
use tempfile::tempdir;
fn cargo_command() -> Command {
Command::cargo_bin("reposhape").expect("binary")
}
#[test]
fn detects_multiple_ecosystems_and_grouped_sections_as_json() {
let temp = tempdir().expect("tempdir");
fs::create_dir_all(temp.path().join("src")).expect("src");
fs::create_dir_all(temp.path().join(".github").join("workflows")).expect("workflows");
fs::create_dir_all(temp.path().join("cmd").join("server")).expect("go cmd");
fs::create_dir_all(temp.path().join("app")).expect("app");
fs::write(temp.path().join("Cargo.toml"), "[package]\nname=\"demo\"\n").expect("cargo");
fs::write(temp.path().join("src").join("main.rs"), "fn main() {}\n").expect("main");
fs::write(
temp.path().join("package.json"),
"{\"scripts\":{\"build\":\"tsc\",\"test\":\"vitest\"},\"main\":\"index.js\"}",
)
.expect("package");
fs::write(temp.path().join("pnpm-lock.yaml"), "lockfileVersion: '9.0'").expect("lock");
fs::write(
temp.path().join("pyproject.toml"),
"[project]\nname=\"demo\"\n[project.scripts]\nserve=\"demo:main\"\n",
)
.expect("pyproject");
fs::write(temp.path().join("requirements.txt"), "pytest\n").expect("requirements");
fs::write(
temp.path().join("go.mod"),
"module example.com/demo\n\ngo 1.22\n",
)
.expect("go");
fs::write(
temp.path().join("cmd").join("server").join("main.go"),
"package main\nfunc main(){}\n",
)
.expect("go main");
fs::write(
temp.path().join("CMakeLists.txt"),
"cmake_minimum_required(VERSION 3.20)\n",
)
.expect("cmake");
fs::write(
temp.path().join("Makefile"),
"build:\n\t@echo build\ntest:\n\t@echo test\n",
)
.expect("make");
fs::write(
temp.path().join("demo.sln"),
"Microsoft Visual Studio Solution File\n",
)
.expect("sln");
fs::write(
temp.path().join("app").join("demo.csproj"),
"<Project Sdk=\"Microsoft.NET.Sdk\" />\n",
)
.expect("csproj");
fs::write(
temp.path().join(".github").join("workflows").join("ci.yml"),
"name: ci\non: [push]\n",
)
.expect("workflow");
let mut command = cargo_command();
command
.arg("--json")
.arg(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("\"ecosystems\""))
.stdout(predicate::str::contains("\"manifests\""))
.stdout(predicate::str::contains("\"commands\""))
.stdout(predicate::str::contains("\"entrypoints\""))
.stdout(predicate::str::contains("\"ci\""))
.stdout(predicate::str::contains("\"name\":\"cargo\""))
.stdout(predicate::str::contains("\"name\":\"pnpm\""))
.stdout(predicate::str::contains("\"name\":\"python\""))
.stdout(predicate::str::contains("\"name\":\"dotnet\""))
.stdout(predicate::str::contains("\"name\":\"go\""))
.stdout(predicate::str::contains("\"name\":\"cmake\""))
.stdout(predicate::str::contains("\"name\":\"make\""))
.stdout(predicate::str::contains("\"provider\":\"github_actions\""));
}
#[test]
fn help_includes_grouped_output_language() {
let mut command = cargo_command();
command
.arg("--help")
.assert()
.success()
.stdout(predicate::str::contains("--max-depth"))
.stdout(predicate::str::contains("ecosystems"))
.stdout(predicate::str::contains("reposhape"));
}
#[test]
fn max_depth_limits_nested_package_detection() {
let temp = tempdir().expect("tempdir");
fs::create_dir_all(temp.path().join("src")).expect("src");
fs::create_dir_all(temp.path().join("deep")).expect("deep");
fs::write(temp.path().join("Cargo.toml"), "[package]\nname=\"demo\"\n").expect("cargo");
fs::write(temp.path().join("src").join("main.rs"), "fn main() {}\n").expect("main");
fs::write(
temp.path().join("deep").join("package.json"),
"{\"scripts\":{\"build\":\"tsc\"}}",
)
.expect("package");
let mut shallow = cargo_command();
shallow
.arg("--json")
.arg("--max-depth")
.arg("1")
.arg(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("\"name\":\"cargo\""))
.stdout(predicate::str::contains("\"kind\":\"package_json\"").not());
let mut deep = cargo_command();
deep.arg("--json")
.arg("--max-depth")
.arg("4")
.arg(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("\"kind\":\"package_json\""))
.stdout(predicate::str::contains("deep"));
}
#[test]
fn hidden_flag_controls_hidden_workspace_detection() {
let temp = tempdir().expect("tempdir");
fs::create_dir_all(temp.path().join("src")).expect("src");
fs::create_dir_all(temp.path().join(".hidden")).expect("hidden");
fs::write(temp.path().join("Cargo.toml"), "[package]\nname=\"demo\"\n").expect("cargo");
fs::write(temp.path().join("src").join("main.rs"), "fn main() {}\n").expect("main");
fs::write(
temp.path().join(".hidden").join("package.json"),
"{\"scripts\":{\"test\":\"vitest\"}}",
)
.expect("package");
let mut without_hidden = cargo_command();
without_hidden
.arg("--json")
.arg(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("\"kind\":\"package_json\"").not());
let mut with_hidden = cargo_command();
with_hidden
.arg("--json")
.arg("--hidden")
.arg(temp.path())
.assert()
.success()
.stdout(predicate::str::contains("\"kind\":\"package_json\""))
.stdout(predicate::str::contains("hidden"));
}
#[test]
fn cli_surfaces_invalid_depth_and_missing_path_errors() {
let mut invalid_depth = cargo_command();
invalid_depth
.arg("--max-depth")
.arg("nope")
.assert()
.failure()
.stderr(predicate::str::contains("invalid --max-depth value"));
let temp = tempdir().expect("tempdir");
let missing = temp.path().join("does-not-exist");
let mut missing_path = cargo_command();
missing_path
.arg(missing)
.assert()
.failure()
.stderr(predicate::str::contains("repository path does not exist"));
}