@feng0531/dsh-vcs 0.3.72 → 0.3.73
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 +3 -2
- package/dist/client.js +2 -2
- package/dist/svn-host.mjs +1 -1
- package/package.json +1 -1
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.73
|
|
38
38
|
|
|
39
39
|
安装后由你自行重启 DSH,再刷新原来的 Web 页面。安装会改变所选 profile;升级前请备份配置。**本项目的发布不会自动升级或重启你的 DSH。**
|
|
40
40
|
|
|
@@ -49,7 +49,8 @@ profile是DSH的配置和插件环境,不是Session。下面的web是示例,
|
|
|
49
49
|
1. 在 DSH 中选择一个 Session,确认它的工作目录在项目内。
|
|
50
50
|
2. 打开 VCS 页面,发现仓库,再从顶部下拉框选择仓库。
|
|
51
51
|
3. 点击文件查看差异,或进入历史视图浏览提交。
|
|
52
|
-
4.
|
|
52
|
+
4. SVN远程历史需先审阅并明确同意。复制成员可主动查看范围内的固定来源历史,不自动跨复制追溯。
|
|
53
|
+
5. 外部工具修改了项目后,手动刷新;可见窗口重新获得焦点时也会刷新。没有定时轮询。
|
|
53
54
|
|
|
54
55
|
默认发现当前目录、一级子目录以及包含当前目录的上级仓库。项目更深时,输入相对 Session 目录的子目录,例如 `packages/example`;不接受任意绝对路径或越界路径。
|
|
55
56
|
|
package/dist/client.js
CHANGED
|
@@ -92,6 +92,6 @@ var Kr=Object.create;var ze=Object.defineProperty;var _r=Object.getOwnPropertyDe
|
|
|
92
92
|
.vcs-root .vcs-toolbar{gap:6px}
|
|
93
93
|
.vcs-root .vcs-title{font-size:16px}
|
|
94
94
|
}
|
|
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))}
|
|
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,b){v++,!(w.length>=2e3)&&w.push({left:u===null?null:{number:u+1,text:o[u]},right:b===null?null:{number:b+1,text:r[b]},kind:u===null?"insert":b===null?"delete":o[u]===r[b]?"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,b=new Uint32Array(c);for(let m=d-1;m>=0;m--)for(let y=n-1;y>=0;y--)b[m*u+y]=o[i+m]===r[i+y]?b[(m+1)*u+y+1]+1:Math.max(b[(m+1)*u+y],b[m*u+y+1]);let x=0,g=0;for(;x<d||g<n;)x<d&&g<n&&o[i+x]===r[i+g]?S(i+x++,i+g++):x<d&&(g===n||b[(x+1)*u+g]>=b[x*u+g+1])?S(i+x++,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))},b=()=>{clearTimeout(w),r?.removeEventListener("abort",g)},x=m=>{v||(v=!0,b(),u(),n(m))},g=()=>x(r.reason||new Error("Image cancelled"));try{c=a(e),h=f(),r?.addEventListener("abort",g,{once:!0}),w=setTimeout(()=>x(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){x(new Error("Image dimensions mismatch"));return}v=!0,b(),d({url:c,dispose:u})}},x)}catch(m){x(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,b]=(0,J.useState)(""),[x,g]=(0,J.useState)(0);return(0,J.useEffect)(()=>{let m=new AbortController,y;return S(null),b(""),(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 O=atob(k.base64);if(O.length!==k.bytes)throw Error(h("imageInvalid"));let L=new Blob([Uint8Array.from(O,V=>V.charCodeAt(0))],{type:k.mime});if(y=await or(L,{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||(b(k.message),k.code==="vcs/rediscover-required"&&w())}),()=>{m.abort(),y?.dispose()}},[e,t,o,r,i,a,p,f,d,n,x]),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),[b,x]=(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,b]);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),x(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 E=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.73";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 b=m=>new URL("vcs-assets/"+m,document.baseURI).href,x=document.createElement("link");x.rel="stylesheet",x.href=b("editor.css"),document.head.appendChild(x);let g=sr({node:d.current,comparison:e,key:t,single:r,load:m=>Ye(b("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{x.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:b,computation:x}=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&&!b&&Q.default.createElement("p",{role:"status"},o("loading")),e.large&&!r&&u&&Q.default.createElement("p",{role:"status"},o(x==="complete"?"diffComplete":x==="incomplete"?"diffIncomplete":"diffPending")),e.large&&!u&&Q.default.createElement("p",{role:"status"},o("largeFallback")),b&&Q.default.createElement("p",{role:"status"},o("fallback")," ",b),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 E.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,E.useState)(r),[n,c]=(0,E.useState)(null),[h,w]=(0,E.useState)(null),[v,S]=(0,E.useState)(""),[u,b]=(0,E.useState)(0);return(0,E.useEffect)(()=>{let x=new AbortController;return c(null),w(null),S(""),i("vcs/svn-log",{sessionId:e,repositoryId:t,token:o,snapshot:r,cursor:f,limit:50},x.signal).then(g=>{x.signal.aborted||c(g)}).catch(g=>{x.signal.aborted||(S(g.message),g.code==="vcs/rediscover-required"&&p())}),()=>x.abort()},[f,u]),E.default.createElement("section",null,E.default.createElement("p",null,a("svnHistoryScope")," \xB7 r",r),v?E.default.createElement("p",{role:"alert"},v," ",E.default.createElement("button",{onClick:()=>b(x=>x+1)},a("retry"))):n?E.default.createElement(E.default.Fragment,null,E.default.createElement("ol",null,n.entries.map(x=>E.default.createElement("li",{key:x.revision},E.default.createElement("button",{onClick:()=>w(x.revision)},"r",x.revision," \xB7 ",x.message)))),n.nextRevision!==null&&E.default.createElement("button",{onClick:()=>d(n.nextRevision)},a("historyMore"))):E.default.createElement("p",{role:"status"},a("loading")),h&&E.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,E.useState)(null),[c,h]=(0,E.useState)(null),[w,v]=(0,E.useState)(""),[S,u]=(0,E.useState)(0);return(0,E.useEffect)(()=>{let b=new AbortController;return n(null),h(null),v(""),a("vcs/svn-detail",{sessionId:e,repositoryId:t,token:o,snapshot:r,revision:i},b.signal).then(x=>{b.signal.aborted||n(x)}).catch(x=>{b.signal.aborted||(v(x.message),x.code==="vcs/rediscover-required"&&f())}),()=>b.abort()},[S]),E.default.createElement("section",null,w?E.default.createElement("p",{role:"alert"},w," ",E.default.createElement("button",{onClick:()=>u(b=>b+1)},p("retry"))):d?E.default.createElement(E.default.Fragment,null,E.default.createElement("p",null,d.message),d.changes.map(b=>E.default.createElement("div",{key:b.id},E.default.createElement("span",null,b.action," ",b.path),b.kind==="file"&&E.default.createElement(E.default.Fragment,null,E.default.createElement("button",{onClick:()=>h({id:b.id,mode:"compare"})},p("svnHistoricalDiff")),E.default.createElement("button",{onClick:()=>h({id:b.id,mode:"trace"})},p("fileHistory")),b.copyFromPath&&b.copyFromRevision&&E.default.createElement("button",{onClick:()=>h({id:b.id,mode:"copytrace"})},p("svnCopyHistory")," \xB7 ",b.copyFromPath," @r",b.copyFromRevision),b.copySourceOutsideScope&&E.default.createElement("span",null,p("svnCopyOutside")))))):E.default.createElement("p",{role:"status"},p("loading")),c&&E.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,E.useState)(null),[w,v]=(0,E.useState)(null),[S,u]=(0,E.useState)(""),[b,x]=(0,E.useState)(0);return(0,E.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,b]),S?E.default.createElement("p",{role:"alert"},S," ",E.default.createElement("button",{onClick:()=>x(g=>g+1)},p("retry"))):c?n==="compare"?c.binary?E.default.createElement("p",null,p("binary")):E.default.createElement(ce,{comparison:c,identity:JSON.stringify([e,t,r,i,d]),t:p}):E.default.createElement("section",null,E.default.createElement("p",null,p(n==="copytrace"?"svnCopyTraceScope":"svnTraceScope")," \xB7 ",c.path," \xB7 peg r",c.pegRevision),E.default.createElement("ol",null,c.entries.map(g=>E.default.createElement("li",{key:g.revision},"r",g.revision," \xB7 ",g.message))),c.nextRevision!==null&&E.default.createElement("button",{onClick:()=>v(c.nextRevision)},p("historyMore"))):E.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(b=>{u.signal.aborted||(c(b.message),b.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(b){c(b.message)}},S=async(...u)=>{try{return await o(...u)}catch(b){throw b.code==="vcs/svn-consent-required"&&!u[2]?.aborted&&(p(null),w(0),c(r("svnExpired"))),b}};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,b]=(0,G.useState)(0),x=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:x},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,x,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:()=>b(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,x]),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 b=new AbortController;return c(null),w(""),i("vcs/tree-file",{sessionId:e,repositoryId:t,commit:o,path:r},b.signal).then(x=>{b.signal.aborted||c(x)}).catch(x=>{b.signal.aborted||(w(x.message),x.code==="vcs/rediscover-required"&&p())}),()=>b.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(b=>b+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),[b,x]=(0,D.useState)(""),[g,m]=(0,D.useState)(null);if((0,D.useEffect)(()=>{let L=new AbortController;return f(null),n(""),r("vcs/tree",{sessionId:e,repositoryId:t,commit:o},L.signal).then(V=>{L.signal.aborted||f(V)}).catch(V=>{L.signal.aborted||(n(V.message),V.code==="vcs/rediscover-required"&&a())}),()=>L.abort()},[e,t,o,c]),d)return D.default.createElement("p",{role:"alert"},d," ",D.default.createElement("button",{onClick:()=>h(L=>L+1)},i("retry")));if(!p)return D.default.createElement("p",{role:"status"},i("loading"));let y=w?w+"/":"",k=dr(p.entries,w,b),O=L=>{v(L),u(0),x(""),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:()=>O(w.includes("/")?w.slice(0,w.lastIndexOf("/")):"")},i("treeUp"))),D.default.createElement("nav",{"aria-label":i("treeBreadcrumbs")},lr(w).map(L=>D.default.createElement(D.default.Fragment,{key:L.path},L.path&&" / ",L.path===w?D.default.createElement("span",{"aria-current":"location"},L.name):D.default.createElement("button",{onClick:()=>O(L.path)},L.name)))),D.default.createElement("label",null,i("treeSearch")," ",D.default.createElement("input",{"aria-label":i("treeSearch"),value:b,onChange:L=>{x(L.target.value),u(0),m(null)}})),D.default.createElement("p",null,k.length," ",i("treeEntries")),!k.length&&b&&D.default.createElement("p",{role:"status"},i("emptySearch")),D.default.createElement("ul",null,k.slice(S*100,S*100+100).map(L=>D.default.createElement("li",{key:L.path},L.type==="tree"?D.default.createElement("button",{onClick:()=>O(L.path)},L.path.slice(y.length),"/"):L.type==="blob"&&["100644","100755"].includes(L.mode)?D.default.createElement("button",{"aria-pressed":g===L.path,onClick:()=>m(L.path)},L.path.slice(y.length)):D.default.createElement("span",null,L.path.slice(y.length))," \xB7 ",D.default.createElement("code",null,L.mode," ",L.type," ",D.default.createElement("span",{title:L.oid},L.oid.slice(0,10)))))),S>0&&D.default.createElement("button",{onClick:()=>{u(L=>L-1),m(null)}},i("treePrevious")),(S+1)*100<k.length&&D.default.createElement("button",{onClick:()=>{u(L=>L+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),[b,x]=(0,F.useState)(!0),[g,m]=(0,F.useState)("");return(0,F.useEffect)(()=>{let y=new AbortController;return x(!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(O=>({...k,commits:w?[...O.commits,...k.commits]:k.commits}))}).catch(k=>{y.signal.aborted||(m(k.message),k.code==="vcs/rediscover-required"&&d())}).finally(()=>{y.signal.aborted||x(!1)}),()=>y.abort()},[e,t,o,r,i,w,S]),F.default.createElement("section",{"aria-label":f("fileHistory"),"aria-busy":b},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))))),b&&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"))),!b&&!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:b,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 B=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,B.useState)(null),[h,w]=(0,B.useState)(""),[v,S]=(0,B.useState)(0),[u,b]=(0,B.useState)(1),[x,g]=(0,B.useState)(null);return(0,B.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?B.default.createElement("p",{role:"alert"},h," ",B.default.createElement("button",{onClick:()=>S(m=>m+1)},p("retry"))):n?B.default.createElement("section",{"aria-label":p("blame")},B.default.createElement("p",null,p("blameScope")),d&&B.default.createElement("p",null,p("blameNavigation")),n.notice&&B.default.createElement("p",{role:"status"},n.notice),n.truncated&&B.default.createElement("p",{role:"status"},p("blameLimit")),!n.notice&&!n.lines.length&&B.default.createElement("p",null,p("blameEmpty")),!!n.lines.length&&B.default.createElement("div",{style:{overflow:"auto",maxHeight:480}},B.default.createElement("table",null,B.default.createElement("thead",null,B.default.createElement("tr",null,["blameLine","blameCommit","blameAuthor","blameSummary","blameSource"].map(m=>B.default.createElement("th",{key:m,scope:"col"},p(m))))),B.default.createElement("tbody",null,n.lines.map(m=>B.default.createElement("tr",{key:m.line},B.default.createElement("th",{scope:"row"},m.line),B.default.createElement("td",null,d?B.default.createElement("button",{title:m.commit,onClick:()=>d(m.commit)},B.default.createElement("code",null,m.commit.slice(0,10))):B.default.createElement("code",{title:m.commit},m.commit.slice(0,10))),B.default.createElement("td",null,m.author),B.default.createElement("td",null,m.summary),B.default.createElement("td",null,B.default.createElement("pre",{style:{margin:0}},m.text),m.path&&m.originalLine?B.default.createElement("button",{onClick:()=>g(m)},p("blameOriginLine"),": ",m.path,":",m.originalLine):B.default.createElement("span",null,p("blameUnmapped")))))))),B.default.createElement("p",null,n.startLine||u,"\u2013",n.lines.at(-1)?.line||u," / ",n.totalLines??"\u2014"),B.default.createElement("button",{disabled:u===1,onClick:()=>b(Math.max(1,u-500))},p("blamePrevious")),B.default.createElement("button",{disabled:n.nextLine==null,onClick:()=>b(n.nextLine)},p("blameNext")),x&&B.default.createElement(Te,{key:JSON.stringify([x.commit,x.path,x.originalLine]),sessionId:e,repositoryId:t,commit:x.commit,path:x.path,line:x.originalLine,rpc:a,t:p,onRediscover:f,onClose:()=>g(null)})):B.default.createElement("p",{role:"status"},p("loading"))}function kt(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("blame")),t&&B.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,b]=(0,I.useState)(0),[x,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,...x?{large:!0}:{}}:{sessionId:e,repositoryId:t,commit:o,parentIndex:r,id:p,...x?{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,x]),v?I.default.createElement("p",{role:"alert"},v," ",I.default.createElement("button",{onClick:()=>b(m=>m+1)},d("retry")),x&&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),x?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"),x&&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,b]=(0,T.useState)(null),[x,g]=(0,T.useState)(""),[m,y]=(0,T.useState)(0);if((0,T.useEffect)(()=>{let O=new AbortController;return b(null),g(""),r("vcs/commit",{sessionId:e,repositoryId:t,commit:o,parentIndex:v},O.signal).then(L=>{O.signal.aborted||(b(L),d.current&&(d.current=!1,c(cr(L.changes,f))))}).catch(L=>{O.signal.aborted||(g(L.message),L.code==="vcs/rediscover-required"&&a())}),()=>O.abort()},[e,t,o,v,m]),x)return T.default.createElement("p",{role:"alert"},x," ",T.default.createElement("button",{onClick:()=>y(O=>O+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:O=>{c(null),b(null),S(Number(O.target.value))}},u.parents.map((O,L)=>T.default.createElement("option",{key:O,value:L},L+1,": ",O.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:O=>{w(O.target.value),c(null)}})),T.default.createElement("span",null," ",k.length," / ",u.changes.length),T.default.createElement("ul",null,k.map(O=>T.default.createElement("li",{key:O.id},T.default.createElement("button",{"aria-pressed":n===O.id,onClick:()=>c(O.id)},O.status," \xB7 ",O.oldPath?O.oldPath+" \u2192 ":"",O.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,b]=(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 x=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=>{b(g.target.value),S(null)}})),H.default.createElement("span",null," ",x.length," / ",f.changes.length),!!f.changes.length&&!x.length&&H.default.createElement("p",{role:"status"},a("emptySearch")),!f.changes.length&&H.default.createElement("p",null,a("revisionEmpty")),H.default.createElement("ul",null,x.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,b]=(0,H.useState)(0),[x,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(O=>{k.signal.aborted||(w(O.references),S(!0),p?.(O.references))}).catch(O=>{k.signal.aborted||(y(O.message),O.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:x,onClick:()=>b(k=>k+1)},i("revisionLoadRefs")),H.default.createElement("p",null,i("revisionRefsScope")),v&&!x&&!m&&H.default.createElement("p",{role:"status"},h.length?`${i("revisionRefsCount")}: ${h.length}`:i("revisionRefsEmpty")),x&&H.default.createElement("p",{role:"status"},i("loading")),m&&H.default.createElement("p",{role:"alert"},m),[[f,d,"revisionBase"],[n,c,"revisionTarget"]].map(([k,O,L])=>H.default.createElement("label",{key:L},i(L)," ",H.default.createElement("select",{"aria-label":i(L),value:k,onChange:V=>O(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})},[b,x]=(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]),O=a.id,L=(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({...b})}},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:b[P],onChange:z=>x(Z=>({...Z,[P]:z.target.value}))}))),C.default.createElement("button",{type:"submit"},r("historyServerApply")),C.default.createElement("button",{type:"button",onClick:()=>{x({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":O===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:O,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"},O&&C.default.createElement(Ct,{key:JSON.stringify([O,a.revision]),initialPath:a.path,sessionId:e,repositoryId:t,commit:O,onSelectCommit:L,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",svnCopyHistory:"\u67E5\u770B\u590D\u5236\u6765\u6E90\u5386\u53F2",svnCopyOutside:"\u590D\u5236\u6765\u6E90\u5728\u6388\u6743\u8303\u56F4\u5916\uFF0C\u4E0D\u80FD\u6253\u5F00",svnCopyTraceScope:"\u5355\u72EC\u67E5\u770B\u8303\u56F4\u5185\u56FA\u5B9A\u6765\u6E90\uFF0C\u4ECD\u6B62\u4E8E\u5176\u590D\u5236\u8FB9\u754C\uFF1B\u4E0D\u662F\u81EA\u52A8\u8FFD\u6EAF",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",svnCopyHistory:"View copy source history",svnCopyOutside:"Copy source is outside the authorized scope",svnCopyTraceScope:"Separate fixed in-scope source history, stopping at its copy boundary; not automatic tracing",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"},Or=e=>new URL("vcs-assets/"+e,document.baseURI).href;function Br(){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,b]=(0,s.useState)(null),[x,g]=(0,s.useState)({}),[m,y]=(0,s.useState)(()=>br(f?.cwd)),[k,O]=(0,s.useState)(0),[L,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)(""),[Ot,Bt]=(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 Oe=()=>{zt.current?.abort(),we.current?.abort(),le(null),pe(null),Z(""),He("content"),ot({added:0,deleted:0,count:0})},We=()=>{Ie.current=!1,Oe(),nt.current?.abort(),at.current=u,b(null),g({}),ye(L.trim()),O(l=>l+1)},Se=()=>{Ie.current||(Ie.current=!0,Oe(),nt.current?.abort(),at.current=null,b(null),g({}),ye(""),O(l=>l+1))},Kt=(l=!1)=>{l||S(N=>N+1),lt.current=l,l||Oe(),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)),b(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?x[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=Or("editor.css"),document.head.appendChild(K),Ye(Or("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 Be=Ar(ge,x,fe,Je),Ne=Be.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()}}Bt(!0),window.setTimeout(()=>Bt(!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 Be)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,Be]);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=>!x[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(Br,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=>{Oe(),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=>{Oe(),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:L,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},Be.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"))):x[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&&x[N.id]&&!l.changes.length&&s.default.createElement("div",{className:"vcs-message"},t(fe?"emptySearch":"clean")))}),!Be.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(Ot?"copied":"copyPath")),Ot&&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},Br))}
|
|
97
97
|
return module.exports; }});
|
package/dist/svn-host.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHandler as Ie}from"../index.mjs";import{XMLParser as he,XMLValidator as me}from"fast-xml-parser";function O(r){if(typeof r!="string"||Buffer.byteLength(r)>2097152||/<!DOCTYPE|<!ENTITY/i.test(r)||me.validate(r)!==!0)throw Error("Invalid DAV XML");let t=new he({preserveOrder:!0,ignoreAttributes:!1,parseTagValue:!1,parseAttributeValue:!1,trimValues:!1}).parse(r),o=0,e=(s,n,i=0)=>{if(i>32)throw Error("DAV XML too deep");let a=Object.create(null),f="";for(let c of s){if(++o>1e4)throw Error("DAV XML too many nodes");if(Object.hasOwn(c,"#text")){f+=c["#text"];continue}let p=Object.keys(c).filter(D=>D!==":@");if(p.length!==1)throw Error("Invalid DAV XML node");let l=p[0];if(l==="?xml"){if(i!==0)throw Error("Unexpected XML declaration");continue}let m={...n},g={};for(let[D,V]of Object.entries(c[":@"]||{}))D==="@_xmlns"?m[""]=V:D.startsWith("@_xmlns:")?m[D.slice(8)]=V:g[D]=V;let y=l.split(":");if(y.length>2)throw Error("Invalid DAV XML name");let u=y.length===2?y[0]:"",d=y.at(-1),h=m[u],S=h==="DAV:"?"D:"+d:h==="http://subversion.tigris.org/xmlns/dav/"?"S:"+d:h==="svn:"?"L:"+d:h==="http://subversion.tigris.org/xmlns/svn/"?"P:"+d:h==="http://subversion.tigris.org/xmlns/custom/"?"C:"+d:null;if(!S)throw Error("Unsupported DAV namespace");let b=["L:added-path","L:deleted-path","L:modified-path","L:replaced-path"].includes(S);if(Object.keys(g).length&&(!b||Object.keys(g).some(D=>!["@_node-kind","@_text-mods","@_prop-mods","@_copyfrom-path","@_copyfrom-rev"].includes(D))))throw Error("Unexpected DAV attribute");let v=e(c[l],m,i+1);if(b&&typeof v!="string")throw Error("Invalid DAV path text");let E=b?{...g,"#text":v}:v;if(["D:response","D:propstat","L:log-item","L:added-path","L:deleted-path","L:modified-path","L:replaced-path"].includes(S))(a[S]??=[]).push(E);else{if(Object.hasOwn(a,S))throw Error("Duplicate DAV expanded name");a[S]=E}}if(!Object.keys(a).length)return f;if(f.trim())throw Error("Mixed DAV XML content");return a};return e(t,{})}var ve=9223372036854775807n;function w(r){if(typeof r!="string"||r.length>19||!/^(0|[1-9][0-9]*)$/.test(r))throw new Error("Invalid SVN revision");let t=BigInt(r);if(t>ve)throw new Error("SVN revision exceeds supported range");return t}function H(r){let t=w(r);return t===0n?null:String(t-1n)}function j(r,{snapshot:t,cursor:o=t,limit:e=50}={}){let s=w(t),n=w(o);if(n>s||!Number.isInteger(e)||e<1||e>100||!Array.isArray(r)||r.length>e+1)throw new Error("Invalid SVN page bounds");let i=n+1n;for(let f of r){let c=w(f);if(c>n||c>=i)throw new Error("SVN revisions must descend within cursor");i=c}let a=r.slice(0,e);return{snapshot:t,revisions:a,nextRevision:r.length>e?H(a.at(-1)):null}}function J(r,t){let o=O(r);if(!o||typeof o!="object"||Object.keys(o).length!==1||!Object.hasOwn(o,"L:log-report"))throw Error("Invalid DAV log root");let e=o["L:log-report"],s;if(e==="")s=[];else{if(!e||typeof e!="object"||Object.keys(e).some(a=>a!=="L:log-item")||!Array.isArray(e["L:log-item"]))throw Error("Invalid DAV log structure");s=e["L:log-item"]}if(s.length>101)throw Error("DAV log entries exceed limit");let n=s.map(a=>{if(!a||typeof a!="object"||Array.isArray(a)||Object.keys(a).some(c=>!["D:version-name","D:comment","D:creator-displayname","L:date"].includes(c)))throw Error("Unsupported DAV log item");let f=c=>{let p=a[c]??"";if(typeof p!="string")throw Error("Invalid DAV log text");return p};return{revision:f("D:version-name"),message:f("D:comment"),author:f("D:creator-displayname"),date:f("L:date")}}),i=j(n.map(a=>a.revision),t);return{snapshot:i.snapshot,entries:n.slice(0,i.revisions.length),nextRevision:i.nextRevision}}function k(r){if(typeof r!="string"||r.length>32768||!r.startsWith("/")||/[\u0000-\u001f\u007f\\]/.test(r))throw new Error("Invalid SVN repository path");if(r!=="/"&&r.slice(1).split("/").some(t=>t===""||t==="."||t===".."))throw new Error("Noncanonical SVN repository path");return r}function T(r,t){return k(r),k(t),t==="/"||r===t||r.startsWith(t+"/")}function q(r,t){if(!Array.isArray(r)||r.length>1e4)throw new Error("Invalid SVN path nodes");let o=r.map(e=>{let s=["#text","@_action","@_kind","@_copyfrom-path","@_copyfrom-rev","@_text-mods","@_prop-mods"];if(!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).some(n=>!s.includes(n)))throw new Error("Invalid SVN path node");for(let n of["@_text-mods","@_prop-mods"])if(Object.hasOwn(e,n)&&!["true","false","unknown"].includes(e[n]))throw new Error("Invalid SVN modification flag");return{...Object.hasOwn(e,"@_text-mods")?{textModified:e["@_text-mods"]}:{},...Object.hasOwn(e,"@_prop-mods")?{propertiesModified:e["@_prop-mods"]}:{},path:e["#text"],action:e["@_action"],kind:e["@_kind"],...Object.hasOwn(e,"@_copyfrom-path")?{copyFromPath:e["@_copyfrom-path"]}:{},...Object.hasOwn(e,"@_copyfrom-rev")?{copyFromRevision:e["@_copyfrom-rev"]}:{}}});return W(o,t)}function W(r,{scope:t,revision:o}={}){k(t);let e=w(o);if(!Array.isArray(r)||r.length>1e4||e===0n&&r.length!==0)throw new Error("Invalid SVN changed paths");let s=new Set;return r.map(i=>{if(!i||typeof i!="object"||Array.isArray(i)||Object.keys(i).some(u=>!["path","action","kind","copyFromPath","copyFromRevision","copySourceOutsideScope","textModified","propertiesModified"].includes(u)))throw new Error("Invalid SVN change structure");let{path:a,action:f,kind:c,copyFromPath:p,copyFromRevision:l}=i;if(k(a),s.has(a)||!["A","D","M","R"].includes(f)||!["file","dir","unknown"].includes(c))throw new Error("Invalid SVN change");s.add(a);let m=p!==void 0||l!==void 0;if(m&&(k(p),!["A","R"].includes(f)||w(l)>=e))throw new Error("Invalid SVN copy source");let g=Object.hasOwn(i,"copySourceOutsideScope");if(g&&(i.copySourceOutsideScope!==!0||m||!["A","R"].includes(f)))throw new Error("Invalid SVN redacted copy source");let y={path:a,action:f,kind:c,...g?{copySourceOutsideScope:!0}:{}};for(let u of["textModified","propertiesModified"])if(Object.hasOwn(i,u)){if(!["true","false","unknown"].includes(i[u]))throw new Error("Invalid SVN modification flag");y[u]=i[u]}return m&&(T(p,t)?(y.copyFromPath=p,y.copyFromRevision=l):y.copySourceOutsideScope=!0),y}).filter(i=>T(i.path,t))}function G(r,{scope:t,revision:o}={}){w(o);let e=O(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)))throw Error("Invalid DAV detail structure")};s(e,["L:log-report"]);let n=e["L:log-report"];if(s(n,["L:log-item"]),n["L:log-item"]?.length!==1)throw Error("One DAV detail revision required");let i=n["L:log-item"][0],a={"L:added-path":"A","L:deleted-path":"D","L:modified-path":"M","L:replaced-path":"R"};if(s(i,["D:version-name","D:comment","D:creator-displayname","L:date",...Object.keys(a)]),i["D:version-name"]!==o)throw Error("DAV detail revision mismatch");let f=p=>{let l=i[p]??"";if(typeof l!="string")throw Error("Invalid DAV detail text");return l},c=[];for(let[p,l]of Object.entries(a))for(let m of i[p]??[]){let{"@_node-kind":g,...y}=m;c.push({...y,"@_kind":g??"unknown","@_action":l})}return{revision:o,author:f("D:creator-displayname"),date:f("L:date"),message:f("D:comment"),changes:q(c,{scope:t,revision:o})}}function I(r,t,o){if(k(t),w(o),typeof r!="string"||r.length>32768||/[\x00-\x20\x7f\\?#]/.test(r))throw new Error("Invalid SVN HTTPS root");let e=new URL(r);if(e.protocol!=="https:"||e.username||e.password||e.href!==r)throw new Error("Noncanonical SVN HTTPS root");let s=e.pathname.split("/").slice(1);s.at(-1)===""&&s.pop();for(let f of s){let c=decodeURIComponent(f);if(!f||c==="."||c===".."||/[\x00-\x1f\x7f/\\]/.test(c))throw new Error("Invalid SVN root path")}let n=r.endsWith("/")?r.slice(0,-1):r,i=t==="/"?"":t.split("/").map(f=>encodeURIComponent(f).replace(/[!'()*]/g,c=>"%"+c.charCodeAt(0).toString(16).toUpperCase())).join("/"),a=n+(i||(e.pathname==="/"?"/":""))+"@"+o;if(a.length>32768)throw new Error("SVN target too long");return a}function B({root:r,scope:t,path:o=t,snapshot:e,revision:s}={}){if(w(s)>w(e))throw new Error("SVN selected revision exceeds snapshot");if(!T(o,t))throw new Error("SVN detail path outside scope");let n=I(r,o,e);return{scope:t,revision:s,snapshot:e,args:["log","--xml","--verbose","--stop-on-copy","--non-interactive","--no-auth-cache","--limit","1","-r",s+":"+s,"--",n]}}function M({root:r,scope:t,path:o=t,snapshot:e,cursor:s=e,limit:n=50}={}){if(j([],{snapshot:e,cursor:s,limit:n}),!T(o,t))throw new Error("SVN history path outside scope");let i=I(r,o,e);return{snapshot:e,cursor:s,limit:n,args:["log","--xml","--stop-on-copy","--non-interactive","--no-auth-cache","--limit",String(n+1),"-r",s+":0","--",i]}}function C(r,t){let o=r?.args;if(!Array.isArray(o)||o.length>16||o.some(l=>typeof l!="string"))throw Error("Invalid SVN command");let e=o.at(-1),s=e.lastIndexOf("@"),n=e.slice(s+1);w(n);let i=t.root.endsWith("/")?t.root.slice(0,-1):t.root;I(t.root,"/",n);let a=e.slice(0,s);if(!(a===i||a.startsWith(i+"/")))throw Error("SVN command target outside root");let f=a.slice(i.length),c=f?"/"+f.slice(1).split("/").map(l=>decodeURIComponent(l)).join("/"):"/";if(!T(c,t.scope)||I(t.root,c,n)!==e)throw Error("SVN command target outside scope or noncanonical");let p;if(o[0]==="cat"||o[0]==="proplist"){w(o[o[0]==="cat"?4:5]);let l=o[o[0]==="cat"?4:5];if(l!==n)throw Error("SVN content operative and peg mismatch");p=o[0]==="cat"?["cat","--non-interactive","--no-auth-cache","-r",l,"--",e]:["proplist","--xml","--non-interactive","--no-auth-cache","-r",l,"--",e]}else if(o[0]==="log")if(o.includes("--verbose")){let l=o[9]?.split(":")[0];p=B({...t,path:c,snapshot:n,revision:l}).args}else{let l=o[8]?.split(":")[0],m=Number(o[6])-1;p=M({...t,path:c,snapshot:n,cursor:l,limit:m}).args}else throw Error("SVN command is not readonly history");if(JSON.stringify(o)!==JSON.stringify(p))throw Error("Unsupported SVN command shape");return{path:c,pegRevision:n,args:[...p]}}function K(r,{scope:t,revision:o,path:e}={}){if(w(o)===0n)throw new Error("SVN r0 has no change comparison");let s=W(r,{scope:t,revision:o}).find(a=>a.path===e);if(!s)throw new Error("SVN path is not an authorized changed member");if(s.kind!=="file")throw new Error("Only SVN file changes can be compared");let n=H(o),i=a=>a===null?{empty:!0}:{empty:!1,path:s.path,revision:a,pegRevision:a};return{path:s.path,action:s.action,left:i(s.action==="A"?null:n),right:i(s.action==="D"?null:o)}}import{XMLParser as ge,XMLValidator as we}from"fast-xml-parser";function Q(r,{target:t,allowEmpty:o=!1}={}){if(typeof t!="string"||!t||t.length>32768)throw new Error("Invalid SVN property target");if(typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||we.validate(r)!==!0)throw new Error("Invalid SVN property XML");let e=new ge({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:p=>p==="target"||p==="property"}).parse(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)&&!(m==="#text"&&typeof p[m]=="string"&&/^[ \t\r\n]*$/.test(p[m]))))throw new Error("Invalid SVN property structure")};if(s(e,["?xml","properties"]),o===!0&&typeof e.properties=="string"&&/^[ \t\r\n]*$/.test(e.properties))return{target:t,names:[],special:!1};s(e.properties,["target"]);let n=e.properties.target;if(!Array.isArray(n)||n.length!==1)throw new Error("Expected one SVN property target");let i=n[0];if(s(i,["@_path","property"]),i["@_path"]!==t)throw new Error("SVN property target mismatch");let a=i.property??[];if(!Array.isArray(a)||a.length>1e4)throw new Error("Too many SVN properties");let f=[],c=new Set;for(let p of a){s(p,["@_name"]);let l=p["@_name"];if(typeof l!="string"||!l||l.length>1024||/[\x00-\x20\x7f]/.test(l)||c.has(l))throw new Error("Invalid SVN property name");c.add(l),f.push(l)}return{target:t,names:f,special:c.has("svn:special")}}import{createHash as Ve}from"node:crypto";import{XMLParser as ye,XMLValidator as Se}from"fast-xml-parser";function Z(r,{scope:t,revision:o}={}){if(w(o),typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||Se.validate(r)!==!0)throw new Error("Invalid SVN detail XML");let e=new ye({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:c=>c==="logentry"||c==="path"}).parse(r),s=(c,p)=>{if(!c||typeof c!="object"||Array.isArray(c)||Object.keys(c).some(l=>!p.includes(l)&&!(l==="#text"&&typeof c[l]=="string"&&/^[ \t\r\n]*$/.test(c[l]))))throw new Error("Invalid SVN detail structure")};if(s(e,["?xml","log"]),s(e.log,["logentry"]),!Array.isArray(e.log.logentry)||e.log.logentry.length!==1)throw new Error("Expected one SVN revision");let n=e.log.logentry[0];if(s(n,["@_revision","author","date","msg","paths"]),n["@_revision"]!==o)throw new Error("SVN detail revision mismatch");let i=c=>{let p=n[c]??"";if(typeof p!="string")throw new Error("Invalid SVN detail text");return p},a=[];n.paths!==void 0&&!(typeof n.paths=="string"&&/^[ \t\r\n]*$/.test(n.paths))&&(s(n.paths,["path"]),a=n.paths.path??[]);let f=q(a,{scope:t,revision:o});return{revision:o,author:i("author"),date:i("date"),message:i("msg"),pathsAvailable:Object.hasOwn(n,"paths"),changes:f}}import{randomBytes as De}from"node:crypto";function ee(r){if(!r||typeof r!="object")throw Error("Invalid SVN consent identity");let{sessionId:t,cwd:o,repositoryId:e,root:s,uuid:n,scope:i}=r;for(let a of[t,o,e])if(typeof a!="string"||!a||a.length>32768||a.includes("\0"))throw Error("Invalid SVN consent scope");if(I(s,"/","0"),k(i),typeof n!="string"||!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(n))throw Error("Invalid SVN repository UUID");return JSON.stringify([t,o,e,s,n,i])}function F({now:r=Date.now,ttlMs:t=3e5,maxEntries:o=32,onRevoke:e=()=>{}}={}){if(!Number.isInteger(t)||t<1||t>3e5||!Number.isInteger(o)||o<1||o>32)throw Error("Invalid SVN consent bounds");if(typeof e!="function")throw Error("Invalid SVN revoke listener");let s=new Map,n=a=>{s.delete(a)&&e(a)},i=()=>{for(let[a,f]of s)f.expires<=r()&&n(a)};return{grant(a,{explicit:f=!1}={}){if(f!==!0)throw Error("Explicit SVN network consent required");let c=ee(a);i();for(let[l,m]of s)m.key===c&&n(l);for(;s.size>=o;)n(s.keys().next().value);let p=De(32).toString("hex");return s.set(p,{key:c,sessionId:a.sessionId,expires:r()+t}),p},assert(a,f){i();let c=ee(f),p=s.get(a);if(!p||p.key!==c)throw Object.assign(Error("SVN network consent missing, expired or identity changed"),{code:"vcs/svn-consent-required"})},revokeSession(a){for(let[f,c]of s)c.sessionId===a&&n(f)},revoke(a){n(a)},clear(){for(let a of[...s.keys()])n(a)}}}import{XMLParser as be,XMLValidator as Ee}from"fast-xml-parser";function re(r,t){let o=Ae(r),e=j(o.map(s=>s.revision),t);return{snapshot:e.snapshot,entries:o.slice(0,e.revisions.length),nextRevision:e.nextRevision}}function Ae(r){if(typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||Ee.validate(r)!==!0)throw new Error("Invalid SVN log XML");let o=new be({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:n=>n==="logentry"}).parse(r);if(!Object.hasOwn(o,"log")||Object.keys(o).some(n=>n!=="log"&&n!=="?xml"))throw new Error("Invalid SVN log root");let e=o.log;if(typeof e=="string"&&/^[ \t\r\n]*$/.test(e))return[];if(e&&typeof e=="object"&&typeof e["#text"]=="string"&&/^[ \t\r\n]*$/.test(e["#text"])&&delete e["#text"],!e||typeof e!="object"||Object.keys(e).some(n=>n!=="logentry")||!Array.isArray(e.logentry)||e.logentry.length>101)throw new Error("Invalid SVN log entries");let s=new Set;return e.logentry.map(n=>{if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(f=>!["@_revision","author","date","msg","#text"].includes(f))||"#text"in n&&(typeof n["#text"]!="string"||!/^[ \t\r\n]*$/.test(n["#text"])))throw new Error("Unsupported SVN log entry structure");let i=n["@_revision"];if(w(i),s.has(i))throw new Error("Duplicate SVN revision");s.add(i);let a=f=>{let c=n[f]??"";if(typeof c!="string")throw new Error("Invalid SVN log text");return c};return{revision:i,author:a("author"),date:a("date"),message:a("msg")}})}function te({resolveIdentity:r,transport:t,now:o=Date.now,timeoutMs:e=15e3,transportFormat:s="cli"}={}){if(!["cli","dav"].includes(s))throw Error("Invalid SVN transport format");if(!Number.isInteger(e)||e<1||e>15e3)throw Error("Invalid SVN runtime deadline");if(typeof r!="function")throw Error("Local identity resolver required");let n=F({now:o}),i=F({now:o,onRevoke:u=>m(u)}),a=!1,f=()=>{if(a)throw new DOMException("SVN runtime disposed","AbortError")},c=async(u,d)=>{f(),d?.throwIfAborted();let h=await r(u,d);return f(),d?.throwIfAborted(),{...h,sessionId:u.sessionId,cwd:h.cwd,repositoryId:u.repositoryId}},p=u=>u.revision===void 0?{}:(w(u.revision),{snapshot:u.revision}),l=new Map,m=u=>{for(let d of l.get(u)||[])d.controller.abort(new DOMException("SVN consent revoked","AbortError"))},g=async(u,d)=>{f(),C(u,d.identity),d.signal?.throwIfAborted(),i.assert(d.token,d.identity);let h=new AbortController,S=()=>h.abort(d.signal.reason);d.signal?.addEventListener("abort",S,{once:!0});let b={controller:h,sessionId:d.identity.sessionId};l.has(d.token)||l.set(d.token,new Set),l.get(d.token).add(b);let v=setTimeout(()=>h.abort(new DOMException("SVN transport deadline exceeded","TimeoutError")),e);try{let E=async()=>{h.signal.throwIfAborted();let V=await c({sessionId:d.identity.sessionId,repositoryId:d.identity.repositoryId},h.signal);i.assert(d.token,V),h.signal.throwIfAborted()},D=await t(u,{...d,timeoutMs:e,signal:h.signal,assertAuthorized:E});if(h.signal.throwIfAborted(),!(typeof D=="string"||Buffer.isBuffer(D))||Buffer.byteLength(D)>d.maxBytes)throw Error("SVN transport output exceeds byte limit or has invalid type");return Buffer.isBuffer(D)&&u.args[0]!=="cat"?new TextDecoder("utf-8",{fatal:!0}).decode(D):D}catch(E){throw h.signal.aborted?h.signal.reason:E}finally{let E=l.get(d.token);E?.delete(b),E?.size||l.delete(d.token),clearTimeout(v),d.signal?.removeEventListener("abort",S)}},y={async describe(u,{signal:d}={}){let h=await c(u,d),S=p(h),b=n.grant(h,{explicit:!0});return{...S,offer:b,root:h.root,uuid:h.uuid,scope:h.scope,origin:new URL(h.root).origin,expiresAt:o()+3e5,remoteEnabled:typeof t=="function"}},async approve(u,{offer:d,explicit:h=!1,signal:S}={}){if(h!==!0)throw Error("Explicit SVN network consent required");let b=await c(u,S);if(n.assert(d,b),typeof t!="function")throw Error("SVN remote transport disabled");let v=p(b),E=i.grant(b,{explicit:!0});return n.revoke(d),{...v,token:E,expiresAt:o()+3e5}},async log(u,{token:d,snapshot:h,cursor:S,limit:b,path:v,signal:E}={}){let D=await c(u,E);if(i.assert(d,D),typeof t!="function")throw Error("SVN remote transport disabled");let V=M({...D,snapshot:h,cursor:S,limit:b,path:v});E?.throwIfAborted();let A=await g(V,{identity:D,token:d,signal:E,maxBytes:2097152,timeoutMs:15e3});E?.throwIfAborted();let x=await c(u,E);return i.assert(d,x),(s==="dav"?J:re)(A,V)},async detail(u,{token:d,snapshot:h,revision:S,signal:b}={}){let v=await c(u,b);if(i.assert(d,v),typeof t!="function")throw Error("SVN remote transport disabled");let E=B({...v,snapshot:h,revision:S}),D=await g(E,{identity:v,token:d,signal:b,maxBytes:2097152,timeoutMs:15e3});b?.throwIfAborted(),i.assert(d,await c(u,b));let V=s==="dav"?{...G(D,E),pathsAvailable:!0}:Z(D,E);return{...V,snapshot:h,changes:V.changes.map(A=>({...A,id:Ve("sha256").update(JSON.stringify([v.root,v.uuid,v.scope,h,S,A])).digest("hex")}))}},async compare(u,{token:d,snapshot:h,revision:S,id:b,signal:v}={}){if(typeof b!="string"||!/^[a-f0-9]{64}$/.test(b))throw Error("Invalid SVN change ID");let E=await y.detail(u,{token:d,snapshot:h,revision:S,signal:v}),D=E.changes.find(N=>N.id===b);if(!D)throw Error("SVN change is not selected revision member");let V=await c(u,v);i.assert(d,V);let A=K(E.changes.map(({id:N,..._})=>_),{scope:V.scope,revision:S,path:D.path}),x=async N=>{if(N.empty)return{label:"empty",text:"",absent:!0};let _=await c(u,v);i.assert(d,_);let U=I(_.root,N.path,N.pegRevision),Y={identity:_,token:d,signal:v,maxBytes:2097152,timeoutMs:15e3},ue=await g({args:["proplist","--xml","--non-interactive","--no-auth-cache","-r",N.revision,"--",U]},Y);if(v?.throwIfAborted(),i.assert(d,await c(u,v)),Q(ue,{target:U.slice(0,U.lastIndexOf("@")),allowEmpty:!0}).special)throw Error("SVN special files cannot be compared");let X=await g({args:["cat","--non-interactive","--no-auth-cache","-r",N.revision,"--",U]},Y);v?.throwIfAborted(),i.assert(d,await c(u,v));let $=Buffer.isBuffer(X)?X:Buffer.from(X);if($.length>2097152)throw Error("SVN text exceeds 2 MiB");if($.includes(0))return{label:"r"+N.revision,text:"",binary:!0};let z;try{z=new TextDecoder("utf-8",{fatal:!0}).decode($)}catch{return{label:"r"+N.revision,text:"",binary:!0}}return{label:"r"+N.revision,text:z}},R=await x(A.left),P=await x(A.right);return{path:D.path,revision:S,snapshot:h,left:R,right:P,binary:!!(R.binary||P.binary)}},async trace(u,{token:d,snapshot:h,revision:S,id:b,cursor:v,limit:E=50,signal:D}={}){if(typeof b!="string"||!/^[a-f0-9]{64}$/.test(b))throw Error("Invalid SVN change ID");let V=await y.detail(u,{token:d,snapshot:h,revision:S,signal:D}),A=V.changes.find(P=>P.id===b);if(!A||A.kind!=="file")throw Error("SVN tracing requires selected file member");let x=A.action==="D"?H(S):S;return{...await y.log(u,{token:d,snapshot:x,cursor:v??x,limit:E,path:A.path,signal:D}),selectionSnapshot:h,selectionRevision:S,path:A.path,pegRevision:x,stopOnCopy:!0,copySourceOutsideScope:!!A.copySourceOutsideScope}},async revoke(u,{token:d,signal:h}={}){let S=await c(u,h);return i.assert(d,S),i.revoke(d),m(d),{revoked:!0}},dispose(){a=!0,n.clear(),i.clear();for(let u of l.keys())m(u)},revokeSession(u){n.revokeSession(u),i.revokeSession(u);for(let[d,h]of l)[...h].some(S=>S.sessionId===u)&&m(d)}};return y}var oe={revoke:["token"],describe:[],approve:["offer","explicit"],log:["token","snapshot","cursor","limit"],detail:["token","snapshot","revision"],compare:["token","snapshot","revision","id"],trace:["token","snapshot","revision","id","cursor","limit"]};function xe(r,t){if(!t||typeof t!="object"||Array.isArray(t))throw Error("Object payload required");if(Object.keys(t).some(o=>!["sessionId","repositoryId",...oe[r]].includes(o)))throw Error("Unknown SVN request field");for(let o of["sessionId","repositoryId"])if(typeof t[o]!="string"||!t[o]||t[o].length>1024||t[o].includes("\0"))throw Error("Invalid SVN Session address");if(r==="approve"&&(t.explicit!==!0||typeof t.offer!="string"||!/^[a-f0-9]{64}$/.test(t.offer)))throw Error("Explicit scoped offer required");if(!["describe","approve"].includes(r)){if(typeof t.token!="string"||!/^[a-f0-9]{64}$/.test(t.token))throw Error("SVN consent token required");if(r!=="revoke"&&w(t.snapshot),t.revision!==void 0&&w(t.revision),["detail","compare","trace"].includes(r)&&t.revision===void 0)throw Error("Selected SVN revision required");if(t.cursor!==void 0&&w(t.cursor),t.limit!==void 0&&(!Number.isInteger(t.limit)||t.limit<1||t.limit>100))throw Error("Invalid SVN page size");if(["compare","trace"].includes(r)&&(typeof t.id!="string"||!/^[a-f0-9]{64}$/.test(t.id)))throw Error("Selected SVN change ID required")}}function ne(r,{timeoutMs:t=15e3}={}){if(!Number.isInteger(t)||t<1||t>15e3)throw Error("Invalid SVN RPC deadline");let o=0;return async(e,s,n)=>{let i=e.startsWith("vcs/svn-")?e.slice(8):"";if(!Object.hasOwn(oe,i))return{ok:!1,error:{code:"vcs/not-found",message:"Unknown SVN endpoint"}};if(i!=="revoke"&&o>=2)return{ok:!1,error:{code:"vcs/busy",message:"SVN history requests busy"}};i!=="revoke"&&o++;let a=new AbortController,f=()=>a.abort(n.reason);n?.addEventListener("abort",f,{once:!0}),n?.aborted&&f();let c=setTimeout(()=>a.abort(new DOMException("SVN operation deadline exceeded","TimeoutError")),t);try{n?.throwIfAborted(),xe(i,s);let{sessionId:p,repositoryId:l,...m}=s,g=await r[i]({sessionId:p,repositoryId:l},{...m,signal:a.signal});return a.signal.throwIfAborted(),{ok:!0,value:g}}catch(p){let l=n?.aborted||p?.name==="AbortError"?"vcs/cancelled":["vcs/rediscover-required","vcs/svn-consent-required"].includes(p?.code)?p.code:"vcs/operation-failed",m=a.signal.aborted?a.signal.reason:p,g=m instanceof Error?m.message:String(m);return{ok:!1,error:{code:l,message:g}}}finally{clearTimeout(c),n?.removeEventListener("abort",f),i!=="revoke"&&o--}}}var Ne=new Set(["describe","approve","log","detail","compare","trace","revoke"]);function se(r,t,{transport:o,transportFormat:e="cli",now:s=Date.now,timeoutMs:n=15e3}={}){let i,a=Ie(r,t,4,{now:s,bindSvnIdentityResolver:p=>{i=p}}),f=te({resolveIdentity:i,transport:o,transportFormat:e,now:s,timeoutMs:n}),c=ne(f,{timeoutMs:n});return{handle(p,l,m){let g=p.startsWith("vcs/svn-")?p.slice(8):"";return Ne.has(g)?c(p,l,m):a(p,l,m)},revokeSession:p=>f.revokeSession(p),dispose:()=>f.dispose()}}import{request as Oe}from"node:https";function ie({request:r=Oe}={}){return async(t,{origin:o,method:e="GET",body:s="",depth:n,label:i,signal:a,maxBytes:f=2097152,timeoutMs:c=15e3}={})=>{let p=new URL(t);if(p.protocol!=="https:"||p.origin!==o||p.username||p.password||p.hash||p.href!==t||!["GET","PROPFIND","REPORT"].includes(e)||typeof s!="string"||Buffer.byteLength(s)>65536||!Number.isInteger(f)||f<1||f>2097152||!Number.isInteger(c)||c<1||c>15e3)throw Error("Invalid bounded HTTPS request");if(n!==void 0&&(e!=="PROPFIND"||n!==0))throw Error("Invalid DAV depth");if(i!==void 0){if(e!=="PROPFIND"||n!==0)throw Error("Invalid DAV label");w(i)}let l={...n===0?{Depth:"0"}:{},...i!==void 0?{Label:i}:{}};return a?.throwIfAborted(),new Promise((m,g)=>{let y,u,d=null,h=null,S=0,b=[],v=A=>{d??=A,u?.destroy(),y?.destroy()},E=()=>v(a.reason??new DOMException("HTTPS cancelled","AbortError")),D=setTimeout(()=>v(new DOMException("HTTPS deadline exceeded","TimeoutError")),c),V=()=>{clearTimeout(D),a?.removeEventListener("abort",E)};try{y=r(p,{method:e,agent:!1,rejectUnauthorized:!0,maxHeaderSize:16384,headers:{...l,"Accept-Encoding":"identity","Content-Type":"text/xml; charset=utf-8","Content-Length":String(Buffer.byteLength(s))}},A=>{u=A;let x=u.statusCode??0;if(x>=300&&x<400){v(Error("HTTPS redirects forbidden"));return}if(x<200||x>=300){v(Error("HTTPS status "+x));return}if(u.headers["content-encoding"]&&u.headers["content-encoding"]!=="identity"){v(Error("HTTPS compressed responses forbidden"));return}let R=u.headers["content-length"];if(R!==void 0&&(!/^[0-9]+$/.test(R)||Number(R)>f)){v(Error("HTTPS response exceeds byte limit"));return}u.on("data",P=>{S+=P.length,S>f?v(Error("HTTPS response exceeds byte limit")):d||b.push(P)}),u.on("error",v),u.on("end",()=>{if(!u.complete){v(Error("HTTPS response incomplete"));return}h=Buffer.concat(b)})}),y.on("error",A=>{d??=A}),y.once("close",()=>{V(),d?g(d):h!==null?m(h):g(Error("HTTPS response closed before completion"))}),a?.addEventListener("abort",E,{once:!0}),a?.aborted?E():y.end(s)}catch(A){V(),y?.destroy(),g(A)}})}}var ke=r=>r.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'");function ae(r,t){let o=C(r,t),e=o.args;if(e[0]!=="log")throw Error("DAV log report requires readonly log plan");let s=e.includes("--verbose"),n=e[s?9:8].split(":"),i=e[s?7:6],a=o.path==="/"?"":o.path.slice(1),f='<?xml version="1.0" encoding="utf-8"?><S:log-report xmlns:S="svn:" xmlns:D="DAV:"><S:start-revision>'+n[0]+"</S:start-revision><S:end-revision>"+n[1]+"</S:end-revision><S:limit>"+i+"</S:limit><S:strict-node-history/>"+(s?"<S:discover-changed-paths/>":"")+"<S:path>"+ke(a)+"</S:path><S:revprop>svn:author</S:revprop><S:revprop>svn:date</S:revprop><S:revprop>svn:log</S:revprop></S:log-report>";if(Buffer.byteLength(f)>65536)throw Error("DAV request body exceeds limit");return{method:"REPORT",body:f,pegRevision:o.pegRevision,path:o.path,requiresVerifiedBaseline:!0}}function L(r,{root:t}={}){if(I(t,"/","0"),typeof r!="string"||!r||r.length>32768||/[\\?#]/.test(r)||[...r].some(n=>n.charCodeAt(0)<=32||n.charCodeAt(0)===127))throw Error("Invalid DAV href");if(!(r.startsWith("/")&&!r.startsWith("//"))&&!r.startsWith("https://"))throw Error("DAV href must be absolute path or HTTPS URL");let o=new URL(r,new URL(t).origin);if(o.protocol!=="https:"||o.origin!==new URL(t).origin||o.username||o.password||o.search||o.hash)throw Error("DAV href outside authorized origin");if(r.startsWith("https://")&&o.href!==r||r.startsWith("/")&&o.pathname!==r)throw Error("Noncanonical DAV href");let e=o.pathname.split("/").slice(1);e.at(-1)===""&&e.pop();for(let n of e){let i=decodeURIComponent(n);if(!n||i==="."||i===".."||[...i].some(a=>a.charCodeAt(0)<32||a.charCodeAt(0)===127||a==="/"||a.charCodeAt(0)===92))throw Error("Unsafe DAV href path")}let s=new URL(t).pathname.replace(/[/]$/,"");if(s&&o.pathname!==s&&!o.pathname.startsWith(s+"/"))throw Error("DAV href outside repository root");return o.href}function ce(r,{root:t,uuid:o,target:e}={}){let s=O(r),n=(l,m)=>{if(!l||typeof l!="object"||Array.isArray(l)||Object.keys(l).some(g=>!m.includes(g)&&!(g==="#text"&&typeof l[g]=="string"&&l[g].trim()==="")))throw Error("Unsupported DAV discovery structure")};n(s,["?xml","D:multistatus"]);let i=s["D:multistatus"];if(n(i,["D:response"]),!Array.isArray(i["D:response"])||i["D:response"].length!==1)throw Error("DAV discovery requires one response");let a=i["D:response"][0];if(n(a,["D:href","D:propstat"]),L(a["D:href"],{root:t})!==e)throw Error("DAV response target mismatch");if(!Array.isArray(a["D:propstat"])||a["D:propstat"].length!==1)throw Error("DAV discovery requires one property status");let f=a["D:propstat"][0];if(n(f,["D:prop","D:status"]),!/^HTTP[/]1[.][01] 200(?: OK)?$/.test(f["D:status"]))throw Error("DAV discovery properties unavailable");let c=f["D:prop"];if(n(c,["S:repository-uuid","D:version-controlled-configuration"]),c["S:repository-uuid"]!==o||typeof o!="string"||!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(o))throw Error("DAV UUID does not match local identity");let p=c["D:version-controlled-configuration"];return n(p,["D:href"]),{uuid:o,vcc:L(p["D:href"],{root:t}),target:e}}function pe(r,{root:t,revision:o}={}){w(o);let e=O(r),s=(l,m)=>{if(!l||typeof l!="object"||Array.isArray(l)||Object.keys(l).some(g=>!m.includes(g)))throw Error("Invalid DAV baseline structure")};s(e,["D:multistatus"]);let n=e["D:multistatus"];if(s(n,["D:response"]),n["D:response"]?.length!==1)throw Error("One DAV baseline response required");let i=n["D:response"][0];s(i,["D:href","D:propstat"]);let a=L(i["D:href"],{root:t});if(i["D:propstat"]?.length!==1)throw Error("One DAV baseline status required");let f=i["D:propstat"][0];if(s(f,["D:status","D:prop"]),f["D:status"]!=="HTTP/1.1 200 OK")throw Error("DAV baseline status unavailable");let c=f["D:prop"];if(s(c,["D:version-name","D:baseline-collection"]),c["D:version-name"]!==o)throw Error("DAV baseline revision mismatch");s(c["D:baseline-collection"],["D:href"]);let p=L(c["D:baseline-collection"]["D:href"],{root:t});if(!p.endsWith("/"))throw Error("DAV baseline collection must end in slash");return{revision:o,baseline:a,collection:p}}function fe({request:r,assertAuthorized:t}={}){if(typeof r!="function"||typeof t!="function")throw Error("DAV chain requires transport and authorization");return async(o,{revision:e,signal:s}={})=>{w(e),I(o.root,o.scope,e);let n=o.root,i=new URL(n).origin,a=n.endsWith("/")?n:n+"/",f=async(m,g)=>{s?.throwIfAborted(),await t(o,{signal:s}),s?.throwIfAborted();let y=await r(m,{origin:i,signal:s,...g});if(s?.throwIfAborted(),await t(o,{signal:s}),s?.throwIfAborted(),!Buffer.isBuffer(y)||y.length>2097152)throw Error("Invalid DAV response bytes");return new TextDecoder("utf-8",{fatal:!0}).decode(y)},c=await f(a,{method:"PROPFIND",depth:0,body:'<D:propfind xmlns:D="DAV:" xmlns:S="http://subversion.tigris.org/xmlns/dav/"><D:prop><S:repository-uuid/><D:version-controlled-configuration/></D:prop></D:propfind>'}),{vcc:p}=ce(c,{root:n,target:a,uuid:o.uuid}),l=await f(p,{method:"PROPFIND",depth:0,label:e,body:'<D:propfind xmlns:D="DAV:"><D:prop><D:baseline-collection/><D:version-name/></D:prop></D:propfind>'});return{...pe(l,{root:n,revision:e}),uuid:o.uuid}}}function le(r,{root:t,target:o}={}){let e=O(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)))throw Error("Invalid DAV property names structure")};s(e,["D:multistatus"]);let n=e["D:multistatus"];if(s(n,["D:response"]),n["D:response"]?.length!==1)throw Error("One DAV property response required");let i=n["D:response"][0];if(s(i,["D:href","D:propstat"]),L(i["D:href"],{root:t})!==o)throw Error("DAV property target mismatch");if(i["D:propstat"]?.length!==1)throw Error("One DAV property status required");let a=i["D:propstat"][0];if(s(a,["D:status","D:prop"]),a["D:status"]!=="HTTP/1.1 200 OK")throw Error("DAV property names unavailable");let f=a["D:prop"];if(f!==""&&(!f||typeof f!="object"||Array.isArray(f)||Object.keys(f).length>1e3||Object.entries(f).some(([p,l])=>!/^[DSPC]:[^:]+$/.test(p)||l!=="")))throw Error("DAV property names must be empty");let c=f===""?[]:Object.keys(f);return{names:c,special:c.includes("P:special")}}var Le=r=>r.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""");function de({request:r}={}){if(typeof r!="function")throw Error("Bounded DAV request required");return async(t,{identity:o,assertAuthorized:e,signal:s}={})=>{let n=C(t,o),i=n.args[0],a=fe({request:r,assertAuthorized:e}),f=await a(o,{revision:n.pegRevision,signal:s}),c=async(y,u)=>{s?.throwIfAborted(),await e(),s?.throwIfAborted();let d=await r(y,{origin:new URL(o.root).origin,...u,signal:s});if(s?.throwIfAborted(),await e(),s?.throwIfAborted(),!Buffer.isBuffer(d)||d.length>2097152)throw Error("Invalid DAV transport bytes");return d};if(i==="log"){let y=ae(t,o);return c(f.collection,{method:"REPORT",body:y.body})}let p=n.path.slice(1).split("/").map(y=>encodeURIComponent(y).replace(/[!'()*]/g,u=>"%"+u.charCodeAt(0).toString(16).toUpperCase())).join("/"),l=L(f.collection+p,{root:o.root}),m=await c(l,{method:"PROPFIND",depth:0,body:'<D:propfind xmlns:D="DAV:"><D:propname/></D:propfind>'}),g=le(new TextDecoder("utf-8",{fatal:!0}).decode(m),{root:o.root,target:l});if(i==="proplist")return'<properties><target path="'+Le(n.args.at(-1).slice(0,n.args.at(-1).lastIndexOf("@")))+'">'+(g.special?'<property name="svn:special"/>':"")+"</target></properties>";if(g.special)throw Error("SVN special content forbidden");return c(l,{method:"GET"})}}function gt(r,t){return se(r,t,{transportFormat:"dav",transport:de({request:ie()})})}export{gt as createSvnHttpsHost};
|
|
1
|
+
import{createHandler as Ie}from"../index.mjs";import{XMLParser as he,XMLValidator as me}from"fast-xml-parser";function O(r){if(typeof r!="string"||Buffer.byteLength(r)>2097152||/<!DOCTYPE|<!ENTITY/i.test(r)||me.validate(r)!==!0)throw Error("Invalid DAV XML");let t=new he({preserveOrder:!0,ignoreAttributes:!1,parseTagValue:!1,parseAttributeValue:!1,trimValues:!1}).parse(r),o=0,e=(s,n,i=0)=>{if(i>32)throw Error("DAV XML too deep");let a=Object.create(null),f="";for(let c of s){if(++o>1e4)throw Error("DAV XML too many nodes");if(Object.hasOwn(c,"#text")){f+=c["#text"];continue}let p=Object.keys(c).filter(b=>b!==":@");if(p.length!==1)throw Error("Invalid DAV XML node");let l=p[0];if(l==="?xml"){if(i!==0)throw Error("Unexpected XML declaration");continue}let m={...n},w={};for(let[b,V]of Object.entries(c[":@"]||{}))b==="@_xmlns"?m[""]=V:b.startsWith("@_xmlns:")?m[b.slice(8)]=V:w[b]=V;let y=l.split(":");if(y.length>2)throw Error("Invalid DAV XML name");let u=y.length===2?y[0]:"",d=y.at(-1),h=m[u],g=h==="DAV:"?"D:"+d:h==="http://subversion.tigris.org/xmlns/dav/"?"S:"+d:h==="svn:"?"L:"+d:h==="http://subversion.tigris.org/xmlns/svn/"?"P:"+d:h==="http://subversion.tigris.org/xmlns/custom/"?"C:"+d:null;if(!g)throw Error("Unsupported DAV namespace");let D=["L:added-path","L:deleted-path","L:modified-path","L:replaced-path"].includes(g);if(Object.keys(w).length&&(!D||Object.keys(w).some(b=>!["@_node-kind","@_text-mods","@_prop-mods","@_copyfrom-path","@_copyfrom-rev"].includes(b))))throw Error("Unexpected DAV attribute");let v=e(c[l],m,i+1);if(D&&typeof v!="string")throw Error("Invalid DAV path text");let E=D?{...w,"#text":v}:v;if(["D:response","D:propstat","L:log-item","L:added-path","L:deleted-path","L:modified-path","L:replaced-path"].includes(g))(a[g]??=[]).push(E);else{if(Object.hasOwn(a,g))throw Error("Duplicate DAV expanded name");a[g]=E}}if(!Object.keys(a).length)return f;if(f.trim())throw Error("Mixed DAV XML content");return a};return e(t,{})}var ve=9223372036854775807n;function S(r){if(typeof r!="string"||r.length>19||!/^(0|[1-9][0-9]*)$/.test(r))throw new Error("Invalid SVN revision");let t=BigInt(r);if(t>ve)throw new Error("SVN revision exceeds supported range");return t}function H(r){let t=S(r);return t===0n?null:String(t-1n)}function j(r,{snapshot:t,cursor:o=t,limit:e=50}={}){let s=S(t),n=S(o);if(n>s||!Number.isInteger(e)||e<1||e>100||!Array.isArray(r)||r.length>e+1)throw new Error("Invalid SVN page bounds");let i=n+1n;for(let f of r){let c=S(f);if(c>n||c>=i)throw new Error("SVN revisions must descend within cursor");i=c}let a=r.slice(0,e);return{snapshot:t,revisions:a,nextRevision:r.length>e?H(a.at(-1)):null}}function J(r,t){let o=O(r);if(!o||typeof o!="object"||Object.keys(o).length!==1||!Object.hasOwn(o,"L:log-report"))throw Error("Invalid DAV log root");let e=o["L:log-report"],s;if(e==="")s=[];else{if(!e||typeof e!="object"||Object.keys(e).some(a=>a!=="L:log-item")||!Array.isArray(e["L:log-item"]))throw Error("Invalid DAV log structure");s=e["L:log-item"]}if(s.length>101)throw Error("DAV log entries exceed limit");let n=s.map(a=>{if(!a||typeof a!="object"||Array.isArray(a)||Object.keys(a).some(c=>!["D:version-name","D:comment","D:creator-displayname","L:date"].includes(c)))throw Error("Unsupported DAV log item");let f=c=>{let p=a[c]??"";if(typeof p!="string")throw Error("Invalid DAV log text");return p};return{revision:f("D:version-name"),message:f("D:comment"),author:f("D:creator-displayname"),date:f("L:date")}}),i=j(n.map(a=>a.revision),t);return{snapshot:i.snapshot,entries:n.slice(0,i.revisions.length),nextRevision:i.nextRevision}}function k(r){if(typeof r!="string"||r.length>32768||!r.startsWith("/")||/[\u0000-\u001f\u007f\\]/.test(r))throw new Error("Invalid SVN repository path");if(r!=="/"&&r.slice(1).split("/").some(t=>t===""||t==="."||t===".."))throw new Error("Noncanonical SVN repository path");return r}function P(r,t){return k(r),k(t),t==="/"||r===t||r.startsWith(t+"/")}function q(r,t){if(!Array.isArray(r)||r.length>1e4)throw new Error("Invalid SVN path nodes");let o=r.map(e=>{let s=["#text","@_action","@_kind","@_copyfrom-path","@_copyfrom-rev","@_text-mods","@_prop-mods"];if(!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).some(n=>!s.includes(n)))throw new Error("Invalid SVN path node");for(let n of["@_text-mods","@_prop-mods"])if(Object.hasOwn(e,n)&&!["true","false","unknown"].includes(e[n]))throw new Error("Invalid SVN modification flag");return{...Object.hasOwn(e,"@_text-mods")?{textModified:e["@_text-mods"]}:{},...Object.hasOwn(e,"@_prop-mods")?{propertiesModified:e["@_prop-mods"]}:{},path:e["#text"],action:e["@_action"],kind:e["@_kind"],...Object.hasOwn(e,"@_copyfrom-path")?{copyFromPath:e["@_copyfrom-path"]}:{},...Object.hasOwn(e,"@_copyfrom-rev")?{copyFromRevision:e["@_copyfrom-rev"]}:{}}});return $(o,t)}function $(r,{scope:t,revision:o}={}){k(t);let e=S(o);if(!Array.isArray(r)||r.length>1e4||e===0n&&r.length!==0)throw new Error("Invalid SVN changed paths");let s=new Set;return r.map(i=>{if(!i||typeof i!="object"||Array.isArray(i)||Object.keys(i).some(u=>!["path","action","kind","copyFromPath","copyFromRevision","copySourceOutsideScope","textModified","propertiesModified"].includes(u)))throw new Error("Invalid SVN change structure");let{path:a,action:f,kind:c,copyFromPath:p,copyFromRevision:l}=i;if(k(a),s.has(a)||!["A","D","M","R"].includes(f)||!["file","dir","unknown"].includes(c))throw new Error("Invalid SVN change");s.add(a);let m=p!==void 0||l!==void 0;if(m&&(k(p),!["A","R"].includes(f)||S(l)>=e))throw new Error("Invalid SVN copy source");let w=Object.hasOwn(i,"copySourceOutsideScope");if(w&&(i.copySourceOutsideScope!==!0||m||!["A","R"].includes(f)))throw new Error("Invalid SVN redacted copy source");let y={path:a,action:f,kind:c,...w?{copySourceOutsideScope:!0}:{}};for(let u of["textModified","propertiesModified"])if(Object.hasOwn(i,u)){if(!["true","false","unknown"].includes(i[u]))throw new Error("Invalid SVN modification flag");y[u]=i[u]}return m&&(P(p,t)?(y.copyFromPath=p,y.copyFromRevision=l):y.copySourceOutsideScope=!0),y}).filter(i=>P(i.path,t))}function G(r,{scope:t,revision:o}={}){S(o);let e=O(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)))throw Error("Invalid DAV detail structure")};s(e,["L:log-report"]);let n=e["L:log-report"];if(s(n,["L:log-item"]),n["L:log-item"]?.length!==1)throw Error("One DAV detail revision required");let i=n["L:log-item"][0],a={"L:added-path":"A","L:deleted-path":"D","L:modified-path":"M","L:replaced-path":"R"};if(s(i,["D:version-name","D:comment","D:creator-displayname","L:date",...Object.keys(a)]),i["D:version-name"]!==o)throw Error("DAV detail revision mismatch");let f=p=>{let l=i[p]??"";if(typeof l!="string")throw Error("Invalid DAV detail text");return l},c=[];for(let[p,l]of Object.entries(a))for(let m of i[p]??[]){let{"@_node-kind":w,...y}=m;c.push({...y,"@_kind":w??"unknown","@_action":l})}return{revision:o,author:f("D:creator-displayname"),date:f("L:date"),message:f("D:comment"),changes:q(c,{scope:t,revision:o})}}function I(r,t,o){if(k(t),S(o),typeof r!="string"||r.length>32768||/[\x00-\x20\x7f\\?#]/.test(r))throw new Error("Invalid SVN HTTPS root");let e=new URL(r);if(e.protocol!=="https:"||e.username||e.password||e.href!==r)throw new Error("Noncanonical SVN HTTPS root");let s=e.pathname.split("/").slice(1);s.at(-1)===""&&s.pop();for(let f of s){let c=decodeURIComponent(f);if(!f||c==="."||c===".."||/[\x00-\x1f\x7f/\\]/.test(c))throw new Error("Invalid SVN root path")}let n=r.endsWith("/")?r.slice(0,-1):r,i=t==="/"?"":t.split("/").map(f=>encodeURIComponent(f).replace(/[!'()*]/g,c=>"%"+c.charCodeAt(0).toString(16).toUpperCase())).join("/"),a=n+(i||(e.pathname==="/"?"/":""))+"@"+o;if(a.length>32768)throw new Error("SVN target too long");return a}function B({root:r,scope:t,path:o=t,snapshot:e,revision:s}={}){if(S(s)>S(e))throw new Error("SVN selected revision exceeds snapshot");if(!P(o,t))throw new Error("SVN detail path outside scope");let n=I(r,o,e);return{scope:t,revision:s,snapshot:e,args:["log","--xml","--verbose","--stop-on-copy","--non-interactive","--no-auth-cache","--limit","1","-r",s+":"+s,"--",n]}}function M({root:r,scope:t,path:o=t,snapshot:e,cursor:s=e,limit:n=50}={}){if(j([],{snapshot:e,cursor:s,limit:n}),!P(o,t))throw new Error("SVN history path outside scope");let i=I(r,o,e);return{snapshot:e,cursor:s,limit:n,args:["log","--xml","--stop-on-copy","--non-interactive","--no-auth-cache","--limit",String(n+1),"-r",s+":0","--",i]}}function C(r,t){let o=r?.args;if(!Array.isArray(o)||o.length>16||o.some(l=>typeof l!="string"))throw Error("Invalid SVN command");let e=o.at(-1),s=e.lastIndexOf("@"),n=e.slice(s+1);S(n);let i=t.root.endsWith("/")?t.root.slice(0,-1):t.root;I(t.root,"/",n);let a=e.slice(0,s);if(!(a===i||a.startsWith(i+"/")))throw Error("SVN command target outside root");let f=a.slice(i.length),c=f?"/"+f.slice(1).split("/").map(l=>decodeURIComponent(l)).join("/"):"/";if(!P(c,t.scope)||I(t.root,c,n)!==e)throw Error("SVN command target outside scope or noncanonical");let p;if(o[0]==="cat"||o[0]==="proplist"){S(o[o[0]==="cat"?4:5]);let l=o[o[0]==="cat"?4:5];if(l!==n)throw Error("SVN content operative and peg mismatch");p=o[0]==="cat"?["cat","--non-interactive","--no-auth-cache","-r",l,"--",e]:["proplist","--xml","--non-interactive","--no-auth-cache","-r",l,"--",e]}else if(o[0]==="log")if(o.includes("--verbose")){let l=o[9]?.split(":")[0];p=B({...t,path:c,snapshot:n,revision:l}).args}else{let l=o[8]?.split(":")[0],m=Number(o[6])-1;p=M({...t,path:c,snapshot:n,cursor:l,limit:m}).args}else throw Error("SVN command is not readonly history");if(JSON.stringify(o)!==JSON.stringify(p))throw Error("Unsupported SVN command shape");return{path:c,pegRevision:n,args:[...p]}}function K(r,{scope:t,revision:o,path:e}={}){if(S(o)===0n)throw new Error("SVN r0 has no change comparison");let s=$(r,{scope:t,revision:o}).find(a=>a.path===e);if(!s)throw new Error("SVN path is not an authorized changed member");if(s.kind!=="file")throw new Error("Only SVN file changes can be compared");let n=H(o),i=a=>a===null?{empty:!0}:{empty:!1,path:s.path,revision:a,pegRevision:a};return{path:s.path,action:s.action,left:i(s.action==="A"?null:n),right:i(s.action==="D"?null:o)}}import{XMLParser as ge,XMLValidator as we}from"fast-xml-parser";function Q(r,{target:t,allowEmpty:o=!1}={}){if(typeof t!="string"||!t||t.length>32768)throw new Error("Invalid SVN property target");if(typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||we.validate(r)!==!0)throw new Error("Invalid SVN property XML");let e=new ge({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:p=>p==="target"||p==="property"}).parse(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)&&!(m==="#text"&&typeof p[m]=="string"&&/^[ \t\r\n]*$/.test(p[m]))))throw new Error("Invalid SVN property structure")};if(s(e,["?xml","properties"]),o===!0&&typeof e.properties=="string"&&/^[ \t\r\n]*$/.test(e.properties))return{target:t,names:[],special:!1};s(e.properties,["target"]);let n=e.properties.target;if(!Array.isArray(n)||n.length!==1)throw new Error("Expected one SVN property target");let i=n[0];if(s(i,["@_path","property"]),i["@_path"]!==t)throw new Error("SVN property target mismatch");let a=i.property??[];if(!Array.isArray(a)||a.length>1e4)throw new Error("Too many SVN properties");let f=[],c=new Set;for(let p of a){s(p,["@_name"]);let l=p["@_name"];if(typeof l!="string"||!l||l.length>1024||/[\x00-\x20\x7f]/.test(l)||c.has(l))throw new Error("Invalid SVN property name");c.add(l),f.push(l)}return{target:t,names:f,special:c.has("svn:special")}}import{createHash as Ve}from"node:crypto";import{XMLParser as ye,XMLValidator as Se}from"fast-xml-parser";function Z(r,{scope:t,revision:o}={}){if(S(o),typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||Se.validate(r)!==!0)throw new Error("Invalid SVN detail XML");let e=new ye({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:c=>c==="logentry"||c==="path"}).parse(r),s=(c,p)=>{if(!c||typeof c!="object"||Array.isArray(c)||Object.keys(c).some(l=>!p.includes(l)&&!(l==="#text"&&typeof c[l]=="string"&&/^[ \t\r\n]*$/.test(c[l]))))throw new Error("Invalid SVN detail structure")};if(s(e,["?xml","log"]),s(e.log,["logentry"]),!Array.isArray(e.log.logentry)||e.log.logentry.length!==1)throw new Error("Expected one SVN revision");let n=e.log.logentry[0];if(s(n,["@_revision","author","date","msg","paths"]),n["@_revision"]!==o)throw new Error("SVN detail revision mismatch");let i=c=>{let p=n[c]??"";if(typeof p!="string")throw new Error("Invalid SVN detail text");return p},a=[];n.paths!==void 0&&!(typeof n.paths=="string"&&/^[ \t\r\n]*$/.test(n.paths))&&(s(n.paths,["path"]),a=n.paths.path??[]);let f=q(a,{scope:t,revision:o});return{revision:o,author:i("author"),date:i("date"),message:i("msg"),pathsAvailable:Object.hasOwn(n,"paths"),changes:f}}import{randomBytes as De}from"node:crypto";function ee(r){if(!r||typeof r!="object")throw Error("Invalid SVN consent identity");let{sessionId:t,cwd:o,repositoryId:e,root:s,uuid:n,scope:i}=r;for(let a of[t,o,e])if(typeof a!="string"||!a||a.length>32768||a.includes("\0"))throw Error("Invalid SVN consent scope");if(I(s,"/","0"),k(i),typeof n!="string"||!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(n))throw Error("Invalid SVN repository UUID");return JSON.stringify([t,o,e,s,n,i])}function W({now:r=Date.now,ttlMs:t=3e5,maxEntries:o=32,onRevoke:e=()=>{}}={}){if(!Number.isInteger(t)||t<1||t>3e5||!Number.isInteger(o)||o<1||o>32)throw Error("Invalid SVN consent bounds");if(typeof e!="function")throw Error("Invalid SVN revoke listener");let s=new Map,n=a=>{s.delete(a)&&e(a)},i=()=>{for(let[a,f]of s)f.expires<=r()&&n(a)};return{grant(a,{explicit:f=!1}={}){if(f!==!0)throw Error("Explicit SVN network consent required");let c=ee(a);i();for(let[l,m]of s)m.key===c&&n(l);for(;s.size>=o;)n(s.keys().next().value);let p=De(32).toString("hex");return s.set(p,{key:c,sessionId:a.sessionId,expires:r()+t}),p},assert(a,f){i();let c=ee(f),p=s.get(a);if(!p||p.key!==c)throw Object.assign(Error("SVN network consent missing, expired or identity changed"),{code:"vcs/svn-consent-required"})},revokeSession(a){for(let[f,c]of s)c.sessionId===a&&n(f)},revoke(a){n(a)},clear(){for(let a of[...s.keys()])n(a)}}}import{XMLParser as be,XMLValidator as Ee}from"fast-xml-parser";function re(r,t){let o=Ae(r),e=j(o.map(s=>s.revision),t);return{snapshot:e.snapshot,entries:o.slice(0,e.revisions.length),nextRevision:e.nextRevision}}function Ae(r){if(typeof r!="string"||Buffer.byteLength(r,"utf8")>2*1024*1024||/<!DOCTYPE|<!ENTITY/i.test(r)||Ee.validate(r)!==!0)throw new Error("Invalid SVN log XML");let o=new be({ignoreAttributes:!1,parseAttributeValue:!1,parseTagValue:!1,trimValues:!1,isArray:n=>n==="logentry"}).parse(r);if(!Object.hasOwn(o,"log")||Object.keys(o).some(n=>n!=="log"&&n!=="?xml"))throw new Error("Invalid SVN log root");let e=o.log;if(typeof e=="string"&&/^[ \t\r\n]*$/.test(e))return[];if(e&&typeof e=="object"&&typeof e["#text"]=="string"&&/^[ \t\r\n]*$/.test(e["#text"])&&delete e["#text"],!e||typeof e!="object"||Object.keys(e).some(n=>n!=="logentry")||!Array.isArray(e.logentry)||e.logentry.length>101)throw new Error("Invalid SVN log entries");let s=new Set;return e.logentry.map(n=>{if(!n||typeof n!="object"||Array.isArray(n)||Object.keys(n).some(f=>!["@_revision","author","date","msg","#text"].includes(f))||"#text"in n&&(typeof n["#text"]!="string"||!/^[ \t\r\n]*$/.test(n["#text"])))throw new Error("Unsupported SVN log entry structure");let i=n["@_revision"];if(S(i),s.has(i))throw new Error("Duplicate SVN revision");s.add(i);let a=f=>{let c=n[f]??"";if(typeof c!="string")throw new Error("Invalid SVN log text");return c};return{revision:i,author:a("author"),date:a("date"),message:a("msg")}})}function te({resolveIdentity:r,transport:t,now:o=Date.now,timeoutMs:e=15e3,transportFormat:s="cli"}={}){if(!["cli","dav"].includes(s))throw Error("Invalid SVN transport format");if(!Number.isInteger(e)||e<1||e>15e3)throw Error("Invalid SVN runtime deadline");if(typeof r!="function")throw Error("Local identity resolver required");let n=W({now:o}),i=W({now:o,onRevoke:u=>m(u)}),a=!1,f=()=>{if(a)throw new DOMException("SVN runtime disposed","AbortError")},c=async(u,d)=>{f(),d?.throwIfAborted();let h=await r(u,d);return f(),d?.throwIfAborted(),{...h,sessionId:u.sessionId,cwd:h.cwd,repositoryId:u.repositoryId}},p=u=>u.revision===void 0?{}:(S(u.revision),{snapshot:u.revision}),l=new Map,m=u=>{for(let d of l.get(u)||[])d.controller.abort(new DOMException("SVN consent revoked","AbortError"))},w=async(u,d)=>{f(),C(u,d.identity),d.signal?.throwIfAborted(),i.assert(d.token,d.identity);let h=new AbortController,g=()=>h.abort(d.signal.reason);d.signal?.addEventListener("abort",g,{once:!0});let D={controller:h,sessionId:d.identity.sessionId};l.has(d.token)||l.set(d.token,new Set),l.get(d.token).add(D);let v=setTimeout(()=>h.abort(new DOMException("SVN transport deadline exceeded","TimeoutError")),e);try{let E=async()=>{h.signal.throwIfAborted();let V=await c({sessionId:d.identity.sessionId,repositoryId:d.identity.repositoryId},h.signal);i.assert(d.token,V),h.signal.throwIfAborted()},b=await t(u,{...d,timeoutMs:e,signal:h.signal,assertAuthorized:E});if(h.signal.throwIfAborted(),!(typeof b=="string"||Buffer.isBuffer(b))||Buffer.byteLength(b)>d.maxBytes)throw Error("SVN transport output exceeds byte limit or has invalid type");return Buffer.isBuffer(b)&&u.args[0]!=="cat"?new TextDecoder("utf-8",{fatal:!0}).decode(b):b}catch(E){throw h.signal.aborted?h.signal.reason:E}finally{let E=l.get(d.token);E?.delete(D),E?.size||l.delete(d.token),clearTimeout(v),d.signal?.removeEventListener("abort",g)}},y={async describe(u,{signal:d}={}){let h=await c(u,d),g=p(h),D=n.grant(h,{explicit:!0});return{...g,offer:D,root:h.root,uuid:h.uuid,scope:h.scope,origin:new URL(h.root).origin,expiresAt:o()+3e5,remoteEnabled:typeof t=="function"}},async approve(u,{offer:d,explicit:h=!1,signal:g}={}){if(h!==!0)throw Error("Explicit SVN network consent required");let D=await c(u,g);if(n.assert(d,D),typeof t!="function")throw Error("SVN remote transport disabled");let v=p(D),E=i.grant(D,{explicit:!0});return n.revoke(d),{...v,token:E,expiresAt:o()+3e5}},async log(u,{token:d,snapshot:h,cursor:g,limit:D,path:v,signal:E}={}){let b=await c(u,E);if(i.assert(d,b),typeof t!="function")throw Error("SVN remote transport disabled");let V=M({...b,snapshot:h,cursor:g,limit:D,path:v});E?.throwIfAborted();let A=await w(V,{identity:b,token:d,signal:E,maxBytes:2097152,timeoutMs:15e3});E?.throwIfAborted();let x=await c(u,E);return i.assert(d,x),(s==="dav"?J:re)(A,V)},async detail(u,{token:d,snapshot:h,revision:g,signal:D}={}){let v=await c(u,D);if(i.assert(d,v),typeof t!="function")throw Error("SVN remote transport disabled");let E=B({...v,snapshot:h,revision:g}),b=await w(E,{identity:v,token:d,signal:D,maxBytes:2097152,timeoutMs:15e3});D?.throwIfAborted(),i.assert(d,await c(u,D));let V=s==="dav"?{...G(b,E),pathsAvailable:!0}:Z(b,E);return{...V,snapshot:h,changes:V.changes.map(A=>({...A,id:Ve("sha256").update(JSON.stringify([v.root,v.uuid,v.scope,h,g,A])).digest("hex")}))}},async compare(u,{token:d,snapshot:h,revision:g,id:D,signal:v}={}){if(typeof D!="string"||!/^[a-f0-9]{64}$/.test(D))throw Error("Invalid SVN change ID");let E=await y.detail(u,{token:d,snapshot:h,revision:g,signal:v}),b=E.changes.find(N=>N.id===D);if(!b)throw Error("SVN change is not selected revision member");let V=await c(u,v);i.assert(d,V);let A=K(E.changes.map(({id:N,..._})=>_),{scope:V.scope,revision:g,path:b.path}),x=async N=>{if(N.empty)return{label:"empty",text:"",absent:!0};let _=await c(u,v);i.assert(d,_);let U=I(_.root,N.path,N.pegRevision),z={identity:_,token:d,signal:v,maxBytes:2097152,timeoutMs:15e3},ue=await w({args:["proplist","--xml","--non-interactive","--no-auth-cache","-r",N.revision,"--",U]},z);if(v?.throwIfAborted(),i.assert(d,await c(u,v)),Q(ue,{target:U.slice(0,U.lastIndexOf("@")),allowEmpty:!0}).special)throw Error("SVN special files cannot be compared");let X=await w({args:["cat","--non-interactive","--no-auth-cache","-r",N.revision,"--",U]},z);v?.throwIfAborted(),i.assert(d,await c(u,v));let F=Buffer.isBuffer(X)?X:Buffer.from(X);if(F.length>2097152)throw Error("SVN text exceeds 2 MiB");if(F.includes(0))return{label:"r"+N.revision,text:"",binary:!0};let Y;try{Y=new TextDecoder("utf-8",{fatal:!0}).decode(F)}catch{return{label:"r"+N.revision,text:"",binary:!0}}return{label:"r"+N.revision,text:Y}},T=await x(A.left),R=await x(A.right);return{path:b.path,revision:g,snapshot:h,left:T,right:R,binary:!!(T.binary||R.binary)}},async trace(u,{token:d,snapshot:h,revision:g,id:D,cursor:v,limit:E=50,signal:b}={}){if(typeof D!="string"||!/^[a-f0-9]{64}$/.test(D))throw Error("Invalid SVN change ID");let V=await y.detail(u,{token:d,snapshot:h,revision:g,signal:b}),A=V.changes.find(R=>R.id===D);if(!A||A.kind!=="file")throw Error("SVN tracing requires selected file member");let x=A.action==="D"?H(g):g;return{...await y.log(u,{token:d,snapshot:x,cursor:v??x,limit:E,path:A.path,signal:b}),selectionSnapshot:h,selectionRevision:g,path:A.path,pegRevision:x,stopOnCopy:!0,copySourceOutsideScope:!!A.copySourceOutsideScope}},async copytrace(u,{token:d,snapshot:h,revision:g,id:D,cursor:v,limit:E=50,signal:b}={}){if(typeof D!="string"||!/^[a-f0-9]{64}$/.test(D))throw Error("Invalid SVN change ID");let V=await y.detail(u,{token:d,snapshot:h,revision:g,signal:b}),A=V.changes.find(R=>R.id===D);if(!A||A.kind!=="file"||A.copySourceOutsideScope||A.copyFromPath===void 0||A.copyFromRevision===void 0)throw Error("Selected file has no authorized copy source");let x=A.copyFromRevision;return{...await y.log(u,{token:d,snapshot:x,cursor:v??x,limit:E,path:A.copyFromPath,signal:b}),selectionSnapshot:h,selectionRevision:g,path:A.copyFromPath,pegRevision:x,sourceForPath:A.path,stopOnCopy:!0}},async revoke(u,{token:d,signal:h}={}){let g=await c(u,h);return i.assert(d,g),i.revoke(d),m(d),{revoked:!0}},dispose(){a=!0,n.clear(),i.clear();for(let u of l.keys())m(u)},revokeSession(u){n.revokeSession(u),i.revokeSession(u);for(let[d,h]of l)[...h].some(g=>g.sessionId===u)&&m(d)}};return y}var oe={revoke:["token"],describe:[],approve:["offer","explicit"],log:["token","snapshot","cursor","limit"],detail:["token","snapshot","revision"],compare:["token","snapshot","revision","id"],trace:["token","snapshot","revision","id","cursor","limit"],copytrace:["token","snapshot","revision","id","cursor","limit"]};function xe(r,t){if(!t||typeof t!="object"||Array.isArray(t))throw Error("Object payload required");if(Object.keys(t).some(o=>!["sessionId","repositoryId",...oe[r]].includes(o)))throw Error("Unknown SVN request field");for(let o of["sessionId","repositoryId"])if(typeof t[o]!="string"||!t[o]||t[o].length>1024||t[o].includes("\0"))throw Error("Invalid SVN Session address");if(r==="approve"&&(t.explicit!==!0||typeof t.offer!="string"||!/^[a-f0-9]{64}$/.test(t.offer)))throw Error("Explicit scoped offer required");if(!["describe","approve"].includes(r)){if(typeof t.token!="string"||!/^[a-f0-9]{64}$/.test(t.token))throw Error("SVN consent token required");if(r!=="revoke"&&S(t.snapshot),t.revision!==void 0&&S(t.revision),["detail","compare","trace","copytrace"].includes(r)&&t.revision===void 0)throw Error("Selected SVN revision required");if(t.cursor!==void 0&&S(t.cursor),t.limit!==void 0&&(!Number.isInteger(t.limit)||t.limit<1||t.limit>100))throw Error("Invalid SVN page size");if(["compare","trace","copytrace"].includes(r)&&(typeof t.id!="string"||!/^[a-f0-9]{64}$/.test(t.id)))throw Error("Selected SVN change ID required")}}function ne(r,{timeoutMs:t=15e3}={}){if(!Number.isInteger(t)||t<1||t>15e3)throw Error("Invalid SVN RPC deadline");let o=0;return async(e,s,n)=>{let i=e.startsWith("vcs/svn-")?e.slice(8):"";if(!Object.hasOwn(oe,i))return{ok:!1,error:{code:"vcs/not-found",message:"Unknown SVN endpoint"}};if(i!=="revoke"&&o>=2)return{ok:!1,error:{code:"vcs/busy",message:"SVN history requests busy"}};i!=="revoke"&&o++;let a=new AbortController,f=()=>a.abort(n.reason);n?.addEventListener("abort",f,{once:!0}),n?.aborted&&f();let c=setTimeout(()=>a.abort(new DOMException("SVN operation deadline exceeded","TimeoutError")),t);try{n?.throwIfAborted(),xe(i,s);let{sessionId:p,repositoryId:l,...m}=s,w=await r[i]({sessionId:p,repositoryId:l},{...m,signal:a.signal});return a.signal.throwIfAborted(),{ok:!0,value:w}}catch(p){let l=n?.aborted||p?.name==="AbortError"?"vcs/cancelled":["vcs/rediscover-required","vcs/svn-consent-required"].includes(p?.code)?p.code:"vcs/operation-failed",m=a.signal.aborted?a.signal.reason:p,w=m instanceof Error?m.message:String(m);return{ok:!1,error:{code:l,message:w}}}finally{clearTimeout(c),n?.removeEventListener("abort",f),i!=="revoke"&&o--}}}var Ne=new Set(["describe","approve","log","detail","compare","trace","copytrace","revoke"]);function se(r,t,{transport:o,transportFormat:e="cli",now:s=Date.now,timeoutMs:n=15e3}={}){let i,a=Ie(r,t,4,{now:s,bindSvnIdentityResolver:p=>{i=p}}),f=te({resolveIdentity:i,transport:o,transportFormat:e,now:s,timeoutMs:n}),c=ne(f,{timeoutMs:n});return{handle(p,l,m){let w=p.startsWith("vcs/svn-")?p.slice(8):"";return Ne.has(w)?c(p,l,m):a(p,l,m)},revokeSession:p=>f.revokeSession(p),dispose:()=>f.dispose()}}import{request as Oe}from"node:https";function ie({request:r=Oe}={}){return async(t,{origin:o,method:e="GET",body:s="",depth:n,label:i,signal:a,maxBytes:f=2097152,timeoutMs:c=15e3}={})=>{let p=new URL(t);if(p.protocol!=="https:"||p.origin!==o||p.username||p.password||p.hash||p.href!==t||!["GET","PROPFIND","REPORT"].includes(e)||typeof s!="string"||Buffer.byteLength(s)>65536||!Number.isInteger(f)||f<1||f>2097152||!Number.isInteger(c)||c<1||c>15e3)throw Error("Invalid bounded HTTPS request");if(n!==void 0&&(e!=="PROPFIND"||n!==0))throw Error("Invalid DAV depth");if(i!==void 0){if(e!=="PROPFIND"||n!==0)throw Error("Invalid DAV label");S(i)}let l={...n===0?{Depth:"0"}:{},...i!==void 0?{Label:i}:{}};return a?.throwIfAborted(),new Promise((m,w)=>{let y,u,d=null,h=null,g=0,D=[],v=A=>{d??=A,u?.destroy(),y?.destroy()},E=()=>v(a.reason??new DOMException("HTTPS cancelled","AbortError")),b=setTimeout(()=>v(new DOMException("HTTPS deadline exceeded","TimeoutError")),c),V=()=>{clearTimeout(b),a?.removeEventListener("abort",E)};try{y=r(p,{method:e,agent:!1,rejectUnauthorized:!0,maxHeaderSize:16384,headers:{...l,"Accept-Encoding":"identity","Content-Type":"text/xml; charset=utf-8","Content-Length":String(Buffer.byteLength(s))}},A=>{u=A;let x=u.statusCode??0;if(x>=300&&x<400){v(Error("HTTPS redirects forbidden"));return}if(x<200||x>=300){v(Error("HTTPS status "+x));return}if(u.headers["content-encoding"]&&u.headers["content-encoding"]!=="identity"){v(Error("HTTPS compressed responses forbidden"));return}let T=u.headers["content-length"];if(T!==void 0&&(!/^[0-9]+$/.test(T)||Number(T)>f)){v(Error("HTTPS response exceeds byte limit"));return}u.on("data",R=>{g+=R.length,g>f?v(Error("HTTPS response exceeds byte limit")):d||D.push(R)}),u.on("error",v),u.on("end",()=>{if(!u.complete){v(Error("HTTPS response incomplete"));return}h=Buffer.concat(D)})}),y.on("error",A=>{d??=A}),y.once("close",()=>{V(),d?w(d):h!==null?m(h):w(Error("HTTPS response closed before completion"))}),a?.addEventListener("abort",E,{once:!0}),a?.aborted?E():y.end(s)}catch(A){V(),y?.destroy(),w(A)}})}}var ke=r=>r.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'");function ae(r,t){let o=C(r,t),e=o.args;if(e[0]!=="log")throw Error("DAV log report requires readonly log plan");let s=e.includes("--verbose"),n=e[s?9:8].split(":"),i=e[s?7:6],a=o.path==="/"?"":o.path.slice(1),f='<?xml version="1.0" encoding="utf-8"?><S:log-report xmlns:S="svn:" xmlns:D="DAV:"><S:start-revision>'+n[0]+"</S:start-revision><S:end-revision>"+n[1]+"</S:end-revision><S:limit>"+i+"</S:limit><S:strict-node-history/>"+(s?"<S:discover-changed-paths/>":"")+"<S:path>"+ke(a)+"</S:path><S:revprop>svn:author</S:revprop><S:revprop>svn:date</S:revprop><S:revprop>svn:log</S:revprop></S:log-report>";if(Buffer.byteLength(f)>65536)throw Error("DAV request body exceeds limit");return{method:"REPORT",body:f,pegRevision:o.pegRevision,path:o.path,requiresVerifiedBaseline:!0}}function L(r,{root:t}={}){if(I(t,"/","0"),typeof r!="string"||!r||r.length>32768||/[\\?#]/.test(r)||[...r].some(n=>n.charCodeAt(0)<=32||n.charCodeAt(0)===127))throw Error("Invalid DAV href");if(!(r.startsWith("/")&&!r.startsWith("//"))&&!r.startsWith("https://"))throw Error("DAV href must be absolute path or HTTPS URL");let o=new URL(r,new URL(t).origin);if(o.protocol!=="https:"||o.origin!==new URL(t).origin||o.username||o.password||o.search||o.hash)throw Error("DAV href outside authorized origin");if(r.startsWith("https://")&&o.href!==r||r.startsWith("/")&&o.pathname!==r)throw Error("Noncanonical DAV href");let e=o.pathname.split("/").slice(1);e.at(-1)===""&&e.pop();for(let n of e){let i=decodeURIComponent(n);if(!n||i==="."||i===".."||[...i].some(a=>a.charCodeAt(0)<32||a.charCodeAt(0)===127||a==="/"||a.charCodeAt(0)===92))throw Error("Unsafe DAV href path")}let s=new URL(t).pathname.replace(/[/]$/,"");if(s&&o.pathname!==s&&!o.pathname.startsWith(s+"/"))throw Error("DAV href outside repository root");return o.href}function ce(r,{root:t,uuid:o,target:e}={}){let s=O(r),n=(l,m)=>{if(!l||typeof l!="object"||Array.isArray(l)||Object.keys(l).some(w=>!m.includes(w)&&!(w==="#text"&&typeof l[w]=="string"&&l[w].trim()==="")))throw Error("Unsupported DAV discovery structure")};n(s,["?xml","D:multistatus"]);let i=s["D:multistatus"];if(n(i,["D:response"]),!Array.isArray(i["D:response"])||i["D:response"].length!==1)throw Error("DAV discovery requires one response");let a=i["D:response"][0];if(n(a,["D:href","D:propstat"]),L(a["D:href"],{root:t})!==e)throw Error("DAV response target mismatch");if(!Array.isArray(a["D:propstat"])||a["D:propstat"].length!==1)throw Error("DAV discovery requires one property status");let f=a["D:propstat"][0];if(n(f,["D:prop","D:status"]),!/^HTTP[/]1[.][01] 200(?: OK)?$/.test(f["D:status"]))throw Error("DAV discovery properties unavailable");let c=f["D:prop"];if(n(c,["S:repository-uuid","D:version-controlled-configuration"]),c["S:repository-uuid"]!==o||typeof o!="string"||!/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(o))throw Error("DAV UUID does not match local identity");let p=c["D:version-controlled-configuration"];return n(p,["D:href"]),{uuid:o,vcc:L(p["D:href"],{root:t}),target:e}}function pe(r,{root:t,revision:o}={}){S(o);let e=O(r),s=(l,m)=>{if(!l||typeof l!="object"||Array.isArray(l)||Object.keys(l).some(w=>!m.includes(w)))throw Error("Invalid DAV baseline structure")};s(e,["D:multistatus"]);let n=e["D:multistatus"];if(s(n,["D:response"]),n["D:response"]?.length!==1)throw Error("One DAV baseline response required");let i=n["D:response"][0];s(i,["D:href","D:propstat"]);let a=L(i["D:href"],{root:t});if(i["D:propstat"]?.length!==1)throw Error("One DAV baseline status required");let f=i["D:propstat"][0];if(s(f,["D:status","D:prop"]),f["D:status"]!=="HTTP/1.1 200 OK")throw Error("DAV baseline status unavailable");let c=f["D:prop"];if(s(c,["D:version-name","D:baseline-collection"]),c["D:version-name"]!==o)throw Error("DAV baseline revision mismatch");s(c["D:baseline-collection"],["D:href"]);let p=L(c["D:baseline-collection"]["D:href"],{root:t});if(!p.endsWith("/"))throw Error("DAV baseline collection must end in slash");return{revision:o,baseline:a,collection:p}}function fe({request:r,assertAuthorized:t}={}){if(typeof r!="function"||typeof t!="function")throw Error("DAV chain requires transport and authorization");return async(o,{revision:e,signal:s}={})=>{S(e),I(o.root,o.scope,e);let n=o.root,i=new URL(n).origin,a=n.endsWith("/")?n:n+"/",f=async(m,w)=>{s?.throwIfAborted(),await t(o,{signal:s}),s?.throwIfAborted();let y=await r(m,{origin:i,signal:s,...w});if(s?.throwIfAborted(),await t(o,{signal:s}),s?.throwIfAborted(),!Buffer.isBuffer(y)||y.length>2097152)throw Error("Invalid DAV response bytes");return new TextDecoder("utf-8",{fatal:!0}).decode(y)},c=await f(a,{method:"PROPFIND",depth:0,body:'<D:propfind xmlns:D="DAV:" xmlns:S="http://subversion.tigris.org/xmlns/dav/"><D:prop><S:repository-uuid/><D:version-controlled-configuration/></D:prop></D:propfind>'}),{vcc:p}=ce(c,{root:n,target:a,uuid:o.uuid}),l=await f(p,{method:"PROPFIND",depth:0,label:e,body:'<D:propfind xmlns:D="DAV:"><D:prop><D:baseline-collection/><D:version-name/></D:prop></D:propfind>'});return{...pe(l,{root:n,revision:e}),uuid:o.uuid}}}function le(r,{root:t,target:o}={}){let e=O(r),s=(p,l)=>{if(!p||typeof p!="object"||Array.isArray(p)||Object.keys(p).some(m=>!l.includes(m)))throw Error("Invalid DAV property names structure")};s(e,["D:multistatus"]);let n=e["D:multistatus"];if(s(n,["D:response"]),n["D:response"]?.length!==1)throw Error("One DAV property response required");let i=n["D:response"][0];if(s(i,["D:href","D:propstat"]),L(i["D:href"],{root:t})!==o)throw Error("DAV property target mismatch");if(i["D:propstat"]?.length!==1)throw Error("One DAV property status required");let a=i["D:propstat"][0];if(s(a,["D:status","D:prop"]),a["D:status"]!=="HTTP/1.1 200 OK")throw Error("DAV property names unavailable");let f=a["D:prop"];if(f!==""&&(!f||typeof f!="object"||Array.isArray(f)||Object.keys(f).length>1e3||Object.entries(f).some(([p,l])=>!/^[DSPC]:[^:]+$/.test(p)||l!=="")))throw Error("DAV property names must be empty");let c=f===""?[]:Object.keys(f);return{names:c,special:c.includes("P:special")}}var Le=r=>r.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""");function de({request:r}={}){if(typeof r!="function")throw Error("Bounded DAV request required");return async(t,{identity:o,assertAuthorized:e,signal:s}={})=>{let n=C(t,o),i=n.args[0],a=fe({request:r,assertAuthorized:e}),f=await a(o,{revision:n.pegRevision,signal:s}),c=async(y,u)=>{s?.throwIfAborted(),await e(),s?.throwIfAborted();let d=await r(y,{origin:new URL(o.root).origin,...u,signal:s});if(s?.throwIfAborted(),await e(),s?.throwIfAborted(),!Buffer.isBuffer(d)||d.length>2097152)throw Error("Invalid DAV transport bytes");return d};if(i==="log"){let y=ae(t,o);return c(f.collection,{method:"REPORT",body:y.body})}let p=n.path.slice(1).split("/").map(y=>encodeURIComponent(y).replace(/[!'()*]/g,u=>"%"+u.charCodeAt(0).toString(16).toUpperCase())).join("/"),l=L(f.collection+p,{root:o.root}),m=await c(l,{method:"PROPFIND",depth:0,body:'<D:propfind xmlns:D="DAV:"><D:propname/></D:propfind>'}),w=le(new TextDecoder("utf-8",{fatal:!0}).decode(m),{root:o.root,target:l});if(i==="proplist")return'<properties><target path="'+Le(n.args.at(-1).slice(0,n.args.at(-1).lastIndexOf("@")))+'">'+(w.special?'<property name="svn:special"/>':"")+"</target></properties>";if(w.special)throw Error("SVN special content forbidden");return c(l,{method:"GET"})}}function gt(r,t){return se(r,t,{transportFormat:"dav",transport:de({request:ie()})})}export{gt as createSvnHttpsHost};
|