From 491c72c036c6a947d3fe59420596527ed12f077d Mon Sep 17 00:00:00 2001 From: Jerry Combs Date: Wed, 28 Oct 2026 09:24:14 -0500 Subject: [PATCH] Show what a Designer import left out, and where the server log is (#174) DirXMLDev 0.57.0 keeps one of two same-named objects when it reads a project, so the imported project loads. The setup result now lists the notes and waits for "Open the workbench" while there are any. The first commit's message records them too. An internal error names where the server log is, and the quickstart says so. Pins DirXMLDev 0.57.0. Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 16 ++++++++++++++ bin/smoke-hosted.sh | 22 +++++++++++++++++++ docs/quickstart.md | 2 ++ pom.xml | 2 +- .../java/com/pointblue/dirxml/web/Api.java | 2 +- .../pointblue/dirxml/web/SetupService.java | 15 +++++++++++++ web/src/components/SetupView.tsx | 15 +++++++++++-- 7 files changed, 70 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 976062eb..3eaee33f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,22 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html) ## [Unreleased] +Needs DirXMLDev 0.57.0. + +### Fixed + +- Importing a Designer project that holds two objects of one name (a driver set using Libraries in + two containers, or a package upgrade's leftover) no longer gives a project where nearly every + page fails with `duplicate artifact path` (#174). The import keeps one, and the page now waits + on the result, saying which one it kept and what was left out, until you open the workbench. The + first commit's message records it too. A project imported before this loads again, and + validation names the duplicate. + +### Changed + +- "An internal error" says where the server log is (`docker logs idmweb`, or the terminal that + runs the server); the quickstart's *Day to day* says so too. + ## [0.80.0] - 2026-10-27 Needs DirXMLDev 0.56.0. diff --git a/bin/smoke-hosted.sh b/bin/smoke-hosted.sh index bf7c5c94..c5b01f98 100755 --- a/bin/smoke-hosted.sh +++ b/bin/smoke-hosted.sh @@ -393,6 +393,28 @@ try: check("adding a project to a server set up with the old repo.* keys keeps its first project", s == 200 and "projects=repo,extra" in conf1 and "project.repo.repo.url=" in conf1 and "repo.url=" not in conf1.replace("project.repo.repo.url=", "").replace("project.extra.repo.url=", "")) s, r, _ = bob.call("POST", "/api/setup/directory", {"project": "outside", "path": "/etc"}) check("a deployer may attach only under setup.roots (#41)", s == 400 and "outside" in r.get("error", "")) + # #174: a Designer project whose driver set uses two Libraries that both hold "es-shared" + proj = os.path.join(work, "two-libraries"); orph = os.path.join(proj, "Model", "EdirOrphan"); os.makedirs(os.path.join(orph, "L2")) + def cobj(name, typ, inner): + return ('%s' % (name, typ, inner)) + def cstr(n, v): return '' % (n, v) + def rel(n, k): return '' % (n, k) + files = { + "DS.DriverSet_": cobj("DS", "DriverSet", cstr("DSetContext", "o=system") + rel("Idm:Libraries", "L2.Library_") + rel("Idm:Libraries", "L1.Library_")), + "L1.Library_": cobj("Library", "Library", cstr("LibraryContext", "cn=DS,o=system") + rel("Idm:Resources", "J1.ECMAScriptResource_")), + "L2.Library_": cobj("Library", "Library", cstr("LibraryContext", "ou=shared,o=system") + rel("Idm:Resources", "J2.ECMAScriptResource_")), + "L2/J1.ECMAScriptResource_": cobj("es-shared", "ECMAScriptResource", cstr("DirXML-ContentType", "text/ecmascript")), + "L2/J1_contents.xml": "function own(){}", + "L2/J2.ECMAScriptResource_": cobj("es-shared", "ECMAScriptResource", cstr("DirXML-ContentType", "text/ecmascript")), + "L2/J2_contents.xml": "function shared(){}", + } + for f, t in files.items(): + open(os.path.join(orph, f), "w").write(t) + open(os.path.join(proj, ".project"), "w").write("two-libraries") + s, r, _ = bob.call("POST", "/api/setup/project", {"project": "twolib", "path": proj}) + check("#174: a project with an object two Libraries hold imports, and the page is told which it kept", s == 200 + and any("kept the resource (in cn=Library,cn=DS,o=system" in n and "one Library" in n for n in r.get("notes", []))) # #42: the audit log, deployers only import datetime def when(t): # 3, 6 or 9 fraction digits: compare as times, not text (#161) diff --git a/docs/quickstart.md b/docs/quickstart.md index a96bd9b4..147aeecf 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -191,6 +191,8 @@ command there (`docker exec idmweb idm vault.status --env lab`) binds as you do - **Stop:** `docker compose -f "$HOME/idmweb/compose.yml" down`. Everything lives in the folder: back it up, move it or delete it, and that is the whole install. - **One per machine:** the container is named `idmweb`. +- **The server log:** `docker logs idmweb` (add `--tail 200` for the end). When the page reports + "an internal error", the stack trace is there; attach it to an issue. - **Moving to a server for a team:** [hosted-install.md](hosted-install.md) is the same image behind a proxy with TLS and your identity provider. Push the folder's `repo.git` to GitHub or GitLab and point the server's project at it. diff --git a/pom.xml b/pom.xml index e2ef33d3..957c6a91 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ - 0.56.0 + 0.57.0 1.7.0