Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

`third-party-licenses` fails on Windows when the parent process is PowerShell

未關閉 適合新手
#4,745 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

@sahilshingate01 已經在處理了。

開始於 2026年10月22日。

  • #4775 來自 @sahilshingate01 —— 未關閉

評估

難度
2/5
預估耗時
1-3 小時
新手友好度
76/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
powershell, rust

研究方向

從 tools/third-party-licenses/src/cargo.rs 開始,尤其是 run(),追蹤它如何呼叫 cargo about 並解析輸出。從 PowerShell 執行重現命令;當授權 JSON 成功讀取,且 PowerShell 是祖先程序時工具能成功執行,即表示完成。

由索引模型根據 Issue 內容生成。

描述

Summary

tools/third-party-licenses runs cargo about generate --format json --locked and parses stdout. On Windows, if PowerShell appears anywhere in the parent process chain, cargo-about refuses to write JSON to stdout and exits with an error telling you to use -o / --output-file.

That breaks cargo run desktop (and any CI/agent that launches the build from PowerShell), even though cargo-about itself is installed and works when given an output file.

Environment

  • OS: Windows 10/11
  • Shell: PowerShell 5.1 / PowerShell 7 (also fails when an ancestor is PowerShell, e.g. Cursor/VS Code terminal, cargo-run spawned from pwsh)
  • cargo-about 0.9.x (behavior from EmbarkStudios/cargo-about#198 / PR that added is_powershell_parent())

Steps to reproduce

  1. On Windows, open PowerShell in a Graphite checkout.
  2. Ensure cargo-about is on PATH.
  3. Run:
cargo run -p third-party-licenses --features desktop

(or the same step via cargo run desktop)

Expected

License JSON is generated and the tool succeeds.

Actual

cargo about generate fails roughly with:

cargo-about should not redirect its output in powershell

(or similar wording pointing at -o, --output-file). Redirecting/piping from the Graphite side does not help: the check walks ancestor processes, so Command::output() capturing stdout is enough to trigger it whenever PowerShell is an ancestor.

Root cause

Current code in tools/third-party-licenses/src/cargo.rs (run()):

Command::new("cargo")
    .args(["about", "generate", "--format", "json", "--locked"])
    // … reads output.stdout

cargo-about intentionally blocks stdout under PowerShell (UTF-16 / encoding footgun). The supported API is writing to a file with -o.

Suggested fix

Write to a temp file with -o, then read and parse that file (delete afterward). Minimal patch:

fn run() -> Result<Output, Error> {
	let out_path = std::env::temp_dir().join(format!("graphite-about-{}.json", std::process::id()));
	let output = Command::new("cargo")
		.args([
			"about",
			"generate",
			"--format",
			"json",
			"--locked",
			"-o",
			out_path.to_str().ok_or_else(|| Error::Command("about output path is not UTF-8".into()))?,
		])
		.current_dir(env!("CARGO_WORKSPACE_DIR"))
		.output()
		.map_err(|e| Error::Io(e, "Failed to run cargo about generate".into()))?;

	if !output.status.success() {
		let _ = std::fs::remove_file(&out_path);
		return Err(Error::Command(format!(
			"cargo about generate failed:\n{}",
			String::from_utf8_lossy(&output.stderr)
		)));
	}

	let json = std::fs::read_to_string(&out_path).map_err(|e| Error::Io(e, format!("reading {}", out_path.display())))?;
	let _ = std::fs::remove_file(&out_path);

	serde_json::from_str(&json).map_err(|e| Error::Json(e, "Failed to parse cargo about generate JSON".into()))
}

This is also slightly more robust on non-Windows hosts (no reliance on capturing a large JSON blob from a pipe).

Workaround (today)

# Skip the failing step and continue the desktop bundle, or invoke about with -o manually:
cargo about generate --format json --locked -o $env:TEMP\about.json

References

  • EmbarkStudios/cargo-about#198 (PowerShell / stdout encoding; led to rejecting stdout under PowerShell)
  • Graphite call site: tools/third-party-licenses/src/cargo.rs → run()
  • Invoked from desktop flow: cargo run desktop → third-party-licenses with --features desktop
主要語言
Rust
星號
27.7k
分支
1.3k
平均合併
14 小時 57 分鐘
30 天內合併 PR
151

環境準備

在 Codespaces 中開啟

在瀏覽器裡用你自己的 GitHub 帳號啟動這個專案的開發容器。

  • 沒有 Dockerfile 或 Docker Compose 檔案
  • 有 Pull Request 範本
  • 沒有貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

GraphiteEditor/Graphite 的其他 Issue

查看 GraphiteEditor/Graphite 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。