@feng0531/dsh-vcs 0.4.9 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/dist/client.js +3 -3
- package/dist/editor.js +59 -59
- package/dist/frontend.json +1 -1
- package/dist/interface.js +3 -3
- package/dist/svn-host.mjs +1 -1
- package/docs/RELEASING.md +41 -9
- package/git-history.mjs +6 -1
- package/index.mjs +313 -120
- package/local-command.mjs +58 -25
- package/package.json +11 -3
- package/src/commit-signature.mjs +26 -13
- package/src/historical-access.mjs +139 -0
- package/src/operation-budget.mjs +44 -0
- package/src/preview-capabilities.mjs +19 -0
- package/vcs.mjs +225 -167
- package/workspace-large-text.mjs +4 -3
package/workspace-large-text.mjs
CHANGED
|
@@ -3,6 +3,7 @@ import {constants} from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import {confined} from './repository-path.mjs';
|
|
5
5
|
import {MAX_LARGE_TEXT,decodeLargeText} from './text-content.mjs';
|
|
6
|
+
const changed=message=>Object.assign(Error(message),{code:'vcs/selection-changed'});
|
|
6
7
|
const fingerprint=s=>[s.dev,s.ino,s.size,s.mtimeNs,s.ctimeNs].map(String).join(':');
|
|
7
8
|
|
|
8
9
|
/** Read complete bounded text, retaining a final named-path verification. No writes. */
|
|
@@ -19,13 +20,13 @@ export async function readWorkspaceLargeText(root,file,signal,budget){
|
|
|
19
20
|
const target=await resolve(),before=await fs.lstat(target,{bigint:true});
|
|
20
21
|
if(!before.isFile())throw Error('Large workspace comparison requires a regular file');
|
|
21
22
|
if(before.size>BigInt(MAX_LARGE_TEXT))throw Error('Large comparison exceeds 8 MiB per side');
|
|
22
|
-
const verify=async()=>{await resolve();const named=await fs.lstat(target,{bigint:true});if(!named.isFile()||named.isSymbolicLink()||fingerprint(named)!==fingerprint(before))throw
|
|
23
|
+
const verify=async()=>{await resolve();const named=await fs.lstat(target,{bigint:true});if(!named.isFile()||named.isSymbolicLink()||fingerprint(named)!==fingerprint(before))throw changed('Working file changed; refresh repository status');check();};
|
|
23
24
|
const handle=await fs.open(target,constants.O_RDONLY|(constants.O_NOFOLLOW||0));
|
|
24
25
|
try{
|
|
25
|
-
const opened=await handle.stat({bigint:true});if(!opened.isFile()||fingerprint(opened)!==fingerprint(before))throw
|
|
26
|
+
const opened=await handle.stat({bigint:true});if(!opened.isFile()||fingerprint(opened)!==fingerprint(before))throw changed('Working file changed during open');
|
|
26
27
|
const buffer=Buffer.alloc(Number(before.size)+1);let offset=0;
|
|
27
28
|
while(offset<buffer.length){check();const result=await handle.read(buffer,offset,buffer.length-offset,offset);if(!result.bytesRead)break;offset+=result.bytesRead;}
|
|
28
|
-
check();if(offset!==Number(before.size)||fingerprint(await handle.stat({bigint:true}))!==fingerprint(before))throw
|
|
29
|
+
check();if(offset!==Number(before.size)||fingerprint(await handle.stat({bigint:true}))!==fingerprint(before))throw changed('Working file changed during read');
|
|
29
30
|
await verify();const value=decodeLargeText(buffer.subarray(0,offset),signal);await verify();
|
|
30
31
|
return {value,verify};
|
|
31
32
|
}finally{await handle.close();}
|