From bdd44bc00d0c5d017047f3380d572cd16ea2fdaf Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Fri, 7 Aug 2026 01:24:25 -0700 Subject: [PATCH 1/3] Drop the polyfill for native workspace APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The engine now covers everything this SDK used the polyfill for (dagger/dagger#13769): findConfigDirs is Workspace.findConfigDirs, and module sources load through Workspace.moduleSource with moduleName / introspectionSchemaJSON read off the native ModuleSource. generateModule also stops hand-building its changeset from raw directory diffs: it stages through Workspace.fork, so the changeset comes back measured from the caller's cwd and a change outside the cwd is a loud error — hand-built root-measured diffs used to land in the wrong place when generating from a subdirectory. The engineVersion bump and the dependency removal land together: the version gate scopes the engine's new changeset rooting to migrated modules. Signed-off-by: Guillaume de Rouville --- dagger-module.toml | 6 +----- dagger.json | 11 ++--------- dagger.lock | 1 - main.dang | 13 +++---------- mod.dang | 31 +++++++++++-------------------- 5 files changed, 17 insertions(+), 45 deletions(-) diff --git a/dagger-module.toml b/dagger-module.toml index 3d53cf8..7465738 100644 --- a/dagger-module.toml +++ b/dagger-module.toml @@ -1,10 +1,6 @@ name = "java-sdk" -engineVersion = "v1.0.0-0" +engineVersion = "v1.0.0-beta.10" [runtime] source = "dang" -[[dependencies]] - name = "polyfill" - source = "github.com/dagger/polyfill@main" - pin = "e90bbfc4843258a877a3a95b8db1571e7981e65f" diff --git a/dagger.json b/dagger.json index e38c38e..95b85ed 100644 --- a/dagger.json +++ b/dagger.json @@ -1,14 +1,7 @@ { "name": "java-sdk", - "engineVersion": "latest", + "engineVersion": "v1.0.0-beta.10", "sdk": { "source": "dang" - }, - "dependencies": [ - { - "name": "polyfill", - "source": "github.com/dagger/polyfill@main", - "pin": "e90bbfc4843258a877a3a95b8db1571e7981e65f" - } - ] + } } diff --git a/dagger.lock b/dagger.lock index f8cfb64..617173c 100644 --- a/dagger.lock +++ b/dagger.lock @@ -1,4 +1,3 @@ [["version","1"]] ["","git.head",["https://github.com/dagger/dang-sdk"],"c724eec4270870aae489daa9f3cb8cbacfb44680","float"] ["","git.head",["https://github.com/dagger/sdk-sdk"],"8c164424b7a8a37b33a77367ef7547490d5b87b5","float"] -["","git.ref",["https://github.com/dagger/polyfill","main"],"ec3ea84a2351b4beb06ecece951f2e5ef66509ff","float"] \ No newline at end of file diff --git a/main.dang b/main.dang index eed9566..edcddcd 100644 --- a/main.dang +++ b/main.dang @@ -56,14 +56,8 @@ type JavaSdk { rawPath.trimSuffix("/") } - let before = if (modPath == ".") { - ws.directory("/", include: ["**"]) - } else { - ws.directory("/", include: [modPath + "/**"]) - } - let selectedTemplate = if (template == "") { "default" } else { template } - before.withDirectory(modPath, renderedTemplate(name, selectedTemplate)).changes(before) + ws.fork.withNewDirectory("/" + modPath, renderedTemplate(name, selectedTemplate)).changes } """ @@ -96,15 +90,14 @@ type JavaSdk { (currentModule.asSDK.modules). So running from a subdirectory acts on the project you're in — and the projects beneath it — not the whole workspace. - Discovery is the polyfill's cwd-aware findConfigDirs (dagger/dagger#13688); + Discovery is the engine's cwd-aware Workspace.findConfigDirs; this maps its cwd-relative results to workspace-root-relative paths and keeps the ones this SDK manages, whether they use dagger-module.toml or dagger.json. """ modules(ws: Workspace!): [Mod!]! { let managed = ws.sdk(name: currentModule.name).modules.{{source}} let cwd = normalizePath(ws.cwd) - polyfill - .workspace(ws) + ws .findConfigDirs(moduleConfigFilenames, exclude: ["**/target/**"]) .map { dir => moduleRelPath(cwd, dir) } .uniq diff --git a/mod.dang b/mod.dang index f6a2922..67e2246 100644 --- a/mod.dang +++ b/mod.dang @@ -199,13 +199,10 @@ type Mod { Stage the vendored SDK + generated entrypoint for one module. """ let generateModule(ws: Workspace!, modPathArg: String!): Changeset! { - # Native module-source resolution (Directory.asModuleSource, Query.moduleSource) - # fails from module code: SDK and user-defaults loading need the requester's host - # session. The polyfill resolves the source from a nested client that has one. # Anchor rootPath at "/" so a non-root workspace cwd is not prefixed again. - let modSource = polyfill.workspace(ws).moduleSource("/" + modPathArg) - let name = modSource.core.moduleName - let introspectionJSON = modSource.core.introspectionSchemaJSON + let modSource = ws.moduleSource("/" + modPathArg) + let name = modSource.moduleName + let introspectionJSON = modSource.introspectionSchemaJSON let vendored = vendoredSdk(introspectionJSON, name) # the module as committed, with the whole committed sdk/ dropped (source and @@ -217,24 +214,18 @@ type Mod { .withoutDirectory("src/generated") let entrypoint = generatedEntrypoint(baseDir, name) - let before = if (modPathArg == ".") { - ws.directory("/", include: ["**"]) - } else { - ws.directory("/", include: [modPathArg + "/**"]) - } - let staged = before - .withDirectory(joinPath(modPathArg, "sdk"), vendored) - .withDirectory(joinPath(modPathArg, "src/generated/java"), entrypoint) + # Stage through a workspace fork: the changeset comes back measured from + # the caller's cwd, the way the client applies it. + let staged = ws.fork + .withNewDirectory("/" + joinPath(modPathArg, "sdk"), vendored) + .withNewDirectory("/" + joinPath(modPathArg, "src/generated/java"), entrypoint) if (vendorSdkJar) { staged - .withDirectory(joinPath(modPathArg, "sdk/repo"), vendoredSdkJar( - introspectionJSON, - name, - )) - .changes(before) + .withNewDirectory("/" + joinPath(modPathArg, "sdk/repo"), vendoredSdkJar(introspectionJSON, name)) + .changes } else { - staged.changes(before) + staged.changes } } From 575984744365a834f4b9760ef30a7a001eb2d1df Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Tue, 11 Aug 2026 15:15:18 -0700 Subject: [PATCH 2/3] Use engine-managed modules in cwd scope Signed-off-by: Guillaume de Rouville --- main.dang | 46 +++++++++------------------------------------- main.dang.tmpl | 47 +++++++++-------------------------------------- 2 files changed, 18 insertions(+), 75 deletions(-) diff --git a/main.dang b/main.dang index edcddcd..0874d79 100644 --- a/main.dang +++ b/main.dang @@ -84,26 +84,17 @@ type JavaSdk { Return every Java SDK module this workspace manages that is visible from the client's current location. - Discovery is anchored at the client's cwd (never the workspace root): the - nearest enclosing module plus every module at or below the cwd, intersected - with the SDK's engine-owned list of managed modules - (currentModule.asSDK.modules). So running from a subdirectory acts on the - project you're in — and the projects beneath it — not the whole workspace. - - Discovery is the engine's cwd-aware Workspace.findConfigDirs; - this maps its cwd-relative results to workspace-root-relative paths and keeps - the ones this SDK manages, whether they use dagger-module.toml or dagger.json. + The engine selects the modules directly from the workspace's registered SDK + modules: every module at or below the cwd, plus the nearest enclosing module + when the cwd itself is not managed. No filesystem discovery or intersection + is required. """ modules(ws: Workspace!): [Mod!]! { - let managed = ws.sdk(name: currentModule.name).modules.{{source}} - let cwd = normalizePath(ws.cwd) - ws - .findConfigDirs(moduleConfigFilenames, exclude: ["**/target/**"]) - .map { dir => moduleRelPath(cwd, dir) } - .uniq - .filter { path => managed.filter { m => normalizePath(m.source) == path }.length > 0 } - .map { path => Mod( - rootPath: path, + currentModule + .asSDK(workspace: ws) + .modulesInScope.{{path}} + .map { module => Mod( + rootPath: module.path, ws: ws, skipGenerateFilename: skipGenerateFilename, vendorSdkJar: vendorSdkJar, @@ -119,25 +110,6 @@ type JavaSdk { if (normalized == "") { "." } else { normalized } } - """ - Resolve a findConfigDirs result — a cwd-relative path, at or below the cwd - ("." , "sub/dir") or a strict ancestor (".." , "../..") — against the cwd into a - workspace-root-relative path, the format both managed module sources and - Mod.rootPath use. - """ - let moduleRelPath(cwd: String!, dir: String!): String! { - let base = if (cwd == "" or cwd == ".") { [] } else { cwd.split("/") } - let segs = dir.split("/").reduce(base) { acc, seg => - if (seg == "..") { - acc.dropLast(1) - } else if (seg == "." or seg == "") { - acc - } else { - acc + [seg] - } - } - if (segs.length == 0) { "." } else { segs.join("/") } - } """ Generate every managed Java SDK module visible from the client's current diff --git a/main.dang.tmpl b/main.dang.tmpl index 52aea22..7d9b404 100644 --- a/main.dang.tmpl +++ b/main.dang.tmpl @@ -90,27 +90,17 @@ type JavaSdk { Return every Java SDK module this workspace manages that is visible from the client's current location. - Discovery is anchored at the client's cwd (never the workspace root): the - nearest enclosing module plus every module at or below the cwd, intersected - with the SDK's engine-owned list of managed modules - (currentModule.asSDK.modules). So running from a subdirectory acts on the - project you're in — and the projects beneath it — not the whole workspace. - - Discovery is the polyfill's cwd-aware findConfigDirs (dagger/dagger#13688); - this maps its cwd-relative results to workspace-root-relative paths and keeps - the ones this SDK manages, whether they use dagger-module.toml or dagger.json. + The engine selects the modules directly from the workspace's registered SDK + modules: every module at or below the cwd, plus the nearest enclosing module + when the cwd itself is not managed. No filesystem discovery or intersection + is required. """ modules(ws: Workspace!): [Mod!]! { - let managed = ws.sdk(name: currentModule.name).modules.{{source}} - let cwd = normalizePath(ws.cwd) - polyfill - .workspace(ws) - .findConfigDirs(moduleConfigFilenames, exclude: ["**/target/**"]) - .map { dir => moduleRelPath(cwd, dir) } - .uniq - .filter { path => managed.filter { m => normalizePath(m.source) == path }.length > 0 } - .map { path => Mod( - rootPath: path, + currentModule + .asSDK(workspace: ws) + .modulesInScope.{{path}} + .map { module => Mod( + rootPath: module.path, ws: ws, skipGenerateFilename: skipGenerateFilename, vendorSdkJar: vendorSdkJar, @@ -126,25 +116,6 @@ type JavaSdk { if (normalized == "") { "." } else { normalized } } - """ - Resolve a findConfigDirs result — a cwd-relative path, at or below the cwd - ("." , "sub/dir") or a strict ancestor (".." , "../..") — against the cwd into a - workspace-root-relative path, the format both managed module sources and - Mod.rootPath use. - """ - let moduleRelPath(cwd: String!, dir: String!): String! { - let base = if (cwd == "" or cwd == ".") { [] } else { cwd.split("/") } - let segs = dir.split("/").reduce(base) { acc, seg => - if (seg == "..") { - acc.dropLast(1) - } else if (seg == "." or seg == "") { - acc - } else { - acc + [seg] - } - } - if (segs.length == 0) { "." } else { segs.join("/") } - } """ Generate every managed Java SDK module visible from the client's current From 9631e88ef3c8d7a68cce22914f230dba2abab10e Mon Sep 17 00:00:00 2001 From: Guillaume de Rouville Date: Tue, 11 Aug 2026 16:26:08 -0700 Subject: [PATCH 3/3] Fix Java generation for native workspace APIs --- .dagger/modules/e2e/main.dang | 8 ++++---- dagger-module.toml | 1 - main.dang.tmpl | 8 +------- .../dagger-codegen-maven-plugin-0.21.4.jar | Bin 67901 -> 68039 bytes .../dagger/codegen/introspection/Helpers.java | 4 ++-- .../introspection/InterfaceVisitor.java | 8 ++++++++ 6 files changed, 15 insertions(+), 14 deletions(-) diff --git a/.dagger/modules/e2e/main.dang b/.dagger/modules/e2e/main.dang index 1b95544..3182b64 100644 --- a/.dagger/modules/e2e/main.dang +++ b/.dagger/modules/e2e/main.dang @@ -235,14 +235,14 @@ type E2e { let fromParent = javaSdk.generateAll( root.asWorkspace(cwd: fixtureRoot + "/generate"), ) - assertAdded(fromParent, generateModulePath + "/sdk/src/main/java/io/dagger/client/Dagger.java") - assertAdded(fromParent, generateModulePath + "/src/generated/java/io/dagger/gen/entrypoint/Entrypoint.java") + assertAdded(fromParent, "app/sdk/src/main/java/io/dagger/client/Dagger.java") + assertAdded(fromParent, "app/src/generated/java/io/dagger/gen/entrypoint/Entrypoint.java") let fromModule = javaSdk.generateAll( root.asWorkspace(cwd: generateModulePath), ) - assertAdded(fromModule, generateModulePath + "/sdk/src/main/java/io/dagger/client/Dagger.java") - assertAdded(fromModule, generateModulePath + "/src/generated/java/io/dagger/gen/entrypoint/Entrypoint.java") + assertAdded(fromModule, "sdk/src/main/java/io/dagger/client/Dagger.java") + assertAdded(fromModule, "src/generated/java/io/dagger/gen/entrypoint/Entrypoint.java") null } diff --git a/dagger-module.toml b/dagger-module.toml index 7465738..2bf7646 100644 --- a/dagger-module.toml +++ b/dagger-module.toml @@ -3,4 +3,3 @@ engineVersion = "v1.0.0-beta.10" [runtime] source = "dang" - diff --git a/main.dang.tmpl b/main.dang.tmpl index 7d9b404..d457be9 100644 --- a/main.dang.tmpl +++ b/main.dang.tmpl @@ -56,14 +56,8 @@ type JavaSdk { rawPath.trimSuffix("/") } - let before = if (modPath == ".") { - ws.directory("/", include: ["**"]) - } else { - ws.directory("/", include: [modPath + "/**"]) - } - let selectedTemplate = if (template == "") { "default" } else { template } - before.withDirectory(modPath, renderedTemplate(name, selectedTemplate)).changes(before) + ws.fork.withNewDirectory("/" + modPath, renderedTemplate(name, selectedTemplate)).changes } """ diff --git a/prebuilt/m2/io/dagger/dagger-codegen-maven-plugin/0.21.4/dagger-codegen-maven-plugin-0.21.4.jar b/prebuilt/m2/io/dagger/dagger-codegen-maven-plugin/0.21.4/dagger-codegen-maven-plugin-0.21.4.jar index e4c09a036e2ae6e7994879f652fc651716b912f1..8ba5f73b3b1ddc6b62aaadecce9e1039812d3268 100644 GIT binary patch delta 9458 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%0Du=?z+fwi5s^uF>J%r0 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 mkfibcvxH#%vplf3diA%w-pOSEAeF{HHICw z-68swKNo&Cdu%kHuiuBSHhca39Ui`V|94FNo5oV+!2Rrtz%Qr#hxNtlP{)nO=V|bp zTy~kS-;q<@= zM-Iu^UpeHFotvmW9}WtaewiR=vGFBN7cY6slL_$-p%h@jkX-f9@27xWQ7)E@x!;*L zzzFsIjZM7lCPo}lO6Qvr_cj^}9H>b(C^hlZ1Z(sv3=cD74-v;zSpf|a?loq-P584A z%-|BB3H%L?rpX~sj4D$0e1a=YgO2=qeJjx2+0nql?>fp(Y`~jP6ZpdrWf%ctEnfXF4;Eo0y%m+s7$xUIr15x@2nR zra1%oV?($Sf5^fZ09>SFG+I44KhstDD=ad|kPo8Uq8#0ff7r2SOouNpiwUID>>hU0 zZp_|_8o*rO0aJD&w7;1oxxqWZ&g`I8b!lt$Ew z?M1q<)3K;B1!Y4+j=)h;mhLK4e8M22s(?R70xh-qKvat!yt+&(ajZDaBI+VaI9{GM z?@(gcZqZ6x@hifs_sYao)XLhwB4}}GIlFOtK2wOD|BDT0VA+dz5BYq9g^C4vUkqHE zm~O#`AP{2@kmO`$_G9&kkK)@@-&iKx+H+S@V!kZREBg%*jSiDPQ_o3`;FVC4y{xHY zvh@P`inWo;hbdyGn&X*i95d}BlXy>)p5Odq1p;8)xwS1*6$zUVQiJ6rePSu`8E@p- z!4xHk_-UF`YZOVq`M8gJQhJq|e@lT8hxn<#@8?qvKvSiXu~;USpmxgabb{20=}oD% zOWj@5E`L^!&|J4f-CQ|6mZ>h`Xs?wFns{u35Vq}yVHP#pVF=iTI*xRu9SVE7zuWV2ffJva z92ZH=YMNEYN*LVU+Eatu*10putD3VsVN1+}3&PF?Z$wo`0PbO`K+RlI%CzK=7TxAu`Qz$YhCirC(Ifz{C2fV|2 zq?T+^RC9!X*3~dbm-*7Br~CnUuT{q|Av$3FHP&fP7Cb*iyr170z0;-0W%ZrW>D}i>26nlD9Ga`zY_13`NC92v3 z8+^Sa!x7!n_PTkM755cS6w6+)e@FacW~kYO)$B}%p||g7i@)GSKnKAa}XH zph4qS{>2wA6xDryy>SGWcnZg#``#R(ov`U`ZgPt^R`C{+@pCTMq_4D%;t2$_+A@-~ zyQ|e}HpzSU($nSx8|*+`7xe50O8ih{Hq&QbRe_Vy{Oa*?kuBZ6%iK)2zP&Wjt{v_I z0`#UIKK2L!wu-pOf4%NhfffNIX@{@S?T<&@5N8K524g3X^dZw$#{;$Y(Q6HGqY_A9 z=Noe_xM_^4p^EM%#J=0AZ#G)_E$x_)WZcU&D=n)4YcWamyiKDyshN!vLT+>N1J0JGa8U*s zmS(A?UNC8%SOE8(bw@okz1qileE+PQPTmz0Q7g>m&V9?CD<34qCd{6jomZI=EYm5_ z0}aG4G=(k?37P!hK>%P^u#DD|P11nA4F^NUuA>$rhpm;cLD3ds2b$D)ehvAjbAw+c}8UNQ}or`@OVJQoz#@y`& zt41p0`BX7G>w2+@h-;8SmkoiAnaV|fgXRFJW@ybwrS_jw zz)ETb8^FR&)(Vf1ulMj%vBi^u9O0d*tij01;fL%d#)_XA`VGrYYH^%wM zIfGlR{gY*OpH0p4>UGLXYM|;xy}w9pJv1jYjH%q`5pHY2Jcdsw>2B08Jpo0Q3$>qw zqb%T2qTJz~>o!R?JcALCJLZ7l@Pulx>y6V1FMwd^j$+`>!~%B&DSf7<>kY{+n=UTf z2xA*{$}z{TxJK8Iyn3L^72zh&KfcR0qHF5evdYZEO=!Z7v@kS&YrnJGxk}FrGx!}p zvgjXd)+N2w2Zfvk1ezsrN4!740_`{Nw}ew0gkAwUA#_ac+=O6T8ddd𝔪Mkb<`Q_bPErlvEB@IXaX)}d$ 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