Skip to content

Commit e2486dd

Browse files
jj811208merceyz
authored andcommitted
feat(fslib): add fchown support (#4801)
1 parent 14fca86 commit e2486dd

File tree

15 files changed

+950
-640
lines changed

15 files changed

+950
-640
lines changed

.pnp.cjs

Lines changed: 827 additions & 634 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.yarn/versions/62ea7f20.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
releases:
2+
"@yarnpkg/cli": patch
3+
"@yarnpkg/fslib": minor
4+
"@yarnpkg/pnp": patch
5+
"@yarnpkg/pnpify": patch
6+
7+
declined:
8+
- "@yarnpkg/plugin-compat"
9+
- "@yarnpkg/plugin-constraints"
10+
- "@yarnpkg/plugin-dlx"
11+
- "@yarnpkg/plugin-essentials"
12+
- "@yarnpkg/plugin-exec"
13+
- "@yarnpkg/plugin-file"
14+
- "@yarnpkg/plugin-git"
15+
- "@yarnpkg/plugin-github"
16+
- "@yarnpkg/plugin-init"
17+
- "@yarnpkg/plugin-interactive-tools"
18+
- "@yarnpkg/plugin-link"
19+
- "@yarnpkg/plugin-nm"
20+
- "@yarnpkg/plugin-npm"
21+
- "@yarnpkg/plugin-npm-cli"
22+
- "@yarnpkg/plugin-pack"
23+
- "@yarnpkg/plugin-patch"
24+
- "@yarnpkg/plugin-pnp"
25+
- "@yarnpkg/plugin-pnpm"
26+
- "@yarnpkg/plugin-stage"
27+
- "@yarnpkg/plugin-typescript"
28+
- "@yarnpkg/plugin-version"
29+
- "@yarnpkg/plugin-workspace-tools"
30+
- vscode-zipfs
31+
- "@yarnpkg/builder"
32+
- "@yarnpkg/core"
33+
- "@yarnpkg/doctor"
34+
- "@yarnpkg/nm"
35+
- "@yarnpkg/sdks"
36+
- "@yarnpkg/shell"

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ Yarn now accepts sponsorships! Please give a look at our [OpenCollective](https:
88

99
## Master
1010

11+
## 3.2.4
12+
13+
### Compatibility
14+
15+
- The patched filesystem now supports `fchown`.
16+
1117
## 3.2.3
1218

1319
### Bugfixes

packages/yarnpkg-core/sources/worker-zip/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/yarnpkg-fslib/sources/FakeFS.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ export abstract class FakeFS<P extends Path> {
216216
abstract fchmodPromise(fd: number, mask: number): Promise<void>;
217217
abstract fchmodSync(fd: number, mask: number): void;
218218

219+
abstract fchownPromise(fd: number, uid: number, gid: number): Promise<void>;
220+
abstract fchownSync(fd: number, uid: number, gid: number): void;
221+
219222
abstract chownPromise(p: P, uid: number, gid: number): Promise<void>;
220223
abstract chownSync(p: P, uid: number, gid: number): void;
221224

packages/yarnpkg-fslib/sources/NoFS.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ export class NoFS extends FakeFS<PortablePath> {
142142
throw makeError();
143143
}
144144

145+
async fchownPromise(): Promise<never> {
146+
throw makeError();
147+
}
148+
149+
fchownSync(): never {
150+
throw makeError();
151+
}
152+
145153
async chownPromise(): Promise<never> {
146154
throw makeError();
147155
}

packages/yarnpkg-fslib/sources/NodeFS.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,16 @@ export class NodeFS extends BasePortableFakeFS {
262262
return this.realFs.chmodSync(npath.fromPortablePath(p), mask);
263263
}
264264

265+
async fchownPromise(fd: number, uid: number, gid: number): Promise<void> {
266+
return await new Promise<void>((resolve, reject) => {
267+
this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject));
268+
});
269+
}
270+
271+
fchownSync(fd: number, uid: number, gid: number): void {
272+
return this.realFs.fchownSync(fd, uid, gid);
273+
}
274+
265275
async chownPromise(p: PortablePath, uid: number, gid: number) {
266276
return await new Promise<void>((resolve, reject) => {
267277
this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject));

packages/yarnpkg-fslib/sources/ProxiedFS.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,14 @@ export abstract class ProxiedFS<P extends Path, IP extends Path> extends FakeFS<
182182
return this.baseFs.chmodSync(this.mapToBase(p), mask);
183183
}
184184

185+
async fchownPromise(fd: number, uid: number, gid: number): Promise<void> {
186+
return this.baseFs.fchownPromise(fd, uid, gid);
187+
}
188+
189+
fchownSync(fd: number, uid: number, gid: number): void {
190+
return this.baseFs.fchownSync(fd, uid, gid);
191+
}
192+
185193
async chownPromise(p: P, uid: number, gid: number) {
186194
return this.baseFs.chownPromise(this.mapToBase(p), uid, gid);
187195
}

packages/yarnpkg-fslib/sources/ZipFS.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,14 @@ export class ZipFS extends BasePortableFakeFS {
10601060
}
10611061
}
10621062

1063+
async fchownPromise(fd: number, uid: number, gid: number): Promise<void> {
1064+
return this.chownPromise(this.fdToPath(fd, `fchown`), uid, gid);
1065+
}
1066+
1067+
fchownSync(fd: number, uid: number, gid: number): void {
1068+
return this.chownSync(this.fdToPath(fd, `fchownSync`), uid, gid);
1069+
}
1070+
10631071
async chownPromise(p: PortablePath, uid: number, gid: number) {
10641072
return this.chownSync(p, uid, gid);
10651073
}

packages/yarnpkg-fslib/sources/ZipOpenFS.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,30 @@ export class ZipOpenFS extends BasePortableFakeFS {
516516
});
517517
}
518518

519+
async fchownPromise(fd: number, uid: number, gid: number): Promise<void> {
520+
if ((fd & ZIP_MASK) !== ZIP_MAGIC)
521+
return this.baseFs.fchownPromise(fd, uid, gid);
522+
523+
const entry = this.fdMap.get(fd);
524+
if (typeof entry === `undefined`)
525+
throw errors.EBADF(`fchown`);
526+
527+
const [zipFs, realFd] = entry;
528+
return zipFs.fchownPromise(realFd, uid, gid);
529+
}
530+
531+
fchownSync(fd: number, uid: number, gid: number): void {
532+
if ((fd & ZIP_MASK) !== ZIP_MAGIC)
533+
return this.baseFs.fchownSync(fd, uid, gid);
534+
535+
const entry = this.fdMap.get(fd);
536+
if (typeof entry === `undefined`)
537+
throw errors.EBADF(`fchownSync`);
538+
539+
const [zipFs, realFd] = entry;
540+
return zipFs.fchownSync(realFd, uid, gid);
541+
}
542+
519543
async chownPromise(p: PortablePath, uid: number, gid: number) {
520544
return await this.makeCallPromise(p, async () => {
521545
return await this.baseFs.chownPromise(p, uid, gid);

0 commit comments

Comments
 (0)