@feng0531/dsh-vcs 0.3.70 → 0.3.72
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 +4 -4
- package/dist/client.js +3 -3
- package/image-preview.mjs +11 -6
- package/index.mjs +4 -4
- package/package.json +2 -1
- package/vcs.mjs +42 -9
- package/workspace-large-text.mjs +32 -0
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ profile是DSH的配置和插件环境,不是Session。下面的web是示例,
|
|
|
34
34
|
|
|
35
35
|
在终端执行:
|
|
36
36
|
|
|
37
|
-
dsh plugin --profile web add @feng0531/dsh-vcs@0.3.
|
|
37
|
+
dsh plugin --profile web add @feng0531/dsh-vcs@0.3.72
|
|
38
38
|
|
|
39
39
|
安装后由你自行重启 DSH,再刷新原来的 Web 页面。安装会改变所选 profile;升级前请备份配置。**本项目的发布不会自动升级或重启你的 DSH。**
|
|
40
40
|
|
|
@@ -75,10 +75,10 @@ profile是DSH的配置和插件环境,不是Session。下面的web是示例,
|
|
|
75
75
|
## 目前的限制
|
|
76
76
|
|
|
77
77
|
- **不是完整的 Fork 客户端**:没有仓库写操作,历史图和列表都有容量限制;分支导航只使用本地分支/标签。
|
|
78
|
-
- 普通文本比较每侧最多 **2MiB**。Git提交/A-B
|
|
78
|
+
- 普通文本比较每侧最多 **2MiB**。Git提交/A-B/工作区三个模式比较超限时可手动加载完整UTF-8文本,每侧最多 **8MiB、10万行**,单行最多65536字符;计算超时会明确提示结果不完整。工作区读取期间发生变化会拒绝结果,但不是系统级原子快照;SVN大文件仍不支持。
|
|
79
79
|
- 历史 UTF-8 正文分段最多 **16MiB**;分段阅读不是完整Diff,与上述完整比较是不同功能。
|
|
80
|
-
-
|
|
81
|
-
- 图片支持 PNG、基线 JPEG 和简单静态 VP8 WebP;动画、扩展 WebP 等不支持。
|
|
80
|
+
- 重命名追溯仅沿第一父链,至少50%相似且确认唯一删除源/新增目标;合并、复制、歧义或累计32次确认后停止。
|
|
81
|
+
- 图片支持 PNG、基线 JPEG 和简单静态 VP8/无损VP8L WebP;动画、扩展 WebP 等不支持。
|
|
82
82
|
- 支持 UTF-8、GBK、带 BOM 的 UTF-16;不是通用编码检测器。
|
|
83
83
|
- 取消状态/比较请求不保证立即停止底层进程,进程仍受超时和输出上限控制。
|
|
84
84
|
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
window.__ModuleLoader__.load({ id: "@feng0531/dsh-vcs", factory(require) { var module = { exports: {} }; var exports = module.exports;
|
|
2
|
-
var
|
|
2
|
+
var Kr=Object.create;var ze=Object.defineProperty;var _r=Object.getOwnPropertyDescriptor;var Yr=Object.getOwnPropertyNames;var Qr=Object.getPrototypeOf,Xr=Object.prototype.hasOwnProperty;var $r=(e,t)=>{for(var o in t)ze(e,o,{get:t[o],enumerable:!0})},Rt=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of Yr(t))!Xr.call(e,i)&&i!==o&&ze(e,i,{get:()=>t[i],enumerable:!(r=_r(t,i))||r.enumerable});return e};var R=(e,t,o)=>(o=e!=null?Kr(Qr(e)):{},Rt(t||!e||!e.__esModule?ze(o,"default",{value:e,enumerable:!0}):o,e)),Zr=e=>Rt(ze({},"__esModule",{value:!0}),e);var Ho={};$r(Ho,{apply:()=>Po,inject:()=>Ao});module.exports=Zr(Ho);var s=R(require("react"),1);var ft=`.vcs-root .vcs-discovery{display:flex;flex-wrap:wrap;align-items:center;gap:8px;width:100%}
|
|
3
3
|
.vcs-root .vcs-discovery input{min-width:160px;max-width:100%;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;background:var(--dsw-alias-bg-base);padding:6px 9px}
|
|
4
4
|
.vcs-root .vcs-discovery span{font-size:12px;color:var(--dsw-alias-label-secondary)}
|
|
5
5
|
.vcs-root .vcs-mode{display:flex;align-items:center;gap:6px}
|
|
@@ -92,6 +92,6 @@ var qr=Object.create;var Ie=Object.defineProperty;var Jr=Object.getOwnPropertyDe
|
|
|
92
92
|
.vcs-root .vcs-toolbar{gap:6px}
|
|
93
93
|
.vcs-root .vcs-title{font-size:16px}
|
|
94
94
|
}
|
|
95
|
-
`;function Qt(e,t){return async(o,r,i)=>{let a=await e.rpc.call("/vcs-rpc",o,r,i);if(!a.ok){let p=new Error(a.error?.message||String(a.error||t()));throw p.code=a.error?.code,p}return a.value}}function ut(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,o=[];function r(){for(;t<e&&o.length;){let i=o.shift();if(i.signal?.removeEventListener("abort",i.abort),i.signal?.aborted){i.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(i.signal?.aborted)throw new Error("Aborted");return i.run()}).then(i.resolve,i.reject).finally(()=>{t--,r()})}}return(i,a)=>new Promise((p,f)=>{let d={run:i,signal:a,resolve:p,reject:f,abort:null};if(d.abort=()=>{let s=o.indexOf(d);s>=0&&(o.splice(s,1),f(new Error("Aborted")))},a?.aborted){f(new Error("Aborted"));return}a?.addEventListener("abort",d.abort,{once:!0}),o.push(d),r()})}var $=R(require("react"),1);function Xt(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function $t(e="",t=""){let o=Xt(e),r=Xt(t),i=0;for(;i<o.length&&i<r.length&&o[i]===r[i];)i++;let a=0;for(;a<o.length-i&&a<r.length-i&&o[o.length-a-1]===r[r.length-a-1];)a++;let p=o.length-a,f=r.length-a,d=p-i,s=f-i,c=d&&s?(d+1)*(s+1):0,h=c>2e5,w=[],v=0;function S(u,x){v++,!(w.length>=2e3)&&w.push({left:u===null?null:{number:u+1,text:o[u]},right:x===null?null:{number:x+1,text:r[x]},kind:u===null?"insert":x===null?"delete":o[u]===r[x]?"equal":"replace"})}for(let u=0;u<i;u++)S(u,u);if(h||!d||!s)for(let u=0;u<Math.max(d,s);u++)S(u<d?i+u:null,u<s?i+u:null);else{let u=s+1,x=new Uint32Array(c);for(let m=d-1;m>=0;m--)for(let y=s-1;y>=0;y--)x[m*u+y]=o[i+m]===r[i+y]?x[(m+1)*u+y+1]+1:Math.max(x[(m+1)*u+y],x[m*u+y+1]);let b=0,g=0;for(;b<d||g<s;)b<d&&g<s&&o[i+b]===r[i+g]?S(i+b++,i+g++):b<d&&(g===s||x[(b+1)*u+g]>=x[b*u+g+1])?S(i+b++,null):S(null,i+g++)}for(let u=0;u<a;u++)S(p+u,f+u);return{rows:w,approximate:h,truncated:v>w.length,totalRows:v,omittedRows:v-w.length,leftLineCount:o.length,rightLineCount:r.length,lcsCells:h?0:c}}var _r={before:"Before",after:"After",readonly:"Read-only text comparison",approximate:"Approximate alignment: the changed region is too large for exact matching; lines are paired by position.",truncated:"Preview truncated to the first 2,000 aligned lines; additional lines are not shown.",empty:"Both versions are empty."},ft={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},Yr={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},Qr={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},Xr={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Be({comparison:e,labels:t={}}){let o=e?.left?.text??"",r=e?.right?.text??"",i=(0,$.useMemo)(()=>$t(o,r),[o,r]),a=f=>t[f]??_r[f],p=(f,d,s)=>{let c=f&&s!=="equal";return $.default.createElement("td",{style:{...ft,background:c?d==="left"?"#d6454520":"#259b4920":void 0}},$.default.createElement("div",{style:Yr},$.default.createElement("span",{style:Qr},f?.number??""),$.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},c?d==="left"?"\u2212":"+":""),$.default.createElement("pre",{style:Xr},f?.text??"")))};return $.default.createElement("section",{className:"vcs-text-comparison","aria-label":a("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},i.approximate&&$.default.createElement("div",{role:"status",style:{padding:8}},a("approximate")),i.truncated&&$.default.createElement("div",{role:"status",style:{padding:8}},a("truncated")," (",2e3," / ",i.totalRows,")"),$.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},$.default.createElement("thead",null,$.default.createElement("tr",null,$.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.left?.label||a("before")),$.default.createElement("th",{scope:"col",style:{...ft,padding:8,overflowWrap:"anywhere"}},e?.right?.label||a("after")))),$.default.createElement("tbody",null,i.rows.map((f,d)=>$.default.createElement("tr",{key:d,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!i.rows.length&&$.default.createElement("p",{style:{padding:8}},a("empty")))}var G=R(require("react"),1);function Zt(e,{width:t,height:o,signal:r,timeoutMs:i=1e4,createURL:a=d=>URL.createObjectURL(d),revokeURL:p=d=>URL.revokeObjectURL(d),createImage:f=()=>new Image}={}){return new Promise((d,s)=>{if(r?.aborted){s(r.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(o)||t<1||o<1||t>8192||o>8192||t*o>16e6||!Number.isFinite(i)||i<=0){s(new Error("Invalid image preview"));return}let c,h,w,v=!1,S=!1,u=()=>{S||(S=!0,h&&(h.src=""),c&&p(c))},x=()=>{clearTimeout(w),r?.removeEventListener("abort",g)},b=m=>{v||(v=!0,x(),u(),s(m))},g=()=>b(r.reason||new Error("Image cancelled"));try{c=a(e),h=f(),r?.addEventListener("abort",g,{once:!0}),w=setTimeout(()=>b(new Error("Image decode timed out")),i),h.src=c,Promise.resolve(h.decode()).then(()=>{if(!v){if(r?.aborted){g();return}if(h.naturalWidth!==t||h.naturalHeight!==o){b(new Error("Image dimensions mismatch"));return}v=!0,x(),d({url:c,dispose:u})}},b)}catch(m){b(m)}})}function $r({side:e,sessionId:t,repositoryId:o,commit:r,parentIndex:i,base:a,target:p,workspace:f=!1,mode:d,id:s,rpc:c,t:h,onRediscover:w}){let[v,S]=(0,G.useState)(null),[u,x]=(0,G.useState)(""),[b,g]=(0,G.useState)(0);return(0,G.useEffect)(()=>{let m=new AbortController,y;return S(null),x(""),(async()=>{let k=await c(f?"vcs/workspace-image":a?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:o,mode:d,id:s,side:e}:a?{sessionId:t,repositoryId:o,base:a,target:p,id:s,side:e}:{sessionId:t,repositoryId:o,commit:r,parentIndex:i,id:s,side:e},m.signal);if(m.signal.aborted)return;if(k.absent){S(k);return}if(!["image/png","image/jpeg","image/webp"].includes(k.mime)||typeof k.base64!="string"||k.base64.length>2796204||!Number.isInteger(k.bytes)||k.bytes<1||k.bytes>2097152)throw Error(h("imageInvalid"));let D=atob(k.base64);if(D.length!==k.bytes)throw Error(h("imageInvalid"));let E=new Blob([Uint8Array.from(D,q=>q.charCodeAt(0))],{type:k.mime});if(y=await Zt(E,{width:k.width,height:k.height,signal:m.signal}),m.signal.aborted){y.dispose();return}S({...k,url:y.url})})().catch(k=>{m.signal.aborted||(x(k.message),k.code==="vcs/rediscover-required"&&w())}),()=>{m.abort(),y?.dispose()}},[e,t,o,r,i,a,p,f,d,s,b]),G.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(e==="left"?"imageBefore":"imageAfter")},G.default.createElement("h5",null,h(e==="left"?"imageBefore":"imageAfter")),u?G.default.createElement("p",{role:"alert"},u," ",G.default.createElement("button",{onClick:()=>g(m=>m+1)},h("retry"))):v?G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,G.default.createElement("code",null,v.commit)," \xB7 ",v.path),v.absent?G.default.createElement("p",null,h("imageAbsent")):G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,v.width," \xD7 ",v.height," \xB7 ",v.bytes," B"),G.default.createElement("img",{src:v.url,alt:v.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),v.metadataStripped&&G.default.createElement("p",null,h("imageMetadata")))):G.default.createElement("p",{role:"status"},h("loading")))}function Fe(e){let[t,o]=(0,G.useState)(!1);return G.default.createElement("div",null,G.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("imageCompare")),t&&G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,e.t("imageScope")),G.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(r=>G.default.createElement($r,{key:r,...e,side:r})))))}function ze(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var I=R(require("react"),1);function mt(e){return I.default.createElement(Zr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Zr({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,I.useState)(!1),[f,d]=(0,I.useState)(null),[s,c]=(0,I.useState)(""),[h,w]=(0,I.useState)(0);return(0,I.useEffect)(()=>{if(!a)return;let v=new AbortController;return d(null),c(""),o("vcs/svn-identity",{sessionId:e,repositoryId:t},v.signal).then(S=>{v.signal.aborted||d(S)}).catch(S=>{v.signal.aborted||(c(S.message),S.code==="vcs/rediscover-required"&&i())}),()=>v.abort()},[a,e,t,h]),I.default.createElement("section",null,I.default.createElement("button",{"aria-expanded":a,onClick:()=>p(v=>!v)},r("svnIdentity")),a&&I.default.createElement(I.default.Fragment,null,I.default.createElement("p",null,r("svnOfflineIdentity")),s?I.default.createElement("p",{role:"alert"},s," ",I.default.createElement("button",{onClick:()=>w(v=>v+1)},r("retry"))):f?I.default.createElement(I.default.Fragment,null,I.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(v=>I.default.createElement(I.default.Fragment,{key:v},I.default.createElement("dt",null,v),I.default.createElement("dd",null,I.default.createElement("code",null,f[v]))))),I.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))):I.default.createElement("p",{role:"status"},r("loading"))))}function Ke(e,t,{now:o=Date.now,schedule:r=setTimeout,cancel:i=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=o()||e-o()>3e5)throw Error("Invalid SVN consent expiry");let a=!0,p=r(()=>{a&&(a=!1,t())},e-o());return()=>{a&&(a=!1,i(p))}}function Rt(e,t=Date.now()){if(!e||typeof e.token!="string"||!/^[a-f0-9]{64}$/.test(e.token)||typeof e.snapshot!="string"||!/^(0|[1-9][0-9]*)$/.test(e.snapshot)||BigInt(e.snapshot)>9223372036854775807n||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t||e.expiresAt-t>3e5)throw Error("Invalid SVN consent response");return e}var X=R(require("react"),1);var M=R(require("react"),1);function ht(e){return M.default.createElement(Rr,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Rr({sessionId:e,repositoryId:t,rpc:o,t:r,onApproved:i,onRediscover:a}){let[p,f]=(0,M.useState)(!1),[d,s]=(0,M.useState)(null),[c,h]=(0,M.useState)(!1),[w,v]=(0,M.useState)(""),[S,u]=(0,M.useState)(!1),[x,b]=(0,M.useState)(0);(0,M.useEffect)(()=>{if(!p)return;let y=new AbortController;return s(null),h(!1),v(""),u(!0),o("vcs/svn-describe",{sessionId:e,repositoryId:t},y.signal).then(k=>{y.signal.aborted||s(k)}).catch(k=>{y.signal.aborted||(v(k.message),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{y.signal.aborted||u(!1)}),()=>y.abort()},[p,e,t,x]);let[g,m]=(0,M.useState)(0);return(0,M.useEffect)(()=>{if(!p||!d||d.expiresAt===void 0)return;let y=()=>{s(null),h(!1),m(0),u(!1),v(r("svnOfferExpired"))};try{return Ke(d.expiresAt,y)}catch{y()}},[p,d]),(0,M.useEffect)(()=>{if(!g||!p||!d)return;let y=new AbortController;return u(!0),v(""),o("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:d.offer,explicit:!0},y.signal).then(k=>{y.signal.aborted||i(k)}).catch(k=>{y.signal.aborted||(v(k.message),h(!1),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{y.signal.aborted||u(!1)}),()=>y.abort()},[g,p,d]),M.default.createElement("section",null,M.default.createElement("button",{"aria-expanded":p,onClick:()=>{m(0),f(y=>!y)}},r("svnConsentReview")),p&&M.default.createElement(M.default.Fragment,null,M.default.createElement("p",null,r("svnConsentScope")),w&&M.default.createElement("p",{role:"alert"},w," ",M.default.createElement("button",{disabled:S,onClick:()=>{m(0),b(y=>y+1)}},r("retry"))),d&&M.default.createElement(M.default.Fragment,null,M.default.createElement("dl",null,["origin","root","uuid","scope"].map(y=>M.default.createElement(M.default.Fragment,{key:y},M.default.createElement("dt",null,y),M.default.createElement("dd",null,M.default.createElement("code",null,d[y]))))),d.remoteEnabled?M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:c,disabled:S,onChange:y=>h(y.target.checked)}),r("svnConsentExplicit")),M.default.createElement("button",{disabled:S||!c,onClick:()=>m(y=>y+1)},r("svnConsentApprove"))):M.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))),S&&M.default.createElement("p",{role:"status"},r("loading"))))}var A=R(require("react"),1);var Q=R(require("react"),1);var ie=require("react");function er({load:e,node:t,comparison:o,key:r,single:i=!1,onReady:a=()=>{},onError:p=()=>{},onComputation:f=()=>{}}){let d=new AbortController,s,c=!1,h=()=>{let v=s;s=void 0,v?.dispose()};return{done:Promise.resolve().then(()=>(d.signal.throwIfAborted(),e(d.signal))).then(v=>{c||(s=v.createDiff(t,{single:i,onComputation:S=>{c||f(S)}}),s.setContent(o,r),c||a(s))}).catch(v=>{try{h()}finally{c||p(v)}}),dispose(){c||(c=!0,d.abort(),h())}}}async function _e(e,{signal:t,fetcher:o=fetch,importer:r=i=>import(i)}={}){let i=await o(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!i.ok)throw new Error("Editor resource HTTP "+i.status+" ("+e+"). "+(i.status===401?"Refresh the authenticated DSH page.":i.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let a=i.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(a))throw new Error("Editor resource returned "+(a||"no Content-Type")+" instead of JavaScript.");return await i.arrayBuffer(),t?.throwIfAborted(),r(e)}var Ye="0.3.70";function tr({comparison:e,identity:t,enabled:o,single:r,line:i,sideBySide:a,ignoreWhitespace:p,wrap:f}){let d=(0,ie.useRef)(null),s=(0,ie.useRef)(null),[c,h]=(0,ie.useState)(!1),[w,v]=(0,ie.useState)(""),[S,u]=(0,ie.useState)("pending");return(0,ie.useEffect)(()=>{if(h(!1),u("pending"),v(""),!o)return;let x=m=>new URL("vcs-assets/"+m,document.baseURI).href,b=document.createElement("link");b.rel="stylesheet",b.href=x("editor.css"),document.head.appendChild(b);let g=er({node:d.current,comparison:e,key:t,single:r,load:m=>_e(x("editor.js")+"?v="+encodeURIComponent(Ye)+"&retry=0",{signal:m}),onReady:m=>{s.current=m,h(!0)},onError:m=>v(m.message),onComputation:u});return()=>{s.current=null;try{g.dispose()}finally{b.remove()}}},[o,e,t,r]),(0,ie.useEffect)(()=>{c&&r&&i&&s.current?.revealLine(i)},[c,r,i]),(0,ie.useEffect)(()=>{c&&s.current?.options({sideBySide:a,ignoreWhitespace:p,wrap:f})},[c,a,p,f]),{node:d,viewer:s,ready:c,error:w,computation:S}}function le({comparison:e,identity:t,t:o,single:r=!1,line:i=null}){let[a,p]=(0,Q.useState)(!0),[f,d]=(0,Q.useState)(!1),[s,c]=(0,Q.useState)(!1),[h,w]=(0,Q.useState)(!0),{node:v,viewer:S,ready:u,error:x,computation:b}=tr({comparison:e,identity:t,enabled:h,single:r,line:i,sideBySide:a,ignoreWhitespace:f,wrap:s});return Q.default.createElement("div",null,Q.default.createElement("button",{"aria-pressed":h,onClick:()=>w(g=>!g)},o(h?"historyBasic":"historyAdvanced")),u&&!r&&Q.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},Q.default.createElement("button",{"aria-pressed":a,onClick:()=>p(g=>!g)},o(a?"side":"inline")),Q.default.createElement("label",null,Q.default.createElement("input",{type:"checkbox",checked:f,onChange:g=>d(g.target.checked)}),o("whitespace")),Q.default.createElement("label",null,Q.default.createElement("input",{type:"checkbox",checked:s,onChange:g=>c(g.target.checked)}),o("wrap")),Q.default.createElement("button",{onClick:()=>S.current?.navigate("previous")},o("previous")),Q.default.createElement("button",{onClick:()=>S.current?.navigate("next")},o("next"))),h&&!u&&!x&&Q.default.createElement("p",{role:"status"},o("loading")),e.large&&!r&&u&&Q.default.createElement("p",{role:"status"},o(b==="complete"?"diffComplete":b==="incomplete"?"diffIncomplete":"diffPending")),e.large&&!u&&Q.default.createElement("p",{role:"status"},o("largeFallback")),x&&Q.default.createElement("p",{role:"status"},o("fallback")," ",x),Q.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},Q.default.createElement("div",{ref:v,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&Q.default.createElement(Be,{comparison:e,labels:ze(o)})))}function gt(e){return A.default.createElement(to,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function to({sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,A.useState)(r),[s,c]=(0,A.useState)(null),[h,w]=(0,A.useState)(null),[v,S]=(0,A.useState)(""),[u,x]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let b=new AbortController;return c(null),w(null),S(""),i("vcs/svn-log",{sessionId:e,repositoryId:t,token:o,snapshot:r,cursor:f,limit:50},b.signal).then(g=>{b.signal.aborted||c(g)}).catch(g=>{b.signal.aborted||(S(g.message),g.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[f,u]),A.default.createElement("section",null,A.default.createElement("p",null,a("svnHistoryScope")," \xB7 r",r),v?A.default.createElement("p",{role:"alert"},v," ",A.default.createElement("button",{onClick:()=>x(b=>b+1)},a("retry"))):s?A.default.createElement(A.default.Fragment,null,A.default.createElement("ol",null,s.entries.map(b=>A.default.createElement("li",{key:b.revision},A.default.createElement("button",{onClick:()=>w(b.revision)},"r",b.revision," \xB7 ",b.message)))),s.nextRevision!==null&&A.default.createElement("button",{onClick:()=>d(s.nextRevision)},a("historyMore"))):A.default.createElement("p",{role:"status"},a("loading")),h&&A.default.createElement(ro,{key:h,sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:i,t:a,onRediscover:p,revision:h}))}function ro({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f}){let[d,s]=(0,A.useState)(null),[c,h]=(0,A.useState)(null),[w,v]=(0,A.useState)(""),[S,u]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let x=new AbortController;return s(null),h(null),v(""),a("vcs/svn-detail",{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i},x.signal).then(b=>{x.signal.aborted||s(b)}).catch(b=>{x.signal.aborted||(v(b.message),b.code==="vcs/rediscover-required"&&f())}),()=>x.abort()},[S]),A.default.createElement("section",null,w?A.default.createElement("p",{role:"alert"},w," ",A.default.createElement("button",{onClick:()=>u(x=>x+1)},p("retry"))):d?A.default.createElement(A.default.Fragment,null,A.default.createElement("p",null,d.message),d.changes.map(x=>A.default.createElement("div",{key:x.id},A.default.createElement("span",null,x.action," ",x.path),x.kind==="file"&&A.default.createElement(A.default.Fragment,null,A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"compare"})},p("svnHistoricalDiff")),A.default.createElement("button",{onClick:()=>h({id:x.id,mode:"trace"})},p("fileHistory")))))):A.default.createElement("p",{role:"status"},p("loading")),c&&A.default.createElement(oo,{key:JSON.stringify(c),sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f,...c}))}function oo({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f,id:d,mode:s}){let[c,h]=(0,A.useState)(null),[w,v]=(0,A.useState)(null),[S,u]=(0,A.useState)(""),[x,b]=(0,A.useState)(0);return(0,A.useEffect)(()=>{let g=new AbortController;return h(null),u(""),a("vcs/svn-"+s,{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,id:d,...w===null?{}:{cursor:w}},g.signal).then(m=>{g.signal.aborted||h(m)}).catch(m=>{g.signal.aborted||(u(m.message),m.code==="vcs/rediscover-required"&&f())}),()=>g.abort()},[w,x]),S?A.default.createElement("p",{role:"alert"},S," ",A.default.createElement("button",{onClick:()=>b(g=>g+1)},p("retry"))):c?s==="compare"?c.binary?A.default.createElement("p",null,p("binary")):A.default.createElement(le,{comparison:c,identity:JSON.stringify([e,t,r,i,d]),t:p}):A.default.createElement("section",null,A.default.createElement("p",null,p("svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),A.default.createElement("ol",null,c.entries.map(g=>A.default.createElement("li",{key:g.revision},"r",g.revision," \xB7 ",g.message))),c.nextRevision!==null&&A.default.createElement("button",{onClick:()=>v(c.nextRevision)},p("historyMore"))):A.default.createElement("p",{role:"status"},p("loading"))}function vt(e){return X.default.createElement(io,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function io({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,X.useState)(null),[f,d]=(0,X.useState)(!1),[s,c]=(0,X.useState)(""),[h,w]=(0,X.useState)(0);(0,X.useEffect)(()=>{if(a)return()=>{Promise.resolve().then(()=>o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token})).catch(()=>{})}},[a,e,t]),(0,X.useEffect)(()=>{if(a)try{return Ke(a.expiresAt,()=>{p(null),w(0),d(!1),c(r("svnExpired"))})}catch{p(null),c(r("svnExpired"))}},[a]),(0,X.useEffect)(()=>{if(!h||!a)return;let u=new AbortController;return d(!0),c(""),o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(x=>{u.signal.aborted||(c(x.message),x.code==="vcs/rediscover-required"&&i())}).finally(()=>{u.signal.aborted||d(!1)}),()=>u.abort()},[h,a]);let v=u=>{try{Rt(u),c(""),w(0),p(u)}catch(x){c(x.message)}},S=async(...u)=>{try{return await o(...u)}catch(x){throw x.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),w(0),c(r("svnExpired"))),x}};return X.default.createElement("section",null,!a&&s&&X.default.createElement("p",{role:"status"},s),a?X.default.createElement(X.default.Fragment,null,X.default.createElement("p",null,r("svnGrantScope")),X.default.createElement("button",{disabled:f,onClick:()=>w(u=>u+1)},r("svnRevoke")),s&&X.default.createElement("p",{role:"alert"},s),!f&&X.default.createElement(gt,{sessionId:e,repositoryId:t,t:r,onRediscover:i,rpc:S,token:a.token,snapshot:a.snapshot})):X.default.createElement(ht,{sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i,onApproved:v}))}var C=R(require("react"),1);function rr(e){let t=new Map;for(let o of e){let r=t.get(o.commit);r||(r={names:[],hidden:0},t.set(o.commit,r)),r.names.length<3?r.names.push(o.name):r.hidden++}return t}var T=R(require("react"),1);var B=R(require("react"),1);var V=R(require("react"),1);var U=R(require("react"),1);function yt(e){return U.default.createElement(so,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function so({sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,U.useState)(!1),[s,c]=(0,U.useState)([0]),[h,w]=(0,U.useState)(null),[v,S]=(0,U.useState)(""),[u,x]=(0,U.useState)(0),b=s.at(-1);(0,U.useEffect)(()=>{if(!f)return;let m=new AbortController;return w(null),S(""),i("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:o,path:r,offset:b},m.signal).then(y=>{m.signal.aborted||w(y)}).catch(y=>{m.signal.aborted||(S(y.message),y.code==="vcs/rediscover-required"&&p())}),()=>m.abort()},[f,b,e,t,o,r,u]);let g=(0,U.useMemo)(()=>h?{path:r,left:{label:o,text:h.text},right:{label:o,text:h.text}}:null,[h,r,o]);return U.default.createElement("section",null,U.default.createElement("button",{"aria-expanded":f,onClick:()=>d(m=>!m)},a("segments")),f&&U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentScope")),v?U.default.createElement("p",{role:"alert"},v," ",U.default.createElement("button",{onClick:()=>x(m=>m+1)},a("retry"))):h?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,a("segmentBytes"),": ",h.offset,"\u2013",h.endOffset," / ",h.totalBytes," \xB7 ",U.default.createElement("code",null,h.oid)),U.default.createElement("button",{disabled:s.length===1,onClick:()=>c(m=>m.slice(0,-1))},a("previous")),U.default.createElement("button",{disabled:h.nextOffset===null,onClick:()=>c(m=>[...m,h.nextOffset])},a("next")),U.default.createElement(le,{single:!0,comparison:g,identity:JSON.stringify([e,t,o,r,b]),t:a})):U.default.createElement("p",{role:"status"},a("loading"))))}function Me({sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p,onClose:f,line:d=null}){let[s,c]=(0,V.useState)(null),[h,w]=(0,V.useState)(""),[v,S]=(0,V.useState)(0);(0,V.useEffect)(()=>{let x=new AbortController;return c(null),w(""),i("vcs/tree-file",{sessionId:e,repositoryId:t,commit:o,path:r},x.signal).then(b=>{x.signal.aborted||c(b)}).catch(b=>{x.signal.aborted||(w(b.message),b.code==="vcs/rediscover-required"&&p())}),()=>x.abort()},[e,t,o,r,v]);let u=(0,V.useMemo)(()=>s?{path:r,left:{label:o,text:s.text||""},right:{label:o,text:s.text||""}}:null,[s,r,o]);return V.default.createElement("section",{"aria-label":a("treePreview")},V.default.createElement("h4",null,r),V.default.createElement("button",{onClick:f},a("treeClose")),V.default.createElement("p",null,V.default.createElement("code",null,o)),h?V.default.createElement("p",{role:"alert"},h," ",V.default.createElement("button",{onClick:()=>S(x=>x+1)},a("retry"))):s?V.default.createElement(V.default.Fragment,null,V.default.createElement("p",null,V.default.createElement("code",null,s.oid)," \xB7 ",a("encoding"),": ",s.encoding||"\u2014"),d&&V.default.createElement("p",{role:"status"},a("blameOriginLine"),": ",d,!s.text||d>s.text.split(`
|
|
96
|
-
`).length?" \xB7 "+a("blameUnmapped"):""),s.notice&&V.default.createElement("p",{role:"status"},s.notice),s.binary?V.default.createElement("p",null,a("binary")):s.text===""?V.default.createElement("p",null,a("treeEmpty")):V.default.createElement(le,{single:!0,line:d,comparison:u,identity:JSON.stringify([e,t,o,r]),t:a})):V.default.createElement("p",{role:"status"},a("loading")),V.default.createElement(yt,{sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p}))}function or(e=""){let t=[{path:"",name:"/"}];if(e){let o="";for(let r of e.split("/"))o=o?o+"/"+r:r,t.push({path:o,name:r})}return t}function ir(e,t="",o=""){let r=t?t+"/":"",i=o.toLowerCase();return e.filter(a=>{let p=a.path.slice(r.length);return a.path.startsWith(r)&&p.length>0&&!p.includes("/")&&p.toLowerCase().includes(i)}).sort((a,p)=>+(p.type==="tree")-+(a.type==="tree")||(a.path<p.path?-1:a.path>p.path?1:0))}function no({sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a}){let[p,f]=(0,B.useState)(null),[d,s]=(0,B.useState)(""),[c,h]=(0,B.useState)(0),[w,v]=(0,B.useState)(""),[S,u]=(0,B.useState)(0),[x,b]=(0,B.useState)(""),[g,m]=(0,B.useState)(null);if((0,B.useEffect)(()=>{let E=new AbortController;return f(null),s(""),r("vcs/tree",{sessionId:e,repositoryId:t,commit:o},E.signal).then(q=>{E.signal.aborted||f(q)}).catch(q=>{E.signal.aborted||(s(q.message),q.code==="vcs/rediscover-required"&&a())}),()=>E.abort()},[e,t,o,c]),d)return B.default.createElement("p",{role:"alert"},d," ",B.default.createElement("button",{onClick:()=>h(E=>E+1)},i("retry")));if(!p)return B.default.createElement("p",{role:"status"},i("loading"));let y=w?w+"/":"",k=ir(p.entries,w,x),D=E=>{v(E),u(0),b(""),m(null)};return B.default.createElement("section",{"aria-label":i("historicalTree")},B.default.createElement("p",null,i("historicalTreeScope")),B.default.createElement("code",null,o),B.default.createElement("p",null,w||"/"," ",w&&B.default.createElement("button",{onClick:()=>D(w.includes("/")?w.slice(0,w.lastIndexOf("/")):"")},i("treeUp"))),B.default.createElement("nav",{"aria-label":i("treeBreadcrumbs")},or(w).map(E=>B.default.createElement(B.default.Fragment,{key:E.path},E.path&&" / ",E.path===w?B.default.createElement("span",{"aria-current":"location"},E.name):B.default.createElement("button",{onClick:()=>D(E.path)},E.name)))),B.default.createElement("label",null,i("treeSearch")," ",B.default.createElement("input",{"aria-label":i("treeSearch"),value:x,onChange:E=>{b(E.target.value),u(0),m(null)}})),B.default.createElement("p",null,k.length," ",i("treeEntries")),!k.length&&x&&B.default.createElement("p",{role:"status"},i("emptySearch")),B.default.createElement("ul",null,k.slice(S*100,S*100+100).map(E=>B.default.createElement("li",{key:E.path},E.type==="tree"?B.default.createElement("button",{onClick:()=>D(E.path)},E.path.slice(y.length),"/"):E.type==="blob"&&["100644","100755"].includes(E.mode)?B.default.createElement("button",{"aria-pressed":g===E.path,onClick:()=>m(E.path)},E.path.slice(y.length)):B.default.createElement("span",null,E.path.slice(y.length))," \xB7 ",B.default.createElement("code",null,E.mode," ",E.type," ",B.default.createElement("span",{title:E.oid},E.oid.slice(0,10)))))),S>0&&B.default.createElement("button",{onClick:()=>{u(E=>E-1),m(null)}},i("treePrevious")),(S+1)*100<k.length&&B.default.createElement("button",{onClick:()=>{u(E=>E+1),m(null)}},i("treeNext")),g&&B.default.createElement(Me,{key:JSON.stringify([e,t,o,g]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a,path:g,onClose:()=>m(null)}))}function bt(e){return B.default.createElement(ao,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function ao(e){let[t,o]=(0,B.useState)(!1);return B.default.createElement("div",null,B.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historicalTree")),t&&B.default.createElement(no,{...e}))}var W=R(require("react"),1);var F=R(require("react"),1);function lo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,follow:a,rpc:p,t:f,onRediscover:d,onSelectCommit:s}){let[c,h]=(0,F.useState)({commits:[],nextOffset:null}),[w,v]=(0,F.useState)(0),[S,u]=(0,F.useState)(0),[x,b]=(0,F.useState)(!0),[g,m]=(0,F.useState)("");return(0,F.useEffect)(()=>{let y=new AbortController;return b(!0),m(""),p("vcs/file-history",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,offset:w,limit:50,follow:a},y.signal).then(k=>{y.signal.aborted||h(D=>({...k,commits:w?[...D.commits,...k.commits]:k.commits}))}).catch(k=>{y.signal.aborted||(m(k.message),k.code==="vcs/rediscover-required"&&d())}).finally(()=>{y.signal.aborted||b(!1)}),()=>y.abort()},[e,t,o,r,i,w,S]),F.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":x},F.default.createElement("p",null,f("fileHistoryScope")),F.default.createElement("p",{style:{overflowWrap:"anywhere"}},c.path," \xB7 ",F.default.createElement("code",null,o)),F.default.createElement("ol",null,c.commits.map(y=>F.default.createElement("li",{key:y.id},F.default.createElement("code",{title:y.id},y.id.slice(0,10))," \xB7 ",s?F.default.createElement("button",{onClick:()=>s(y.id,y.path||c.path)},y.subject):y.subject,F.default.createElement("div",null,y.boundary&&F.default.createElement("span",null,f(y.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":y.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":y.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary")," "),y.path&&F.default.createElement("code",null,y.oldPath?y.oldPath+" \u2192 ":"",y.path)," ",y.similarity!==void 0&&F.default.createElement("span",null,f("fileHistorySimilarity"),": ",y.similarity,"% \xB7 "),y.author," \xB7 ",F.default.createElement("time",{dateTime:y.date},y.date))))),x&&F.default.createElement("p",{role:"status"},f("loading")),g&&F.default.createElement("p",{role:"alert"},g," ",F.default.createElement("button",{onClick:()=>u(y=>y+1)},f("retry"))),!x&&!g&&!c.commits.length&&F.default.createElement("p",null,f("historyEmpty")),c.truncated&&F.default.createElement("p",{role:"status"},f("historyLimit")),!g&&c.nextOffset!==null&&F.default.createElement("button",{disabled:x,onClick:()=>v(c.nextOffset)},f("historyMore")))}function xt(e){return F.default.createElement(co,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.id]),...e})}function co(e){let[t,o]=(0,F.useState)(!1),[r,i]=(0,F.useState)(!1);return F.default.createElement("div",null,F.default.createElement("button",{"aria-expanded":t,onClick:()=>o(a=>!a)},e.t("fileHistory")),t&&F.default.createElement(F.default.Fragment,null,F.default.createElement("label",null,F.default.createElement("input",{type:"checkbox",checked:r,onChange:a=>i(a.target.checked)}),e.t("fileHistoryFollow")),F.default.createElement("p",null,e.t("fileHistoryFollowScope")),F.default.createElement(lo,{key:String(r),follow:r,...e})))}var O=R(require("react"),1);function po({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,rpc:a,t:p,onRediscover:f,onSelectCommit:d}){let[s,c]=(0,O.useState)(null),[h,w]=(0,O.useState)(""),[v,S]=(0,O.useState)(0),[u,x]=(0,O.useState)(1),[b,g]=(0,O.useState)(null);return(0,O.useEffect)(()=>{let m=new AbortController;return c(null),w(""),g(null),a("vcs/blame",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,startLine:u,lineLimit:500},m.signal).then(y=>{m.signal.aborted||c(y)}).catch(y=>{m.signal.aborted||(w(y.message),y.code==="vcs/rediscover-required"&&f())}),()=>m.abort()},[e,t,o,r,i,v,u]),h?O.default.createElement("p",{role:"alert"},h," ",O.default.createElement("button",{onClick:()=>S(m=>m+1)},p("retry"))):s?O.default.createElement("section",{"aria-label":p("blame")},O.default.createElement("p",null,p("blameScope")),d&&O.default.createElement("p",null,p("blameNavigation")),s.notice&&O.default.createElement("p",{role:"status"},s.notice),s.truncated&&O.default.createElement("p",{role:"status"},p("blameLimit")),!s.notice&&!s.lines.length&&O.default.createElement("p",null,p("blameEmpty")),!!s.lines.length&&O.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},O.default.createElement("table",null,O.default.createElement("thead",null,O.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(m=>O.default.createElement("th",{key:m,scope:"col"},p(m))))),O.default.createElement("tbody",null,s.lines.map(m=>O.default.createElement("tr",{key:m.line},O.default.createElement("th",{scope:"row"},m.line),O.default.createElement("td",null,d?O.default.createElement("button",{title:m.commit,onClick:()=>d(m.commit)},O.default.createElement("code",null,m.commit.slice(0,10))):O.default.createElement("code",{title:m.commit},m.commit.slice(0,10))),O.default.createElement("td",null,m.author),O.default.createElement("td",null,m.summary),O.default.createElement("td",null,O.default.createElement("pre",{style:{margin:0}},m.text),m.path&&m.originalLine?O.default.createElement("button",{onClick:()=>g(m)},p("blameOriginLine"),": ",m.path,":",m.originalLine):O.default.createElement("span",null,p("blameUnmapped")))))))),O.default.createElement("p",null,s.startLine||u,"\u2013",s.lines.at(-1)?.line||u," / ",s.totalLines??"\u2014"),O.default.createElement("button",{disabled:u===1,onClick:()=>x(Math.max(1,u-500))},p("blamePrevious")),O.default.createElement("button",{disabled:s.nextLine==null,onClick:()=>x(s.nextLine)},p("blameNext")),b&&O.default.createElement(Me,{key:JSON.stringify([b.commit,b.path,b.originalLine]),sessionId:e,repositoryId:t,commit:b.commit,path:b.path,line:b.originalLine,rpc:a,t:p,onRediscover:f,onClose:()=>g(null)})):O.default.createElement("p",{role:"status"},p("loading"))}function wt(e){let[t,o]=(0,O.useState)(!1);return O.default.createElement("div",null,O.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("blame")),t&&O.default.createElement(po,{...e}))}function Te(e){return W.default.createElement(uo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.base,e.target,e.id]),...e})}function uo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:i,target:a,id:p,rpc:f,t:d,onRediscover:s,onSelectCommit:c}){let[h,w]=(0,W.useState)(null),[v,S]=(0,W.useState)(""),[u,x]=(0,W.useState)(0),[b,g]=(0,W.useState)(!1);return(0,W.useEffect)(()=>{let m=new AbortController;return w(null),S(""),f(i?"vcs/revision-compare":"vcs/commit-compare",i?{sessionId:e,repositoryId:t,base:i,target:a,id:p,...b?{large:!0}:{}}:{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,...b?{large:!0}:{}},m.signal).then(y=>{m.signal.aborted||w(y)}).catch(y=>{m.signal.aborted||(S(y.message),y.code==="vcs/rediscover-required"&&s())}),()=>m.abort()},[e,t,o,r,i,a,p,u,b]),v?W.default.createElement("p",{role:"alert"},v," ",W.default.createElement("button",{onClick:()=>x(m=>m+1)},d("retry")),b&&W.default.createElement("button",{onClick:()=>g(!1)},d("largeClose"))):h?W.default.createElement("section",null,W.default.createElement("h4",null,h.path),W.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&W.default.createElement("p",{role:"status"},h.notice),b?W.default.createElement("p",null,d("largeScope")," ",W.default.createElement("button",{onClick:()=>g(!1)},d("largeClose"))):h.notice?.includes("2 MiB")&&W.default.createElement("p",null,d("largeScope")," ",W.default.createElement("button",{onClick:()=>g(!0)},d("largeLoad"))),h.binary?W.default.createElement("p",null,d("binary")):W.default.createElement(le,{comparison:h,identity:JSON.stringify(i?[e,t,i,a,p]:[e,t,o,r,p]),t:d}),o&&!i&&W.default.createElement(xt,{onSelectCommit:c,key:"file-history:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:s}),o&&!i&&W.default.createElement(wt,{onSelectCommit:c,key:"blame:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:s}),(o||i)&&W.default.createElement(Fe,{key:"image:"+JSON.stringify([e,t,o,r,i,a,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:i,target:a,id:p,rpc:f,t:d,onRediscover:s})):W.default.createElement("p",{role:"status"},d("loading"),b&&W.default.createElement("button",{onClick:()=>g(!1)},d("largeClose")))}function sr(e,t){if(typeof t!="string"||!t)return null;let o=e.filter(r=>r.path===t);return o.length===1&&typeof o[0].id=="string"&&o[0].id?o[0].id:null}function nr(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.id,r.author,r.subject].some(i=>i?.toLowerCase().includes(o))):e}function Qe(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.path,r.oldPath].some(i=>i?.toLowerCase().includes(o))):e}function St(e){return T.default.createElement(fo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function fo({sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a,onSelectCommit:p,initialPath:f}){let d=(0,T.useRef)(!0),[s,c]=(0,T.useState)(null),[h,w]=(0,T.useState)(""),[v,S]=(0,T.useState)(0),[u,x]=(0,T.useState)(null),[b,g]=(0,T.useState)(""),[m,y]=(0,T.useState)(0);if((0,T.useEffect)(()=>{let D=new AbortController;return x(null),g(""),r("vcs/commit",{sessionId:e,repositoryId:t,commit:o,parentIndex:v},D.signal).then(E=>{D.signal.aborted||(x(E),d.current&&(d.current=!1,c(sr(E.changes,f))))}).catch(E=>{D.signal.aborted||(g(E.message),E.code==="vcs/rediscover-required"&&a())}),()=>D.abort()},[e,t,o,v,m]),b)return T.default.createElement("p",{role:"alert"},b," ",T.default.createElement("button",{onClick:()=>y(D=>D+1)},i("retry")));if(!u)return T.default.createElement("p",{role:"status"},i("loading"));let k=Qe(u.changes,h);return T.default.createElement("section",{"aria-label":i("commitDetails")},T.default.createElement("h3",null,u.subject),T.default.createElement("code",null,u.id),T.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&T.default.createElement("p",{role:"status"},i("commitMessageLimit")),u.message&&T.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&T.default.createElement("label",null,i("commitParent")," ",T.default.createElement("select",{"aria-label":i("commitParent"),value:v,onChange:D=>{c(null),x(null),S(Number(D.target.value))}},u.parents.map((D,E)=>T.default.createElement("option",{key:D,value:E},E+1,": ",D.slice(0,10))))),T.default.createElement("p",null,u.parent||i("commitRoot")," \u2192 ",u.id.slice(0,10)),T.default.createElement("label",null,i("commitFileSearch")," ",T.default.createElement("input",{"aria-label":i("commitFileSearch"),value:h,onChange:D=>{w(D.target.value),c(null)}})),T.default.createElement("span",null," ",k.length," / ",u.changes.length),T.default.createElement("ul",null,k.map(D=>T.default.createElement("li",{key:D.id},T.default.createElement("button",{"aria-pressed":s===D.id,onClick:()=>c(D.id)},D.status," \xB7 ",D.oldPath?D.oldPath+" \u2192 ":"",D.path)))),!!u.changes.length&&!k.length&&T.default.createElement("p",{role:"status"},i("emptySearch")),!u.changes.length&&T.default.createElement("p",null,i("commitNoChanges")),s&&T.default.createElement(Te,{key:s,sessionId:e,repositoryId:t,commit:o,parentIndex:v,id:s,onSelectCommit:p,rpc:r,t:i,onRediscover:a}),T.default.createElement(bt,{key:JSON.stringify([e,t,o]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a}))}var K=R(require("react"),1);function ar(e){if(!Array.isArray(e))throw new Error("Invalid graph commits");let t=e.slice(0,200),o=new Map,r=[],i=[],a=f=>typeof f=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(f);for(let[f,d]of t.entries()){if(!d||!a(d.id)||!Array.isArray(d.parents)||o.has(d.id))throw new Error("Invalid graph node");o.set(d.id,f),r.push({id:d.id,row:f})}let p=!1;for(let f of t){let d=new Set;for(let s of f.parents){if(i.length===1e3){p=!0;break}if(!a(s)||s.length!==f.id.length||s===f.id||d.has(s))throw new Error("Invalid graph parent");d.add(s);let c=o.get(s);if(c!==void 0&&c<=o.get(f.id))throw new Error("Graph requires child-before-parent order");i.push({from:f.id,to:s,missing:c===void 0})}if(p)break}return{nodes:r,edges:i,nodesTruncated:e.length>200,edgesTruncated:p}}function lr(e){let t=Array(32).fill(null),o=new Map,r=[],i=new Set,a=!1,p=s=>{if(i.has(s))return null;let c=t.indexOf(s);return c>=0?c:(c=t.indexOf(null),c<0?(a=!0,i.add(s),null):(t[c]=s,c))},f=new Map;for(let s of e.edges){if(s.missing)continue;let c=f.get(s.from)||[];c.push(s.to),f.set(s.from,c)}for(let s of e.nodes){let c=p(s.id);if(o.set(s.id,{...s,lane:c}),r.push({...s,lane:c}),c===null)continue;t[c]=null;let h=f.get(s.id)||[];for(let[w,v]of h.entries())t.includes(v)||(w===0&&t[c]===null?t[c]=v:p(v))}let d=e.edges.filter(s=>!s.missing).flatMap(s=>{let c=o.get(s.from),h=o.get(s.to);return c.lane===null||h.lane===null?[]:[{...s,start:c.row,end:h.row,fromLane:c.lane,toLane:h.lane}]});return{nodes:r,edges:d,lanesTruncated:a,laneCount:Math.max(1,...r.map(s=>(s.lane??0)+1))}}function mo({commits:e,selected:t,onSelect:o,t:r}){let i;try{i=ar(e)}catch{return K.default.createElement("p",{role:"alert"},r("graphInvalid"))}let a=lr(i),p=a.edges,f=Math.max(100,24+18*a.laneCount),d=Math.max(40,i.nodes.length*36);return K.default.createElement("section",{"aria-label":r("historyGraph")},K.default.createElement("p",null,r("graphScope")),a.lanesTruncated&&K.default.createElement("p",{role:"status"},r("graphLaneLimit")),(i.nodesTruncated||i.edgesTruncated)&&K.default.createElement("p",{role:"status"},r("graphLimit")),K.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},K.default.createElement("svg",{width:f,height:d,"aria-hidden":"true",style:{flexShrink:0}},p.map(s=>{let c=s.start*36+18,h=s.end*36+18,w=12+s.fromLane*18,v=12+s.toLane*18;return K.default.createElement("path",{key:s.from+s.to,d:"M "+w+" "+c+" C "+w+" "+(c+18)+", "+v+" "+(h-18)+", "+v+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),a.nodes.filter(s=>s.lane!==null).map(s=>K.default.createElement("circle",{key:s.id,cx:12+s.lane*18,cy:s.row*36+18,r:"4",fill:"currentColor"}))),K.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},i.nodes.map(s=>K.default.createElement("li",{key:s.id,style:{height:36,whiteSpace:"nowrap"}},K.default.createElement("button",{title:s.id,"aria-current":t===s.id?!0:void 0,style:t===s.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:c=>{if(c.altKey||c.ctrlKey||c.metaKey||c.shiftKey)return;let h=c.key==="ArrowDown"?Math.min(s.row+1,i.nodes.length-1):c.key==="ArrowUp"?Math.max(0,s.row-1):c.key==="Home"?0:c.key==="End"?i.nodes.length-1:null;h!==null&&(c.preventDefault(),c.stopPropagation(),c.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>o(s.id)},K.default.createElement("code",null,s.id.slice(0,10))," ",e[s.row].subject))))),K.default.createElement("details",null,K.default.createElement("summary",null,r("graphRelations")),K.default.createElement("ul",null,i.edges.map(s=>K.default.createElement("li",{key:s.from+s.to},K.default.createElement("code",null,s.from)," \u2192 ",K.default.createElement("code",null,s.to),s.missing?" \xB7 "+r("graphMissing"):"")))))}function kt(e){let[t,o]=(0,K.useState)(!1);return K.default.createElement("div",null,K.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historyGraph")),t&&K.default.createElement(mo,{...e}))}var P=R(require("react"),1);function ho({sessionId:e,repositoryId:t,base:o,target:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,P.useState)(null),[s,c]=(0,P.useState)(""),[h,w]=(0,P.useState)(0),[v,S]=(0,P.useState)(null),[u,x]=(0,P.useState)("");if((0,P.useEffect)(()=>{let g=new AbortController;return d(null),c(""),S(null),i("vcs/revision-changes",{sessionId:e,repositoryId:t,base:o,target:r},g.signal).then(m=>{g.signal.aborted||d(m)}).catch(m=>{g.signal.aborted||(c(m.message),m.code==="vcs/rediscover-required"&&p())}),()=>g.abort()},[e,t,o,r,h]),s)return P.default.createElement("p",{role:"alert"},s," ",P.default.createElement("button",{onClick:()=>w(g=>g+1)},a("retry")));if(!f)return P.default.createElement("p",{role:"status"},a("loading"));let b=Qe(f.changes,u);return P.default.createElement("div",null,P.default.createElement("label",null,a("commitFileSearch")," ",P.default.createElement("input",{"aria-label":a("commitFileSearch"),value:u,onChange:g=>{x(g.target.value),S(null)}})),P.default.createElement("span",null," ",b.length," / ",f.changes.length),!!f.changes.length&&!b.length&&P.default.createElement("p",{role:"status"},a("emptySearch")),!f.changes.length&&P.default.createElement("p",null,a("revisionEmpty")),P.default.createElement("ul",null,b.map(g=>P.default.createElement("li",{key:g.id},P.default.createElement("button",{"aria-pressed":v===g.id,onClick:()=>S(g.id)},g.status," \xB7 ",g.oldPath?g.oldPath+" \u2192 ":"",g.path)))),v&&P.default.createElement(Te,{key:v,sessionId:e,repositoryId:t,base:o,target:r,id:v,rpc:i,t:a,onRediscover:p}))}function Ct(e){return P.default.createElement(go,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function go({commits:e,sessionId:t,repositoryId:o,rpc:r,t:i,onRediscover:a,onReferencesLoaded:p}){let[f,d]=(0,P.useState)(""),[s,c]=(0,P.useState)(""),[h,w]=(0,P.useState)([]),[v,S]=(0,P.useState)(!1),[u,x]=(0,P.useState)(0),[b,g]=(0,P.useState)(!1),[m,y]=(0,P.useState)("");return(0,P.useEffect)(()=>{if(!u)return;let k=new AbortController;return g(!0),y(""),r("vcs/references",{sessionId:t,repositoryId:o},k.signal).then(D=>{k.signal.aborted||(w(D.references),S(!0),p?.(D.references))}).catch(D=>{k.signal.aborted||(y(D.message),D.code==="vcs/rediscover-required"&&a())}).finally(()=>{k.signal.aborted||g(!1)}),()=>k.abort()},[t,o,u]),P.default.createElement("section",{"aria-label":i("revisionTitle")},P.default.createElement("h3",null,i("revisionTitle")),P.default.createElement("p",null,i("revisionScope")),P.default.createElement("button",{disabled:b,onClick:()=>x(k=>k+1)},i("revisionLoadRefs")),P.default.createElement("p",null,i("revisionRefsScope")),v&&!b&&!m&&P.default.createElement("p",{role:"status"},h.length?`${i("revisionRefsCount")}: ${h.length}`:i("revisionRefsEmpty")),b&&P.default.createElement("p",{role:"status"},i("loading")),m&&P.default.createElement("p",{role:"alert"},m),[[f,d,"revisionBase"],[s,c,"revisionTarget"]].map(([k,D,E])=>P.default.createElement("label",{key:E},i(E)," ",P.default.createElement("select",{"aria-label":i(E),value:k,onChange:q=>D(q.target.value)},P.default.createElement("option",{value:""},"\u2014"),!!e.length&&P.default.createElement("optgroup",{label:i("revisionLoadedCommits")},e.map(q=>P.default.createElement("option",{key:q.id,value:q.id},q.id.slice(0,10)," \xB7 ",q.subject))),!!h.length&&P.default.createElement("optgroup",{label:i("revisionLocalRefs")},h.map(q=>P.default.createElement("option",{key:q.name,value:q.commit},q.name," \xB7 ",q.commit.slice(0,10)))),k&&!e.some(q=>q.id===k)&&!h.some(q=>q.commit===k)&&P.default.createElement("option",{value:k},k)))),P.default.createElement("button",{disabled:!f||!s,onClick:()=>{d(s),c(f)}},i("revisionSwap")),P.default.createElement("p",{style:{overflowWrap:"anywhere"}},P.default.createElement("code",null,f||"\u2014")," \u2192 ",P.default.createElement("code",null,s||"\u2014")),f&&s&&P.default.createElement(ho,{key:JSON.stringify([t,o,f,s]),sessionId:t,repositoryId:o,base:f,target:s,rpc:r,t:i,onRediscover:a}))}function dr(e,t,o){let r=o?[...e.commits.filter(i=>!t.commits.some(a=>a.id===i.id)),...t.commits]:t.commits;return{...t,windowEnd:o+t.commits.length,commits:r.slice(-200)}}function Nt(e){return C.default.createElement(vo,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function vo({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,C.useState)({id:null,path:null,revision:0}),[f,d]=(0,C.useState)(""),[s,c]=(0,C.useState)(null),[h,w]=(0,C.useState)(""),[v,S]=(0,C.useState)(""),u=L=>{let Z=(s||[]).find(ee=>JSON.stringify([ee.name,ee.commit])===L)?.commit||"";S(L),w(Z),m(ee=>ee?{...ee,snapshot:Z||null}:null),de(0),d(""),q(null),ge({commits:[],snapshot:null,nextOffset:null})},[x,b]=(0,C.useState)({message:"",author:"",path:""}),[g,m]=(0,C.useState)(null),y=L=>{m({values:L,snapshot:_.snapshot}),de(0),d(""),q(null),ge(Y=>({...Y,commits:[],nextOffset:null}))},k=(0,C.useMemo)(()=>rr(s||[]),[s]),D=a.id,E=(L,Y=null)=>p(Z=>({id:L,path:Y,revision:Z.revision+1})),q=(L,Y=null)=>p(Z=>({id:L,path:Y,revision:Z.revision+(Y||Z.path?1:0)})),[_,ge]=(0,C.useState)({commits:[],snapshot:null,nextOffset:null}),[J,de]=(0,C.useState)(0),[H,ce]=(0,C.useState)(0),[re,Ce]=(0,C.useState)(!0),[ve,Ne]=(0,C.useState)("");(0,C.useEffect)(()=>{let L=new AbortController;return Ce(!0),Ne(""),o("vcs/history",{sessionId:e,repositoryId:t,offset:J,limit:50,...g?{search:g.values}:{},...g?.snapshot||h||J?{snapshot:g?.snapshot||h||_.snapshot}:{}},L.signal).then(Y=>{L.signal.aborted||(ge(Z=>dr(Z,Y,J)),J>=200&&(q(null),d("")))}).catch(Y=>{L.signal.aborted||(Ne(Y.message),Y.code==="vcs/rediscover-required"&&i())}).finally(()=>{L.signal.aborted||Ce(!1)}),()=>L.abort()},[e,t,J,H,g,h]);let se=nr(_.commits,f);return C.default.createElement("section",{className:"vcs-history","aria-label":r("history"),"aria-busy":re},C.default.createElement("div",{className:"vcs-history-list"},C.default.createElement("p",null,r("historyListOnly")),s!==null&&C.default.createElement("p",null,r("historyRefsScope")),C.default.createElement("label",null,r("historyBranch")," ",C.default.createElement("select",{"aria-label":r("historyBranch"),value:v,disabled:re,onChange:L=>u(L.target.value)},C.default.createElement("option",{value:""},"HEAD"),v&&!(s||[]).some(L=>JSON.stringify([L.name,L.commit])===v)&&C.default.createElement("option",{value:v},JSON.parse(v)[0]," \xB7 ",h.slice(0,10)," \xB7 ",r("historyPinned")),(s||[]).map(L=>{let Y=JSON.stringify([L.name,L.commit]);return C.default.createElement("option",{key:Y,value:Y},L.name," \xB7 ",L.commit.slice(0,10))}))),C.default.createElement("p",null,r("historyBranchScope"),h&&C.default.createElement(C.default.Fragment,null," \xB7 ",C.default.createElement("code",null,h))),C.default.createElement("form",{"aria-label":r("historyServerSearch"),onSubmit:L=>{L.preventDefault(),y({...x})}},C.default.createElement("fieldset",{disabled:re},C.default.createElement("legend",null,r("historyServerSearch")),C.default.createElement("p",null,r("historyServerScope")),["message","author","path"].map(L=>C.default.createElement("label",{key:L},r("historyServer_"+L)," ",C.default.createElement("input",{maxLength:1024,"aria-label":r("historyServer_"+L),value:x[L],onChange:Y=>b(Z=>({...Z,[L]:Y.target.value}))}))),C.default.createElement("button",{type:"submit"},r("historyServerApply")),C.default.createElement("button",{type:"button",onClick:()=>{b({message:"",author:"",path:""}),y({})}},r("historyServerClear")))),g&&C.default.createElement("p",{role:"status"},r("historyServerActive"),": ",JSON.stringify(g.values)," \xB7 ",C.default.createElement("code",null,g.snapshot||_.snapshot)),C.default.createElement("label",null,r("historySearch")," ",C.default.createElement("input",{"aria-label":r("historySearch"),value:f,onChange:L=>{d(L.target.value),q(null)}})),C.default.createElement("span",null," ",se.length," / ",_.commits.length),!!_.commits.length&&C.default.createElement("p",{role:"status"},r("historyWindow"),": ",Math.max(0,(_.windowEnd??_.commits.length)-_.commits.length),"\u2013",_.windowEnd??_.commits.length," \xB7 ",r("historyWindowScope")),!!_.commits.length&&!se.length&&C.default.createElement("p",{role:"status"},r("historyNoMatch")),C.default.createElement("ol",null,se.map(L=>C.default.createElement("li",{key:L.id},C.default.createElement("button",{"aria-pressed":D===L.id,onClick:()=>q(L.id)},L.subject),C.default.createElement("div",null,C.default.createElement("code",{title:L.id},L.id.slice(0,10))," \xB7 ",L.author," \xB7 ",C.default.createElement("time",{dateTime:L.date},L.date)),k.has(L.id)&&C.default.createElement("div",{"aria-label":r("historyRefsLabel"),style:{overflowWrap:"anywhere"}},k.get(L.id).names.map(Y=>C.default.createElement("span",{key:Y},C.default.createElement("code",null,Y)," ")),k.get(L.id).hidden>0&&C.default.createElement("span",null,r("historyRefsMore"),": ",k.get(L.id).hidden))))),re&&C.default.createElement("p",{role:"status"},r("loading")),ve&&C.default.createElement("p",{role:"alert"},ve," ",C.default.createElement("button",{onClick:()=>ce(L=>L+1)},r("retry"))),!re&&!ve&&!_.commits.length&&C.default.createElement("p",null,r("historyEmpty")),_.truncated&&C.default.createElement("p",{role:"status"},r("historyLimit")),!ve&&_.nextOffset!==null&&C.default.createElement("button",{disabled:re,onClick:()=>de(_.nextOffset)},r("historyMore")),!!_.commits.length&&C.default.createElement(kt,{commits:_.commits,selected:D,onSelect:q,t:r}),C.default.createElement(Ct,{onReferencesLoaded:c,commits:_.commits,sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i})),C.default.createElement("div",{className:"vcs-history-details"},D&&C.default.createElement(St,{key:JSON.stringify([D,a.revision]),initialPath:a.path,sessionId:e,repositoryId:t,commit:D,onSelectCommit:E,rpc:o,t:r,onRediscover:i})))}var cr={zh:{svnOfferExpired:"\u7F51\u7EDC\u8BBF\u95EE\u63D0\u6848\u5DF2\u8FC7\u671F\uFF1B\u8BF7\u624B\u52A8\u91CD\u8BD5\uFF0C\u5E76\u91CD\u65B0\u52FE\u9009\u540C\u610F\u3002",svnExpired:"SVN \u7F51\u7EDC\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u5386\u53F2\u8BF7\u6C42\u5DF2\u505C\u6B62\uFF1B\u8BF7\u91CD\u65B0\u5BA1\u9605\u5E76\u540C\u610F\u3002",svnConsentReview:"\u5BA1\u9605 SVN \u7F51\u7EDC\u8BBF\u95EE\u8303\u56F4",svnConsentScope:"\u540C\u610F\u524D\u4EC5\u8BFB\u53D6\u672C\u5730\u8EAB\u4EFD\u3002\u6388\u6743\u53EA\u9002\u7528\u4E8E\u6240\u5217\u4ED3\u5E93\u3001Session \u4E0E\u76EE\u5F55\uFF0C\u4E94\u5206\u949F\u6709\u6548\uFF1B\u4E0D\u6388\u6743\u91CD\u5B9A\u5411\u6216\u5199\u64CD\u4F5C\u3002",svnConsentExplicit:"\u6211\u540C\u610F\u8BBF\u95EE\u4EE5\u4E0A HTTPS SVN \u4ED3\u5E93",svnConsentApprove:"\u540C\u610F\u5E76\u8BFB\u53D6\u5386\u53F2",svnHistoryScope:"\u56FA\u5B9A\u672C\u5730 revision \u5FEB\u7167\u7684 SVN \u5386\u53F2\uFF1B\u5206\u9875\u66FF\u6362\u663E\u793A",svnHistoricalDiff:"\u5386\u53F2\u53EA\u8BFB Diff",svnTraceScope:"\u6587\u4EF6\u8FFD\u6EAF\u5728\u590D\u5236\u8FB9\u754C\u505C\u6B62\uFF0C\u4E0D\u8DDF\u968F\u8303\u56F4\u5916\u6765\u6E90",svnGrantScope:"\u7F51\u7EDC\u6388\u6743\u4E94\u5206\u949F\u6709\u6548\uFF1B\u53EF\u968F\u65F6\u64A4\u9500\uFF0C\u5386\u53F2\u64CD\u4F5C\u4E0D\u4FEE\u6539\u5DE5\u4F5C\u526F\u672C\u3002",svnRevoke:"\u64A4\u9500 SVN \u7F51\u7EDC\u6388\u6743",svnIdentity:"\u67E5\u770B SVN \u672C\u5730\u5386\u53F2\u8BBF\u95EE\u8EAB\u4EFD",svnOfflineIdentity:"\u4EC5\u4ECE\u6388\u6743\u5DE5\u4F5C\u526F\u672C\u8BFB\u53D6\u672C\u5730\u5143\u6570\u636E\uFF0C\u4E0D\u53D1\u8D77\u8FDC\u7A0B\u8BF7\u6C42\u3002",svnRemoteDisabled:"\u8FDC\u7A0B SVN \u5386\u53F2\u4F20\u8F93\u5C1A\u672A\u542F\u7528\uFF1B\u6CA1\u6709\u7F51\u7EDC\u6388\u6743\u6216\u53EF\u7528\u8BBF\u95EE\u51ED\u636E\u3002\u672C\u9875\u4E0D\u662F\u5DF2\u6388\u6743\u5386\u53F2\u5165\u53E3\u3002",historyWindow:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u7A97\u53E3\uFF08\u5E8F\u53F7\u5DE6\u95ED\u53F3\u5F00\uFF09",historyWindowScope:"\u5217\u8868\u53CA\u56FE\u6700\u591A\u4FDD\u7559200\u6761\uFF1B\u7EE7\u7EED\u52A0\u8F7D\u66FF\u6362\u8F83\u65B0\u884C\uFF0C\u8DE8\u7A97\u53E3\u8FB9\u4E0D\u8868\u793A\u5B8C\u6574\u56FE\u3002\u5C40\u90E8\u7B5B\u9009\u4EC5\u5F53\u524D\u7A97\u53E3\u3002",segments:"\u5206\u6BB5\u6D4F\u89C8\u5386\u53F2\u6B63\u6587",segmentBytes:"\u5B57\u8282\u8303\u56F4\uFF08\u5DE6\u95ED\u53F3\u5F00\uFF09",segmentScope:"\u4EC5\u56FA\u5B9A\u5386\u53F2 UTF-8 \u666E\u901A\u6587\u4EF6\uFF0C\u6700\u5927 16 MiB\uFF1B\u6BCF\u7247\u6700\u591A 64 KiB\uFF0C\u66FF\u6362\u663E\u793A\u4E0D\u7D2F\u79EF\u3002\u7247\u6BB5\u884C\u53F7\u4E0D\u662F\u539F\u6587\u4EF6\u884C\u53F7\uFF0C\u4E0D\u662F\u5168\u6587\u4EF6 Diff\u3002",blameOriginLine:"\u67E5\u770B\u6765\u6E90\u5386\u53F2\u884C",blameUnmapped:"\u65E0\u6CD5\u7CBE\u786E\u5B9A\u4F4D\u6765\u6E90\u884C",blamePrevious:"\u4E0A\u4E00\u884C\u9875",blameNext:"\u4E0B\u4E00\u884C\u9875",fileHistoryMergeBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u5408\u5E76\u63D0\u4EA4\uFF0C\u6B64\u5904\u505C\u6B62\uFF0C\u4E0D\u63A8\u65AD\u591A\u7236\u6765\u6E90",fileHistorySimilarity:"Git\u76F8\u4F3C\u5EA6",fileHistoryAmbiguous:"\u591A\u4E2A\u5019\u9009\u6765\u6E90\uFF0C\u6B64\u5904\u505C\u6B62\u8FFD\u6EAF",fileHistoryRenameLimit:"\u5DF2\u8FBE32\u6B21\u91CD\u547D\u540D\u786E\u8BA4\u4E0A\u9650\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u8DDF\u968FGit\u68C0\u51FA\u7684\u91CD\u547D\u540D\uFF1B50%\u4EE5\u4E0A\u76F8\u4F3C\u91CD\u547D\u540D\u989D\u5916\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u548C\u5408\u5E76\u5904\u505C\u6B62\u3002\u76F8\u4F3C\u5EA6\u4E0D\u662F\u8EAB\u4EFD\u4FDD\u8BC1\uFF1B\u6BCF\u6761\u8BB0\u5F55\u4F7F\u7528\u5F53\u65F6\u8DEF\u5F84\u3002",graphLaneLimit:"\u6CF3\u9053\u6700\u591A32\u6761\uFF1B\u8D85\u51FA\u90E8\u5206\u7701\u7565\u56FE\u5F62\uFF0C\u5B8C\u6574\u5DF2\u52A0\u8F7D\u8282\u70B9\u4E0E\u5173\u7CFB\u4ECD\u53EF\u5728\u6587\u5B57\u4E2D\u67E5\u770B\u3002",historyBranch:"\u5386\u53F2\u8D77\u70B9\uFF08\u672C\u5730\u5F15\u7528\uFF09",historyPinned:"\u56FA\u5B9A\u5FEB\u7167",historyBranchScope:"\u5F15\u7528\u7531\u4E0B\u65B9\u624B\u52A8\u52A0\u8F7D\uFF1B\u9009\u62E9\u540E\u56FA\u5B9A\u8BE5\u6B21OID\uFF0C\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5386\u53F2\u8D77\u70B9\u3002\u9009\u62E9HEAD\u91CD\u65B0\u8BFB\u53D6\u5F53\u524DHEAD\uFF0C\u4E0D\u5207\u6362\u5DE5\u4F5C\u533A\u3002",historyServerSearch:"\u5168\u5386\u53F2\u67E5\u8BE2",historyServerScope:"\u67E5\u8BE2\u56FA\u5B9A\u5FEB\u7167\u53EF\u8FBE\u7684\u5B8C\u6574\u5386\u53F2\uFF1B\u8BF4\u660E/\u4F5C\u8005\u4E3A\u5FFD\u7565\u5927\u5C0F\u5199\u7684\u5B57\u9762\u5339\u914D\uFF0C\u8DEF\u5F84\u4E3A\u7CBE\u786E\u8DEF\u5F84\u6216\u76EE\u5F55\uFF0C\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u3002\u5206\u9875\u4E0E\u8FD0\u884C\u65F6\u95F4\u6709\u754C\u3002",historyServer_message:"\u63D0\u4EA4\u8BF4\u660E",historyServer_author:"\u4F5C\u8005",historyServer_path:"\u8DEF\u5F84",historyServerApply:"\u6267\u884C\u67E5\u8BE2",historyServerClear:"\u6E05\u9664\u67E5\u8BE2",historyServerActive:"\u5F53\u524D\u5DF2\u63D0\u4EA4\u67E5\u8BE2",reviewView:"\u5BA1\u9605\u89C6\u56FE",workspaceView:"\u5DE5\u4F5C\u533A\u6539\u52A8",workspaceRoot:"\u5DE5\u4F5C\u533A\u672C\u8EAB",title:"VCS \u53D8\u66F4",readonly:"\u53EA\u8BFB\u9884\u89C8",refresh:"\u5237\u65B0",back:"\u8FD4\u56DE\u5BF9\u8BDD",all:"\u5168\u90E8\u53D8\u66F4",staged:"\u5DF2\u6682\u5B58",unstaged:"\u672A\u6682\u5B58",search:"\u641C\u7D22\u6587\u4EF6\u2026",noSession:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u4F1A\u8BDD\uFF0C\u518D\u67E5\u770B\u53D8\u66F4\u3002",noRepo:"\u672A\u53D1\u73B0 Git / SVN \u4ED3\u5E93\u3002\u53EF\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u540E\u91CD\u65B0\u626B\u63CF\u3002",clean:"\u6CA1\u6709\u53D8\u66F4",pick:"\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",loading:"\u6B63\u5728\u8BFB\u53D6\u2026",side:"\u5DE6\u53F3\u5BF9\u6BD4",inline:"\u884C\u5185\u5BF9\u6BD4",whitespace:"\u5FFD\u7565\u884C\u9996\u5C3E\u7A7A\u767D",wrap:"\u81EA\u52A8\u6362\u884C",previous:"\u4E0A\u4E00\u5904",next:"\u4E0B\u4E00\u5904",content:"\u5185\u5BB9",properties:"\u5C5E\u6027",binary:"\u4E8C\u8FDB\u5236\u6216\u53D7\u9650\u5185\u5BB9\u65E0\u6CD5\u6309\u6587\u672C\u6BD4\u8F83",changes:"\u5904\u53D8\u66F4",files:"\u4E2A\u6587\u4EF6",list:"\u5E73\u94FA",tree:"\u76EE\u5F55",emptySearch:"\u6CA1\u6709\u5339\u914D\u6587\u4EF6",session:"\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55",M:"\u4FEE\u6539",A:"\u65B0\u589E",D:"\u5220\u9664",R:"\u91CD\u547D\u540D",C:"\u590D\u5236",U:"\u51B2\u7A81","?":"\u672A\u8DDF\u8E2A",P:"\u5C5E\u6027",error:"\u8BFB\u53D6\u5931\u8D25",retry:"\u91CD\u8BD5",stale:"\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",repositories:"\u4ED3\u5E93",allRepositories:"\u5168\u90E8\u4ED3\u5E93",gitMode:"Git \u53D8\u66F4",svnBase:"SVN \xB7 BASE \u2194 \u5DE5\u4F5C\u526F\u672C",subdirectory:"\u76F8\u5BF9\u5B50\u76EE\u5F55\uFF08\u53EF\u9009\uFF09",rescan:"\u91CD\u65B0\u626B\u63CF\u4ED3\u5E93",scanHint:"\u4EC5\u626B\u63CF\u5F53\u524D\u76EE\u5F55\u53CA\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF0C\u4E0D\u9012\u5F52\u6DF1\u5165 \xB7 \u7F13\u5B58 5 \u5206\u949F\u540E\u8FC7\u671F",truncated:"\u5DF2\u8FBE\u5230\u626B\u63CF\u4E0A\u9650\u3002\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u5E76\u91CD\u65B0\u626B\u63CF\u4EE5\u8865\u5145\u5176\u4ED6\u4F4D\u7F6E\u3002",fallback:"\u9AD8\u7EA7\u7F16\u8F91\u5668\u4E0D\u53EF\u7528\uFF0C\u5DF2\u5207\u6362\u4E3A\u57FA\u7840\u5DE6\u53F3\u6587\u672C\u5BF9\u6BD4\u3002",diagnostics:"\u52A0\u8F7D\u8BCA\u65AD",approximate:"\u5185\u5BB9\u8F83\u5927\uFF0C\u4F7F\u7528\u8FD1\u4F3C\u884C\u5BF9\u9F50\u3002",textTruncated:"\u4EC5\u663E\u793A\u524D 2000 \u884C\u3002",textBefore:"\u4FEE\u6539\u524D",textAfter:"\u4FEE\u6539\u540E",textReadonly:"\u53EA\u8BFB\u6587\u672C\u6BD4\u8F83",textEmpty:"\u4E24\u4E2A\u7248\u672C\u5747\u4E3A\u7A7A\u3002",commitDetails:"\u63D0\u4EA4\u8BE6\u60C5",commitFileSearch:"\u7B5B\u9009\u672C\u6B21\u63D0\u4EA4\u6587\u4EF6",commitParent:"\u6BD4\u8F83\u7236\u63D0\u4EA4",commitRoot:"\u7A7A\u57FA\u7EBF\uFF08\u6839\u63D0\u4EA4\uFF09",commitNoChanges:"\u76F8\u5BF9\u6B64\u57FA\u7EBF\u65E0\u6587\u4EF6\u53D8\u66F4",history:"\u63D0\u4EA4\u5386\u53F2",largeLoad:"\u52A0\u8F7D\u5B8C\u6574\u5927\u6587\u4EF6\u6BD4\u8F83",largeClose:"\u53D6\u6D88\u5927\u6587\u4EF6\u6A21\u5F0F",largeScope:"\u4EC5Git\u5386\u53F2UTF-8\u666E\u901A\u6587\u4EF6\uFF0C\u6BCF\u4FA7\u6700\u591A8MiB\u300110\u4E07\u884C\uFF1B\u4E0D\u662F\u5DE5\u4F5C\u533A\u6216SVN\u5927\u6587\u4EF6\u3002",diffPending:"\u6B63\u5728\u8BA1\u7B97\u5DEE\u5F02\uFF0C\u5C1A\u4E0D\u80FD\u5224\u65AD\u662F\u5426\u76F8\u540C\u3002",diffIncomplete:"\u5DEE\u5F02\u8BA1\u7B97\u672A\u5B8C\u6210\u6216\u8D85\u65F6\uFF0C\u5F53\u524D\u7ED3\u679C\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002",diffComplete:"\u5DEE\u5F02\u8BA1\u7B97\u5B8C\u6210\u3002",largeFallback:"\u57FA\u7840\u89C6\u56FE\u53EA\u5C55\u793A\u6709\u754C\u7247\u6BB5\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5927\u6587\u4EF6\u5DEE\u5F02\u3002",historyAdvanced:"\u52A0\u8F7D\u9AD8\u7EA7\u53EA\u8BFB Diff",historyBasic:"\u8FD4\u56DE\u57FA\u7840\u6587\u672C Diff",historyListOnly:"\u672C\u5730 HEAD \u5386\u53F2\uFF1B\u9009\u62E9\u63D0\u4EA4\u53CA\u6587\u4EF6\u67E5\u770B\u53EA\u8BFB\u6587\u672C\u5DEE\u5F02\u3002",historyEmpty:"\u5C1A\u65E0\u63D0\u4EA4",historyRefsScope:"\u6807\u8BB0\u6765\u81EA\u6700\u8FD1\u4E00\u6B21\u624B\u52A8\u52A0\u8F7D\u7684\u672C\u5730\u5F15\u7528\uFF0C\u4E0D\u4EE3\u8868\u63D0\u4EA4\u521B\u5EFA\u65F6\u7684\u5206\u652F\u72B6\u6001\uFF1B\u5237\u65B0\u5931\u8D25\u65F6\u4FDD\u7559\u4E0A\u6B21\u6210\u529F\u7ED3\u679C\u3002",historyRefsLabel:"\u5DF2\u52A0\u8F7D\u672C\u5730\u5F15\u7528",historyRefsMore:"\u5176\u4ED6\u5F15\u7528",historySearch:"\u7B5B\u9009\u5DF2\u52A0\u8F7D\u63D0\u4EA4\uFF08\u4F5C\u8005 / \u6458\u8981 / SHA\uFF09",historyNoMatch:"\u5DF2\u52A0\u8F7D\u63D0\u4EA4\u4E2D\u65E0\u5339\u914D\u9879\uFF1B\u53EF\u7EE7\u7EED\u52A0\u8F7D\u66F4\u591A\u3002",historyMore:"\u52A0\u8F7D\u66F4\u591A\u63D0\u4EA4",historyLimit:"\u5DF2\u8FBE\u5230\u5386\u53F2\u6D4F\u89C8\u8303\u56F4\u4E0A\u9650\uFF0C\u4ECD\u6709\u66F4\u65E9\u63D0\u4EA4\u672A\u663E\u793A\u3002",autoRefresh:"\u624B\u52A8\u6216\u7A97\u53E3\u805A\u7126\u65F6\u5237\u65B0",comparisonContext:"\u6BD4\u8F83\u4E0A\u4E0B\u6587",encoding:"\u7F16\u7801",before:"\u524D\u7248\u672C",after:"\u540E\u7248\u672C",filterStatus:"\u6309\u72B6\u6001\u7B5B\u9009",allFiles:"\u5168\u90E8\u6587\u4EF6",previousFile:"\u4E0A\u4E00\u4E2A\u6587\u4EF6",nextFile:"\u4E0B\u4E00\u4E2A\u6587\u4EF6",expandAll:"\u5168\u90E8\u5C55\u5F00",collapseAll:"\u5168\u90E8\u6298\u53E0",revealSelected:"\u5B9A\u4F4D\u5F53\u524D\u6587\u4EF6",reviewPosition:"\u7B2C {index} / {total} \u4E2A\u6587\u4EF6",clearFilters:"\u6E05\u9664\u7B5B\u9009",searchShortcut:"Ctrl / \u2318 + F \u641C\u7D22\uFF1BEsc \u6E05\u7A7A\u641C\u7D22",fileShortcut:"Alt + \u2190 / \u2192 \u5207\u6362\u4E0A\u4E00\u4E2A\u6216\u4E0B\u4E00\u4E2A\u6587\u4EF6",copyPath:"\u590D\u5236\u8DEF\u5F84",copied:"\u5DF2\u590D\u5236",pathCopied:"\u6587\u4EF6\u8DEF\u5F84\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",copyFailed:"\u65E0\u6CD5\u590D\u5236\u6587\u4EF6\u8DEF\u5F84\u3002",binaryComparison:"\uFF08{files}\uFF09",revisionTitle:"\u672C\u5730\u7248\u672C A/B \u6BD4\u8F83",revisionScope:"\u53EF\u9009\u62E9\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4\uFF0C\u6216\u624B\u52A8\u52A0\u8F7D\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E\uFF1B\u76F4\u63A5\u6BD4\u8F83 A \u2192 B\uFF0C\u4E0D\u4F7F\u7528\u5408\u5E76\u57FA\u70B9\u3002",revisionBase:"A\uFF08\u5DE6\u4FA7\uFF09",revisionTarget:"B\uFF08\u53F3\u4FA7\uFF09",revisionSwap:"\u4EA4\u6362 A/B",revisionEmpty:"\u4E24\u4E2A\u7248\u672C\u6CA1\u6709\u6587\u4EF6\u53D8\u66F4\u3002",fileHistory:"\u8DEF\u5F84\u5386\u53F2",fileHistoryScope:"\u56FA\u5B9A\u63D0\u4EA4\u5FEB\u7167\u4E0B\u7684\u7CBE\u786E\u8DEF\u5F84\u5386\u53F2\uFF1B\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u524D\u8DEF\u5F84\uFF0C\u5305\u542B\u540C\u8DEF\u5F84\u5220\u9664\u540E\u91CD\u5EFA\u3002\u70B9\u51FB\u63D0\u4EA4\u540E\uFF0C\u4EC5\u5728\u76F8\u5BF9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF08\u6839\u63D0\u4EA4\u4E3A\u7A7A\u6811\uFF09\u7684\u53D8\u66F4\u4E2D\u552F\u4E00\u5339\u914D\u540C\u8DEF\u5F84\u65F6\u6253\u5F00 Diff\uFF1B\u5426\u5219\u53EA\u663E\u793A\u8BE6\u60C5\u3002",blame:"\u884C\u5F52\u5C5E\uFF08Blame\uFF09",blameNavigation:"\u70B9\u51FB\u5F52\u5C5E\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5\uFF1B\u9ED8\u8BA4\u9009\u62E9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\u5386\u53F2\u6587\u4EF6\u6216\u884C\u53F7\u3002",blameScope:"\u6240\u9009\u63D0\u4EA4\u7684 UTF-8 \u666E\u901A\u6587\u672C\uFF0C\u6700\u591A\u663E\u793A\u524D 500 \u884C\uFF1B\u4E0D\u5305\u542B\u5DE5\u4F5C\u533A\u4FEE\u6539\u3002",blameLimit:"\u4EC5\u663E\u793A\u524D 500 \u884C\uFF0C\u7ED3\u679C\u5DF2\u622A\u65AD\u3002",blameEmpty:"\u6587\u4EF6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u884C\u3002",blameLine:"\u884C\u53F7",blameCommit:"\u5F52\u5C5E\u63D0\u4EA4",blameAuthor:"\u4F5C\u8005",blameSummary:"\u63D0\u4EA4\u6458\u8981",blameSource:"\u6E90\u7801",historicalTree:"\u5386\u53F2\u76EE\u5F55",historicalTreeScope:"\u6240\u9009\u63D0\u4EA4\u7684\u76EE\u5F55\u6761\u76EE\uFF1B\u6BCF\u9875 100 \u9879\u3002\u70B9\u51FB\u666E\u901A\u6587\u4EF6\u53EA\u8BFB\u9884\u89C8\uFF1B\u4E0D\u8DDF\u968F\u7B26\u53F7\u94FE\u63A5\u6216\u5B50\u6A21\u5757\u3002",treePreview:"\u5386\u53F2\u6587\u4EF6\u9884\u89C8",treeClose:"\u5173\u95ED\u6587\u4EF6\u9884\u89C8",treeEmpty:"\u7A7A\u6587\u4EF6\u6216\u65E0\u53EF\u663E\u793A\u7684\u6587\u672C\u3002",treeSearch:"\u7B5B\u9009\u5F53\u524D\u76EE\u5F55\u540D\u79F0",treeBreadcrumbs:"\u5386\u53F2\u76EE\u5F55\u8DEF\u5F84",treeUp:"\u4E0A\u7EA7\u76EE\u5F55",treeEntries:"\u4E2A\u6761\u76EE",treePrevious:"\u4E0A\u4E00\u9875",treeNext:"\u4E0B\u4E00\u9875",historyGraph:"\u5C40\u90E8\u63D0\u4EA4\u56FE",graphScope:"\u4EC5\u5C55\u793A\u5DF2\u52A0\u8F7D\u5386\u53F2\u7684\u524D 200 \u4E2A\u63D0\u4EA4\uFF0C\u6700\u591A 1000 \u6761\u7236\u5B50\u8FB9\uFF1B\u4E0D\u53D7\u6587\u672C\u7B5B\u9009\u5F71\u54CD\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5206\u652F\u56FE\u3002\u8282\u70B9\u70B9\u51FB\u53EF\u67E5\u770B\u8BE6\u60C5\u3002",graphLimit:"\u56FE\u5DF2\u8FBE\u5230\u8282\u70B9\u6216\u8FB9\u4E0A\u9650\uFF0C\u90E8\u5206\u5173\u7CFB\u672A\u5C55\u793A\u3002",graphMissing:"\u7236\u63D0\u4EA4\u672A\u5728\u5F53\u524D\u56FE\u4E2D",graphRelations:"\u7236\u5B50\u5173\u7CFB\uFF08\u6587\u672C\uFF09",graphInvalid:"\u5F53\u524D\u63D0\u4EA4\u987A\u5E8F\u65E0\u6CD5\u7ED8\u56FE\uFF1B\u8BF7\u4F7F\u7528\u5386\u53F2\u5217\u8868\u3002",imageCompare:"PNG \u56FE\u7247\u6BD4\u8F83",imageBefore:"\u6240\u9009\u7236\u63D0\u4EA4",imageAfter:"\u6240\u9009\u63D0\u4EA4",imageAbsent:"\u6B64\u4FA7\u6CA1\u6709\u6587\u4EF6\u3002",imageInvalid:"\u56FE\u7247\u54CD\u5E94\u65E0\u6548\u3002",imageMetadata:"\u9884\u89C8\u5DF2\u79FB\u9664\u9644\u52A0\u5143\u6570\u636E\u3002",imageScope:"\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u4E0E 8 \u4F4D\u5355\u626B\u63CF baseline JPEG \u666E\u901A\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5355\u5757 simple \u9759\u6001 WebP\uFF08\u4E0D\u652F\u6301\u6E10\u8FDB\u5F0F/CMYK JPEG\u3001\u6269\u5C55/\u52A8\u753B WebP\uFF09\uFF1B\u6BCF\u4FA7\u6700\u591A 2 MiB\u30011600 \u4E07\u50CF\u7D20\u3002\u5143\u6570\u636E\u88AB\u79FB\u9664\uFF0C\u4E0D\u9002\u7528\u4E8E\u8272\u5F69\u7CBE\u786E\u6027\u5BA1\u9605\u3002\u652F\u6301\u5386\u53F2\u63D0\u4EA4\u3001\u56FA\u5B9A A/B \u53CA Git \u5DE5\u4F5C\u533A\uFF1B\u6309\u6240\u9009\u6A21\u5F0F\u8BFB\u53D6 HEAD\u3001\u6682\u5B58\u533A\u6216\u5DE5\u4F5C\u6587\u4EF6\u3002\u51B2\u7A81\u56FE\u7247\u4E0D\u652F\u6301\u3002",commitMessageLimit:"\u5B8C\u6574\u63D0\u4EA4\u8BF4\u660E\u8D85\u8FC7 2 MiB \u9884\u89C8\u4E0A\u9650\uFF0C\u5DF2\u7701\u7565\u3002",revisionLoadRefs:"\u52A0\u8F7D / \u5237\u65B0\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsScope:"\u4EC5\u672C\u5730\u5206\u652F\u548C\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\uFF0C\u6700\u591A 1000 \u6761\uFF1B\u4E0D fetch\u3002\u9009\u62E9\u56FA\u5B9A\u4E3A\u52A0\u8F7D\u65F6\u7684\u63D0\u4EA4 OID\uFF1B\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5DF2\u9009\u7248\u672C\u3002",revisionRefsEmpty:"\u6CA1\u6709\u53EF\u7528\u7684\u672C\u5730\u5206\u652F\u6216\u63D0\u4EA4\u6807\u7B7E\u3002",revisionLoadedCommits:"\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4",revisionLocalRefs:"\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{svnOfferExpired:"Network access offer expired. Retry manually and check consent again.",svnExpired:"SVN network consent expired; history requests stopped. Review and consent again.",svnConsentReview:"Review SVN network access",svnConsentScope:"Before consent, read local identity only. Access binds this repository, Session and cwd for five minutes; redirects and writes are not authorized.",svnConsentExplicit:"I consent to access the HTTPS SVN repository above",svnConsentApprove:"Consent and read history",svnHistoryScope:"SVN history at a fixed local revision snapshot; pages replace displayed rows",svnHistoricalDiff:"Historical read-only Diff",svnTraceScope:"File trace stops at copy boundaries and does not follow out-of-scope sources",svnGrantScope:"Network consent lasts five minutes; revoke at any time. History operations do not modify the working copy.",svnRevoke:"Revoke SVN network consent",svnIdentity:"Inspect local SVN history identity",svnOfflineIdentity:"Read local metadata from the authorized working copy only; no remote request.",svnRemoteDisabled:"Remote SVN history transport is not enabled; no network grant or usable access token. This is not an authorized history entry point.",historyWindow:"Loaded history window (start inclusive, end exclusive)",historyWindowScope:"List and graph retain at most 200 rows; more loads replace newer rows. Boundary edges are not a complete graph. Local filtering covers this window only.",segments:"Browse historical text segments",segmentBytes:"Byte range (start inclusive, end exclusive)",segmentScope:"Committed UTF-8 regular files up to 16 MiB; replaceable 64 KiB segments. Segment line numbers are not original file lines; this is not a full-file Diff.",blameOriginLine:"View origin historical line",blameUnmapped:"Origin line cannot be located precisely",blamePrevious:"Previous line page",blameNext:"Next line page",fileHistoryMergeBoundary:"Identity boundary: merge commit; stopped without inferring parent origin",fileHistorySimilarity:"Git similarity",fileHistoryAmbiguous:"Multiple candidate origins; tracing stopped here",fileHistoryRenameLimit:"32 rename confirmations reached; tracing stopped here",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow renames (first-parent)",fileHistoryFollowScope:"Git-detected renames; similarities of 50% or more require a unique deletion/addition transition. Stops at ambiguity, copies and merges. Similarity is not an identity guarantee; rows use historical paths.",graphLaneLimit:"At most 32 lanes. Overflow geometry is omitted; loaded nodes and relations remain available as text.",historyBranch:"History tip (local reference)",historyPinned:"Pinned snapshot",historyBranchScope:"Load references manually below. Selection pins that OID; refreshing references does not move the history tip. Selecting HEAD reads current HEAD without checking out.",historyServerSearch:"Full history query",historyServerScope:"Search all history reachable from the pinned snapshot. Message/author use case-insensitive literal matching; path is an exact path or directory, without rename following. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServerApply:"Run query",historyServerClear:"Clear query",historyServerActive:"Submitted query",reviewView:"Review view",workspaceView:"Working changes",workspaceRoot:"Workspace root",title:"VCS changes",readonly:"Read-only preview",refresh:"Refresh",back:"Back to chat",all:"All changes",staged:"Staged",unstaged:"Unstaged",search:"Filter files\u2026",noSession:"Open a project session to inspect its changes.",noRepo:"No Git / SVN repositories discovered. Try a relative subdirectory and rescan.",clean:"No changes",pick:"Select a file to review",loading:"Loading\u2026",side:"Side by side",inline:"Inline",whitespace:"Ignore trim whitespace",wrap:"Word wrap",previous:"Previous change",next:"Next change",content:"Content",properties:"Properties",binary:"Binary or restricted content cannot be compared as text",changes:"changes",files:"files",list:"Flat",tree:"Tree",emptySearch:"No matching files",session:"Session directory",M:"Modified",A:"Added",D:"Deleted",R:"Renamed",C:"Copied",U:"Conflict","?":"Untracked",P:"Property",error:"Failed to read",retry:"Retry",stale:"Content changed. Refresh and try again.",repositories:"Repositories",allRepositories:"All repositories",gitMode:"Git changes",svnBase:"SVN \xB7 BASE \u2194 Working Copy",subdirectory:"Relative subdirectory (optional)",rescan:"Rescan repositories",scanHint:"Scan current directory and immediate children only \xB7 cache expires after 5 minutes",truncated:"Discovery limit reached. Enter a relative subdirectory and rescan to include another location.",fallback:"Advanced editor unavailable. Showing basic side-by-side text comparison.",diagnostics:"Loading diagnostics",approximate:"Large content: approximate line alignment.",textTruncated:"Only the first 2000 lines are displayed.",textBefore:"Before",textAfter:"After",textReadonly:"Read-only text comparison",textEmpty:"Both versions are empty.",commitDetails:"Commit details",commitFileSearch:"Filter files in this commit",commitParent:"Compare parent",commitRoot:"Empty baseline (root commit)",commitNoChanges:"No file changes against this baseline",history:"Commit history",largeLoad:"Load complete large-file comparison",largeClose:"Cancel large-file mode",largeScope:"Git historical UTF-8 regular files only: 8 MiB and 100000 lines per side, not working-copy or SVN large files.",diffPending:"Computing differences; equality is not yet known.",diffIncomplete:"Difference computation is incomplete or timed out; displayed results may be partial.",diffComplete:"Difference computation completed.",largeFallback:"The basic view shows bounded excerpts, not the complete large-file diff.",historyAdvanced:"Load advanced read-only diff",historyBasic:"Return to basic text diff",historyListOnly:"Local HEAD history. Select a commit and file to view a read-only text diff.",historyEmpty:"No commits yet",historyRefsScope:"Labels reflect the last manually loaded local refs, not branches at commit creation. Failed refreshes retain the last successful result.",historyRefsLabel:"Loaded local references",historyRefsMore:"Additional references",historySearch:"Filter loaded commits (author / subject / SHA)",historyNoMatch:"No matches in loaded commits; you can load more if available.",historyMore:"Load more commits",historyLimit:"History browsing limit reached; older commits are not shown.",autoRefresh:"Refresh manually or on window focus",comparisonContext:"Comparison context",encoding:"Encoding",before:"Before",after:"After",filterStatus:"Filter by status",allFiles:"All files",previousFile:"Previous file",nextFile:"Next file",expandAll:"Expand all",collapseAll:"Collapse all",revealSelected:"Reveal current file",reviewPosition:"File {index} of {total}",clearFilters:"Clear filters",searchShortcut:"Ctrl / \u2318 + F to search; Esc clears search",fileShortcut:"Alt + \u2190 / \u2192 switches the previous or next file",copyPath:"Copy path",copied:"Copied",pathCopied:"File path copied to the clipboard.",copyFailed:"Unable to copy the file path.",binaryComparison:"({files})",revisionTitle:"Local A/B revision comparison",revisionScope:"Choose loaded commits or manually load local branches and tags. Compare A \u2192 B directly, not via merge-base.",revisionBase:"A (left)",revisionTarget:"B (right)",revisionSwap:"Swap A/B",revisionEmpty:"No file changes between these revisions.",fileHistory:"Path history",fileHistoryScope:"Exact-path history at the pinned commit; no rename following, including deletion and recreation. Selecting a commit opens its Diff only for a unique same-path change against the first parent (empty tree for a root); otherwise only details are shown.",blame:"Blame",blameNavigation:"Select an attributed commit to view details with its first parent selected; no automatic historical file or line navigation.",blameScope:"UTF-8 regular text at the selected commit, first 500 lines at most. Working changes are excluded.",blameLimit:"Only the first 500 lines are shown; result truncated.",blameEmpty:"No source lines to display.",blameLine:"Line",blameCommit:"Commit",blameAuthor:"Author",blameSummary:"Summary",blameSource:"Source",historicalTree:"Historical tree",historicalTreeScope:"Entries at the selected commit; 100 per page. Select regular files for read-only preview; symlinks and submodules are not followed.",treePreview:"Historical file preview",treeClose:"Close file preview",treeEmpty:"Empty file or no displayable text.",treeSearch:"Filter names in this directory",treeBreadcrumbs:"Historical directory path",treeUp:"Parent directory",treeEntries:"entries",treePrevious:"Previous page",treeNext:"Next page",historyGraph:"Local commit graph",graphScope:"First 200 loaded commits, at most 1000 parent edges. Independent of text filtering; not a complete branch graph. Select a node for details.",graphLimit:"Node or edge limit reached; some relationships are omitted.",graphMissing:"Parent outside this graph",graphRelations:"Parent relationships (text)",graphInvalid:"Cannot graph this commit order; use the history list.",imageCompare:"PNG image comparison",imageBefore:"Selected parent",imageAfter:"Selected commit",imageAbsent:"No file on this side.",imageInvalid:"Invalid image response.",imageMetadata:"Ancillary metadata was removed from this preview.",imageScope:"Non-interlaced static PNG or 8-bit single-scan baseline JPEG regular files , or single-chunk simple static WebP (no progressive/CMYK JPEG or extended/animated WebP); at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Supports commits, fixed A/B and Git working changes; HEAD, index or working bytes follow the selected mode. Conflicted images are unsupported.",commitMessageLimit:"Full commit message exceeds the 2 MiB preview limit and was omitted.",revisionLoadRefs:"Load / refresh local branches and tags",revisionRefsScope:"Local branches and commit tags only, at most 1000 refs; no fetch. Selections pin the loaded commit OID; refreshing refs does not move selected versions.",revisionRefsEmpty:"No local branches or commit tags are available.",revisionLoadedCommits:"Loaded commits",revisionLocalRefs:"Local branches and tags",revisionRefsCount:"Selectable references loaded"}};function pr(e,t,o,r){let i=e.target;if(!t?.contains(i)||e.defaultPrevented||e.isComposing||i?.closest?.(".monaco-editor")||i?.closest?.(".vcs-history"))return null;if(e.key==="Escape"&&i===o&&r)return"clear";let a=i?.isContentEditable||i?.closest?.('input,textarea,select,[role="textbox"]');if(a&&i!==o)return null;if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&e.key?.toLowerCase()==="f")return"search";if(!a&&e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){if(e.key==="ArrowLeft")return"previous";if(e.key==="ArrowRight")return"next"}return null}function ur(e,t){let o=t?[...t.querySelectorAll("button[data-vcs-item]")]:[],r=o.indexOf(e.target);if(r<0)return;let i;if(e.key==="ArrowDown")i=o[r+1];else if(e.key==="ArrowUp")i=o[r-1];else if(e.key==="Home")i=o[0];else if(e.key==="End")i=o.at(-1);else if(e.key==="ArrowRight"&&e.target.dataset.vcsDirectory==="closed"||e.key==="ArrowLeft"&&e.target.dataset.vcsDirectory==="open"){e.preventDefault(),e.target.click();return}else return;e.preventDefault(),i?.focus()}var fr=e=>"dsh-vcs:project:v1:"+e;function mr(e,t){if(!e)return"";try{let o=(t??globalThis.localStorage)?.getItem(fr(e));return typeof o=="string"&&o.length<=1024?o:""}catch{return""}}function hr(e,t,o){if(!(!e||!t))try{(o??globalThis.localStorage)?.setItem(fr(e),t)}catch{}}function vr(e,t=""){return e.find(o=>o.id===t)?.id||e.find(o=>o.relativePath===".")?.id||e[0]?.id||""}var je=(e,t)=>JSON.stringify([e,t]),qe=(e,t=".")=>[e.type.toUpperCase(),e.relativePath==="."?t:e.relativePath||".",e.branch].filter(Boolean).join(" \xB7 "),Xe=(e,t="all")=>e.type==="git"&&["staged","unstaged"].includes(t)?t:"all",gr=(e="",t="")=>e===t?0:e<t?-1:1;function Et(e=[]){let t={id:"",name:"",directories:new Map,files:[],count:0};for(let r of e){let i=String(r.path||"").split("/").filter(Boolean);if(!i.length)continue;let a=t;for(let p of i.slice(0,-1)){let f=a.id?a.id+"/"+p:p;a.directories.has(p)||a.directories.set(p,{id:f,name:p,directories:new Map,files:[],count:0}),a=a.directories.get(p),a.count++}a.files.push(r)}let o=r=>({...r,directories:[...r.directories.values()].sort((i,a)=>gr(i.name,a.name)).map(o),files:[...r.files].sort((i,a)=>gr(i.path,a.path))});return o(t)}function yr(e=[],t){let o=e.findIndex(r=>r.id===t);return{index:o<0?0:o+1,total:e.length}}function br(e=[],t,o){if(!e.length||!["previous","next"].includes(o))return null;let r=e.findIndex(p=>p.id===t),i=o==="next"?1:-1,a=r<0?o==="next"?-1:0:r;return e[(a+i+e.length)%e.length]||null}function xr(e=""){let t=String(e).split("/").filter(Boolean);return t.slice(0,-1).map((o,r)=>t.slice(0,r+1).join("/"))}function At(e,t=[]){for(let o of e?.directories||[])t.push(o.id),At(o,t);return t}function wr(e=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[e]||e}function Sr(e=[]){return e.reduce((t,o)=>{let r=wr(o.status);return t.all++,t[r]=(t[r]||0)+1,t},{all:0})}function bo(e=[],t="",o="all"){let r=t.toLowerCase();return e.filter(i=>(o==="all"||wr(i.status)===o)&&i.path.toLowerCase().includes(r)).sort((i,a)=>i.path.localeCompare(a.path))}function kr(e,t,o="",r="all"){return e.map(i=>({...t[i.id],repository:i,changes:bo(t[i.id]?.changes,o,r)}))}function Cr(e,t,o=""){if(!o||!e||e.cwd!==t.cwd)return t;let r=new Map(e.repositories.map(i=>[i.id,i]));for(let i of t.repositories)r.set(i.id,i);return{...t,repositories:[...r.values()],truncated:e.truncated||t.truncated,warnings:[...e.warnings||[],...t.warnings||[]]}}var Nr={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},Er=e=>new URL("vcs-assets/"+e,document.baseURI).href;function Ar(){return n.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},n.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),n.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var xo=["slots","layout","locale","connection","uiSession"];function wo(e){e.effect(()=>e.locale.register("local.vcs",cr));let t=e.locale.bind("local.vcs"),o=ut(2),r=Qt(e.connection,()=>t("error"));function i(f){let d=f.useSessions(s=>Object.values(s.byId).find(c=>(c.retainedBy.mainView??0)>0));return n.default.createElement(a,{key:JSON.stringify([d?.id,d?.cwd])},n.default.createElement(p,{session:d}))}class a extends n.default.Component{state={error:null};static getDerivedStateFromError(d){return{error:d}}render(){return this.state.error?n.default.createElement("section",{className:"vcs-root"},n.default.createElement("style",null,pt),n.default.createElement("div",{className:"vcs-message vcs-error"},t("error"),n.default.createElement("button",{onClick:()=>this.setState({error:null})},t("retry")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")))):this.props.children}}function p({session:f}){(0,n.useSyncExternalStore)(l=>e.locale.subscribe(l),()=>e.locale.getSnapshot(),()=>e.locale.getSnapshot());let d=f?.id,[s,c]=(0,n.useState)("all"),[h,w]=(0,n.useState)(0),[v,S]=(0,n.useState)(0),[u,x]=(0,n.useState)(null),[b,g]=(0,n.useState)({}),[m,y]=(0,n.useState)(()=>mr(f?.cwd)),[k,D]=(0,n.useState)(0),[E,q]=(0,n.useState)(""),[_,ge]=(0,n.useState)(""),[J,de]=(0,n.useState)(null),[H,ce]=(0,n.useState)(null),[re,Ce]=(0,n.useState)(!1),[ve,Ne]=(0,n.useState)(!1),[se,L]=(0,n.useState)(""),[Y,Z]=(0,n.useState)(""),[ee,Lt]=(0,n.useState)(""),[Pt,Ht]=(0,n.useState)(!1),[ue,$e]=(0,n.useState)(""),[Je,Dt]=(0,n.useState)("all"),[ye,Ot]=(0,n.useState)(!0),[Bt,Ze]=(0,n.useState)({}),[Ee,Lr]=(0,n.useState)(!0),[Re,Pr]=(0,n.useState)(!1),[et,Hr]=(0,n.useState)(!1),[Ge,Ae]=(0,n.useState)("content"),[Ft,Mt]=(0,n.useState)(0),[Dr,Tt]=(0,n.useState)(!1),[tt,rt]=(0,n.useState)({added:0,deleted:0,count:0}),[oe,jt]=(0,n.useState)(!1),qt=(0,n.useRef)(null),Jt=(0,n.useRef)(null),be=(0,n.useRef)(null),ot=(0,n.useRef)(null),Ue=(0,n.useRef)(null),it=(0,n.useRef)(null),Gt=(0,n.useRef)(null),Le=(0,n.useRef)(null),st=(0,n.useRef)(null),nt=(0,n.useRef)(null),at=(0,n.useRef)(!1),Ve=(0,n.useRef)(!1),fe=u?.repositories||[],me=fe.filter(l=>l.id===m),ne=Dr&&me.some(l=>l.type==="git"),Or=()=>{Le.current?.abort(),ce(null),de(null),Z(""),Tt(!0)};(0,n.useEffect)(()=>{fe.some(l=>l.id===m)&&hr(f?.cwd,m)},[f?.cwd,m,u]);let Pe=()=>{Gt.current?.abort(),Le.current?.abort(),ce(null),de(null),Z(""),Ae("content"),rt({added:0,deleted:0,count:0})},We=()=>{Ve.current=!1,Pe(),st.current?.abort(),nt.current=u,x(null),g({}),ge(E.trim()),D(l=>l+1)},xe=()=>{Ve.current||(Ve.current=!0,Pe(),st.current?.abort(),nt.current=null,x(null),g({}),ge(""),D(l=>l+1))},Ut=(l=!1)=>{l||S(N=>N+1),at.current=l,l||Pe(),l||g({}),w(N=>N+1)};(0,n.useEffect)(()=>{let l=new AbortController;return st.current=l,L(""),Ce(!!d),d&&r("vcs/repositories",{sessionId:d,..._?{subdirectory:_}:{}},l.signal).then(N=>{if(!l.signal.aborted){let j=Cr(nt.current,N,_);Ve.current=!1,y(z=>vr(j.repositories,z)),x(j)}}).catch(N=>{l.signal.aborted||L(N.message)}).finally(()=>{l.signal.aborted||Ce(!1)}),()=>l.abort()},[d,k,_]),(0,n.useEffect)(()=>{let l=new AbortController,N=at.current;Gt.current=l,at.current=!1,N||(g({}),Z(""));for(let j of me){let z=Xe(j,s);o(()=>r("vcs/status",{sessionId:d,repositoryId:j.id,mode:z},l.signal),l.signal).then(te=>{l.signal.aborted||g(ae=>({...ae,[j.id]:{...te,mode:z}}))}).catch(te=>{if(!l.signal.aborted){if(te.code==="vcs/rediscover-required"){xe();return}g(ae=>({...ae,[j.id]:{error:te.message,changes:[],mode:z}}))}})}return()=>l.abort()},[d,u,m,s,h]),(0,n.useEffect)(()=>{let l=N=>{N.target===window&&d&&m&&document.visibilityState==="visible"&&Ut(!0)};return window.addEventListener("focus",l),()=>window.removeEventListener("focus",l)},[d,m,s]);let He=fe.find(l=>l.id===J?.repositoryId),we=J?b[J.repositoryId]:null;(0,n.useEffect)(()=>{let l=new AbortController;return Le.current=l,ce(null),Z(""),rt({added:0,deleted:0,count:0}),Ae("content"),Ne(!!J&&!!we),!ne&&J&&we&&He&&r("vcs/compare",{sessionId:d,repositoryId:J.repositoryId,mode:Xe(He,s),id:J.id},l.signal).then(N=>{l.signal.aborted||ce(N)}).catch(N=>{if(!l.signal.aborted){if(N.code==="vcs/rediscover-required"){xe();return}Z(N.message)}}).finally(()=>{l.signal.aborted||Ne(!1)}),()=>l.abort()},[J,we,d,s,ne]),(0,n.useEffect)(()=>{let l=!1,N,j=new AbortController;jt(!1),Lt("");let z=document.createElement("link");return z.rel="stylesheet",z.href=Er("editor.css"),document.head.appendChild(z),_e(Er("editor.js")+"?v="+encodeURIComponent(Ye)+"&retry="+Ft,{signal:j.signal}).then(te=>{l||(N=te.createDiff(Jt.current,{onStats:rt}),be.current=N,jt(!0))}).catch(te=>{l||Lt(te.message)}),()=>{l=!0,j.abort(),N?.dispose(),be.current=null,z.remove()}},[Ft]),(0,n.useEffect)(()=>{oe&&H&&!H.binary&&be.current?.setContent(H,JSON.stringify([d,u?.cwd,J?.repositoryId,s,J?.id,H.path]))},[oe,H,d,u,J,s]),(0,n.useEffect)(()=>{be.current?.options({sideBySide:Ee,ignoreWhitespace:Re,wrap:et})},[oe,Ee,Re,et]);let De=kr(me,b,ue,Je),Se=De.flatMap(l=>l.changes),Br=Sr(we?.changes),lt=yr(Se,J?.id),Vt=()=>{$e(""),Dt("all")},Fr=async()=>{let l=H?.path||pe?.path;if(l)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{let N=document.createElement("textarea");try{if(N.value=l,N.style.cssText="position:fixed;opacity:0",document.body.appendChild(N),N.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{N.remove()}}Ht(!0),window.setTimeout(()=>Ht(!1),1500)}catch{Z(t("copyFailed"))}};(0,n.useEffect)(()=>{let l=N=>{if(ne)return;let j=pr(N,qt.current,Ue.current,!!ue);j&&(N.preventDefault(),j==="search"?(Ue.current?.focus(),Ue.current?.select()):j==="clear"?$e(""):dt(j))};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[ue,Se,J,ne]);let Wt=l=>Ze(N=>{let j={...N};for(let z of De)for(let te of At(Et(z.changes)))j[z.repository.id+"\0"+te]=!l;return j}),Mr=()=>{let l=pe;!l||!J||(Ot(!0),Vt(),Ze(N=>{let j={...N};for(let z of xr(l.path))j[J.repositoryId+"\0"+z]=!1;return j}),it.current=je(J.repositoryId,l.id))};(0,n.useEffect)(()=>{let l=it.current;if(!l)return;let N=[...ot.current?.querySelectorAll("button[data-vcs-change]")||[]].find(j=>j.dataset.vcsChange===l);N&&(N.scrollIntoView({block:"nearest"}),N.focus(),it.current=null)},[ye,ue,Je,Bt,De]);let dt=l=>{let N=br(Se,J?.id,l);N&&(Le.current?.abort(),ce(null),Ae("content"),de({repositoryId:m,id:N.id}))},It=re||me.some(l=>!b[l.id]),pe=we?.changes?.find(l=>l.id===J?.id),he=H?.properties,ct=he?[...new Set([...Object.keys(he.left||{}),...Object.keys(he.right||{})])].filter(l=>he.left?.[l]!==he.right?.[l]):[],Oe=l=>Nr[l?.status]||l?.status?.slice(0,1).toUpperCase()||"M",zt=H?.binary?[H.left.label,H.right.label].filter(Boolean).join(" \u2194 "):"",ke=Y||(ve?t("loading"):d?It&&!pe?t("loading"):se||(fe.length?pe?H?.binary?t("binary")+(zt?" "+t("binaryComparison",{files:zt}):""):H?!oe&&!ee?t("loading"):"":t("pick"):t("pick"):t("noRepo")):t("noSession")),Tr=l=>ur(l,ot.current),Kt=({entry:l,compact:N=!1,depth:j=0})=>{let z=l.path.lastIndexOf("/");return n.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":je(m,l.id),"aria-current":J?.repositoryId===m&&J?.id===l.id?"true":void 0,style:{paddingInlineStart:8+j*14},title:(l.oldPath?l.oldPath+" \u2192 ":"")+l.path+" \xB7 "+t(Oe(l)),onClick:()=>{Le.current?.abort(),ce(null),Ae("content"),de({repositoryId:m,id:l.id})}},n.default.createElement("span",{className:"vcs-status","data-status":Oe(l)},Oe(l)),n.default.createElement("span",{className:"vcs-filename"},N?l.path.slice(z+1):l.path,l.oldPath&&n.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",l.oldPath)))},_t=({node:l,repository:N,depth:j=0})=>n.default.createElement(n.default.Fragment,null,l.directories.map(z=>{let te=N.id+"\0"+z.id,ae=!!Bt[te];return n.default.createElement(n.default.Fragment,{key:te},n.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":ae?"closed":"open","aria-expanded":!ae,style:{paddingInlineStart:8+j*14},onClick:()=>Ze(jr=>({...jr,[te]:!ae}))},n.default.createElement("span",{"aria-hidden":"true"},ae?"\u203A":"\u2304"),z.name,n.default.createElement("small",null,z.count)),!ae&&n.default.createElement(_t,{node:z,repository:N,depth:j+1}))}),l.files.map(z=>n.default.createElement(Kt,{key:je(N.id,z.id),entry:z,compact:l.id!=="",depth:j})));return n.default.createElement("section",{ref:qt,className:"vcs-root","aria-label":t("title")},n.default.createElement("style",null,pt),n.default.createElement("header",{className:"vcs-top"},n.default.createElement(Ar,null),n.default.createElement("h1",{className:"vcs-title"},t("title")),n.default.createElement("span",{className:"vcs-badge"},t("readonly")),n.default.createElement("span",{className:"vcs-spacer"}),n.default.createElement("select",{"aria-label":t("repositories"),value:m,disabled:re||!fe.length,onChange:l=>{Pe(),g({}),y(l.target.value)}},!fe.length&&n.default.createElement("option",{value:""},t("repositories")),fe.map(l=>n.default.createElement("option",{key:l.id,value:l.id},qe(l,t("workspaceRoot"))))),n.default.createElement("label",{className:"vcs-mode"},t("gitMode")," ",n.default.createElement("select",{"aria-label":t("gitMode"),value:s,disabled:ne||!me.some(l=>l.type==="git"),onChange:l=>{Pe(),g({}),c(l.target.value)}},["all","unstaged","staged"].map(l=>n.default.createElement("option",{key:l,value:l},t(l))))),n.default.createElement("button",{onClick:()=>Ut(!1),disabled:It||!d},t("refresh")),n.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")),n.default.createElement("div",{className:"vcs-path",title:u?.cwd||f?.cwd},t("session"),": ",u?.cwd||f?.cwd||"\u2014"),n.default.createElement("form",{className:"vcs-discovery",onSubmit:l=>{l.preventDefault(),We()}},n.default.createElement("input",{"aria-label":t("subdirectory"),placeholder:t("subdirectory"),value:E,onChange:l=>q(l.target.value)}),n.default.createElement("button",{disabled:!d||re},t("rescan")),n.default.createElement("span",null,t("scanHint"))),u?.truncated&&n.default.createElement("div",{className:"vcs-notice"},t("truncated")),(u?.warnings||[]).map((l,N)=>n.default.createElement("div",{className:"vcs-notice",key:N},typeof l=="string"?l:l.message||JSON.stringify(l)))),me.filter(l=>l.type==="svn").map(l=>n.default.createElement(n.default.Fragment,{key:JSON.stringify([d,l.id,k,h])},n.default.createElement(mt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:xe}),n.default.createElement(vt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:xe}))),me.some(l=>l.type==="git")&&n.default.createElement(n.default.Fragment,null,n.default.createElement("nav",{className:"vcs-review-views","aria-label":t("reviewView")},n.default.createElement("button",{"aria-pressed":!ne,onClick:()=>Tt(!1)},t("workspaceView")),n.default.createElement("button",{"aria-pressed":ne,"aria-expanded":ne,onClick:Or},t("history"))),ne&&n.default.createElement(Nt,{key:JSON.stringify([d,m,v,k]),sessionId:d,repositoryId:m,rpc:r,t,onRediscover:xe})),n.default.createElement("div",{className:"vcs-body",hidden:ne,"aria-label":t("workspaceView")},n.default.createElement("aside",{className:"vcs-files"},n.default.createElement("div",{className:"vcs-filter"},n.default.createElement("input",{ref:Ue,"aria-label":t("search"),placeholder:t("search"),title:t("searchShortcut"),value:ue,onChange:l=>$e(l.target.value)}),(ue||Je!=="all")&&n.default.createElement("button",{className:"vcs-clear-filter",onClick:Vt},t("clearFilters"))),n.default.createElement("div",{className:"vcs-status-filter","aria-label":t("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":Je===l,onClick:()=>Dt(l)},t(l==="all"?"allFiles":Nr[l]||"M")," ",n.default.createElement("small",null,Br[l]||0)))),n.default.createElement("div",{className:"vcs-count"},n.default.createElement("span",null,Se.length," ",t("files")),n.default.createElement("span",{className:"vcs-auto"},t("autoRefresh")),n.default.createElement("button",{"aria-pressed":ye,onClick:()=>Ot(!ye)},t(ye?"tree":"list"))),ye&&n.default.createElement("div",{className:"vcs-tree-actions"},n.default.createElement("button",{onClick:()=>Wt(!0)},t("expandAll")),n.default.createElement("button",{onClick:()=>Wt(!1)},t("collapseAll")),n.default.createElement("button",{onClick:Mr,disabled:!pe},t("revealSelected"))),n.default.createElement("nav",{className:"vcs-filelist","aria-label":t("title"),ref:ot,onKeyDown:Tr},De.map(l=>{let N=l.repository;return n.default.createElement("section",{className:"vcs-repository",key:N.id,"aria-label":qe(N,t("workspaceRoot"))},n.default.createElement("div",{className:"vcs-repository-heading",title:N.root},n.default.createElement("strong",null,qe(N,t("workspaceRoot"))),n.default.createElement("small",null,N.type==="svn"?t("svnBase"):t(Xe(N,s)))),l.error?n.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},l.error,n.default.createElement("button",{onClick:We},t("rescan"))):b[N.id]?ye?n.default.createElement(_t,{node:Et(l.changes),repository:N}):l.changes.map(j=>n.default.createElement(Kt,{key:je(N.id,j.id),entry:j})):n.default.createElement("div",{className:"vcs-message"},t("loading")),!l.error&&b[N.id]&&!l.changes.length&&n.default.createElement("div",{className:"vcs-message"},t(ue?"emptySearch":"clean")))}),!De.length&&n.default.createElement("div",{className:"vcs-message"},re?t("loading"):se||t(d?"noRepo":"noSession"),se&&n.default.createElement("button",{onClick:We},t("rescan"))))),n.default.createElement("main",{className:"vcs-detail"},n.default.createElement("div",{className:"vcs-filehead"},n.default.createElement("strong",{title:H?.path||pe?.path},He?qe(He,t("workspaceRoot"))+" / ":"",H?.path||pe?.path||t("pick")),n.default.createElement("button",{className:"vcs-copy-path",disabled:!(H?.path||pe?.path),onClick:Fr},t(Pt?"copied":"copyPath")),Pt&&n.default.createElement("span",{className:"vcs-sr-only",role:"status"},t("pathCopied")),n.default.createElement("span",{className:"vcs-spacer"}),H&&!H.binary&&oe&&n.default.createElement(n.default.Fragment,null,n.default.createElement("span",{className:"vcs-add"},"+",tt.added),n.default.createElement("span",{className:"vcs-del"},"\u2212",tt.deleted))),ee&&n.default.createElement("div",{className:"vcs-notice",role:"status"},t("fallback")," ",n.default.createElement("button",{onClick:()=>Mt(l=>l+1)},t("retry")),n.default.createElement("details",null,n.default.createElement("summary",null,t("diagnostics")),ee)),H&&n.default.createElement("div",{className:"vcs-context","aria-label":t("comparisonContext")},n.default.createElement("span",{className:"vcs-context-status","data-status":Oe(H)},t(Oe(H))),H.oldPath&&n.default.createElement("span",{className:"vcs-context-rename",title:H.oldPath+" \u2192 "+H.path},H.oldPath," ",n.default.createElement("b",null,"\u2192")," ",H.path),n.default.createElement("span",null,H.left.label||"\u2014"," ",n.default.createElement("b",null,"\u2194")," ",H.right.label||"\u2014"),(H.left.encoding||H.right.encoding)&&n.default.createElement("span",null,t("encoding"),": ",H.left.encoding||"\u2014"," / ",H.right.encoding||"\u2014")),H&&He?.type==="git"&&n.default.createElement(Fe,{key:JSON.stringify([d,u?.cwd,J.repositoryId,s,J.id,h,we]),workspace:!0,sessionId:d,repositoryId:J.repositoryId,mode:s,id:J.id,rpc:r,t,onRediscover:xe}),H?.notice&&n.default.createElement("div",{className:"vcs-notice"},H.notice),ct.length>0&&n.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(l=>n.default.createElement("button",{key:l,"aria-pressed":Ge===l,onClick:()=>Ae(l)},t(l),l==="properties"?" ("+ct.length+")":""))),n.default.createElement("div",{className:"vcs-labels"},n.default.createElement("span",null,H?.left.label||"\u2014",H?.left.encoding?" \xB7 "+H.left.encoding:""),n.default.createElement("span",null,H?.right.label||"\u2014",H?.right.encoding?" \xB7 "+H.right.encoding:"")),n.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!ke||Ge!=="content",style:Ge==="properties"?{display:"none"}:void 0},n.default.createElement("div",{className:"vcs-editor",ref:Jt,style:ee?{display:"none"}:void 0}),ee&&H&&!H.binary&&!ke&&n.default.createElement(Be,{comparison:H,labels:ze(t)}),ke&&n.default.createElement("div",{className:"vcs-message "+(se||Y||ee?"vcs-error":""),role:"status"},ke,(se||Y||ee)&&n.default.createElement("button",{onClick:()=>ee?Mt(l=>l+1):We()},t(ee?"retry":"rescan")))),Ge==="properties"&&n.default.createElement("div",{className:"vcs-properties"},n.default.createElement("table",null,n.default.createElement("thead",null,n.default.createElement("tr",null,n.default.createElement("th",null,t("properties")),n.default.createElement("th",null,H?.left.label||t("before")),n.default.createElement("th",null,H?.right.label||t("after")))),n.default.createElement("tbody",null,ct.map(l=>n.default.createElement("tr",{key:l},n.default.createElement("th",null,l),n.default.createElement("td",null,he.left?.[l]??"\u2014"),n.default.createElement("td",null,he.right?.[l]??"\u2014")))))),n.default.createElement("footer",{className:"vcs-toolbar"},n.default.createElement("button",{disabled:!oe,"aria-pressed":Ee,onClick:()=>Lr(!Ee)},t(Ee?"side":"inline")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!oe,checked:Re,onChange:l=>Pr(l.target.checked)}),t("whitespace")),n.default.createElement("label",null,n.default.createElement("input",{type:"checkbox",disabled:!oe,checked:et,onChange:l=>Hr(l.target.checked)}),t("wrap")),n.default.createElement("span",{className:"vcs-spacer"}),oe&&n.default.createElement("span",null,tt.count," ",t("changes")),n.default.createElement("button",{disabled:!oe||!H||!!ke,onClick:()=>be.current?.navigate("previous")},t("previous")),n.default.createElement("button",{disabled:!oe||!H||!!ke,onClick:()=>be.current?.navigate("next")},t("next")),lt.index>0&&n.default.createElement("span",{className:"vcs-review-position"},t("reviewPosition",{index:lt.index,total:lt.total})),n.default.createElement("span",{className:"vcs-toolbar-separator"}),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Se.length,onClick:()=>dt("previous")},t("previousFile")),n.default.createElement("button",{title:t("fileShortcut"),disabled:!Se.length,onClick:()=>dt("next")},t("nextFile"))))))}e.slots.inject("main",()=>e.slots.register({name:"main",key:"local-vcs"},i)),e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>t("title"),order:65},Ar))}
|
|
95
|
+
`;function er(e,t){return async(o,r,i)=>{let a=await e.rpc.call("/vcs-rpc",o,r,i);if(!a.ok){let p=new Error(a.error?.message||String(a.error||t()));throw p.code=a.error?.code,p}return a.value}}function mt(e=2){if(!Number.isInteger(e)||e<1||e>2)throw new RangeError("Status concurrency must be 1 or 2");let t=0,o=[];function r(){for(;t<e&&o.length;){let i=o.shift();if(i.signal?.removeEventListener("abort",i.abort),i.signal?.aborted){i.reject(new Error("Aborted"));continue}t++,Promise.resolve().then(()=>{if(i.signal?.aborted)throw new Error("Aborted");return i.run()}).then(i.resolve,i.reject).finally(()=>{t--,r()})}}return(i,a)=>new Promise((p,f)=>{let d={run:i,signal:a,resolve:p,reject:f,abort:null};if(d.abort=()=>{let n=o.indexOf(d);n>=0&&(o.splice(n,1),f(new Error("Aborted")))},a?.aborted){f(new Error("Aborted"));return}a?.addEventListener("abort",d.abort,{once:!0}),o.push(d),r()})}var $=R(require("react"),1);function tr(e){return e===""?[]:e.split(/\r\n|\n|\r/)}function rr(e="",t=""){let o=tr(e),r=tr(t),i=0;for(;i<o.length&&i<r.length&&o[i]===r[i];)i++;let a=0;for(;a<o.length-i&&a<r.length-i&&o[o.length-a-1]===r[r.length-a-1];)a++;let p=o.length-a,f=r.length-a,d=p-i,n=f-i,c=d&&n?(d+1)*(n+1):0,h=c>2e5,w=[],v=0;function S(u,x){v++,!(w.length>=2e3)&&w.push({left:u===null?null:{number:u+1,text:o[u]},right:x===null?null:{number:x+1,text:r[x]},kind:u===null?"insert":x===null?"delete":o[u]===r[x]?"equal":"replace"})}for(let u=0;u<i;u++)S(u,u);if(h||!d||!n)for(let u=0;u<Math.max(d,n);u++)S(u<d?i+u:null,u<n?i+u:null);else{let u=n+1,x=new Uint32Array(c);for(let m=d-1;m>=0;m--)for(let y=n-1;y>=0;y--)x[m*u+y]=o[i+m]===r[i+y]?x[(m+1)*u+y+1]+1:Math.max(x[(m+1)*u+y],x[m*u+y+1]);let b=0,g=0;for(;b<d||g<n;)b<d&&g<n&&o[i+b]===r[i+g]?S(i+b++,i+g++):b<d&&(g===n||x[(b+1)*u+g]>=x[b*u+g+1])?S(i+b++,null):S(null,i+g++)}for(let u=0;u<a;u++)S(p+u,f+u);return{rows:w,approximate:h,truncated:v>w.length,totalRows:v,omittedRows:v-w.length,leftLineCount:o.length,rightLineCount:r.length,lcsCells:h?0:c}}var to={before:"Before",after:"After",readonly:"Read-only text comparison",approximate:"Approximate alignment: the changed region is too large for exact matching; lines are paired by position.",truncated:"Preview truncated to the first 2,000 aligned lines; additional lines are not shown.",empty:"Both versions are empty."},ht={verticalAlign:"top",padding:0,width:"50%",borderRight:"1px solid var(--border, #8884)"},ro={display:"flex",minHeight:"1.5em",fontFamily:"monospace",fontSize:12,lineHeight:1.5},oo={flex:"0 0 6ch",textAlign:"right",paddingRight:8,opacity:.65,userSelect:"none"},io={margin:0,flex:1,minWidth:0,whiteSpace:"pre-wrap",overflowWrap:"anywhere",tabSize:4,font:"inherit"};function Fe({comparison:e,labels:t={}}){let o=e?.left?.text??"",r=e?.right?.text??"",i=(0,$.useMemo)(()=>rr(o,r),[o,r]),a=f=>t[f]??to[f],p=(f,d,n)=>{let c=f&&n!=="equal";return $.default.createElement("td",{style:{...ht,background:c?d==="left"?"#d6454520":"#259b4920":void 0}},$.default.createElement("div",{style:ro},$.default.createElement("span",{style:oo},f?.number??""),$.default.createElement("span",{"aria-hidden":"true",style:{flex:"0 0 2ch",userSelect:"none"}},c?d==="left"?"\u2212":"+":""),$.default.createElement("pre",{style:io},f?.text??"")))};return $.default.createElement("section",{className:"vcs-text-comparison","aria-label":a("readonly"),style:{flex:"1 1 0",minHeight:0,minWidth:0,overflow:"auto",position:"absolute",inset:0},tabIndex:0},i.approximate&&$.default.createElement("div",{role:"status",style:{padding:8}},a("approximate")),i.truncated&&$.default.createElement("div",{role:"status",style:{padding:8}},a("truncated")," (",2e3," / ",i.totalRows,")"),$.default.createElement("table",{style:{width:"100%",tableLayout:"fixed",borderCollapse:"collapse",textAlign:"left"}},$.default.createElement("thead",null,$.default.createElement("tr",null,$.default.createElement("th",{scope:"col",style:{...ht,padding:8,overflowWrap:"anywhere"}},e?.left?.label||a("before")),$.default.createElement("th",{scope:"col",style:{...ht,padding:8,overflowWrap:"anywhere"}},e?.right?.label||a("after")))),$.default.createElement("tbody",null,i.rows.map((f,d)=>$.default.createElement("tr",{key:d,"data-kind":f.kind},p(f.left,"left",f.kind),p(f.right,"right",f.kind))))),!i.rows.length&&$.default.createElement("p",{style:{padding:8}},a("empty")))}var J=R(require("react"),1);function or(e,{width:t,height:o,signal:r,timeoutMs:i=1e4,createURL:a=d=>URL.createObjectURL(d),revokeURL:p=d=>URL.revokeObjectURL(d),createImage:f=()=>new Image}={}){return new Promise((d,n)=>{if(r?.aborted){n(r.reason);return}if(!["image/png","image/jpeg","image/webp"].includes(e?.type)||e.size>2*1024*1024||!Number.isInteger(t)||!Number.isInteger(o)||t<1||o<1||t>8192||o>8192||t*o>16e6||!Number.isFinite(i)||i<=0){n(new Error("Invalid image preview"));return}let c,h,w,v=!1,S=!1,u=()=>{S||(S=!0,h&&(h.src=""),c&&p(c))},x=()=>{clearTimeout(w),r?.removeEventListener("abort",g)},b=m=>{v||(v=!0,x(),u(),n(m))},g=()=>b(r.reason||new Error("Image cancelled"));try{c=a(e),h=f(),r?.addEventListener("abort",g,{once:!0}),w=setTimeout(()=>b(new Error("Image decode timed out")),i),h.src=c,Promise.resolve(h.decode()).then(()=>{if(!v){if(r?.aborted){g();return}if(h.naturalWidth!==t||h.naturalHeight!==o){b(new Error("Image dimensions mismatch"));return}v=!0,x(),d({url:c,dispose:u})}},b)}catch(m){b(m)}})}function so({side:e,sessionId:t,repositoryId:o,commit:r,parentIndex:i,base:a,target:p,workspace:f=!1,mode:d,id:n,rpc:c,t:h,onRediscover:w}){let[v,S]=(0,J.useState)(null),[u,x]=(0,J.useState)(""),[b,g]=(0,J.useState)(0);return(0,J.useEffect)(()=>{let m=new AbortController,y;return S(null),x(""),(async()=>{let k=await c(f?"vcs/workspace-image":a?"vcs/revision-image":"vcs/commit-image",f?{sessionId:t,repositoryId:o,mode:d,id:n,side:e}:a?{sessionId:t,repositoryId:o,base:a,target:p,id:n,side:e}:{sessionId:t,repositoryId:o,commit:r,parentIndex:i,id:n,side:e},m.signal);if(m.signal.aborted)return;if(k.absent){S(k);return}if(!["image/png","image/jpeg","image/webp"].includes(k.mime)||typeof k.base64!="string"||k.base64.length>2796204||!Number.isInteger(k.bytes)||k.bytes<1||k.bytes>2097152)throw Error(h("imageInvalid"));let B=atob(k.base64);if(B.length!==k.bytes)throw Error(h("imageInvalid"));let E=new Blob([Uint8Array.from(B,V=>V.charCodeAt(0))],{type:k.mime});if(y=await or(E,{width:k.width,height:k.height,signal:m.signal}),m.signal.aborted){y.dispose();return}S({...k,url:y.url})})().catch(k=>{m.signal.aborted||(x(k.message),k.code==="vcs/rediscover-required"&&w())}),()=>{m.abort(),y?.dispose()}},[e,t,o,r,i,a,p,f,d,n,b]),J.default.createElement("section",{style:{flex:"1 1 280px",minWidth:0},"aria-label":h(e==="left"?"imageBefore":"imageAfter")},J.default.createElement("h5",null,h(e==="left"?"imageBefore":"imageAfter")),u?J.default.createElement("p",{role:"alert"},u," ",J.default.createElement("button",{onClick:()=>g(m=>m+1)},h("retry"))):v?J.default.createElement(J.default.Fragment,null,J.default.createElement("p",null,J.default.createElement("code",null,v.commit)," \xB7 ",v.path),v.absent?J.default.createElement("p",null,h("imageAbsent")):J.default.createElement(J.default.Fragment,null,J.default.createElement("p",null,v.mime,v.encoding?" \xB7 "+v.encoding:""," \xB7 ",v.width," \xD7 ",v.height," \xB7 ",v.bytes," B"),J.default.createElement("img",{src:v.url,alt:v.path,style:{maxWidth:"100%",maxHeight:480,objectFit:"contain"}}),v.metadataStripped&&J.default.createElement("p",null,h("imageMetadata")))):J.default.createElement("p",{role:"status"},h("loading")))}function Me(e){let[t,o]=(0,J.useState)(!1);return J.default.createElement("div",null,J.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("imageCompare")),t&&J.default.createElement(J.default.Fragment,null,J.default.createElement("p",null,e.t("imageScope")),J.default.createElement("div",{style:{display:"flex",flexWrap:"wrap",gap:16}},["left","right"].map(r=>J.default.createElement(so,{key:r,...e,side:r})))))}function Ke(e){return{before:e("textBefore"),after:e("textAfter"),readonly:e("textReadonly"),empty:e("textEmpty"),approximate:e("approximate"),truncated:e("textTruncated")}}var W=R(require("react"),1);function gt(e){return W.default.createElement(no,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function no({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,W.useState)(!1),[f,d]=(0,W.useState)(null),[n,c]=(0,W.useState)(""),[h,w]=(0,W.useState)(0);return(0,W.useEffect)(()=>{if(!a)return;let v=new AbortController;return d(null),c(""),o("vcs/svn-identity",{sessionId:e,repositoryId:t},v.signal).then(S=>{v.signal.aborted||d(S)}).catch(S=>{v.signal.aborted||(c(S.message),S.code==="vcs/rediscover-required"&&i())}),()=>v.abort()},[a,e,t,h]),W.default.createElement("section",null,W.default.createElement("button",{"aria-expanded":a,onClick:()=>p(v=>!v)},r("svnIdentity")),a&&W.default.createElement(W.default.Fragment,null,W.default.createElement("p",null,r("svnOfflineIdentity")),n?W.default.createElement("p",{role:"alert"},n," ",W.default.createElement("button",{onClick:()=>w(v=>v+1)},r("retry"))):f?W.default.createElement(W.default.Fragment,null,W.default.createElement("dl",null,["origin","root","uuid","scope","revision"].map(v=>W.default.createElement(W.default.Fragment,{key:v},W.default.createElement("dt",null,v),W.default.createElement("dd",null,W.default.createElement("code",null,f[v]))))),W.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))):W.default.createElement("p",{role:"status"},r("loading"))))}function _e(e,t,{now:o=Date.now,schedule:r=setTimeout,cancel:i=clearTimeout}={}){if(!Number.isSafeInteger(e)||e<=o()||e-o()>3e5)throw Error("Invalid SVN consent expiry");let a=!0,p=r(()=>{a&&(a=!1,t())},e-o());return()=>{a&&(a=!1,i(p))}}function ir(e,t=Date.now()){if(!e||typeof e.token!="string"||!/^[a-f0-9]{64}$/.test(e.token)||typeof e.snapshot!="string"||!/^(0|[1-9][0-9]*)$/.test(e.snapshot)||BigInt(e.snapshot)>9223372036854775807n||!Number.isSafeInteger(e.expiresAt)||e.expiresAt<=t||e.expiresAt-t>3e5)throw Error("Invalid SVN consent response");return e}var X=R(require("react"),1);var M=R(require("react"),1);function vt(e){return M.default.createElement(ao,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function ao({sessionId:e,repositoryId:t,rpc:o,t:r,onApproved:i,onRediscover:a}){let[p,f]=(0,M.useState)(!1),[d,n]=(0,M.useState)(null),[c,h]=(0,M.useState)(!1),[w,v]=(0,M.useState)(""),[S,u]=(0,M.useState)(!1),[x,b]=(0,M.useState)(0);(0,M.useEffect)(()=>{if(!p)return;let y=new AbortController;return n(null),h(!1),v(""),u(!0),o("vcs/svn-describe",{sessionId:e,repositoryId:t},y.signal).then(k=>{y.signal.aborted||n(k)}).catch(k=>{y.signal.aborted||(v(k.message),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{y.signal.aborted||u(!1)}),()=>y.abort()},[p,e,t,x]);let[g,m]=(0,M.useState)(0);return(0,M.useEffect)(()=>{if(!p||!d||d.expiresAt===void 0)return;let y=()=>{n(null),h(!1),m(0),u(!1),v(r("svnOfferExpired"))};try{return _e(d.expiresAt,y)}catch{y()}},[p,d]),(0,M.useEffect)(()=>{if(!g||!p||!d)return;let y=new AbortController;return u(!0),v(""),o("vcs/svn-approve",{sessionId:e,repositoryId:t,offer:d.offer,explicit:!0},y.signal).then(k=>{y.signal.aborted||i(k)}).catch(k=>{y.signal.aborted||(v(k.message),h(!1),k.code==="vcs/rediscover-required"&&a())}).finally(()=>{y.signal.aborted||u(!1)}),()=>y.abort()},[g,p,d]),M.default.createElement("section",null,M.default.createElement("button",{"aria-expanded":p,onClick:()=>{m(0),f(y=>!y)}},r("svnConsentReview")),p&&M.default.createElement(M.default.Fragment,null,M.default.createElement("p",null,r("svnConsentScope")),w&&M.default.createElement("p",{role:"alert"},w," ",M.default.createElement("button",{disabled:S,onClick:()=>{m(0),b(y=>y+1)}},r("retry"))),d&&M.default.createElement(M.default.Fragment,null,M.default.createElement("dl",null,["origin","root","uuid","scope"].map(y=>M.default.createElement(M.default.Fragment,{key:y},M.default.createElement("dt",null,y),M.default.createElement("dd",null,M.default.createElement("code",null,d[y]))))),d.remoteEnabled?M.default.createElement(M.default.Fragment,null,M.default.createElement("label",null,M.default.createElement("input",{type:"checkbox",checked:c,disabled:S,onChange:y=>h(y.target.checked)}),r("svnConsentExplicit")),M.default.createElement("button",{disabled:S||!c,onClick:()=>m(y=>y+1)},r("svnConsentApprove"))):M.default.createElement("p",{role:"status"},r("svnRemoteDisabled"))),S&&M.default.createElement("p",{role:"status"},r("loading"))))}var L=R(require("react"),1);var Q=R(require("react"),1);var ne=require("react");function sr({load:e,node:t,comparison:o,key:r,single:i=!1,onReady:a=()=>{},onError:p=()=>{},onComputation:f=()=>{}}){let d=new AbortController,n,c=!1,h=()=>{let v=n;n=void 0,v?.dispose()};return{done:Promise.resolve().then(()=>(d.signal.throwIfAborted(),e(d.signal))).then(v=>{c||(n=v.createDiff(t,{single:i,onComputation:S=>{c||f(S)}}),n.setContent(o,r),c||a(n))}).catch(v=>{try{h()}finally{c||p(v)}}),dispose(){c||(c=!0,d.abort(),h())}}}async function Ye(e,{signal:t,fetcher:o=fetch,importer:r=i=>import(i)}={}){let i=await o(e,{credentials:"same-origin",cache:"no-cache",signal:t});if(!i.ok)throw new Error("Editor resource HTTP "+i.status+" ("+e+"). "+(i.status===401?"Refresh the authenticated DSH page.":i.status===404?"The editor route is not active in this DSH process.":"Check plugin asset registration."));let a=i.headers.get("content-type")||"";if(!/(?:java|ecma)script/i.test(a))throw new Error("Editor resource returned "+(a||"no Content-Type")+" instead of JavaScript.");return await i.arrayBuffer(),t?.throwIfAborted(),r(e)}var Qe="0.3.72";function nr({comparison:e,identity:t,enabled:o,single:r,line:i,sideBySide:a,ignoreWhitespace:p,wrap:f}){let d=(0,ne.useRef)(null),n=(0,ne.useRef)(null),[c,h]=(0,ne.useState)(!1),[w,v]=(0,ne.useState)(""),[S,u]=(0,ne.useState)("pending");return(0,ne.useEffect)(()=>{if(h(!1),u("pending"),v(""),!o)return;let x=m=>new URL("vcs-assets/"+m,document.baseURI).href,b=document.createElement("link");b.rel="stylesheet",b.href=x("editor.css"),document.head.appendChild(b);let g=sr({node:d.current,comparison:e,key:t,single:r,load:m=>Ye(x("editor.js")+"?v="+encodeURIComponent(Qe)+"&retry=0",{signal:m}),onReady:m=>{n.current=m,h(!0)},onError:m=>v(m.message),onComputation:u});return()=>{n.current=null;try{g.dispose()}finally{b.remove()}}},[o,e,t,r]),(0,ne.useEffect)(()=>{c&&r&&i&&n.current?.revealLine(i)},[c,r,i]),(0,ne.useEffect)(()=>{c&&n.current?.options({sideBySide:a,ignoreWhitespace:p,wrap:f})},[c,a,p,f]),{node:d,viewer:n,ready:c,error:w,computation:S}}function ce({comparison:e,identity:t,t:o,single:r=!1,line:i=null}){let[a,p]=(0,Q.useState)(!0),[f,d]=(0,Q.useState)(!1),[n,c]=(0,Q.useState)(!1),[h,w]=(0,Q.useState)(!0),{node:v,viewer:S,ready:u,error:x,computation:b}=nr({comparison:e,identity:t,enabled:h,single:r,line:i,sideBySide:a,ignoreWhitespace:f,wrap:n});return Q.default.createElement("div",null,Q.default.createElement("button",{"aria-pressed":h,onClick:()=>w(g=>!g)},o(h?"historyBasic":"historyAdvanced")),u&&!r&&Q.default.createElement("div",{key:"controls",style:{display:"flex",flexWrap:"wrap",gap:8}},Q.default.createElement("button",{"aria-pressed":a,onClick:()=>p(g=>!g)},o(a?"side":"inline")),Q.default.createElement("label",null,Q.default.createElement("input",{type:"checkbox",checked:f,onChange:g=>d(g.target.checked)}),o("whitespace")),Q.default.createElement("label",null,Q.default.createElement("input",{type:"checkbox",checked:n,onChange:g=>c(g.target.checked)}),o("wrap")),Q.default.createElement("button",{onClick:()=>S.current?.navigate("previous")},o("previous")),Q.default.createElement("button",{onClick:()=>S.current?.navigate("next")},o("next"))),h&&!u&&!x&&Q.default.createElement("p",{role:"status"},o("loading")),e.large&&!r&&u&&Q.default.createElement("p",{role:"status"},o(b==="complete"?"diffComplete":b==="incomplete"?"diffIncomplete":"diffPending")),e.large&&!u&&Q.default.createElement("p",{role:"status"},o("largeFallback")),x&&Q.default.createElement("p",{role:"status"},o("fallback")," ",x),Q.default.createElement("div",{key:"editor-host",style:{position:"relative",height:360}},Q.default.createElement("div",{ref:v,style:{position:"absolute",inset:0,visibility:u?"visible":"hidden"},"aria-hidden":!u}),!u&&Q.default.createElement(Fe,{comparison:e,labels:Ke(o)})))}function yt(e){return L.default.createElement(co,{key:JSON.stringify([e.sessionId,e.repositoryId,e.token,e.snapshot]),...e})}function co({sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,L.useState)(r),[n,c]=(0,L.useState)(null),[h,w]=(0,L.useState)(null),[v,S]=(0,L.useState)(""),[u,x]=(0,L.useState)(0);return(0,L.useEffect)(()=>{let b=new AbortController;return c(null),w(null),S(""),i("vcs/svn-log",{sessionId:e,repositoryId:t,token:o,snapshot:r,cursor:f,limit:50},b.signal).then(g=>{b.signal.aborted||c(g)}).catch(g=>{b.signal.aborted||(S(g.message),g.code==="vcs/rediscover-required"&&p())}),()=>b.abort()},[f,u]),L.default.createElement("section",null,L.default.createElement("p",null,a("svnHistoryScope")," \xB7 r",r),v?L.default.createElement("p",{role:"alert"},v," ",L.default.createElement("button",{onClick:()=>x(b=>b+1)},a("retry"))):n?L.default.createElement(L.default.Fragment,null,L.default.createElement("ol",null,n.entries.map(b=>L.default.createElement("li",{key:b.revision},L.default.createElement("button",{onClick:()=>w(b.revision)},"r",b.revision," \xB7 ",b.message)))),n.nextRevision!==null&&L.default.createElement("button",{onClick:()=>d(n.nextRevision)},a("historyMore"))):L.default.createElement("p",{role:"status"},a("loading")),h&&L.default.createElement(po,{key:h,sessionId:e,repositoryId:t,token:o,snapshot:r,rpc:i,t:a,onRediscover:p,revision:h}))}function po({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f}){let[d,n]=(0,L.useState)(null),[c,h]=(0,L.useState)(null),[w,v]=(0,L.useState)(""),[S,u]=(0,L.useState)(0);return(0,L.useEffect)(()=>{let x=new AbortController;return n(null),h(null),v(""),a("vcs/svn-detail",{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i},x.signal).then(b=>{x.signal.aborted||n(b)}).catch(b=>{x.signal.aborted||(v(b.message),b.code==="vcs/rediscover-required"&&f())}),()=>x.abort()},[S]),L.default.createElement("section",null,w?L.default.createElement("p",{role:"alert"},w," ",L.default.createElement("button",{onClick:()=>u(x=>x+1)},p("retry"))):d?L.default.createElement(L.default.Fragment,null,L.default.createElement("p",null,d.message),d.changes.map(x=>L.default.createElement("div",{key:x.id},L.default.createElement("span",null,x.action," ",x.path),x.kind==="file"&&L.default.createElement(L.default.Fragment,null,L.default.createElement("button",{onClick:()=>h({id:x.id,mode:"compare"})},p("svnHistoricalDiff")),L.default.createElement("button",{onClick:()=>h({id:x.id,mode:"trace"})},p("fileHistory")))))):L.default.createElement("p",{role:"status"},p("loading")),c&&L.default.createElement(uo,{key:JSON.stringify(c),sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f,...c}))}function uo({sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,rpc:a,t:p,onRediscover:f,id:d,mode:n}){let[c,h]=(0,L.useState)(null),[w,v]=(0,L.useState)(null),[S,u]=(0,L.useState)(""),[x,b]=(0,L.useState)(0);return(0,L.useEffect)(()=>{let g=new AbortController;return h(null),u(""),a("vcs/svn-"+n,{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i,id:d,...w===null?{}:{cursor:w}},g.signal).then(m=>{g.signal.aborted||h(m)}).catch(m=>{g.signal.aborted||(u(m.message),m.code==="vcs/rediscover-required"&&f())}),()=>g.abort()},[w,x]),S?L.default.createElement("p",{role:"alert"},S," ",L.default.createElement("button",{onClick:()=>b(g=>g+1)},p("retry"))):c?n==="compare"?c.binary?L.default.createElement("p",null,p("binary")):L.default.createElement(ce,{comparison:c,identity:JSON.stringify([e,t,r,i,d]),t:p}):L.default.createElement("section",null,L.default.createElement("p",null,p("svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),L.default.createElement("ol",null,c.entries.map(g=>L.default.createElement("li",{key:g.revision},"r",g.revision," \xB7 ",g.message))),c.nextRevision!==null&&L.default.createElement("button",{onClick:()=>v(c.nextRevision)},p("historyMore"))):L.default.createElement("p",{role:"status"},p("loading"))}function bt(e){return X.default.createElement(fo,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function fo({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,X.useState)(null),[f,d]=(0,X.useState)(!1),[n,c]=(0,X.useState)(""),[h,w]=(0,X.useState)(0);(0,X.useEffect)(()=>{if(a)return()=>{Promise.resolve().then(()=>o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token})).catch(()=>{})}},[a,e,t]),(0,X.useEffect)(()=>{if(a)try{return _e(a.expiresAt,()=>{p(null),w(0),d(!1),c(r("svnExpired"))})}catch{p(null),c(r("svnExpired"))}},[a]),(0,X.useEffect)(()=>{if(!h||!a)return;let u=new AbortController;return d(!0),c(""),o("vcs/svn-revoke",{sessionId:e,repositoryId:t,token:a.token},u.signal).then(()=>{u.signal.aborted||p(null)}).catch(x=>{u.signal.aborted||(c(x.message),x.code==="vcs/rediscover-required"&&i())}).finally(()=>{u.signal.aborted||d(!1)}),()=>u.abort()},[h,a]);let v=u=>{try{ir(u),c(""),w(0),p(u)}catch(x){c(x.message)}},S=async(...u)=>{try{return await o(...u)}catch(x){throw x.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),w(0),c(r("svnExpired"))),x}};return X.default.createElement("section",null,!a&&n&&X.default.createElement("p",{role:"status"},n),a?X.default.createElement(X.default.Fragment,null,X.default.createElement("p",null,r("svnGrantScope")),X.default.createElement("button",{disabled:f,onClick:()=>w(u=>u+1)},r("svnRevoke")),n&&X.default.createElement("p",{role:"alert"},n),!f&&X.default.createElement(yt,{sessionId:e,repositoryId:t,t:r,onRediscover:i,rpc:S,token:a.token,snapshot:a.snapshot})):X.default.createElement(vt,{sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i,onApproved:v}))}var C=R(require("react"),1);function ar(e){let t=new Map;for(let o of e){let r=t.get(o.commit);r||(r={names:[],hidden:0},t.set(o.commit,r)),r.names.length<3?r.names.push(o.name):r.hidden++}return t}var T=R(require("react"),1);var D=R(require("react"),1);var U=R(require("react"),1);var G=R(require("react"),1);function xt(e){return G.default.createElement(mo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.path]),...e})}function mo({sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,G.useState)(!1),[n,c]=(0,G.useState)([0]),[h,w]=(0,G.useState)(null),[v,S]=(0,G.useState)(""),[u,x]=(0,G.useState)(0),b=n.at(-1);(0,G.useEffect)(()=>{if(!f)return;let m=new AbortController;return w(null),S(""),i("vcs/tree-segment",{sessionId:e,repositoryId:t,commit:o,path:r,offset:b},m.signal).then(y=>{m.signal.aborted||w(y)}).catch(y=>{m.signal.aborted||(S(y.message),y.code==="vcs/rediscover-required"&&p())}),()=>m.abort()},[f,b,e,t,o,r,u]);let g=(0,G.useMemo)(()=>h?{path:r,left:{label:o,text:h.text},right:{label:o,text:h.text}}:null,[h,r,o]);return G.default.createElement("section",null,G.default.createElement("button",{"aria-expanded":f,onClick:()=>d(m=>!m)},a("segments")),f&&G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,a("segmentScope")),v?G.default.createElement("p",{role:"alert"},v," ",G.default.createElement("button",{onClick:()=>x(m=>m+1)},a("retry"))):h?G.default.createElement(G.default.Fragment,null,G.default.createElement("p",null,a("segmentBytes"),": ",h.offset,"\u2013",h.endOffset," / ",h.totalBytes," \xB7 ",G.default.createElement("code",null,h.oid)),G.default.createElement("button",{disabled:n.length===1,onClick:()=>c(m=>m.slice(0,-1))},a("previous")),G.default.createElement("button",{disabled:h.nextOffset===null,onClick:()=>c(m=>[...m,h.nextOffset])},a("next")),G.default.createElement(ce,{single:!0,comparison:g,identity:JSON.stringify([e,t,o,r,b]),t:a})):G.default.createElement("p",{role:"status"},a("loading"))))}function Te({sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p,onClose:f,line:d=null}){let[n,c]=(0,U.useState)(null),[h,w]=(0,U.useState)(""),[v,S]=(0,U.useState)(0);(0,U.useEffect)(()=>{let x=new AbortController;return c(null),w(""),i("vcs/tree-file",{sessionId:e,repositoryId:t,commit:o,path:r},x.signal).then(b=>{x.signal.aborted||c(b)}).catch(b=>{x.signal.aborted||(w(b.message),b.code==="vcs/rediscover-required"&&p())}),()=>x.abort()},[e,t,o,r,v]);let u=(0,U.useMemo)(()=>n?{path:r,left:{label:o,text:n.text||""},right:{label:o,text:n.text||""}}:null,[n,r,o]);return U.default.createElement("section",{"aria-label":a("treePreview")},U.default.createElement("h4",null,r),U.default.createElement("button",{onClick:f},a("treeClose")),U.default.createElement("p",null,U.default.createElement("code",null,o)),h?U.default.createElement("p",{role:"alert"},h," ",U.default.createElement("button",{onClick:()=>S(x=>x+1)},a("retry"))):n?U.default.createElement(U.default.Fragment,null,U.default.createElement("p",null,U.default.createElement("code",null,n.oid)," \xB7 ",a("encoding"),": ",n.encoding||"\u2014"),d&&U.default.createElement("p",{role:"status"},a("blameOriginLine"),": ",d,!n.text||d>n.text.split(`
|
|
96
|
+
`).length?" \xB7 "+a("blameUnmapped"):""),n.notice&&U.default.createElement("p",{role:"status"},n.notice),n.binary?U.default.createElement("p",null,a("binary")):n.text===""?U.default.createElement("p",null,a("treeEmpty")):U.default.createElement(ce,{single:!0,line:d,comparison:u,identity:JSON.stringify([e,t,o,r]),t:a})):U.default.createElement("p",{role:"status"},a("loading")),U.default.createElement(xt,{sessionId:e,repositoryId:t,commit:o,path:r,rpc:i,t:a,onRediscover:p}))}function lr(e=""){let t=[{path:"",name:"/"}];if(e){let o="";for(let r of e.split("/"))o=o?o+"/"+r:r,t.push({path:o,name:r})}return t}function dr(e,t="",o=""){let r=t?t+"/":"",i=o.toLowerCase();return e.filter(a=>{let p=a.path.slice(r.length);return a.path.startsWith(r)&&p.length>0&&!p.includes("/")&&p.toLowerCase().includes(i)}).sort((a,p)=>+(p.type==="tree")-+(a.type==="tree")||(a.path<p.path?-1:a.path>p.path?1:0))}function ho({sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a}){let[p,f]=(0,D.useState)(null),[d,n]=(0,D.useState)(""),[c,h]=(0,D.useState)(0),[w,v]=(0,D.useState)(""),[S,u]=(0,D.useState)(0),[x,b]=(0,D.useState)(""),[g,m]=(0,D.useState)(null);if((0,D.useEffect)(()=>{let E=new AbortController;return f(null),n(""),r("vcs/tree",{sessionId:e,repositoryId:t,commit:o},E.signal).then(V=>{E.signal.aborted||f(V)}).catch(V=>{E.signal.aborted||(n(V.message),V.code==="vcs/rediscover-required"&&a())}),()=>E.abort()},[e,t,o,c]),d)return D.default.createElement("p",{role:"alert"},d," ",D.default.createElement("button",{onClick:()=>h(E=>E+1)},i("retry")));if(!p)return D.default.createElement("p",{role:"status"},i("loading"));let y=w?w+"/":"",k=dr(p.entries,w,x),B=E=>{v(E),u(0),b(""),m(null)};return D.default.createElement("section",{"aria-label":i("historicalTree")},D.default.createElement("p",null,i("historicalTreeScope")),D.default.createElement("code",null,o),D.default.createElement("p",null,w||"/"," ",w&&D.default.createElement("button",{onClick:()=>B(w.includes("/")?w.slice(0,w.lastIndexOf("/")):"")},i("treeUp"))),D.default.createElement("nav",{"aria-label":i("treeBreadcrumbs")},lr(w).map(E=>D.default.createElement(D.default.Fragment,{key:E.path},E.path&&" / ",E.path===w?D.default.createElement("span",{"aria-current":"location"},E.name):D.default.createElement("button",{onClick:()=>B(E.path)},E.name)))),D.default.createElement("label",null,i("treeSearch")," ",D.default.createElement("input",{"aria-label":i("treeSearch"),value:x,onChange:E=>{b(E.target.value),u(0),m(null)}})),D.default.createElement("p",null,k.length," ",i("treeEntries")),!k.length&&x&&D.default.createElement("p",{role:"status"},i("emptySearch")),D.default.createElement("ul",null,k.slice(S*100,S*100+100).map(E=>D.default.createElement("li",{key:E.path},E.type==="tree"?D.default.createElement("button",{onClick:()=>B(E.path)},E.path.slice(y.length),"/"):E.type==="blob"&&["100644","100755"].includes(E.mode)?D.default.createElement("button",{"aria-pressed":g===E.path,onClick:()=>m(E.path)},E.path.slice(y.length)):D.default.createElement("span",null,E.path.slice(y.length))," \xB7 ",D.default.createElement("code",null,E.mode," ",E.type," ",D.default.createElement("span",{title:E.oid},E.oid.slice(0,10)))))),S>0&&D.default.createElement("button",{onClick:()=>{u(E=>E-1),m(null)}},i("treePrevious")),(S+1)*100<k.length&&D.default.createElement("button",{onClick:()=>{u(E=>E+1),m(null)}},i("treeNext")),g&&D.default.createElement(Te,{key:JSON.stringify([e,t,o,g]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a,path:g,onClose:()=>m(null)}))}function wt(e){return D.default.createElement(go,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function go(e){let[t,o]=(0,D.useState)(!1);return D.default.createElement("div",null,D.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historicalTree")),t&&D.default.createElement(ho,{...e}))}var I=R(require("react"),1);var F=R(require("react"),1);function vo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,follow:a,rpc:p,t:f,onRediscover:d,onSelectCommit:n}){let[c,h]=(0,F.useState)({commits:[],nextOffset:null}),[w,v]=(0,F.useState)(0),[S,u]=(0,F.useState)(0),[x,b]=(0,F.useState)(!0),[g,m]=(0,F.useState)("");return(0,F.useEffect)(()=>{let y=new AbortController;return b(!0),m(""),p("vcs/file-history",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,offset:w,limit:50,follow:a},y.signal).then(k=>{y.signal.aborted||h(B=>({...k,commits:w?[...B.commits,...k.commits]:k.commits}))}).catch(k=>{y.signal.aborted||(m(k.message),k.code==="vcs/rediscover-required"&&d())}).finally(()=>{y.signal.aborted||b(!1)}),()=>y.abort()},[e,t,o,r,i,w,S]),F.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":x},F.default.createElement("p",null,f("fileHistoryScope")),F.default.createElement("p",{style:{overflowWrap:"anywhere"}},c.path," \xB7 ",F.default.createElement("code",null,o)),F.default.createElement("ol",null,c.commits.map(y=>F.default.createElement("li",{key:y.id},F.default.createElement("code",{title:y.id},y.id.slice(0,10))," \xB7 ",n?F.default.createElement("button",{onClick:()=>n(y.id,y.path||c.path)},y.subject):y.subject,F.default.createElement("div",null,y.boundary&&F.default.createElement("span",null,f(y.boundary==="merge-first-parent"?"fileHistoryMergeBoundary":y.boundary==="ambiguous-rename"?"fileHistoryAmbiguous":y.boundary==="rename-check-limit"?"fileHistoryRenameLimit":"fileHistoryBoundary")," "),y.path&&F.default.createElement("code",null,y.oldPath?y.oldPath+" \u2192 ":"",y.path)," ",y.similarity!==void 0&&F.default.createElement("span",null,f("fileHistorySimilarity"),": ",y.similarity,"% \xB7 "),y.author," \xB7 ",F.default.createElement("time",{dateTime:y.date},y.date))))),x&&F.default.createElement("p",{role:"status"},f("loading")),g&&F.default.createElement("p",{role:"alert"},g," ",F.default.createElement("button",{onClick:()=>u(y=>y+1)},f("retry"))),!x&&!g&&!c.commits.length&&F.default.createElement("p",null,f("historyEmpty")),c.truncated&&F.default.createElement("p",{role:"status"},f("historyLimit")),!g&&c.nextOffset!==null&&F.default.createElement("button",{disabled:x,onClick:()=>v(c.nextOffset)},f("historyMore")))}function St(e){return F.default.createElement(yo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.id]),...e})}function yo(e){let[t,o]=(0,F.useState)(!1),[r,i]=(0,F.useState)(!1);return F.default.createElement("div",null,F.default.createElement("button",{"aria-expanded":t,onClick:()=>o(a=>!a)},e.t("fileHistory")),t&&F.default.createElement(F.default.Fragment,null,F.default.createElement("label",null,F.default.createElement("input",{type:"checkbox",checked:r,onChange:a=>i(a.target.checked)}),e.t("fileHistoryFollow")),F.default.createElement("p",null,e.t("fileHistoryFollowScope")),F.default.createElement(vo,{key:String(r),follow:r,...e})))}var O=R(require("react"),1);function bo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,rpc:a,t:p,onRediscover:f,onSelectCommit:d}){let[n,c]=(0,O.useState)(null),[h,w]=(0,O.useState)(""),[v,S]=(0,O.useState)(0),[u,x]=(0,O.useState)(1),[b,g]=(0,O.useState)(null);return(0,O.useEffect)(()=>{let m=new AbortController;return c(null),w(""),g(null),a("vcs/blame",{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:i,startLine:u,lineLimit:500},m.signal).then(y=>{m.signal.aborted||c(y)}).catch(y=>{m.signal.aborted||(w(y.message),y.code==="vcs/rediscover-required"&&f())}),()=>m.abort()},[e,t,o,r,i,v,u]),h?O.default.createElement("p",{role:"alert"},h," ",O.default.createElement("button",{onClick:()=>S(m=>m+1)},p("retry"))):n?O.default.createElement("section",{"aria-label":p("blame")},O.default.createElement("p",null,p("blameScope")),d&&O.default.createElement("p",null,p("blameNavigation")),n.notice&&O.default.createElement("p",{role:"status"},n.notice),n.truncated&&O.default.createElement("p",{role:"status"},p("blameLimit")),!n.notice&&!n.lines.length&&O.default.createElement("p",null,p("blameEmpty")),!!n.lines.length&&O.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},O.default.createElement("table",null,O.default.createElement("thead",null,O.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(m=>O.default.createElement("th",{key:m,scope:"col"},p(m))))),O.default.createElement("tbody",null,n.lines.map(m=>O.default.createElement("tr",{key:m.line},O.default.createElement("th",{scope:"row"},m.line),O.default.createElement("td",null,d?O.default.createElement("button",{title:m.commit,onClick:()=>d(m.commit)},O.default.createElement("code",null,m.commit.slice(0,10))):O.default.createElement("code",{title:m.commit},m.commit.slice(0,10))),O.default.createElement("td",null,m.author),O.default.createElement("td",null,m.summary),O.default.createElement("td",null,O.default.createElement("pre",{style:{margin:0}},m.text),m.path&&m.originalLine?O.default.createElement("button",{onClick:()=>g(m)},p("blameOriginLine"),": ",m.path,":",m.originalLine):O.default.createElement("span",null,p("blameUnmapped")))))))),O.default.createElement("p",null,n.startLine||u,"\u2013",n.lines.at(-1)?.line||u," / ",n.totalLines??"\u2014"),O.default.createElement("button",{disabled:u===1,onClick:()=>x(Math.max(1,u-500))},p("blamePrevious")),O.default.createElement("button",{disabled:n.nextLine==null,onClick:()=>x(n.nextLine)},p("blameNext")),b&&O.default.createElement(Te,{key:JSON.stringify([b.commit,b.path,b.originalLine]),sessionId:e,repositoryId:t,commit:b.commit,path:b.path,line:b.originalLine,rpc:a,t:p,onRediscover:f,onClose:()=>g(null)})):O.default.createElement("p",{role:"status"},p("loading"))}function kt(e){let[t,o]=(0,O.useState)(!1);return O.default.createElement("div",null,O.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("blame")),t&&O.default.createElement(bo,{...e}))}function je(e){return I.default.createElement(xo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit,e.parentIndex,e.base,e.target,e.id]),...e})}function xo({sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:i,target:a,id:p,rpc:f,t:d,onRediscover:n,onSelectCommit:c}){let[h,w]=(0,I.useState)(null),[v,S]=(0,I.useState)(""),[u,x]=(0,I.useState)(0),[b,g]=(0,I.useState)(!1);return(0,I.useEffect)(()=>{let m=new AbortController;return w(null),S(""),f(i?"vcs/revision-compare":"vcs/commit-compare",i?{sessionId:e,repositoryId:t,base:i,target:a,id:p,...b?{large:!0}:{}}:{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,...b?{large:!0}:{}},m.signal).then(y=>{m.signal.aborted||w(y)}).catch(y=>{m.signal.aborted||(S(y.message),y.code==="vcs/rediscover-required"&&n())}),()=>m.abort()},[e,t,o,r,i,a,p,u,b]),v?I.default.createElement("p",{role:"alert"},v," ",I.default.createElement("button",{onClick:()=>x(m=>m+1)},d("retry")),b&&I.default.createElement("button",{onClick:()=>g(!1)},d("largeClose"))):h?I.default.createElement("section",null,I.default.createElement("h4",null,h.path),I.default.createElement("p",null,h.left.label," \u2194 ",h.right.label),h.notice&&I.default.createElement("p",{role:"status"},h.notice),b?I.default.createElement("p",null,d("largeScope")," ",I.default.createElement("button",{onClick:()=>g(!1)},d("largeClose"))):h.notice?.includes("2 MiB")&&I.default.createElement("p",null,d("largeScope")," ",I.default.createElement("button",{onClick:()=>g(!0)},d("largeLoad"))),h.binary?I.default.createElement("p",null,d("binary")):I.default.createElement(ce,{comparison:h,identity:JSON.stringify(i?[e,t,i,a,p]:[e,t,o,r,p]),t:d}),o&&!i&&I.default.createElement(St,{onSelectCommit:c,key:"file-history:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:n}),o&&!i&&I.default.createElement(kt,{onSelectCommit:c,key:"blame:"+JSON.stringify([e,t,o,r,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,rpc:f,t:d,onRediscover:n}),(o||i)&&I.default.createElement(Me,{key:"image:"+JSON.stringify([e,t,o,r,i,a,p]),sessionId:e,repositoryId:t,commit:o,parentIndex:r,base:i,target:a,id:p,rpc:f,t:d,onRediscover:n})):I.default.createElement("p",{role:"status"},d("loading"),b&&I.default.createElement("button",{onClick:()=>g(!1)},d("largeClose")))}function cr(e,t){if(typeof t!="string"||!t)return null;let o=e.filter(r=>r.path===t);return o.length===1&&typeof o[0].id=="string"&&o[0].id?o[0].id:null}function pr(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.id,r.author,r.subject].some(i=>i?.toLowerCase().includes(o))):e}function Xe(e,t=""){let o=t.trim().toLowerCase();return o?e.filter(r=>[r.path,r.oldPath].some(i=>i?.toLowerCase().includes(o))):e}function Ct(e){return T.default.createElement(wo,{key:JSON.stringify([e.sessionId,e.repositoryId,e.commit]),...e})}function wo({sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a,onSelectCommit:p,initialPath:f}){let d=(0,T.useRef)(!0),[n,c]=(0,T.useState)(null),[h,w]=(0,T.useState)(""),[v,S]=(0,T.useState)(0),[u,x]=(0,T.useState)(null),[b,g]=(0,T.useState)(""),[m,y]=(0,T.useState)(0);if((0,T.useEffect)(()=>{let B=new AbortController;return x(null),g(""),r("vcs/commit",{sessionId:e,repositoryId:t,commit:o,parentIndex:v},B.signal).then(E=>{B.signal.aborted||(x(E),d.current&&(d.current=!1,c(cr(E.changes,f))))}).catch(E=>{B.signal.aborted||(g(E.message),E.code==="vcs/rediscover-required"&&a())}),()=>B.abort()},[e,t,o,v,m]),b)return T.default.createElement("p",{role:"alert"},b," ",T.default.createElement("button",{onClick:()=>y(B=>B+1)},i("retry")));if(!u)return T.default.createElement("p",{role:"status"},i("loading"));let k=Xe(u.changes,h);return T.default.createElement("section",{"aria-label":i("commitDetails")},T.default.createElement("h3",null,u.subject),T.default.createElement("code",null,u.id),T.default.createElement("p",null,u.author," \xB7 ",u.date),u.messageTruncated&&T.default.createElement("p",{role:"status"},i("commitMessageLimit")),u.message&&T.default.createElement("pre",{style:{whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxHeight:240,overflow:"auto"}},u.message),u.parents.length>1&&T.default.createElement("label",null,i("commitParent")," ",T.default.createElement("select",{"aria-label":i("commitParent"),value:v,onChange:B=>{c(null),x(null),S(Number(B.target.value))}},u.parents.map((B,E)=>T.default.createElement("option",{key:B,value:E},E+1,": ",B.slice(0,10))))),T.default.createElement("p",null,u.parent||i("commitRoot")," \u2192 ",u.id.slice(0,10)),T.default.createElement("label",null,i("commitFileSearch")," ",T.default.createElement("input",{"aria-label":i("commitFileSearch"),value:h,onChange:B=>{w(B.target.value),c(null)}})),T.default.createElement("span",null," ",k.length," / ",u.changes.length),T.default.createElement("ul",null,k.map(B=>T.default.createElement("li",{key:B.id},T.default.createElement("button",{"aria-pressed":n===B.id,onClick:()=>c(B.id)},B.status," \xB7 ",B.oldPath?B.oldPath+" \u2192 ":"",B.path)))),!!u.changes.length&&!k.length&&T.default.createElement("p",{role:"status"},i("emptySearch")),!u.changes.length&&T.default.createElement("p",null,i("commitNoChanges")),n&&T.default.createElement(je,{key:n,sessionId:e,repositoryId:t,commit:o,parentIndex:v,id:n,onSelectCommit:p,rpc:r,t:i,onRediscover:a}),T.default.createElement(wt,{key:JSON.stringify([e,t,o]),sessionId:e,repositoryId:t,commit:o,rpc:r,t:i,onRediscover:a}))}var _=R(require("react"),1);function ur(e){if(!Array.isArray(e))throw new Error("Invalid graph commits");let t=e.slice(0,200),o=new Map,r=[],i=[],a=f=>typeof f=="string"&&/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(f);for(let[f,d]of t.entries()){if(!d||!a(d.id)||!Array.isArray(d.parents)||o.has(d.id))throw new Error("Invalid graph node");o.set(d.id,f),r.push({id:d.id,row:f})}let p=!1;for(let f of t){let d=new Set;for(let n of f.parents){if(i.length===1e3){p=!0;break}if(!a(n)||n.length!==f.id.length||n===f.id||d.has(n))throw new Error("Invalid graph parent");d.add(n);let c=o.get(n);if(c!==void 0&&c<=o.get(f.id))throw new Error("Graph requires child-before-parent order");i.push({from:f.id,to:n,missing:c===void 0})}if(p)break}return{nodes:r,edges:i,nodesTruncated:e.length>200,edgesTruncated:p}}function fr(e){let t=Array(32).fill(null),o=new Map,r=[],i=new Set,a=!1,p=n=>{if(i.has(n))return null;let c=t.indexOf(n);return c>=0?c:(c=t.indexOf(null),c<0?(a=!0,i.add(n),null):(t[c]=n,c))},f=new Map;for(let n of e.edges){if(n.missing)continue;let c=f.get(n.from)||[];c.push(n.to),f.set(n.from,c)}for(let n of e.nodes){let c=p(n.id);if(o.set(n.id,{...n,lane:c}),r.push({...n,lane:c}),c===null)continue;t[c]=null;let h=f.get(n.id)||[];for(let[w,v]of h.entries())t.includes(v)||(w===0&&t[c]===null?t[c]=v:p(v))}let d=e.edges.filter(n=>!n.missing).flatMap(n=>{let c=o.get(n.from),h=o.get(n.to);return c.lane===null||h.lane===null?[]:[{...n,start:c.row,end:h.row,fromLane:c.lane,toLane:h.lane}]});return{nodes:r,edges:d,lanesTruncated:a,laneCount:Math.max(1,...r.map(n=>(n.lane??0)+1))}}function So({commits:e,selected:t,onSelect:o,t:r}){let i;try{i=ur(e)}catch{return _.default.createElement("p",{role:"alert"},r("graphInvalid"))}let a=fr(i),p=a.edges,f=Math.max(100,24+18*a.laneCount),d=Math.max(40,i.nodes.length*36);return _.default.createElement("section",{"aria-label":r("historyGraph")},_.default.createElement("p",null,r("graphScope")),a.lanesTruncated&&_.default.createElement("p",{role:"status"},r("graphLaneLimit")),(i.nodesTruncated||i.edgesTruncated)&&_.default.createElement("p",{role:"status"},r("graphLimit")),_.default.createElement("div",{style:{maxHeight:480,overflow:"auto",display:"flex"}},_.default.createElement("svg",{width:f,height:d,"aria-hidden":"true",style:{flexShrink:0}},p.map(n=>{let c=n.start*36+18,h=n.end*36+18,w=12+n.fromLane*18,v=12+n.toLane*18;return _.default.createElement("path",{key:n.from+n.to,d:"M "+w+" "+c+" C "+w+" "+(c+18)+", "+v+" "+(h-18)+", "+v+" "+h,fill:"none",stroke:"currentColor",opacity:"0.45"})}),a.nodes.filter(n=>n.lane!==null).map(n=>_.default.createElement("circle",{key:n.id,cx:12+n.lane*18,cy:n.row*36+18,r:"4",fill:"currentColor"}))),_.default.createElement("ol",{style:{listStyle:"none",margin:0,padding:0}},i.nodes.map(n=>_.default.createElement("li",{key:n.id,style:{height:36,whiteSpace:"nowrap"}},_.default.createElement("button",{title:n.id,"aria-current":t===n.id?!0:void 0,style:t===n.id?{fontWeight:700,textDecoration:"underline"}:void 0,onKeyDown:c=>{if(c.altKey||c.ctrlKey||c.metaKey||c.shiftKey)return;let h=c.key==="ArrowDown"?Math.min(n.row+1,i.nodes.length-1):c.key==="ArrowUp"?Math.max(0,n.row-1):c.key==="Home"?0:c.key==="End"?i.nodes.length-1:null;h!==null&&(c.preventDefault(),c.stopPropagation(),c.currentTarget.closest("ol").querySelectorAll("button")[h]?.focus())},onClick:()=>o(n.id)},_.default.createElement("code",null,n.id.slice(0,10))," ",e[n.row].subject))))),_.default.createElement("details",null,_.default.createElement("summary",null,r("graphRelations")),_.default.createElement("ul",null,i.edges.map(n=>_.default.createElement("li",{key:n.from+n.to},_.default.createElement("code",null,n.from)," \u2192 ",_.default.createElement("code",null,n.to),n.missing?" \xB7 "+r("graphMissing"):"")))))}function Nt(e){let[t,o]=(0,_.useState)(!1);return _.default.createElement("div",null,_.default.createElement("button",{"aria-expanded":t,onClick:()=>o(r=>!r)},e.t("historyGraph")),t&&_.default.createElement(So,{...e}))}var H=R(require("react"),1);function ko({sessionId:e,repositoryId:t,base:o,target:r,rpc:i,t:a,onRediscover:p}){let[f,d]=(0,H.useState)(null),[n,c]=(0,H.useState)(""),[h,w]=(0,H.useState)(0),[v,S]=(0,H.useState)(null),[u,x]=(0,H.useState)("");if((0,H.useEffect)(()=>{let g=new AbortController;return d(null),c(""),S(null),i("vcs/revision-changes",{sessionId:e,repositoryId:t,base:o,target:r},g.signal).then(m=>{g.signal.aborted||d(m)}).catch(m=>{g.signal.aborted||(c(m.message),m.code==="vcs/rediscover-required"&&p())}),()=>g.abort()},[e,t,o,r,h]),n)return H.default.createElement("p",{role:"alert"},n," ",H.default.createElement("button",{onClick:()=>w(g=>g+1)},a("retry")));if(!f)return H.default.createElement("p",{role:"status"},a("loading"));let b=Xe(f.changes,u);return H.default.createElement("div",null,H.default.createElement("label",null,a("commitFileSearch")," ",H.default.createElement("input",{"aria-label":a("commitFileSearch"),value:u,onChange:g=>{x(g.target.value),S(null)}})),H.default.createElement("span",null," ",b.length," / ",f.changes.length),!!f.changes.length&&!b.length&&H.default.createElement("p",{role:"status"},a("emptySearch")),!f.changes.length&&H.default.createElement("p",null,a("revisionEmpty")),H.default.createElement("ul",null,b.map(g=>H.default.createElement("li",{key:g.id},H.default.createElement("button",{"aria-pressed":v===g.id,onClick:()=>S(g.id)},g.status," \xB7 ",g.oldPath?g.oldPath+" \u2192 ":"",g.path)))),v&&H.default.createElement(je,{key:v,sessionId:e,repositoryId:t,base:o,target:r,id:v,rpc:i,t:a,onRediscover:p}))}function Et(e){return H.default.createElement(Co,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function Co({commits:e,sessionId:t,repositoryId:o,rpc:r,t:i,onRediscover:a,onReferencesLoaded:p}){let[f,d]=(0,H.useState)(""),[n,c]=(0,H.useState)(""),[h,w]=(0,H.useState)([]),[v,S]=(0,H.useState)(!1),[u,x]=(0,H.useState)(0),[b,g]=(0,H.useState)(!1),[m,y]=(0,H.useState)("");return(0,H.useEffect)(()=>{if(!u)return;let k=new AbortController;return g(!0),y(""),r("vcs/references",{sessionId:t,repositoryId:o},k.signal).then(B=>{k.signal.aborted||(w(B.references),S(!0),p?.(B.references))}).catch(B=>{k.signal.aborted||(y(B.message),B.code==="vcs/rediscover-required"&&a())}).finally(()=>{k.signal.aborted||g(!1)}),()=>k.abort()},[t,o,u]),H.default.createElement("section",{"aria-label":i("revisionTitle")},H.default.createElement("h3",null,i("revisionTitle")),H.default.createElement("p",null,i("revisionScope")),H.default.createElement("button",{disabled:b,onClick:()=>x(k=>k+1)},i("revisionLoadRefs")),H.default.createElement("p",null,i("revisionRefsScope")),v&&!b&&!m&&H.default.createElement("p",{role:"status"},h.length?`${i("revisionRefsCount")}: ${h.length}`:i("revisionRefsEmpty")),b&&H.default.createElement("p",{role:"status"},i("loading")),m&&H.default.createElement("p",{role:"alert"},m),[[f,d,"revisionBase"],[n,c,"revisionTarget"]].map(([k,B,E])=>H.default.createElement("label",{key:E},i(E)," ",H.default.createElement("select",{"aria-label":i(E),value:k,onChange:V=>B(V.target.value)},H.default.createElement("option",{value:""},"\u2014"),!!e.length&&H.default.createElement("optgroup",{label:i("revisionLoadedCommits")},e.map(V=>H.default.createElement("option",{key:V.id,value:V.id},V.id.slice(0,10)," \xB7 ",V.subject))),!!h.length&&H.default.createElement("optgroup",{label:i("revisionLocalRefs")},h.map(V=>H.default.createElement("option",{key:V.name,value:V.commit},V.name," \xB7 ",V.commit.slice(0,10)))),k&&!e.some(V=>V.id===k)&&!h.some(V=>V.commit===k)&&H.default.createElement("option",{value:k},k)))),H.default.createElement("button",{disabled:!f||!n,onClick:()=>{d(n),c(f)}},i("revisionSwap")),H.default.createElement("p",{style:{overflowWrap:"anywhere"}},H.default.createElement("code",null,f||"\u2014")," \u2192 ",H.default.createElement("code",null,n||"\u2014")),f&&n&&H.default.createElement(ko,{key:JSON.stringify([t,o,f,n]),sessionId:t,repositoryId:o,base:f,target:n,rpc:r,t:i,onRediscover:a}))}function mr(e,t,o){let r=o?[...e.commits.filter(i=>!t.commits.some(a=>a.id===i.id)),...t.commits]:t.commits;return{...t,windowEnd:o+t.commits.length,commits:r.slice(-200)}}function Lt(e){return C.default.createElement(No,{key:JSON.stringify([e.sessionId,e.repositoryId]),...e})}function No({sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i}){let[a,p]=(0,C.useState)({id:null,path:null,revision:0}),[f,d]=(0,C.useState)(""),[n,c]=(0,C.useState)(null),[h,w]=(0,C.useState)(""),[v,S]=(0,C.useState)(""),u=P=>{let Z=(n||[]).find(ee=>JSON.stringify([ee.name,ee.commit])===P)?.commit||"";S(P),w(Z),m(ee=>ee?{...ee,snapshot:Z||null}:null),pe(0),d(""),V(null),ye({commits:[],snapshot:null,nextOffset:null})},[x,b]=(0,C.useState)({message:"",author:"",path:""}),[g,m]=(0,C.useState)(null),y=P=>{m({values:P,snapshot:Y.snapshot}),pe(0),d(""),V(null),ye(z=>({...z,commits:[],nextOffset:null}))},k=(0,C.useMemo)(()=>ar(n||[]),[n]),B=a.id,E=(P,z=null)=>p(Z=>({id:P,path:z,revision:Z.revision+1})),V=(P,z=null)=>p(Z=>({id:P,path:z,revision:Z.revision+(z||Z.path?1:0)})),[Y,ye]=(0,C.useState)({commits:[],snapshot:null,nextOffset:null}),[j,pe]=(0,C.useState)(0),[A,le]=(0,C.useState)(0),[ie,Le]=(0,C.useState)(!0),[be,Ae]=(0,C.useState)("");(0,C.useEffect)(()=>{let P=new AbortController;return Le(!0),Ae(""),o("vcs/history",{sessionId:e,repositoryId:t,offset:j,limit:50,...g?{search:g.values}:{},...g?.snapshot||h||j?{snapshot:g?.snapshot||h||Y.snapshot}:{}},P.signal).then(z=>{P.signal.aborted||(ye(Z=>mr(Z,z,j)),j>=200&&(V(null),d("")))}).catch(z=>{P.signal.aborted||(Ae(z.message),z.code==="vcs/rediscover-required"&&i())}).finally(()=>{P.signal.aborted||Le(!1)}),()=>P.abort()},[e,t,j,A,g,h]);let ae=pr(Y.commits,f);return C.default.createElement("section",{className:"vcs-history","aria-label":r("history"),"aria-busy":ie},C.default.createElement("div",{className:"vcs-history-list"},C.default.createElement("p",null,r("historyListOnly")),n!==null&&C.default.createElement("p",null,r("historyRefsScope")),C.default.createElement("label",null,r("historyBranch")," ",C.default.createElement("select",{"aria-label":r("historyBranch"),value:v,disabled:ie,onChange:P=>u(P.target.value)},C.default.createElement("option",{value:""},"HEAD"),v&&!(n||[]).some(P=>JSON.stringify([P.name,P.commit])===v)&&C.default.createElement("option",{value:v},JSON.parse(v)[0]," \xB7 ",h.slice(0,10)," \xB7 ",r("historyPinned")),(n||[]).map(P=>{let z=JSON.stringify([P.name,P.commit]);return C.default.createElement("option",{key:z,value:z},P.name," \xB7 ",P.commit.slice(0,10))}))),C.default.createElement("p",null,r("historyBranchScope"),h&&C.default.createElement(C.default.Fragment,null," \xB7 ",C.default.createElement("code",null,h))),C.default.createElement("form",{"aria-label":r("historyServerSearch"),onSubmit:P=>{P.preventDefault(),y({...x})}},C.default.createElement("fieldset",{disabled:ie},C.default.createElement("legend",null,r("historyServerSearch")),C.default.createElement("p",null,r("historyServerScope")),["message","author","path"].map(P=>C.default.createElement("label",{key:P},r("historyServer_"+P)," ",C.default.createElement("input",{maxLength:1024,"aria-label":r("historyServer_"+P),value:x[P],onChange:z=>b(Z=>({...Z,[P]:z.target.value}))}))),C.default.createElement("button",{type:"submit"},r("historyServerApply")),C.default.createElement("button",{type:"button",onClick:()=>{b({message:"",author:"",path:""}),y({})}},r("historyServerClear")))),g&&C.default.createElement("p",{role:"status"},r("historyServerActive"),": ",JSON.stringify(g.values)," \xB7 ",C.default.createElement("code",null,g.snapshot||Y.snapshot)),C.default.createElement("label",null,r("historySearch")," ",C.default.createElement("input",{"aria-label":r("historySearch"),value:f,onChange:P=>{d(P.target.value),V(null)}})),C.default.createElement("span",null," ",ae.length," / ",Y.commits.length),!!Y.commits.length&&C.default.createElement("p",{role:"status"},r("historyWindow"),": ",Math.max(0,(Y.windowEnd??Y.commits.length)-Y.commits.length),"\u2013",Y.windowEnd??Y.commits.length," \xB7 ",r("historyWindowScope")),!!Y.commits.length&&!ae.length&&C.default.createElement("p",{role:"status"},r("historyNoMatch")),C.default.createElement("ol",null,ae.map(P=>C.default.createElement("li",{key:P.id},C.default.createElement("button",{"aria-pressed":B===P.id,onClick:()=>V(P.id)},P.subject),C.default.createElement("div",null,C.default.createElement("code",{title:P.id},P.id.slice(0,10))," \xB7 ",P.author," \xB7 ",C.default.createElement("time",{dateTime:P.date},P.date)),k.has(P.id)&&C.default.createElement("div",{"aria-label":r("historyRefsLabel"),style:{overflowWrap:"anywhere"}},k.get(P.id).names.map(z=>C.default.createElement("span",{key:z},C.default.createElement("code",null,z)," ")),k.get(P.id).hidden>0&&C.default.createElement("span",null,r("historyRefsMore"),": ",k.get(P.id).hidden))))),ie&&C.default.createElement("p",{role:"status"},r("loading")),be&&C.default.createElement("p",{role:"alert"},be," ",C.default.createElement("button",{onClick:()=>le(P=>P+1)},r("retry"))),!ie&&!be&&!Y.commits.length&&C.default.createElement("p",null,r("historyEmpty")),Y.truncated&&C.default.createElement("p",{role:"status"},r("historyLimit")),!be&&Y.nextOffset!==null&&C.default.createElement("button",{disabled:ie,onClick:()=>pe(Y.nextOffset)},r("historyMore")),!!Y.commits.length&&C.default.createElement(Nt,{commits:Y.commits,selected:B,onSelect:V,t:r}),C.default.createElement(Et,{onReferencesLoaded:c,commits:Y.commits,sessionId:e,repositoryId:t,rpc:o,t:r,onRediscover:i})),C.default.createElement("div",{className:"vcs-history-details"},B&&C.default.createElement(Ct,{key:JSON.stringify([B,a.revision]),initialPath:a.path,sessionId:e,repositoryId:t,commit:B,onSelectCommit:E,rpc:o,t:r,onRediscover:i})))}var hr={zh:{svnOfferExpired:"\u7F51\u7EDC\u8BBF\u95EE\u63D0\u6848\u5DF2\u8FC7\u671F\uFF1B\u8BF7\u624B\u52A8\u91CD\u8BD5\uFF0C\u5E76\u91CD\u65B0\u52FE\u9009\u540C\u610F\u3002",svnExpired:"SVN \u7F51\u7EDC\u6388\u6743\u5DF2\u8FC7\u671F\uFF0C\u5386\u53F2\u8BF7\u6C42\u5DF2\u505C\u6B62\uFF1B\u8BF7\u91CD\u65B0\u5BA1\u9605\u5E76\u540C\u610F\u3002",svnConsentReview:"\u5BA1\u9605 SVN \u7F51\u7EDC\u8BBF\u95EE\u8303\u56F4",svnConsentScope:"\u540C\u610F\u524D\u4EC5\u8BFB\u53D6\u672C\u5730\u8EAB\u4EFD\u3002\u6388\u6743\u53EA\u9002\u7528\u4E8E\u6240\u5217\u4ED3\u5E93\u3001Session \u4E0E\u76EE\u5F55\uFF0C\u4E94\u5206\u949F\u6709\u6548\uFF1B\u4E0D\u6388\u6743\u91CD\u5B9A\u5411\u6216\u5199\u64CD\u4F5C\u3002",svnConsentExplicit:"\u6211\u540C\u610F\u8BBF\u95EE\u4EE5\u4E0A HTTPS SVN \u4ED3\u5E93",svnConsentApprove:"\u540C\u610F\u5E76\u8BFB\u53D6\u5386\u53F2",svnHistoryScope:"\u56FA\u5B9A\u672C\u5730 revision \u5FEB\u7167\u7684 SVN \u5386\u53F2\uFF1B\u5206\u9875\u66FF\u6362\u663E\u793A",svnHistoricalDiff:"\u5386\u53F2\u53EA\u8BFB Diff",svnTraceScope:"\u6587\u4EF6\u8FFD\u6EAF\u5728\u590D\u5236\u8FB9\u754C\u505C\u6B62\uFF0C\u4E0D\u8DDF\u968F\u8303\u56F4\u5916\u6765\u6E90",svnGrantScope:"\u7F51\u7EDC\u6388\u6743\u4E94\u5206\u949F\u6709\u6548\uFF1B\u53EF\u968F\u65F6\u64A4\u9500\uFF0C\u5386\u53F2\u64CD\u4F5C\u4E0D\u4FEE\u6539\u5DE5\u4F5C\u526F\u672C\u3002",svnRevoke:"\u64A4\u9500 SVN \u7F51\u7EDC\u6388\u6743",svnIdentity:"\u67E5\u770B SVN \u672C\u5730\u5386\u53F2\u8BBF\u95EE\u8EAB\u4EFD",svnOfflineIdentity:"\u4EC5\u4ECE\u6388\u6743\u5DE5\u4F5C\u526F\u672C\u8BFB\u53D6\u672C\u5730\u5143\u6570\u636E\uFF0C\u4E0D\u53D1\u8D77\u8FDC\u7A0B\u8BF7\u6C42\u3002",svnRemoteDisabled:"\u8FDC\u7A0B SVN \u5386\u53F2\u4F20\u8F93\u5C1A\u672A\u542F\u7528\uFF1B\u6CA1\u6709\u7F51\u7EDC\u6388\u6743\u6216\u53EF\u7528\u8BBF\u95EE\u51ED\u636E\u3002\u672C\u9875\u4E0D\u662F\u5DF2\u6388\u6743\u5386\u53F2\u5165\u53E3\u3002",historyWindow:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u7A97\u53E3\uFF08\u5E8F\u53F7\u5DE6\u95ED\u53F3\u5F00\uFF09",historyWindowScope:"\u5217\u8868\u53CA\u56FE\u6700\u591A\u4FDD\u7559200\u6761\uFF1B\u7EE7\u7EED\u52A0\u8F7D\u66FF\u6362\u8F83\u65B0\u884C\uFF0C\u8DE8\u7A97\u53E3\u8FB9\u4E0D\u8868\u793A\u5B8C\u6574\u56FE\u3002\u5C40\u90E8\u7B5B\u9009\u4EC5\u5F53\u524D\u7A97\u53E3\u3002",segments:"\u5206\u6BB5\u6D4F\u89C8\u5386\u53F2\u6B63\u6587",segmentBytes:"\u5B57\u8282\u8303\u56F4\uFF08\u5DE6\u95ED\u53F3\u5F00\uFF09",segmentScope:"\u4EC5\u56FA\u5B9A\u5386\u53F2 UTF-8 \u666E\u901A\u6587\u4EF6\uFF0C\u6700\u5927 16 MiB\uFF1B\u6BCF\u7247\u6700\u591A 64 KiB\uFF0C\u66FF\u6362\u663E\u793A\u4E0D\u7D2F\u79EF\u3002\u7247\u6BB5\u884C\u53F7\u4E0D\u662F\u539F\u6587\u4EF6\u884C\u53F7\uFF0C\u4E0D\u662F\u5168\u6587\u4EF6 Diff\u3002",blameOriginLine:"\u67E5\u770B\u6765\u6E90\u5386\u53F2\u884C",blameUnmapped:"\u65E0\u6CD5\u7CBE\u786E\u5B9A\u4F4D\u6765\u6E90\u884C",blamePrevious:"\u4E0A\u4E00\u884C\u9875",blameNext:"\u4E0B\u4E00\u884C\u9875",fileHistoryMergeBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u5408\u5E76\u63D0\u4EA4\uFF0C\u6B64\u5904\u505C\u6B62\uFF0C\u4E0D\u63A8\u65AD\u591A\u7236\u6765\u6E90",fileHistorySimilarity:"Git\u76F8\u4F3C\u5EA6",fileHistoryAmbiguous:"\u591A\u4E2A\u5019\u9009\u6765\u6E90\uFF0C\u6B64\u5904\u505C\u6B62\u8FFD\u6EAF",fileHistoryRenameLimit:"\u5DF2\u8FBE32\u6B21\u91CD\u547D\u540D\u786E\u8BA4\u4E0A\u9650\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryBoundary:"\u8EAB\u4EFD\u8FB9\u754C\uFF1A\u590D\u5236\u6216\u975E\u7CBE\u786E\u91CD\u547D\u540D\uFF0C\u6B64\u5904\u505C\u6B62",fileHistoryFollow:"\u8DDF\u968F\u91CD\u547D\u540D\uFF08\u7B2C\u4E00\u7236\u94FE\uFF09",fileHistoryFollowScope:"\u8DDF\u968FGit\u68C0\u51FA\u7684\u91CD\u547D\u540D\uFF1B50%\u4EE5\u4E0A\u76F8\u4F3C\u91CD\u547D\u540D\u989D\u5916\u786E\u8BA4\u552F\u4E00\u5220\u9664\uFF0F\u65B0\u589E\u6765\u6E90\uFF0C\u6B67\u4E49\u3001\u590D\u5236\u548C\u5408\u5E76\u5904\u505C\u6B62\u3002\u76F8\u4F3C\u5EA6\u4E0D\u662F\u8EAB\u4EFD\u4FDD\u8BC1\uFF1B\u6BCF\u6761\u8BB0\u5F55\u4F7F\u7528\u5F53\u65F6\u8DEF\u5F84\u3002",graphLaneLimit:"\u6CF3\u9053\u6700\u591A32\u6761\uFF1B\u8D85\u51FA\u90E8\u5206\u7701\u7565\u56FE\u5F62\uFF0C\u5B8C\u6574\u5DF2\u52A0\u8F7D\u8282\u70B9\u4E0E\u5173\u7CFB\u4ECD\u53EF\u5728\u6587\u5B57\u4E2D\u67E5\u770B\u3002",historyBranch:"\u5386\u53F2\u8D77\u70B9\uFF08\u672C\u5730\u5F15\u7528\uFF09",historyPinned:"\u56FA\u5B9A\u5FEB\u7167",historyBranchScope:"\u5F15\u7528\u7531\u4E0B\u65B9\u624B\u52A8\u52A0\u8F7D\uFF1B\u9009\u62E9\u540E\u56FA\u5B9A\u8BE5\u6B21OID\uFF0C\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5386\u53F2\u8D77\u70B9\u3002\u9009\u62E9HEAD\u91CD\u65B0\u8BFB\u53D6\u5F53\u524DHEAD\uFF0C\u4E0D\u5207\u6362\u5DE5\u4F5C\u533A\u3002",historyServerSearch:"\u5168\u5386\u53F2\u67E5\u8BE2",historyServerScope:"\u67E5\u8BE2\u56FA\u5B9A\u5FEB\u7167\u53EF\u8FBE\u7684\u5B8C\u6574\u5386\u53F2\uFF1B\u8BF4\u660E/\u4F5C\u8005\u4E3A\u5FFD\u7565\u5927\u5C0F\u5199\u7684\u5B57\u9762\u5339\u914D\uFF0C\u8DEF\u5F84\u4E3A\u7CBE\u786E\u8DEF\u5F84\u6216\u76EE\u5F55\uFF0C\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u3002\u5206\u9875\u4E0E\u8FD0\u884C\u65F6\u95F4\u6709\u754C\u3002",historyServer_message:"\u63D0\u4EA4\u8BF4\u660E",historyServer_author:"\u4F5C\u8005",historyServer_path:"\u8DEF\u5F84",historyServerApply:"\u6267\u884C\u67E5\u8BE2",historyServerClear:"\u6E05\u9664\u67E5\u8BE2",historyServerActive:"\u5F53\u524D\u5DF2\u63D0\u4EA4\u67E5\u8BE2",reviewView:"\u5BA1\u9605\u89C6\u56FE",workspaceView:"\u5DE5\u4F5C\u533A\u6539\u52A8",workspaceRoot:"\u5DE5\u4F5C\u533A\u672C\u8EAB",title:"VCS \u53D8\u66F4",readonly:"\u53EA\u8BFB\u9884\u89C8",refresh:"\u5237\u65B0",back:"\u8FD4\u56DE\u5BF9\u8BDD",all:"\u5168\u90E8\u53D8\u66F4",staged:"\u5DF2\u6682\u5B58",unstaged:"\u672A\u6682\u5B58",search:"\u641C\u7D22\u6587\u4EF6\u2026",noSession:"\u5148\u6253\u5F00\u4E00\u4E2A\u9879\u76EE\u4F1A\u8BDD\uFF0C\u518D\u67E5\u770B\u53D8\u66F4\u3002",noRepo:"\u672A\u53D1\u73B0 Git / SVN \u4ED3\u5E93\u3002\u53EF\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u540E\u91CD\u65B0\u626B\u63CF\u3002",clean:"\u6CA1\u6709\u53D8\u66F4",pick:"\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",loading:"\u6B63\u5728\u8BFB\u53D6\u2026",side:"\u5DE6\u53F3\u5BF9\u6BD4",inline:"\u884C\u5185\u5BF9\u6BD4",whitespace:"\u5FFD\u7565\u884C\u9996\u5C3E\u7A7A\u767D",wrap:"\u81EA\u52A8\u6362\u884C",previous:"\u4E0A\u4E00\u5904",next:"\u4E0B\u4E00\u5904",content:"\u5185\u5BB9",properties:"\u5C5E\u6027",binary:"\u4E8C\u8FDB\u5236\u6216\u53D7\u9650\u5185\u5BB9\u65E0\u6CD5\u6309\u6587\u672C\u6BD4\u8F83",changes:"\u5904\u53D8\u66F4",files:"\u4E2A\u6587\u4EF6",list:"\u5E73\u94FA",tree:"\u76EE\u5F55",emptySearch:"\u6CA1\u6709\u5339\u914D\u6587\u4EF6",session:"\u4F1A\u8BDD\u5DE5\u4F5C\u76EE\u5F55",M:"\u4FEE\u6539",A:"\u65B0\u589E",D:"\u5220\u9664",R:"\u91CD\u547D\u540D",C:"\u590D\u5236",U:"\u51B2\u7A81","?":"\u672A\u8DDF\u8E2A",P:"\u5C5E\u6027",error:"\u8BFB\u53D6\u5931\u8D25",retry:"\u91CD\u8BD5",stale:"\u5185\u5BB9\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u8BD5\u3002",repositories:"\u4ED3\u5E93",allRepositories:"\u5168\u90E8\u4ED3\u5E93",gitMode:"Git \u53D8\u66F4",svnBase:"SVN \xB7 BASE \u2194 \u5DE5\u4F5C\u526F\u672C",subdirectory:"\u76F8\u5BF9\u5B50\u76EE\u5F55\uFF08\u53EF\u9009\uFF09",rescan:"\u91CD\u65B0\u626B\u63CF\u4ED3\u5E93",scanHint:"\u4EC5\u626B\u63CF\u5F53\u524D\u76EE\u5F55\u53CA\u4E00\u7EA7\u5B50\u76EE\u5F55\uFF0C\u4E0D\u9012\u5F52\u6DF1\u5165 \xB7 \u7F13\u5B58 5 \u5206\u949F\u540E\u8FC7\u671F",truncated:"\u5DF2\u8FBE\u5230\u626B\u63CF\u4E0A\u9650\u3002\u8F93\u5165\u76F8\u5BF9\u5B50\u76EE\u5F55\u5E76\u91CD\u65B0\u626B\u63CF\u4EE5\u8865\u5145\u5176\u4ED6\u4F4D\u7F6E\u3002",fallback:"\u9AD8\u7EA7\u7F16\u8F91\u5668\u4E0D\u53EF\u7528\uFF0C\u5DF2\u5207\u6362\u4E3A\u57FA\u7840\u5DE6\u53F3\u6587\u672C\u5BF9\u6BD4\u3002",diagnostics:"\u52A0\u8F7D\u8BCA\u65AD",approximate:"\u5185\u5BB9\u8F83\u5927\uFF0C\u4F7F\u7528\u8FD1\u4F3C\u884C\u5BF9\u9F50\u3002",textTruncated:"\u4EC5\u663E\u793A\u524D 2000 \u884C\u3002",textBefore:"\u4FEE\u6539\u524D",textAfter:"\u4FEE\u6539\u540E",textReadonly:"\u53EA\u8BFB\u6587\u672C\u6BD4\u8F83",textEmpty:"\u4E24\u4E2A\u7248\u672C\u5747\u4E3A\u7A7A\u3002",commitDetails:"\u63D0\u4EA4\u8BE6\u60C5",commitFileSearch:"\u7B5B\u9009\u672C\u6B21\u63D0\u4EA4\u6587\u4EF6",commitParent:"\u6BD4\u8F83\u7236\u63D0\u4EA4",commitRoot:"\u7A7A\u57FA\u7EBF\uFF08\u6839\u63D0\u4EA4\uFF09",commitNoChanges:"\u76F8\u5BF9\u6B64\u57FA\u7EBF\u65E0\u6587\u4EF6\u53D8\u66F4",history:"\u63D0\u4EA4\u5386\u53F2",workspaceLargeScope:"Git\u5DE5\u4F5C\u533A\u5B8C\u6574UTF-8\u6BD4\u8F83\uFF0C\u6BCF\u4FA78MiB\uFF0F10\u4E07\u884C\uFF1B\u8BFB\u53D6\u671F\u95F4\u53D8\u5316\u4F1A\u62D2\u7EDD\u7ED3\u679C\uFF0C\u6210\u529F\u540E\u6587\u4EF6\u4ECD\u53EF\u88AB\u5916\u90E8\u4FEE\u6539\u3002",largeLoad:"\u52A0\u8F7D\u5B8C\u6574\u5927\u6587\u4EF6\u6BD4\u8F83",largeClose:"\u53D6\u6D88\u5927\u6587\u4EF6\u6A21\u5F0F",largeScope:"\u4EC5Git\u5386\u53F2UTF-8\u666E\u901A\u6587\u4EF6\uFF0C\u6BCF\u4FA7\u6700\u591A8MiB\u300110\u4E07\u884C\uFF1B\u4E0D\u662F\u5DE5\u4F5C\u533A\u6216SVN\u5927\u6587\u4EF6\u3002",diffPending:"\u6B63\u5728\u8BA1\u7B97\u5DEE\u5F02\uFF0C\u5C1A\u4E0D\u80FD\u5224\u65AD\u662F\u5426\u76F8\u540C\u3002",diffIncomplete:"\u5DEE\u5F02\u8BA1\u7B97\u672A\u5B8C\u6210\u6216\u8D85\u65F6\uFF0C\u5F53\u524D\u7ED3\u679C\u53EF\u80FD\u4E0D\u5B8C\u6574\u3002",diffComplete:"\u5DEE\u5F02\u8BA1\u7B97\u5B8C\u6210\u3002",largeFallback:"\u57FA\u7840\u89C6\u56FE\u53EA\u5C55\u793A\u6709\u754C\u7247\u6BB5\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5927\u6587\u4EF6\u5DEE\u5F02\u3002",historyAdvanced:"\u52A0\u8F7D\u9AD8\u7EA7\u53EA\u8BFB Diff",historyBasic:"\u8FD4\u56DE\u57FA\u7840\u6587\u672C Diff",historyListOnly:"\u672C\u5730 HEAD \u5386\u53F2\uFF1B\u9009\u62E9\u63D0\u4EA4\u53CA\u6587\u4EF6\u67E5\u770B\u53EA\u8BFB\u6587\u672C\u5DEE\u5F02\u3002",historyEmpty:"\u5C1A\u65E0\u63D0\u4EA4",historyRefsScope:"\u6807\u8BB0\u6765\u81EA\u6700\u8FD1\u4E00\u6B21\u624B\u52A8\u52A0\u8F7D\u7684\u672C\u5730\u5F15\u7528\uFF0C\u4E0D\u4EE3\u8868\u63D0\u4EA4\u521B\u5EFA\u65F6\u7684\u5206\u652F\u72B6\u6001\uFF1B\u5237\u65B0\u5931\u8D25\u65F6\u4FDD\u7559\u4E0A\u6B21\u6210\u529F\u7ED3\u679C\u3002",historyRefsLabel:"\u5DF2\u52A0\u8F7D\u672C\u5730\u5F15\u7528",historyRefsMore:"\u5176\u4ED6\u5F15\u7528",historySearch:"\u7B5B\u9009\u5DF2\u52A0\u8F7D\u63D0\u4EA4\uFF08\u4F5C\u8005 / \u6458\u8981 / SHA\uFF09",historyNoMatch:"\u5DF2\u52A0\u8F7D\u63D0\u4EA4\u4E2D\u65E0\u5339\u914D\u9879\uFF1B\u53EF\u7EE7\u7EED\u52A0\u8F7D\u66F4\u591A\u3002",historyMore:"\u52A0\u8F7D\u66F4\u591A\u63D0\u4EA4",historyLimit:"\u5DF2\u8FBE\u5230\u5386\u53F2\u6D4F\u89C8\u8303\u56F4\u4E0A\u9650\uFF0C\u4ECD\u6709\u66F4\u65E9\u63D0\u4EA4\u672A\u663E\u793A\u3002",autoRefresh:"\u624B\u52A8\u6216\u7A97\u53E3\u805A\u7126\u65F6\u5237\u65B0",comparisonContext:"\u6BD4\u8F83\u4E0A\u4E0B\u6587",encoding:"\u7F16\u7801",before:"\u524D\u7248\u672C",after:"\u540E\u7248\u672C",filterStatus:"\u6309\u72B6\u6001\u7B5B\u9009",allFiles:"\u5168\u90E8\u6587\u4EF6",previousFile:"\u4E0A\u4E00\u4E2A\u6587\u4EF6",nextFile:"\u4E0B\u4E00\u4E2A\u6587\u4EF6",expandAll:"\u5168\u90E8\u5C55\u5F00",collapseAll:"\u5168\u90E8\u6298\u53E0",revealSelected:"\u5B9A\u4F4D\u5F53\u524D\u6587\u4EF6",reviewPosition:"\u7B2C {index} / {total} \u4E2A\u6587\u4EF6",clearFilters:"\u6E05\u9664\u7B5B\u9009",searchShortcut:"Ctrl / \u2318 + F \u641C\u7D22\uFF1BEsc \u6E05\u7A7A\u641C\u7D22",fileShortcut:"Alt + \u2190 / \u2192 \u5207\u6362\u4E0A\u4E00\u4E2A\u6216\u4E0B\u4E00\u4E2A\u6587\u4EF6",copyPath:"\u590D\u5236\u8DEF\u5F84",copied:"\u5DF2\u590D\u5236",pathCopied:"\u6587\u4EF6\u8DEF\u5F84\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\u3002",copyFailed:"\u65E0\u6CD5\u590D\u5236\u6587\u4EF6\u8DEF\u5F84\u3002",binaryComparison:"\uFF08{files}\uFF09",revisionTitle:"\u672C\u5730\u7248\u672C A/B \u6BD4\u8F83",revisionScope:"\u53EF\u9009\u62E9\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4\uFF0C\u6216\u624B\u52A8\u52A0\u8F7D\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E\uFF1B\u76F4\u63A5\u6BD4\u8F83 A \u2192 B\uFF0C\u4E0D\u4F7F\u7528\u5408\u5E76\u57FA\u70B9\u3002",revisionBase:"A\uFF08\u5DE6\u4FA7\uFF09",revisionTarget:"B\uFF08\u53F3\u4FA7\uFF09",revisionSwap:"\u4EA4\u6362 A/B",revisionEmpty:"\u4E24\u4E2A\u7248\u672C\u6CA1\u6709\u6587\u4EF6\u53D8\u66F4\u3002",fileHistory:"\u8DEF\u5F84\u5386\u53F2",fileHistoryScope:"\u56FA\u5B9A\u63D0\u4EA4\u5FEB\u7167\u4E0B\u7684\u7CBE\u786E\u8DEF\u5F84\u5386\u53F2\uFF1B\u4E0D\u8FFD\u8E2A\u91CD\u547D\u540D\u524D\u8DEF\u5F84\uFF0C\u5305\u542B\u540C\u8DEF\u5F84\u5220\u9664\u540E\u91CD\u5EFA\u3002\u70B9\u51FB\u63D0\u4EA4\u540E\uFF0C\u4EC5\u5728\u76F8\u5BF9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF08\u6839\u63D0\u4EA4\u4E3A\u7A7A\u6811\uFF09\u7684\u53D8\u66F4\u4E2D\u552F\u4E00\u5339\u914D\u540C\u8DEF\u5F84\u65F6\u6253\u5F00 Diff\uFF1B\u5426\u5219\u53EA\u663E\u793A\u8BE6\u60C5\u3002",blame:"\u884C\u5F52\u5C5E\uFF08Blame\uFF09",blameNavigation:"\u70B9\u51FB\u5F52\u5C5E\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5\uFF1B\u9ED8\u8BA4\u9009\u62E9\u9996\u4E2A\u7236\u63D0\u4EA4\uFF0C\u4E0D\u81EA\u52A8\u5B9A\u4F4D\u5386\u53F2\u6587\u4EF6\u6216\u884C\u53F7\u3002",blameScope:"\u6240\u9009\u63D0\u4EA4\u7684 UTF-8 \u666E\u901A\u6587\u672C\uFF0C\u6700\u591A\u663E\u793A\u524D 500 \u884C\uFF1B\u4E0D\u5305\u542B\u5DE5\u4F5C\u533A\u4FEE\u6539\u3002",blameLimit:"\u4EC5\u663E\u793A\u524D 500 \u884C\uFF0C\u7ED3\u679C\u5DF2\u622A\u65AD\u3002",blameEmpty:"\u6587\u4EF6\u6CA1\u6709\u53EF\u663E\u793A\u7684\u884C\u3002",blameLine:"\u884C\u53F7",blameCommit:"\u5F52\u5C5E\u63D0\u4EA4",blameAuthor:"\u4F5C\u8005",blameSummary:"\u63D0\u4EA4\u6458\u8981",blameSource:"\u6E90\u7801",historicalTree:"\u5386\u53F2\u76EE\u5F55",historicalTreeScope:"\u6240\u9009\u63D0\u4EA4\u7684\u76EE\u5F55\u6761\u76EE\uFF1B\u6BCF\u9875 100 \u9879\u3002\u70B9\u51FB\u666E\u901A\u6587\u4EF6\u53EA\u8BFB\u9884\u89C8\uFF1B\u4E0D\u8DDF\u968F\u7B26\u53F7\u94FE\u63A5\u6216\u5B50\u6A21\u5757\u3002",treePreview:"\u5386\u53F2\u6587\u4EF6\u9884\u89C8",treeClose:"\u5173\u95ED\u6587\u4EF6\u9884\u89C8",treeEmpty:"\u7A7A\u6587\u4EF6\u6216\u65E0\u53EF\u663E\u793A\u7684\u6587\u672C\u3002",treeSearch:"\u7B5B\u9009\u5F53\u524D\u76EE\u5F55\u540D\u79F0",treeBreadcrumbs:"\u5386\u53F2\u76EE\u5F55\u8DEF\u5F84",treeUp:"\u4E0A\u7EA7\u76EE\u5F55",treeEntries:"\u4E2A\u6761\u76EE",treePrevious:"\u4E0A\u4E00\u9875",treeNext:"\u4E0B\u4E00\u9875",historyGraph:"\u5C40\u90E8\u63D0\u4EA4\u56FE",graphScope:"\u4EC5\u5C55\u793A\u5DF2\u52A0\u8F7D\u5386\u53F2\u7684\u524D 200 \u4E2A\u63D0\u4EA4\uFF0C\u6700\u591A 1000 \u6761\u7236\u5B50\u8FB9\uFF1B\u4E0D\u53D7\u6587\u672C\u7B5B\u9009\u5F71\u54CD\uFF0C\u4E0D\u4EE3\u8868\u5B8C\u6574\u5206\u652F\u56FE\u3002\u8282\u70B9\u70B9\u51FB\u53EF\u67E5\u770B\u8BE6\u60C5\u3002",graphLimit:"\u56FE\u5DF2\u8FBE\u5230\u8282\u70B9\u6216\u8FB9\u4E0A\u9650\uFF0C\u90E8\u5206\u5173\u7CFB\u672A\u5C55\u793A\u3002",graphMissing:"\u7236\u63D0\u4EA4\u672A\u5728\u5F53\u524D\u56FE\u4E2D",graphRelations:"\u7236\u5B50\u5173\u7CFB\uFF08\u6587\u672C\uFF09",graphInvalid:"\u5F53\u524D\u63D0\u4EA4\u987A\u5E8F\u65E0\u6CD5\u7ED8\u56FE\uFF1B\u8BF7\u4F7F\u7528\u5386\u53F2\u5217\u8868\u3002",imageCompare:"PNG \u56FE\u7247\u6BD4\u8F83",imageBefore:"\u6240\u9009\u7236\u63D0\u4EA4",imageAfter:"\u6240\u9009\u63D0\u4EA4",imageAbsent:"\u6B64\u4FA7\u6CA1\u6709\u6587\u4EF6\u3002",imageInvalid:"\u56FE\u7247\u54CD\u5E94\u65E0\u6548\u3002",imageMetadata:"\u9884\u89C8\u5DF2\u79FB\u9664\u9644\u52A0\u5143\u6570\u636E\u3002",imageScope:"\u652F\u6301\u975E\u4EA4\u9519\u9759\u6001 PNG \u4E0E 8 \u4F4D\u5355\u626B\u63CF baseline JPEG \u666E\u901A\u6587\u4EF6\uFF0C\u4EE5\u53CA\u5355\u5757\u9759\u6001VP8\uFF0F\u65E0\u635FVP8L WebP\uFF08\u4E0D\u652F\u6301\u6E10\u8FDB\u5F0F/CMYK JPEG\u3001\u6269\u5C55/\u52A8\u753B WebP\uFF09\uFF1B\u6BCF\u4FA7\u6700\u591A 2 MiB\u30011600 \u4E07\u50CF\u7D20\u3002\u5143\u6570\u636E\u88AB\u79FB\u9664\uFF0C\u4E0D\u9002\u7528\u4E8E\u8272\u5F69\u7CBE\u786E\u6027\u5BA1\u9605\u3002\u652F\u6301\u5386\u53F2\u63D0\u4EA4\u3001\u56FA\u5B9A A/B \u53CA Git \u5DE5\u4F5C\u533A\uFF1B\u6309\u6240\u9009\u6A21\u5F0F\u8BFB\u53D6 HEAD\u3001\u6682\u5B58\u533A\u6216\u5DE5\u4F5C\u6587\u4EF6\u3002\u51B2\u7A81\u56FE\u7247\u4E0D\u652F\u6301\u3002",commitMessageLimit:"\u5B8C\u6574\u63D0\u4EA4\u8BF4\u660E\u8D85\u8FC7 2 MiB \u9884\u89C8\u4E0A\u9650\uFF0C\u5DF2\u7701\u7565\u3002",revisionLoadRefs:"\u52A0\u8F7D / \u5237\u65B0\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsScope:"\u4EC5\u672C\u5730\u5206\u652F\u548C\u6307\u5411\u63D0\u4EA4\u7684\u6807\u7B7E\uFF0C\u6700\u591A 1000 \u6761\uFF1B\u4E0D fetch\u3002\u9009\u62E9\u56FA\u5B9A\u4E3A\u52A0\u8F7D\u65F6\u7684\u63D0\u4EA4 OID\uFF1B\u5237\u65B0\u5F15\u7528\u4E0D\u4F1A\u79FB\u52A8\u5DF2\u9009\u7248\u672C\u3002",revisionRefsEmpty:"\u6CA1\u6709\u53EF\u7528\u7684\u672C\u5730\u5206\u652F\u6216\u63D0\u4EA4\u6807\u7B7E\u3002",revisionLoadedCommits:"\u5DF2\u52A0\u8F7D\u7684\u63D0\u4EA4",revisionLocalRefs:"\u672C\u5730\u5206\u652F\u4E0E\u6807\u7B7E",revisionRefsCount:"\u5DF2\u52A0\u8F7D\u53EF\u9009\u5F15\u7528"},en:{svnOfferExpired:"Network access offer expired. Retry manually and check consent again.",svnExpired:"SVN network consent expired; history requests stopped. Review and consent again.",svnConsentReview:"Review SVN network access",svnConsentScope:"Before consent, read local identity only. Access binds this repository, Session and cwd for five minutes; redirects and writes are not authorized.",svnConsentExplicit:"I consent to access the HTTPS SVN repository above",svnConsentApprove:"Consent and read history",svnHistoryScope:"SVN history at a fixed local revision snapshot; pages replace displayed rows",svnHistoricalDiff:"Historical read-only Diff",svnTraceScope:"File trace stops at copy boundaries and does not follow out-of-scope sources",svnGrantScope:"Network consent lasts five minutes; revoke at any time. History operations do not modify the working copy.",svnRevoke:"Revoke SVN network consent",svnIdentity:"Inspect local SVN history identity",svnOfflineIdentity:"Read local metadata from the authorized working copy only; no remote request.",svnRemoteDisabled:"Remote SVN history transport is not enabled; no network grant or usable access token. This is not an authorized history entry point.",historyWindow:"Loaded history window (start inclusive, end exclusive)",historyWindowScope:"List and graph retain at most 200 rows; more loads replace newer rows. Boundary edges are not a complete graph. Local filtering covers this window only.",segments:"Browse historical text segments",segmentBytes:"Byte range (start inclusive, end exclusive)",segmentScope:"Committed UTF-8 regular files up to 16 MiB; replaceable 64 KiB segments. Segment line numbers are not original file lines; this is not a full-file Diff.",blameOriginLine:"View origin historical line",blameUnmapped:"Origin line cannot be located precisely",blamePrevious:"Previous line page",blameNext:"Next line page",fileHistoryMergeBoundary:"Identity boundary: merge commit; stopped without inferring parent origin",fileHistorySimilarity:"Git similarity",fileHistoryAmbiguous:"Multiple candidate origins; tracing stopped here",fileHistoryRenameLimit:"32 rename confirmations reached; tracing stopped here",fileHistoryBoundary:"Identity boundary: copy or inexact rename; stopped here",fileHistoryFollow:"Follow renames (first-parent)",fileHistoryFollowScope:"Git-detected renames; similarities of 50% or more require a unique deletion/addition transition. Stops at ambiguity, copies and merges. Similarity is not an identity guarantee; rows use historical paths.",graphLaneLimit:"At most 32 lanes. Overflow geometry is omitted; loaded nodes and relations remain available as text.",historyBranch:"History tip (local reference)",historyPinned:"Pinned snapshot",historyBranchScope:"Load references manually below. Selection pins that OID; refreshing references does not move the history tip. Selecting HEAD reads current HEAD without checking out.",historyServerSearch:"Full history query",historyServerScope:"Search all history reachable from the pinned snapshot. Message/author use case-insensitive literal matching; path is an exact path or directory, without rename following. Pagination and runtime are bounded.",historyServer_message:"Commit message",historyServer_author:"Author",historyServer_path:"Path",historyServerApply:"Run query",historyServerClear:"Clear query",historyServerActive:"Submitted query",reviewView:"Review view",workspaceView:"Working changes",workspaceRoot:"Workspace root",title:"VCS changes",readonly:"Read-only preview",refresh:"Refresh",back:"Back to chat",all:"All changes",staged:"Staged",unstaged:"Unstaged",search:"Filter files\u2026",noSession:"Open a project session to inspect its changes.",noRepo:"No Git / SVN repositories discovered. Try a relative subdirectory and rescan.",clean:"No changes",pick:"Select a file to review",loading:"Loading\u2026",side:"Side by side",inline:"Inline",whitespace:"Ignore trim whitespace",wrap:"Word wrap",previous:"Previous change",next:"Next change",content:"Content",properties:"Properties",binary:"Binary or restricted content cannot be compared as text",changes:"changes",files:"files",list:"Flat",tree:"Tree",emptySearch:"No matching files",session:"Session directory",M:"Modified",A:"Added",D:"Deleted",R:"Renamed",C:"Copied",U:"Conflict","?":"Untracked",P:"Property",error:"Failed to read",retry:"Retry",stale:"Content changed. Refresh and try again.",repositories:"Repositories",allRepositories:"All repositories",gitMode:"Git changes",svnBase:"SVN \xB7 BASE \u2194 Working Copy",subdirectory:"Relative subdirectory (optional)",rescan:"Rescan repositories",scanHint:"Scan current directory and immediate children only \xB7 cache expires after 5 minutes",truncated:"Discovery limit reached. Enter a relative subdirectory and rescan to include another location.",fallback:"Advanced editor unavailable. Showing basic side-by-side text comparison.",diagnostics:"Loading diagnostics",approximate:"Large content: approximate line alignment.",textTruncated:"Only the first 2000 lines are displayed.",textBefore:"Before",textAfter:"After",textReadonly:"Read-only text comparison",textEmpty:"Both versions are empty.",commitDetails:"Commit details",commitFileSearch:"Filter files in this commit",commitParent:"Compare parent",commitRoot:"Empty baseline (root commit)",commitNoChanges:"No file changes against this baseline",history:"Commit history",workspaceLargeScope:"Complete Git working-copy UTF-8 comparison: 8 MiB / 100000 lines per side. Changes during loading reject the result; external edits remain possible afterward.",largeLoad:"Load complete large-file comparison",largeClose:"Cancel large-file mode",largeScope:"Git historical UTF-8 regular files only: 8 MiB and 100000 lines per side, not working-copy or SVN large files.",diffPending:"Computing differences; equality is not yet known.",diffIncomplete:"Difference computation is incomplete or timed out; displayed results may be partial.",diffComplete:"Difference computation completed.",largeFallback:"The basic view shows bounded excerpts, not the complete large-file diff.",historyAdvanced:"Load advanced read-only diff",historyBasic:"Return to basic text diff",historyListOnly:"Local HEAD history. Select a commit and file to view a read-only text diff.",historyEmpty:"No commits yet",historyRefsScope:"Labels reflect the last manually loaded local refs, not branches at commit creation. Failed refreshes retain the last successful result.",historyRefsLabel:"Loaded local references",historyRefsMore:"Additional references",historySearch:"Filter loaded commits (author / subject / SHA)",historyNoMatch:"No matches in loaded commits; you can load more if available.",historyMore:"Load more commits",historyLimit:"History browsing limit reached; older commits are not shown.",autoRefresh:"Refresh manually or on window focus",comparisonContext:"Comparison context",encoding:"Encoding",before:"Before",after:"After",filterStatus:"Filter by status",allFiles:"All files",previousFile:"Previous file",nextFile:"Next file",expandAll:"Expand all",collapseAll:"Collapse all",revealSelected:"Reveal current file",reviewPosition:"File {index} of {total}",clearFilters:"Clear filters",searchShortcut:"Ctrl / \u2318 + F to search; Esc clears search",fileShortcut:"Alt + \u2190 / \u2192 switches the previous or next file",copyPath:"Copy path",copied:"Copied",pathCopied:"File path copied to the clipboard.",copyFailed:"Unable to copy the file path.",binaryComparison:"({files})",revisionTitle:"Local A/B revision comparison",revisionScope:"Choose loaded commits or manually load local branches and tags. Compare A \u2192 B directly, not via merge-base.",revisionBase:"A (left)",revisionTarget:"B (right)",revisionSwap:"Swap A/B",revisionEmpty:"No file changes between these revisions.",fileHistory:"Path history",fileHistoryScope:"Exact-path history at the pinned commit; no rename following, including deletion and recreation. Selecting a commit opens its Diff only for a unique same-path change against the first parent (empty tree for a root); otherwise only details are shown.",blame:"Blame",blameNavigation:"Select an attributed commit to view details with its first parent selected; no automatic historical file or line navigation.",blameScope:"UTF-8 regular text at the selected commit, first 500 lines at most. Working changes are excluded.",blameLimit:"Only the first 500 lines are shown; result truncated.",blameEmpty:"No source lines to display.",blameLine:"Line",blameCommit:"Commit",blameAuthor:"Author",blameSummary:"Summary",blameSource:"Source",historicalTree:"Historical tree",historicalTreeScope:"Entries at the selected commit; 100 per page. Select regular files for read-only preview; symlinks and submodules are not followed.",treePreview:"Historical file preview",treeClose:"Close file preview",treeEmpty:"Empty file or no displayable text.",treeSearch:"Filter names in this directory",treeBreadcrumbs:"Historical directory path",treeUp:"Parent directory",treeEntries:"entries",treePrevious:"Previous page",treeNext:"Next page",historyGraph:"Local commit graph",graphScope:"First 200 loaded commits, at most 1000 parent edges. Independent of text filtering; not a complete branch graph. Select a node for details.",graphLimit:"Node or edge limit reached; some relationships are omitted.",graphMissing:"Parent outside this graph",graphRelations:"Parent relationships (text)",graphInvalid:"Cannot graph this commit order; use the history list.",imageCompare:"PNG image comparison",imageBefore:"Selected parent",imageAfter:"Selected commit",imageAbsent:"No file on this side.",imageInvalid:"Invalid image response.",imageMetadata:"Ancillary metadata was removed from this preview.",imageScope:"Non-interlaced static PNG or 8-bit single-scan baseline JPEG regular files , or single-chunk static VP8 / lossless VP8L WebP (no progressive/CMYK JPEG or extended/animated WebP); at most 2 MiB and 16 million pixels per side. Metadata is removed; not suitable for color-critical review. Supports commits, fixed A/B and Git working changes; HEAD, index or working bytes follow the selected mode. Conflicted images are unsupported.",commitMessageLimit:"Full commit message exceeds the 2 MiB preview limit and was omitted.",revisionLoadRefs:"Load / refresh local branches and tags",revisionRefsScope:"Local branches and commit tags only, at most 1000 refs; no fetch. Selections pin the loaded commit OID; refreshing refs does not move selected versions.",revisionRefsEmpty:"No local branches or commit tags are available.",revisionLoadedCommits:"Loaded commits",revisionLocalRefs:"Local branches and tags",revisionRefsCount:"Selectable references loaded"}};function gr(e,t,o,r){let i=e.target;if(!t?.contains(i)||e.defaultPrevented||e.isComposing||i?.closest?.(".monaco-editor")||i?.closest?.(".vcs-history"))return null;if(e.key==="Escape"&&i===o&&r)return"clear";let a=i?.isContentEditable||i?.closest?.('input,textarea,select,[role="textbox"]');if(a&&i!==o)return null;if((e.ctrlKey||e.metaKey)&&!e.altKey&&!e.shiftKey&&e.key?.toLowerCase()==="f")return"search";if(!a&&e.altKey&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){if(e.key==="ArrowLeft")return"previous";if(e.key==="ArrowRight")return"next"}return null}function vr(e,t){let o=t?[...t.querySelectorAll("button[data-vcs-item]")]:[],r=o.indexOf(e.target);if(r<0)return;let i;if(e.key==="ArrowDown")i=o[r+1];else if(e.key==="ArrowUp")i=o[r-1];else if(e.key==="Home")i=o[0];else if(e.key==="End")i=o.at(-1);else if(e.key==="ArrowRight"&&e.target.dataset.vcsDirectory==="closed"||e.key==="ArrowLeft"&&e.target.dataset.vcsDirectory==="open"){e.preventDefault(),e.target.click();return}else return;e.preventDefault(),i?.focus()}var yr=e=>"dsh-vcs:project:v1:"+e;function br(e,t){if(!e)return"";try{let o=(t??globalThis.localStorage)?.getItem(yr(e));return typeof o=="string"&&o.length<=1024?o:""}catch{return""}}function xr(e,t,o){if(!(!e||!t))try{(o??globalThis.localStorage)?.setItem(yr(e),t)}catch{}}function Sr(e,t=""){return e.find(o=>o.id===t)?.id||e.find(o=>o.relativePath===".")?.id||e[0]?.id||""}var qe=(e,t)=>JSON.stringify([e,t]),Ve=(e,t=".")=>[e.type.toUpperCase(),e.relativePath==="."?t:e.relativePath||".",e.branch].filter(Boolean).join(" \xB7 "),$e=(e,t="all")=>e.type==="git"&&["staged","unstaged"].includes(t)?t:"all",wr=(e="",t="")=>e===t?0:e<t?-1:1;function At(e=[]){let t={id:"",name:"",directories:new Map,files:[],count:0};for(let r of e){let i=String(r.path||"").split("/").filter(Boolean);if(!i.length)continue;let a=t;for(let p of i.slice(0,-1)){let f=a.id?a.id+"/"+p:p;a.directories.has(p)||a.directories.set(p,{id:f,name:p,directories:new Map,files:[],count:0}),a=a.directories.get(p),a.count++}a.files.push(r)}let o=r=>({...r,directories:[...r.directories.values()].sort((i,a)=>wr(i.name,a.name)).map(o),files:[...r.files].sort((i,a)=>wr(i.path,a.path))});return o(t)}function kr(e=[],t){let o=e.findIndex(r=>r.id===t);return{index:o<0?0:o+1,total:e.length}}function Cr(e=[],t,o){if(!e.length||!["previous","next"].includes(o))return null;let r=e.findIndex(p=>p.id===t),i=o==="next"?1:-1,a=r<0?o==="next"?-1:0:r;return e[(a+i+e.length)%e.length]||null}function Nr(e=""){let t=String(e).split("/").filter(Boolean);return t.slice(0,-1).map((o,r)=>t.slice(0,r+1).join("/"))}function Pt(e,t=[]){for(let o of e?.directories||[])t.push(o.id),Pt(o,t);return t}function Er(e=""){return{missing:"deleted",unversioned:"untracked",replaced:"modified",obstructed:"conflicted",copied:"renamed"}[e]||e}function Lr(e=[]){return e.reduce((t,o)=>{let r=Er(o.status);return t.all++,t[r]=(t[r]||0)+1,t},{all:0})}function Lo(e=[],t="",o="all"){let r=t.toLowerCase();return e.filter(i=>(o==="all"||Er(i.status)===o)&&i.path.toLowerCase().includes(r)).sort((i,a)=>i.path.localeCompare(a.path))}function Ar(e,t,o="",r="all"){return e.map(i=>({...t[i.id],repository:i,changes:Lo(t[i.id]?.changes,o,r)}))}function Pr(e,t,o=""){if(!o||!e||e.cwd!==t.cwd)return t;let r=new Map(e.repositories.map(i=>[i.id,i]));for(let i of t.repositories)r.set(i.id,i);return{...t,repositories:[...r.values()],truncated:e.truncated||t.truncated,warnings:[...e.warnings||[],...t.warnings||[]]}}var Hr={modified:"M",added:"A",deleted:"D",missing:"D",renamed:"R",copied:"C",conflicted:"U",untracked:"?",unversioned:"?",replaced:"M",obstructed:"U",normal:"P"},Br=e=>new URL("vcs-assets/"+e,document.baseURI).href;function Or(){return s.default.createElement("svg",{width:"20",height:"20",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.6","aria-hidden":"true"},s.default.createElement("rect",{x:"3",y:"4",width:"18",height:"16",rx:"3"}),s.default.createElement("path",{d:"M12 4v16M6 10h3M7.5 8.5v3M15 14h3"}))}var Ao=["slots","layout","locale","connection","uiSession"];function Po(e){e.effect(()=>e.locale.register("local.vcs",hr));let t=e.locale.bind("local.vcs"),o=mt(2),r=er(e.connection,()=>t("error"));function i(f){let d=f.useSessions(n=>Object.values(n.byId).find(c=>(c.retainedBy.mainView??0)>0));return s.default.createElement(a,{key:JSON.stringify([d?.id,d?.cwd])},s.default.createElement(p,{session:d}))}class a extends s.default.Component{state={error:null};static getDerivedStateFromError(d){return{error:d}}render(){return this.state.error?s.default.createElement("section",{className:"vcs-root"},s.default.createElement("style",null,ft),s.default.createElement("div",{className:"vcs-message vcs-error"},t("error"),s.default.createElement("button",{onClick:()=>this.setState({error:null})},t("retry")),s.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")))):this.props.children}}function p({session:f}){(0,s.useSyncExternalStore)(l=>e.locale.subscribe(l),()=>e.locale.getSnapshot(),()=>e.locale.getSnapshot());let d=f?.id,[n,c]=(0,s.useState)("all"),[h,w]=(0,s.useState)(0),[v,S]=(0,s.useState)(0),[u,x]=(0,s.useState)(null),[b,g]=(0,s.useState)({}),[m,y]=(0,s.useState)(()=>br(f?.cwd)),[k,B]=(0,s.useState)(0),[E,V]=(0,s.useState)(""),[Y,ye]=(0,s.useState)(""),[j,pe]=(0,s.useState)(null),[A,le]=(0,s.useState)(null),[ie,Le]=(0,s.useState)(!1),[be,Ae]=(0,s.useState)(!1),[ae,P]=(0,s.useState)(""),[z,Z]=(0,s.useState)(""),[ee,Ht]=(0,s.useState)(""),[Bt,Ot]=(0,s.useState)(!1),[fe,Ze]=(0,s.useState)(""),[Je,Dt]=(0,s.useState)("all"),[xe,Ft]=(0,s.useState)(!0),[Mt,Re]=(0,s.useState)({}),[Pe,Dr]=(0,s.useState)(!0),[et,Fr]=(0,s.useState)(!1),[tt,Mr]=(0,s.useState)(!1),[Ge,He]=(0,s.useState)("content"),[Tt,jt]=(0,s.useState)(0),[Tr,qt]=(0,s.useState)(!1),[Vt,Jt]=(0,s.useState)(null),[jr,qr]=(0,s.useState)(0),[Gt,Vr]=(0,s.useState)("pending"),[rt,ot]=(0,s.useState)({added:0,deleted:0,count:0}),[oe,Ut]=(0,s.useState)(!1),It=(0,s.useRef)(null),Wt=(0,s.useRef)(null),me=(0,s.useRef)(null),it=(0,s.useRef)(null),Ue=(0,s.useRef)(null),st=(0,s.useRef)(null),zt=(0,s.useRef)(null),we=(0,s.useRef)(null),nt=(0,s.useRef)(null),at=(0,s.useRef)(null),lt=(0,s.useRef)(!1),Ie=(0,s.useRef)(!1),he=u?.repositories||[],ge=he.filter(l=>l.id===m),te=Tr&&ge.some(l=>l.type==="git"),Jr=()=>{we.current?.abort(),le(null),pe(null),Z(""),qt(!0)};(0,s.useEffect)(()=>{he.some(l=>l.id===m)&&xr(f?.cwd,m)},[f?.cwd,m,u]);let Be=()=>{zt.current?.abort(),we.current?.abort(),le(null),pe(null),Z(""),He("content"),ot({added:0,deleted:0,count:0})},We=()=>{Ie.current=!1,Be(),nt.current?.abort(),at.current=u,x(null),g({}),ye(E.trim()),B(l=>l+1)},Se=()=>{Ie.current||(Ie.current=!0,Be(),nt.current?.abort(),at.current=null,x(null),g({}),ye(""),B(l=>l+1))},Kt=(l=!1)=>{l||S(N=>N+1),lt.current=l,l||Be(),l||g({}),w(N=>N+1)};(0,s.useEffect)(()=>{let l=new AbortController;return nt.current=l,P(""),Le(!!d),d&&r("vcs/repositories",{sessionId:d,...Y?{subdirectory:Y}:{}},l.signal).then(N=>{if(!l.signal.aborted){let q=Pr(at.current,N,Y);Ie.current=!1,y(K=>Sr(q.repositories,K)),x(q)}}).catch(N=>{l.signal.aborted||P(N.message)}).finally(()=>{l.signal.aborted||Le(!1)}),()=>l.abort()},[d,k,Y]),(0,s.useEffect)(()=>{let l=new AbortController,N=lt.current;zt.current=l,lt.current=!1,N||(g({}),Z(""));for(let q of ge){let K=$e(q,n);o(()=>r("vcs/status",{sessionId:d,repositoryId:q.id,mode:K},l.signal),l.signal).then(re=>{l.signal.aborted||g(se=>({...se,[q.id]:{...re,mode:K}}))}).catch(re=>{if(!l.signal.aborted){if(re.code==="vcs/rediscover-required"){Se();return}g(se=>({...se,[q.id]:{error:re.message,changes:[],mode:K}}))}})}return()=>l.abort()},[d,u,m,n,h]),(0,s.useEffect)(()=>{let l=N=>{N.target===window&&d&&m&&document.visibilityState==="visible"&&Kt(!0)};return window.addEventListener("focus",l),()=>window.removeEventListener("focus",l)},[d,m,n]);let ke=he.find(l=>l.id===j?.repositoryId),de=j?b[j.repositoryId]:null,dt=JSON.stringify([d,u?.cwd,j?.repositoryId,n,j?.id]),Ce=Vt?.key===dt&&Vt?.status===de;(0,s.useEffect)(()=>Jt(null),[dt,de,te]),(0,s.useEffect)(()=>{let l=new AbortController;return we.current=l,le(null),Z(""),ot({added:0,deleted:0,count:0}),He("content"),Ae(!!j&&!!de),!te&&j&&de&&ke&&r("vcs/compare",{sessionId:d,repositoryId:j.repositoryId,mode:$e(ke,n),id:j.id,...Ce?{large:!0}:{}},l.signal).then(N=>{l.signal.aborted||le(N)}).catch(N=>{if(!l.signal.aborted){if(N.code==="vcs/rediscover-required"){Se();return}Z(N.message)}}).finally(()=>{l.signal.aborted||Ae(!1)}),()=>l.abort()},[j,de,d,n,te,Ce,jr]),(0,s.useEffect)(()=>{let l=!1,N,q=new AbortController;Ut(!1),Ht("");let K=document.createElement("link");return K.rel="stylesheet",K.href=Br("editor.css"),document.head.appendChild(K),Ye(Br("editor.js")+"?v="+encodeURIComponent(Qe)+"&retry="+Tt,{signal:q.signal}).then(re=>{l||(N=re.createDiff(Wt.current,{onStats:ot,onComputation:se=>{l||Vr(se)}}),me.current=N,Ut(!0))}).catch(re=>{l||Ht(re.message)}),()=>{l=!0,q.abort(),N?.dispose(),me.current=null,K.remove()}},[Tt]),(0,s.useEffect)(()=>{oe&&(!A||A.binary||te)&&me.current?.setContent({left:{text:""},right:{text:""}},"empty"),oe&&A&&!A.binary&&!te&&me.current?.setContent(A,JSON.stringify([d,u?.cwd,j?.repositoryId,n,j?.id,A.path]))},[oe,A,d,u,j,n,te]),(0,s.useEffect)(()=>{me.current?.options({sideBySide:Pe,ignoreWhitespace:et,wrap:tt})},[oe,Pe,et,tt]);let Oe=Ar(ge,b,fe,Je),Ne=Oe.flatMap(l=>l.changes),Gr=Lr(de?.changes),ct=kr(Ne,j?.id),_t=()=>{Ze(""),Dt("all")},Ur=async()=>{let l=A?.path||ue?.path;if(l)try{if(navigator.clipboard?.writeText)await navigator.clipboard.writeText(l);else{let N=document.createElement("textarea");try{if(N.value=l,N.style.cssText="position:fixed;opacity:0",document.body.appendChild(N),N.select(),!document.execCommand("copy"))throw Error("copy failed")}finally{N.remove()}}Ot(!0),window.setTimeout(()=>Ot(!1),1500)}catch{Z(t("copyFailed"))}};(0,s.useEffect)(()=>{let l=N=>{if(te)return;let q=gr(N,It.current,Ue.current,!!fe);q&&(N.preventDefault(),q==="search"?(Ue.current?.focus(),Ue.current?.select()):q==="clear"?Ze(""):pt(q))};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[fe,Ne,j,te]);let Yt=l=>Re(N=>{let q={...N};for(let K of Oe)for(let re of Pt(At(K.changes)))q[K.repository.id+"\0"+re]=!l;return q}),Ir=()=>{let l=ue;!l||!j||(Ft(!0),_t(),Re(N=>{let q={...N};for(let K of Nr(l.path))q[j.repositoryId+"\0"+K]=!1;return q}),st.current=qe(j.repositoryId,l.id))};(0,s.useEffect)(()=>{let l=st.current;if(!l)return;let N=[...it.current?.querySelectorAll("button[data-vcs-change]")||[]].find(q=>q.dataset.vcsChange===l);N&&(N.scrollIntoView({block:"nearest"}),N.focus(),st.current=null)},[xe,fe,Je,Mt,Oe]);let pt=l=>{let N=Cr(Ne,j?.id,l);N&&(we.current?.abort(),le(null),He("content"),pe({repositoryId:m,id:N.id}))},Qt=ie||ge.some(l=>!b[l.id]),ue=de?.changes?.find(l=>l.id===j?.id),ve=A?.properties,ut=ve?[...new Set([...Object.keys(ve.left||{}),...Object.keys(ve.right||{})])].filter(l=>ve.left?.[l]!==ve.right?.[l]):[],De=l=>Hr[l?.status]||l?.status?.slice(0,1).toUpperCase()||"M",Xt=A?.binary?[A.left.label,A.right.label].filter(Boolean).join(" \u2194 "):"",Ee=z||(be?t("loading"):d?Qt&&!ue?t("loading"):ae||(he.length?ue?A?.binary?t("binary")+(Xt?" "+t("binaryComparison",{files:Xt}):""):A?!oe&&!ee?t("loading"):"":t("pick"):t("pick"):t("noRepo")):t("noSession")),Wr=l=>vr(l,it.current),$t=({entry:l,compact:N=!1,depth:q=0})=>{let K=l.path.lastIndexOf("/");return s.default.createElement("button",{className:"vcs-file","data-vcs-item":!0,"data-vcs-change":qe(m,l.id),"aria-current":j?.repositoryId===m&&j?.id===l.id?"true":void 0,style:{paddingInlineStart:8+q*14},title:(l.oldPath?l.oldPath+" \u2192 ":"")+l.path+" \xB7 "+t(De(l)),onClick:()=>{we.current?.abort(),le(null),He("content"),pe({repositoryId:m,id:l.id})}},s.default.createElement("span",{className:"vcs-status","data-status":De(l)},De(l)),s.default.createElement("span",{className:"vcs-filename"},N?l.path.slice(K+1):l.path,l.oldPath&&s.default.createElement("small",{className:"vcs-filepath"},"\u2190 ",l.oldPath)))},Zt=({node:l,repository:N,depth:q=0})=>s.default.createElement(s.default.Fragment,null,l.directories.map(K=>{let re=N.id+"\0"+K.id,se=!!Mt[re];return s.default.createElement(s.default.Fragment,{key:re},s.default.createElement("button",{className:"vcs-dir vcs-dir-toggle","data-vcs-item":!0,"data-vcs-directory":se?"closed":"open","aria-expanded":!se,style:{paddingInlineStart:8+q*14},onClick:()=>Re(zr=>({...zr,[re]:!se}))},s.default.createElement("span",{"aria-hidden":"true"},se?"\u203A":"\u2304"),K.name,s.default.createElement("small",null,K.count)),!se&&s.default.createElement(Zt,{node:K,repository:N,depth:q+1}))}),l.files.map(K=>s.default.createElement($t,{key:qe(N.id,K.id),entry:K,compact:l.id!=="",depth:q})));return s.default.createElement("section",{ref:It,className:"vcs-root","aria-label":t("title")},s.default.createElement("style",null,ft),s.default.createElement("header",{className:"vcs-top"},s.default.createElement(Or,null),s.default.createElement("h1",{className:"vcs-title"},t("title")),s.default.createElement("span",{className:"vcs-badge"},t("readonly")),s.default.createElement("span",{className:"vcs-spacer"}),s.default.createElement("select",{"aria-label":t("repositories"),value:m,disabled:ie||!he.length,onChange:l=>{Be(),g({}),y(l.target.value)}},!he.length&&s.default.createElement("option",{value:""},t("repositories")),he.map(l=>s.default.createElement("option",{key:l.id,value:l.id},Ve(l,t("workspaceRoot"))))),s.default.createElement("label",{className:"vcs-mode"},t("gitMode")," ",s.default.createElement("select",{"aria-label":t("gitMode"),value:n,disabled:te||!ge.some(l=>l.type==="git"),onChange:l=>{Be(),g({}),c(l.target.value)}},["all","unstaged","staged"].map(l=>s.default.createElement("option",{key:l,value:l},t(l))))),s.default.createElement("button",{onClick:()=>Kt(!1),disabled:Qt||!d},t("refresh")),s.default.createElement("button",{onClick:()=>e.layout.selectPanel(null)},t("back")),s.default.createElement("div",{className:"vcs-path",title:u?.cwd||f?.cwd},t("session"),": ",u?.cwd||f?.cwd||"\u2014"),s.default.createElement("form",{className:"vcs-discovery",onSubmit:l=>{l.preventDefault(),We()}},s.default.createElement("input",{"aria-label":t("subdirectory"),placeholder:t("subdirectory"),value:E,onChange:l=>V(l.target.value)}),s.default.createElement("button",{disabled:!d||ie},t("rescan")),s.default.createElement("span",null,t("scanHint"))),u?.truncated&&s.default.createElement("div",{className:"vcs-notice"},t("truncated")),(u?.warnings||[]).map((l,N)=>s.default.createElement("div",{className:"vcs-notice",key:N},typeof l=="string"?l:l.message||JSON.stringify(l)))),ge.filter(l=>l.type==="svn").map(l=>s.default.createElement(s.default.Fragment,{key:JSON.stringify([d,l.id,k,h])},s.default.createElement(gt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:Se}),s.default.createElement(bt,{repositoryId:l.id,sessionId:d,rpc:r,t,onRediscover:Se}))),ge.some(l=>l.type==="git")&&s.default.createElement(s.default.Fragment,null,s.default.createElement("nav",{className:"vcs-review-views","aria-label":t("reviewView")},s.default.createElement("button",{"aria-pressed":!te,onClick:()=>qt(!1)},t("workspaceView")),s.default.createElement("button",{"aria-pressed":te,"aria-expanded":te,onClick:Jr},t("history"))),te&&s.default.createElement(Lt,{key:JSON.stringify([d,m,v,k]),sessionId:d,repositoryId:m,rpc:r,t,onRediscover:Se})),s.default.createElement("div",{className:"vcs-body",hidden:te,"aria-label":t("workspaceView")},s.default.createElement("aside",{className:"vcs-files"},s.default.createElement("div",{className:"vcs-filter"},s.default.createElement("input",{ref:Ue,"aria-label":t("search"),placeholder:t("search"),title:t("searchShortcut"),value:fe,onChange:l=>Ze(l.target.value)}),(fe||Je!=="all")&&s.default.createElement("button",{className:"vcs-clear-filter",onClick:_t},t("clearFilters"))),s.default.createElement("div",{className:"vcs-status-filter","aria-label":t("filterStatus")},["all","modified","added","deleted","renamed","conflicted","untracked"].map(l=>s.default.createElement("button",{key:l,"aria-pressed":Je===l,onClick:()=>Dt(l)},t(l==="all"?"allFiles":Hr[l]||"M")," ",s.default.createElement("small",null,Gr[l]||0)))),s.default.createElement("div",{className:"vcs-count"},s.default.createElement("span",null,Ne.length," ",t("files")),s.default.createElement("span",{className:"vcs-auto"},t("autoRefresh")),s.default.createElement("button",{"aria-pressed":xe,onClick:()=>Ft(!xe)},t(xe?"tree":"list"))),xe&&s.default.createElement("div",{className:"vcs-tree-actions"},s.default.createElement("button",{onClick:()=>Yt(!0)},t("expandAll")),s.default.createElement("button",{onClick:()=>Yt(!1)},t("collapseAll")),s.default.createElement("button",{onClick:Ir,disabled:!ue},t("revealSelected"))),s.default.createElement("nav",{className:"vcs-filelist","aria-label":t("title"),ref:it,onKeyDown:Wr},Oe.map(l=>{let N=l.repository;return s.default.createElement("section",{className:"vcs-repository",key:N.id,"aria-label":Ve(N,t("workspaceRoot"))},s.default.createElement("div",{className:"vcs-repository-heading",title:N.root},s.default.createElement("strong",null,Ve(N,t("workspaceRoot"))),s.default.createElement("small",null,N.type==="svn"?t("svnBase"):t($e(N,n)))),l.error?s.default.createElement("div",{className:"vcs-message vcs-error",role:"status"},l.error,s.default.createElement("button",{onClick:We},t("rescan"))):b[N.id]?xe?s.default.createElement(Zt,{node:At(l.changes),repository:N}):l.changes.map(q=>s.default.createElement($t,{key:qe(N.id,q.id),entry:q})):s.default.createElement("div",{className:"vcs-message"},t("loading")),!l.error&&b[N.id]&&!l.changes.length&&s.default.createElement("div",{className:"vcs-message"},t(fe?"emptySearch":"clean")))}),!Oe.length&&s.default.createElement("div",{className:"vcs-message"},ie?t("loading"):ae||t(d?"noRepo":"noSession"),ae&&s.default.createElement("button",{onClick:We},t("rescan"))))),s.default.createElement("main",{className:"vcs-detail"},s.default.createElement("div",{className:"vcs-filehead"},s.default.createElement("strong",{title:A?.path||ue?.path},ke?Ve(ke,t("workspaceRoot"))+" / ":"",A?.path||ue?.path||t("pick")),s.default.createElement("button",{className:"vcs-copy-path",disabled:!(A?.path||ue?.path),onClick:Ur},t(Bt?"copied":"copyPath")),Bt&&s.default.createElement("span",{className:"vcs-sr-only",role:"status"},t("pathCopied")),s.default.createElement("span",{className:"vcs-spacer"}),A&&!A.binary&&oe&&s.default.createElement(s.default.Fragment,null,s.default.createElement("span",{className:"vcs-add"},"+",rt.added),s.default.createElement("span",{className:"vcs-del"},"\u2212",rt.deleted))),ee&&s.default.createElement("div",{className:"vcs-notice",role:"status"},t("fallback")," ",s.default.createElement("button",{onClick:()=>jt(l=>l+1)},t("retry")),s.default.createElement("details",null,s.default.createElement("summary",null,t("diagnostics")),ee)),A&&s.default.createElement("div",{className:"vcs-context","aria-label":t("comparisonContext")},s.default.createElement("span",{className:"vcs-context-status","data-status":De(A)},t(De(A))),A.oldPath&&s.default.createElement("span",{className:"vcs-context-rename",title:A.oldPath+" \u2192 "+A.path},A.oldPath," ",s.default.createElement("b",null,"\u2192")," ",A.path),s.default.createElement("span",null,A.left.label||"\u2014"," ",s.default.createElement("b",null,"\u2194")," ",A.right.label||"\u2014"),(A.left.encoding||A.right.encoding)&&s.default.createElement("span",null,t("encoding"),": ",A.left.encoding||"\u2014"," / ",A.right.encoding||"\u2014")),A&&ke?.type==="git"&&s.default.createElement(Me,{key:JSON.stringify([d,u?.cwd,j.repositoryId,n,j.id,h,de]),workspace:!0,sessionId:d,repositoryId:j.repositoryId,mode:n,id:j.id,rpc:r,t,onRediscover:Se}),ke?.type==="git"&&(Ce||A?.notice?.includes("2 MiB"))&&s.default.createElement("div",{className:"vcs-notice"},s.default.createElement("span",null,t("workspaceLargeScope")),s.default.createElement("button",{onClick:()=>{we.current?.abort(),le(null),Jt(Ce?null:{key:dt,status:de})}},t(Ce?"largeClose":"largeLoad")),Ce&&z&&s.default.createElement("button",{onClick:()=>qr(l=>l+1)},t("retry"))),A?.large&&s.default.createElement("p",{role:"status"},t(ee?"largeFallback":Gt==="complete"?"diffComplete":Gt==="incomplete"?"diffIncomplete":"diffPending")),A?.notice&&s.default.createElement("div",{className:"vcs-notice"},A.notice),ut.length>0&&s.default.createElement("div",{className:"vcs-tabs"},["content","properties"].map(l=>s.default.createElement("button",{key:l,"aria-pressed":Ge===l,onClick:()=>He(l)},t(l),l==="properties"?" ("+ut.length+")":""))),s.default.createElement("div",{className:"vcs-labels"},s.default.createElement("span",null,A?.left.label||"\u2014",A?.left.encoding?" \xB7 "+A.left.encoding:""),s.default.createElement("span",null,A?.right.label||"\u2014",A?.right.encoding?" \xB7 "+A.right.encoding:"")),s.default.createElement("div",{className:"vcs-editorbox","data-hidden":!!Ee||Ge!=="content",style:Ge==="properties"?{display:"none"}:void 0},s.default.createElement("div",{className:"vcs-editor",ref:Wt,style:ee?{display:"none"}:void 0}),ee&&A&&!A.binary&&!Ee&&s.default.createElement(Fe,{comparison:A,labels:Ke(t)}),Ee&&s.default.createElement("div",{className:"vcs-message "+(ae||z||ee?"vcs-error":""),role:"status"},Ee,(ae||z||ee)&&s.default.createElement("button",{onClick:()=>ee?jt(l=>l+1):We()},t(ee?"retry":"rescan")))),Ge==="properties"&&s.default.createElement("div",{className:"vcs-properties"},s.default.createElement("table",null,s.default.createElement("thead",null,s.default.createElement("tr",null,s.default.createElement("th",null,t("properties")),s.default.createElement("th",null,A?.left.label||t("before")),s.default.createElement("th",null,A?.right.label||t("after")))),s.default.createElement("tbody",null,ut.map(l=>s.default.createElement("tr",{key:l},s.default.createElement("th",null,l),s.default.createElement("td",null,ve.left?.[l]??"\u2014"),s.default.createElement("td",null,ve.right?.[l]??"\u2014")))))),s.default.createElement("footer",{className:"vcs-toolbar"},s.default.createElement("button",{disabled:!oe,"aria-pressed":Pe,onClick:()=>Dr(!Pe)},t(Pe?"side":"inline")),s.default.createElement("label",null,s.default.createElement("input",{type:"checkbox",disabled:!oe,checked:et,onChange:l=>Fr(l.target.checked)}),t("whitespace")),s.default.createElement("label",null,s.default.createElement("input",{type:"checkbox",disabled:!oe,checked:tt,onChange:l=>Mr(l.target.checked)}),t("wrap")),s.default.createElement("span",{className:"vcs-spacer"}),oe&&s.default.createElement("span",null,rt.count," ",t("changes")),s.default.createElement("button",{disabled:!oe||!A||!!Ee,onClick:()=>me.current?.navigate("previous")},t("previous")),s.default.createElement("button",{disabled:!oe||!A||!!Ee,onClick:()=>me.current?.navigate("next")},t("next")),ct.index>0&&s.default.createElement("span",{className:"vcs-review-position"},t("reviewPosition",{index:ct.index,total:ct.total})),s.default.createElement("span",{className:"vcs-toolbar-separator"}),s.default.createElement("button",{title:t("fileShortcut"),disabled:!Ne.length,onClick:()=>pt("previous")},t("previousFile")),s.default.createElement("button",{title:t("fileShortcut"),disabled:!Ne.length,onClick:()=>pt("next")},t("nextFile"))))))}e.slots.inject("main",()=>e.slots.register({name:"main",key:"local-vcs"},i)),e.slots.inject("sidebar.panellist",()=>e.slots.register({name:"sidebar.panellist",id:"local-vcs",label:()=>t("title"),order:65},Or))}
|
|
97
97
|
return module.exports; }});
|
package/image-preview.mjs
CHANGED
|
@@ -6,7 +6,7 @@ export async function prepareRaster(buffer, {signal} = {}) {
|
|
|
6
6
|
signal?.throwIfAborted();
|
|
7
7
|
return result;
|
|
8
8
|
}
|
|
9
|
-
if (Buffer.isBuffer(buffer) && buffer.toString('
|
|
9
|
+
if (Buffer.isBuffer(buffer) && buffer.toString('latin1', 0, 4) === 'RIFF') {
|
|
10
10
|
const result = prepareSimpleWebp(buffer);
|
|
11
11
|
signal?.throwIfAborted();
|
|
12
12
|
return result;
|
|
@@ -17,11 +17,11 @@ export async function prepareRaster(buffer, {signal} = {}) {
|
|
|
17
17
|
// Simple static WebP only; extended/animated containers remain rejected.
|
|
18
18
|
export function prepareSimpleWebp(buffer) {
|
|
19
19
|
if (!Buffer.isBuffer(buffer) || buffer.length < 26 || buffer.length > 2097152 ||
|
|
20
|
-
buffer.toString('
|
|
20
|
+
buffer.toString('latin1', 0, 4) !== 'RIFF' || buffer.toString('latin1', 8, 12) !== 'WEBP' ||
|
|
21
21
|
buffer.readUInt32LE(4) !== buffer.length - 8) {
|
|
22
22
|
throw Error('Invalid WebP RIFF or byte limit');
|
|
23
23
|
}
|
|
24
|
-
const kind = buffer.toString('
|
|
24
|
+
const kind = buffer.toString('latin1', 12, 16);
|
|
25
25
|
const size = buffer.readUInt32LE(16);
|
|
26
26
|
const end = 20 + size;
|
|
27
27
|
if (end + (size & 1) !== buffer.length || (size & 1 && buffer[end] !== 0)) {
|
|
@@ -40,6 +40,11 @@ export function prepareSimpleWebp(buffer) {
|
|
|
40
40
|
if (w >>> 14 || h >>> 14) throw Error('WebP scaled frame unsupported');
|
|
41
41
|
width = w & 16383;
|
|
42
42
|
height = h & 16383;
|
|
43
|
+
} else if (kind === 'VP8L') {
|
|
44
|
+
if(size<=5||buffer[20]!==0x2f)throw Error('Invalid WebP lossless signature');
|
|
45
|
+
const bits=buffer.readUInt32LE(21);
|
|
46
|
+
if(bits>>>29)throw Error('Unsupported WebP lossless version');
|
|
47
|
+
width=(bits&0x3fff)+1;height=((bits>>>14)&0x3fff)+1;
|
|
43
48
|
} else {
|
|
44
49
|
throw Error('Only simple static WebP is supported');
|
|
45
50
|
}
|
|
@@ -47,7 +52,7 @@ export function prepareSimpleWebp(buffer) {
|
|
|
47
52
|
throw Error('WebP dimensions exceed limit');
|
|
48
53
|
}
|
|
49
54
|
return {mime: 'image/webp', width, height, bytes: buffer.length, originalBytes: buffer.length,
|
|
50
|
-
data: Buffer.from(buffer), metadataStripped: false};
|
|
55
|
+
data: Buffer.from(buffer), metadataStripped: false, encoding:kind==='VP8L'?'VP8L':'VP8'};
|
|
51
56
|
}
|
|
52
57
|
export function prepareBaselineJpeg(buffer){
|
|
53
58
|
if(!Buffer.isBuffer(buffer)||buffer.length<4||buffer.length>2097152||buffer[0]!==255||buffer[1]!==216)throw Error('Invalid JPEG input or byte limit');
|
|
@@ -79,7 +84,7 @@ export function inspectPng(buffer){
|
|
|
79
84
|
if(++chunks>4096||buffer.length-offset<12)throw new Error('Invalid PNG chunk bounds');
|
|
80
85
|
const length=buffer.readUInt32BE(offset),end=offset+12+length;
|
|
81
86
|
if(end>buffer.length)throw new Error('Truncated PNG chunk');
|
|
82
|
-
const type=buffer.toString('
|
|
87
|
+
const type=buffer.toString('latin1',offset+4,offset+8);
|
|
83
88
|
if(!buffer.subarray(offset+4,offset+8).every(b=>(b>=65&&b<=90)||(b>=97&&b<=122)))throw new Error('Invalid PNG chunk type');
|
|
84
89
|
if(buffer[offset+6]&32)throw new Error('Invalid PNG reserved chunk bit');
|
|
85
90
|
let crc=0xffffffff;
|
|
@@ -145,7 +150,7 @@ async function validatePngStream(buffer,{signal}){
|
|
|
145
150
|
const expected=stride*metadata.height;
|
|
146
151
|
if(expected>64*1024*1024)throw new Error('PNG decoded byte limit exceeded');
|
|
147
152
|
const parts=[];
|
|
148
|
-
for(let offset=8;offset<buffer.length;){const length=buffer.readUInt32BE(offset);if(buffer.toString('
|
|
153
|
+
for(let offset=8;offset<buffer.length;){const length=buffer.readUInt32BE(offset);if(buffer.toString('latin1',offset+4,offset+8)==='IDAT')parts.push(buffer.subarray(offset+8,offset+8+length));offset+=length+12;}
|
|
149
154
|
const compressed=Buffer.concat(parts);
|
|
150
155
|
const result=await inflateAsync(compressed,{maxOutputLength:expected,info:true,signal});
|
|
151
156
|
signal?.throwIfAborted();
|
package/index.mjs
CHANGED
|
@@ -31,7 +31,7 @@ const REQUEST_FIELDS = {
|
|
|
31
31
|
'vcs/svn-identity': ['sessionId', 'repositoryId'],
|
|
32
32
|
'vcs/references': ['sessionId', 'repositoryId'],
|
|
33
33
|
'vcs/status': ['sessionId', 'repositoryId', 'mode'],
|
|
34
|
-
'vcs/compare': ['sessionId', 'repositoryId', 'mode', 'id'],
|
|
34
|
+
'vcs/compare': ['sessionId', 'repositoryId', 'mode', 'id', 'large'],
|
|
35
35
|
'vcs/history': ['sessionId', 'repositoryId', 'snapshot', 'offset', 'limit', 'search'],
|
|
36
36
|
'vcs/commit': ['sessionId', 'repositoryId', 'commit', 'parentIndex'],
|
|
37
37
|
'vcs/commit-compare': ['sessionId', 'repositoryId', 'commit', 'parentIndex', 'id', 'large'],
|
|
@@ -68,7 +68,7 @@ function validatePayload(endpoint, payload) {
|
|
|
68
68
|
if(typeof payload.commit!=='string'||!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(payload.commit))throw invalid('Invalid commit id.');
|
|
69
69
|
if(payload.parentIndex!==undefined&&(!Number.isInteger(payload.parentIndex)||payload.parentIndex<0||payload.parentIndex>100))throw invalid('Invalid parent index.');
|
|
70
70
|
}
|
|
71
|
-
if(['vcs/commit-compare','vcs/revision-compare'].includes(endpoint)&&payload.large!==undefined&&typeof payload.large!=='boolean')throw invalid('Invalid large comparison mode.');
|
|
71
|
+
if(['vcs/compare','vcs/commit-compare','vcs/revision-compare'].includes(endpoint)&&payload.large!==undefined&&typeof payload.large!=='boolean')throw invalid('Invalid large comparison mode.');
|
|
72
72
|
if(endpoint==='vcs/tree-segment'&&payload.offset!==undefined&&(!Number.isInteger(payload.offset)||payload.offset<0||payload.offset>16777216))throw invalid('Invalid segment offset.');
|
|
73
73
|
if(endpoint==='vcs/blame'&&((payload.startLine!==undefined&&(!Number.isInteger(payload.startLine)||payload.startLine<1||payload.startLine>100001))||(payload.lineLimit!==undefined&&(!Number.isInteger(payload.lineLimit)||payload.lineLimit<1||payload.lineLimit>500))))throw invalid('Invalid blame line window.');
|
|
74
74
|
if(endpoint==='vcs/file-history'&&payload.follow!==undefined&&typeof payload.follow!=='boolean')throw invalid('Invalid rename follow mode.');
|
|
@@ -122,7 +122,7 @@ async function readRepository(api, endpoint, repository, payload, {cwd, mode, si
|
|
|
122
122
|
case 'vcs/status':
|
|
123
123
|
return {cwd, repository: {...repository}, changes: await api.listChanges({...repository}, mode), mode};
|
|
124
124
|
case 'vcs/compare':
|
|
125
|
-
return api.getComparison({...repository}, {mode, id: payload.id});
|
|
125
|
+
return api.getComparison({...repository}, {mode, id: payload.id, ...(payload.large !== undefined ? {large: payload.large,signal} : {})});
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
|
|
@@ -195,7 +195,7 @@ export function createHandler(ctx, api = adapter, maxActive = 4, { now = Date.no
|
|
|
195
195
|
// Both adapter operations revalidate the canonical root; comparison also validates
|
|
196
196
|
// the change ID against fresh status, so do not duplicate a full status scan here.
|
|
197
197
|
if(['vcs/history','vcs/commit','vcs/commit-compare','vcs/revision-changes','vcs/revision-compare','vcs/file-history','vcs/blame','vcs/tree','vcs/tree-file','vcs/tree-segment','vcs/commit-image','vcs/revision-image','vcs/workspace-image','vcs/references'].includes(endpoint)&&repository.type!=='git')throw invalid('History currently supports Git only.');
|
|
198
|
-
if(endpoint==='vcs/tree-segment'||(['vcs/commit-compare','vcs/revision-compare'].includes(endpoint)&&payload.large===true)){if(activeSegments>=1)return failure('vcs/busy','A text segment is already loading. Please retry.');activeSegments++;segmentSlot=true;}
|
|
198
|
+
if(endpoint==='vcs/tree-segment'||(['vcs/compare','vcs/commit-compare','vcs/revision-compare'].includes(endpoint)&&payload.large===true)){if(activeSegments>=1)return failure('vcs/busy','A text segment is already loading. Please retry.');activeSegments++;segmentSlot=true;}
|
|
199
199
|
if(['vcs/commit-image','vcs/revision-image','vcs/workspace-image'].includes(endpoint)){
|
|
200
200
|
if(activeImages>=2)return failure('vcs/busy','Too many image requests. Please retry.');
|
|
201
201
|
activeImages++;imageSlot=true;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feng0531/dsh-vcs",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.72",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/" },
|
|
6
6
|
"type": "module",
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
"git-history.mjs",
|
|
18
18
|
"image-preview.mjs",
|
|
19
19
|
"text-content.mjs",
|
|
20
|
+
"workspace-large-text.mjs",
|
|
20
21
|
"repository-path.mjs",
|
|
21
22
|
"local-command.mjs",
|
|
22
23
|
"src/svn-identity.mjs",
|
package/vcs.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import { XMLParser, XMLValidator } from 'fast-xml-parser';
|
|
|
10
10
|
|
|
11
11
|
import {decode, MAX_TEXT, MAX_LARGE_TEXT, decodeLargeText} from './text-content.mjs';
|
|
12
12
|
import {inside, confined} from './repository-path.mjs';
|
|
13
|
+
import {readWorkspaceLargeText} from './workspace-large-text.mjs';
|
|
13
14
|
const xml = new XMLParser({ ignoreAttributes: false, attributeNamePrefix: '', parseTagValue: false, parseAttributeValue: false, trimValues: false, processEntities: true, isArray: name => ['entry', 'target', 'property'].includes(name) });
|
|
14
15
|
|
|
15
16
|
|
|
@@ -172,10 +173,10 @@ export async function discoverRepositories(cwd, { signal, maxDepth = 6, maxDirec
|
|
|
172
173
|
return result;
|
|
173
174
|
}
|
|
174
175
|
|
|
175
|
-
async function checkedRepo(repo, signal) {
|
|
176
|
+
async function checkedRepo(repo, signal, budget) {
|
|
176
177
|
signal?.throwIfAborted();
|
|
177
178
|
if (!repo || !['git', 'svn'].includes(repo.type) || typeof repo.root !== 'string') throw new Error('Invalid repository');
|
|
178
|
-
const found = await repositoryAt(repo.root, repo.type, () => ({signal}));
|
|
179
|
+
const found = await repositoryAt(repo.root, repo.type, budget || (() => ({signal})));
|
|
179
180
|
signal?.throwIfAborted();
|
|
180
181
|
if (!found || found.type !== repo.type || path.resolve(found.root) !== path.resolve(repo.root)) throw new Error('Repository root changed or is invalid');
|
|
181
182
|
return found;
|
|
@@ -430,10 +431,10 @@ function modeFor(repo, mode) {
|
|
|
430
431
|
}
|
|
431
432
|
function identity(entry, mode) { return createHash('sha256').update(JSON.stringify([mode, entry.path, entry.oldPath, entry.status, entry.indexStatus, entry.worktreeStatus, entry.propertyStatus])).digest('hex'); }
|
|
432
433
|
const statuses = { M: 'modified', A: 'added', D: 'deleted', R: 'renamed', C: 'copied', U: 'conflicted', T: 'typechanged', '?': 'untracked' };
|
|
433
|
-
async function changes(repo, mode) {
|
|
434
|
+
async function changes(repo, mode, options) {
|
|
434
435
|
let entries;
|
|
435
436
|
if (repo.type === 'git') {
|
|
436
|
-
const fields = (await git(repo.root, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--ignore-submodules=none'])).toString('utf8').split('\0');
|
|
437
|
+
const fields = (await git(repo.root, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--ignore-submodules=none'],undefined,options)).toString('utf8').split('\0');
|
|
437
438
|
entries = [];
|
|
438
439
|
for (let i = 0; i < fields.length && fields[i]; i++) {
|
|
439
440
|
const raw = fields[i], x = raw[0], y = raw[1], file = raw.slice(3);
|
|
@@ -472,8 +473,8 @@ async function working(root, relative, svnLink = false) {
|
|
|
472
473
|
try { const info = await handle.stat(); if (!info.isFile()) throw new Error('Not a regular file'); const buffer = Buffer.alloc(MAX_TEXT + 1); const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0); await confined(root, relative); return decode(buffer.subarray(0, bytesRead)); } finally { await handle.close(); }
|
|
473
474
|
}
|
|
474
475
|
async function gitBlob(root, revision, file) { return content(() => git(root, ['show', '--no-ext-diff', '--no-textconv', revision + ':' + file], MAX_TEXT)); }
|
|
475
|
-
async function historicalBlob(root,revision,file,signal,large=false){
|
|
476
|
-
const listing=(await git(root,['ls-tree','-z',revision,'--',file],MAX_TEXT,{signal})).toString('utf8');
|
|
476
|
+
async function historicalBlob(root,revision,file,signal,large=false,budget){
|
|
477
|
+
const listing=(await git(root,['ls-tree','-z',revision,'--',file],MAX_TEXT,budget?budget():{signal})).toString('utf8');
|
|
477
478
|
const records=listing.split(String.fromCharCode(0)).filter(Boolean);
|
|
478
479
|
const record=records.find(row=>row.slice(row.indexOf(' ')+1)===file);
|
|
479
480
|
if(!record)throw new Error('Historical path missing');
|
|
@@ -482,11 +483,11 @@ async function historicalBlob(root,revision,file,signal,large=false){
|
|
|
482
483
|
if(mode==='160000')return {text:oid,notice:'Submodule commit reference; repository contents are not loaded.'};
|
|
483
484
|
if(type!=='blob'||!['100644','100755','120000'].includes(mode))return {text:'',notice:'Unsupported historical object type.'};
|
|
484
485
|
if (large) {
|
|
485
|
-
const rawSize = (await git(root, ['cat-file', '-s', oid], MAX_TEXT, {signal})).toString('utf8').trim();
|
|
486
|
+
const rawSize = (await git(root, ['cat-file', '-s', oid], MAX_TEXT, budget?budget():{signal})).toString('utf8').trim();
|
|
486
487
|
if (!/^\d+$/.test(rawSize)) throw new Error('Invalid historical object size.');
|
|
487
488
|
const size = Number(rawSize);
|
|
488
489
|
if (size > MAX_LARGE_TEXT) throw new Error('Large comparison exceeds 8 MiB per side.');
|
|
489
|
-
const buffer = await git(root, ['cat-file', 'blob', oid], MAX_LARGE_TEXT, {signal});
|
|
490
|
+
const buffer = await git(root, ['cat-file', 'blob', oid], MAX_LARGE_TEXT, budget?budget():{signal});
|
|
490
491
|
if (buffer.length !== size) throw new Error('Historical object size changed.');
|
|
491
492
|
return decodeLargeText(buffer, signal);
|
|
492
493
|
}
|
|
@@ -521,8 +522,40 @@ async function properties(root, file, base) {
|
|
|
521
522
|
for (const target of result.properties?.target || []) for (const prop of target.property || []) props[prop.name] = prop.encoding === 'base64' ? '[base64] ' + (prop['#text'] || '') : String(prop['#text'] ?? '');
|
|
522
523
|
return props;
|
|
523
524
|
}
|
|
525
|
+
async function getWorkspaceLargeComparison(repo,{mode,id,signal}){
|
|
526
|
+
const deadline=Date.now()+TIMEOUT;
|
|
527
|
+
const options=()=>{signal?.throwIfAborted();const timeoutMs=deadline-Date.now();if(timeoutMs<=0)throw Object.assign(Error('Workspace comparison timed out'),{code:'TIMEOUT'});return {signal,timeoutMs};};
|
|
528
|
+
repo=await checkedRepo(repo,signal,options);modeFor(repo,mode);
|
|
529
|
+
if(repo.type!=='git')throw Error('Large workspace comparison supports Git only');
|
|
530
|
+
const run=args=>git(repo.root,args,MAX_TEXT,options());
|
|
531
|
+
const status=()=>changes(repo,mode,options());
|
|
532
|
+
const entry=(await status()).find(row=>row.id===id);if(!entry)throw Error('Change no longer exists; refresh repository status');
|
|
533
|
+
if(entry.status==='conflicted')throw Error('Large conflicted comparisons are not supported');
|
|
534
|
+
const head=async()=>{try{return (await run(['rev-parse','--verify','HEAD^{commit}'])).toString('utf8').trim();}catch(e){if(e.code!=='VCS_COMMAND')throw e;const ref=(await run(['symbolic-ref','-q','HEAD'])).toString('utf8').trim();try{await run(['show-ref','--verify','--quiet',ref]);}catch(missing){if(missing.code==='VCS_COMMAND'&&missing.exitCode===1)return null;throw missing;}throw e;}};
|
|
535
|
+
const revision=await head(),indexArgs=['ls-files','--stage','-z','--',entry.path],index=await run(indexArgs);
|
|
536
|
+
const readIndex=async()=>{
|
|
537
|
+
const rows=index.toString('utf8').split('\0').filter(Boolean);if(rows.length!==1)throw Error('Large comparison requires one stage0 Index entry');
|
|
538
|
+
const match=/^(100644|100755) ([a-f0-9]{40}|[a-f0-9]{64}) 0\t/.exec(rows[0]);if(!match||rows[0].slice(match[0].length)!==entry.path)throw Error('Large comparison requires a regular Index file');
|
|
539
|
+
const size=(await run(['cat-file','-s',match[2]])).toString('utf8').trim();if(!/^\d+$/.test(size)||Number(size)>MAX_LARGE_TEXT)throw Error('Large comparison exceeds 8 MiB per side');
|
|
540
|
+
const bytes=await git(repo.root,['cat-file','blob',match[2]],MAX_LARGE_TEXT,options());if(bytes.length!==Number(size))throw Error('Index object size mismatch');return decodeLargeText(bytes,signal);
|
|
541
|
+
};
|
|
542
|
+
let left={text:''},right={text:''},verify;
|
|
543
|
+
const untracked=entry.indexStatus==='?',added=['A','C'].includes(entry.indexStatus);
|
|
544
|
+
if(!untracked&&(mode==='unstaged'?entry.indexStatus!=='D':revision&&!added))left=mode==='unstaged'?await readIndex():await historicalBlob(repo.root,revision,entry.oldPath||entry.path,signal,true,options);
|
|
545
|
+
if(mode==='staged'){if(entry.indexStatus!=='D')right=await readIndex();}
|
|
546
|
+
else if(entry.worktreeStatus!=='D'){
|
|
547
|
+
try{const result=await readWorkspaceLargeText(repo.root,entry.path,signal,options);right=result.value;verify=result.verify;}
|
|
548
|
+
catch(error){if(error.code!=='ENOENT'||entry.indexStatus!=='D')throw error;verify=async()=>{const target=await confined(repo.root,entry.path);try{await fs.lstat(target);throw Error('Working file appeared; refresh repository status');}catch(missing){if(missing.code!=='ENOENT')throw missing;}};await verify();}
|
|
549
|
+
}
|
|
550
|
+
options();if(revision!==await head()||!index.equals(await run(indexArgs))||!(await status()).some(row=>row.id===id))throw Error('Workspace selection changed; refresh repository status');
|
|
551
|
+
await verify?.();options();
|
|
552
|
+
return {...entry,large:true,left:{...left,label:mode==='unstaged'?'Index':'HEAD'},right:{...right,label:mode==='staged'?'Index':'Working tree'}};
|
|
553
|
+
}
|
|
554
|
+
|
|
524
555
|
/** Revalidates the opaque ID against fresh status before reading any selected path. */
|
|
525
|
-
export async function getComparison(repo, { mode = 'all', id } = {}) {
|
|
556
|
+
export async function getComparison(repo, { mode = 'all', id, large=false, signal } = {}) {
|
|
557
|
+
if(typeof large!=='boolean')throw Error('Invalid large comparison mode');
|
|
558
|
+
if(large)return getWorkspaceLargeComparison(repo,{mode,id,signal});
|
|
526
559
|
repo = await checkedRepo(repo); modeFor(repo, mode);
|
|
527
560
|
const entry = (await changes(repo, mode)).find(item => item.id === id);
|
|
528
561
|
if (!entry) throw new Error('Change no longer exists; refresh repository status.');
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import {constants} from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import {confined} from './repository-path.mjs';
|
|
5
|
+
import {MAX_LARGE_TEXT,decodeLargeText} from './text-content.mjs';
|
|
6
|
+
const fingerprint=s=>[s.dev,s.ino,s.size,s.mtimeNs,s.ctimeNs].map(String).join(':');
|
|
7
|
+
|
|
8
|
+
/** Read complete bounded text, retaining a final named-path verification. No writes. */
|
|
9
|
+
export async function readWorkspaceLargeText(root,file,signal,budget){
|
|
10
|
+
const check=()=>{signal?.throwIfAborted();budget?.();};
|
|
11
|
+
const resolve=async()=>{
|
|
12
|
+
check();const target=await confined(root,file);let component=root;
|
|
13
|
+
for(const part of path.relative(root,target).split(path.sep).filter(Boolean)){
|
|
14
|
+
component=path.join(component,part);const info=await fs.lstat(component);
|
|
15
|
+
if(info.isSymbolicLink())throw Error('Large workspace comparison does not support links');
|
|
16
|
+
}
|
|
17
|
+
return target;
|
|
18
|
+
};
|
|
19
|
+
const target=await resolve(),before=await fs.lstat(target,{bigint:true});
|
|
20
|
+
if(!before.isFile())throw Error('Large workspace comparison requires a regular file');
|
|
21
|
+
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 Error('Working file changed; refresh repository status');check();};
|
|
23
|
+
const handle=await fs.open(target,constants.O_RDONLY|(constants.O_NOFOLLOW||0));
|
|
24
|
+
try{
|
|
25
|
+
const opened=await handle.stat({bigint:true});if(!opened.isFile()||fingerprint(opened)!==fingerprint(before))throw Error('Working file changed during open');
|
|
26
|
+
const buffer=Buffer.alloc(Number(before.size)+1);let offset=0;
|
|
27
|
+
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 Error('Working file changed during read');
|
|
29
|
+
await verify();const value=decodeLargeText(buffer.subarray(0,offset),signal);await verify();
|
|
30
|
+
return {value,verify};
|
|
31
|
+
}finally{await handle.close();}
|
|
32
|
+
}
|