Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

On macOS, files cp writes are not recorded as outputs, although fspy swaps cp for its bundled coreutils

未关闭
#910 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
56/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
rust
领域
backend

调研方向

Start with crates/fspy_shared_unix/src/spawn/macos.rs and the linked COREUTILS_FUNCTIONS entry, then trace how the preload records filesystem reads and writes. Check interception coverage for clonefile, clonefileat, fclonefileat, and copyfile; reproduce with the cp task described in the issue. Done means copied destinations are recorded as outputs and restored on a cache hit.

由索引模型根据 Issue 内容生成。

描述

Written by an AI agent (Claude) on behalf of @jasonkuhrt.

Problem

On macOS, a task that copies files into place with cp gets a cache entry without them, so a cache hit restores nothing.

fspy already swaps /bin/cp for its bundled coreutils so that copies can be tracked (spawn/macos.rs, COREUTILS_FUNCTIONS), and the swap does happen: inside vp run, cp --version prints cp (uutils coreutils) 0.4.0. But cp's writes still aren't recorded, while those of other swapped tools are.

Reproduction on vite-plus 1.4.0, macOS, APFS, with no remote cache:

// vite.config.ts
import { defineConfig } from 'vite-plus';

export default defineConfig({
  run: {
    tasks: {
      generate: {
        command: 'node generate.mjs',
        cache: { input: ['generate.mjs'] },
      },
    },
  },
});
// generate.mjs: makes a file in the OS temp folder, then copies it into place
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
import { execFileSync } from 'node:child_process';
import { tmpdir } from 'node:os';
import { join } from 'node:path';

const t = mkdtempSync(join(tmpdir(), 'gen-'));
writeFileSync(join(t, 'a.ts'), 'export const a = 1;\n');
rmSync('generated', { recursive: true, force: true });
mkdirSync('generated');
execFileSync('cp', [join(t, 'a.ts'), 'generated/a.ts']);
$ vp run generate        # generated/a.ts now exists
$ ls node_modules/.vite/task-cache/v18/*.tar.zst
ls: no matches found     # no output archive was stored
$ rm -rf generated
$ vp run generate
vp run: cache hit, 103ms saved.
$ ls generated
ls: generated: No such file or directory

The same task, with only the line that puts generated/a.ts in place changed:

How generated/a.ts gets there Recorded as output
fs.copyFileSync (Node) yes
sh -c 'cat "$0" > generated/a.ts' (swapped shell) yes
mkdir + touch (swapped coreutils) yes
Homebrew python3 shutil.copytree yes
cp src generated/a.ts (swapped coreutils) no
cp -R src_dir generated no
cp -R --reflink=never src_dir generated no

Cause

The swapped cp creates its destination with clonefile(src, dst, 0), which the preload doesn't intercept; std::fs::copy's fallback, fclonefileat, isn't intercepted either. Evidence and experiments: see the first comment.

Proposal

Record the source of the macOS clone and copy calls as a read and the destination as a write: clonefile, clonefileat, fclonefileat, and copyfile. That fixes the swapped cp, and any other tool that copies the same way.

Related: #908 (files renamed into place aren't recorded either).

主要语言
Rust
星标
480
派生
50
平均合并
1 天 5 小时
30 天内合并 PR
63

环境准备

在 Codespaces 中打开

在浏览器里用你自己的 GitHub 账号启动这个项目的开发容器。

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

voidzero-dev/vite-task 的其他 Issue

查看 voidzero-dev/vite-task 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。