Class WsReconcileBranchesDraftMojo
- All Implemented Interfaces:
org.apache.maven.api.plugin.Mojo
- Direct Known Subclasses:
WsReconcileBranchesPublishMojo
workspace.yaml branch fields against on-disk git
state (preview).
This is the ws:reconcile-branches-draft goal — recovery /
rare-use, separated from the ws:align-{draft,publish}
POM-axis daily driver per ike-issues#200's two-axis split (Option B).
Each goal name now describes its audience: ws:align-draft /
ws:align-publish (backed by
AlignmentReconciler) is the
safe daily POM convergence; ws:reconcile-branches-draft /
-publish is the branch-state recovery operation that runs
when something has already gone wrong.
Three directions are supported via -Dfrom=...:
repos(default) — read each subproject's actual branch and updateworkspace.yamlto match.manifest—git checkouteach subproject to the branch declared inworkspace.yaml.workspace-head— the workspace repo's HEAD is authoritative; reconcile both YAML fields and on-disk branches to that single value (ike-issues#287).
mvn ws:reconcile-branches-draft # report only (from=repos)
mvn ws:reconcile-branches-publish # apply (from=repos)
mvn ws:reconcile-branches-publish -Dfrom=manifest # checkout repos to declared branches
mvn ws:reconcile-branches-publish -Dfrom=workspace-head -Dforce=true
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected booleanPrompt the user with a yes/no question, accepting "y"/"yes"/"n"/"no" (case-insensitive).final voidexecute()Run the goal and write its report.protected org.apache.maven.api.plugin.LoggetLog()Access the Maven logger.protected network.ike.plugin.support.IkePrompterTheIkePrompterfor this goal — built lazily from the session's interactive flag, or the test-injected instance.protected org.apache.maven.api.SessionAccess the Maven session injected by Maven 4's plugin DI.protected StringGet the current branch of a subproject directory.protected StringgitShortSha(File subprojectDir) Get the short SHA of HEAD for a subproject directory.protected StringRungit status --porcelainon a subproject directory and return the output (empty string = clean).protected StringFormat a goal header line using the workspace name.protected booleanCheck whether a workspace.yaml exists in the directory hierarchy.protected network.ike.workspace.WorkspaceGraphLoad the manifest and build the workspace graph.protected StringrequireParam(String currentValue, String propertyName, String promptLabel) Prompt the user interactively for a required parameter when it was not supplied on the command line.protected PathResolve the manifest path — explicit parameter, or search upward.protected WorkspaceReportSpecrunGoal()Run this goal's work and return the report it produced.protected StringselectFromList(String label, List<String> options) Prompt the user to pick from a numbered list.protected voidsetLog(org.apache.maven.api.plugin.Log log) Replace the logger.protected static network.ike.workspace.FeatureNamevalidateFeatureName(String feature) Validate a feature-name string withFeatureName.of(String)and surface any rule violation as a cleanMojoException(the rawIllegalArgumentExceptionwould otherwise bubble up as a Maven internal error).protected static network.ike.workspace.MavenVersionvalidateMavenVersion(String version) Validate a Maven version string withMavenVersion.of(String)and surface any rule violation as aMojoException(ike-issues#295).protected static network.ike.workspace.SubprojectNamevalidateSubprojectName(String subproject) Validate a subproject-name string withSubprojectName.of(String)and surface any rule violation as aMojoException(ike-issues#295).protected StringRead the workspace name from the root POM's artifactId.protected FileResolve the workspace root directory (parent of workspace.yaml).
-
Constructor Details
-
WsReconcileBranchesDraftMojo
public WsReconcileBranchesDraftMojo()Creates this goal instance.
-
-
Method Details
-
runGoal
Run this goal's work and return the report it produced.Implementations do the goal's actual work here and return a
WorkspaceReportSpec— the goal identity and the Markdown body. The base class resolves the workspace root and writes the file. A goal cannot be implemented without producing a report, which is the structural fix for the missing-report bug class (IKE-Network/ike-issues#413 / #407).On failure, throw
MojoExceptionas usual — a failed goal produces no report, and Maven surfaces the exception.- Returns:
- the report this goal produced (never
null) - Throws:
org.apache.maven.api.plugin.MojoException- if the goal fails
-
getLog
protected org.apache.maven.api.plugin.Log getLog()Access the Maven logger.- Returns:
- the logger instance
-
getSession
protected org.apache.maven.api.Session getSession()Access the Maven session injected by Maven 4's plugin DI.- Returns:
- the injected session (may be
nullin unit tests)
-
setLog
protected void setLog(org.apache.maven.api.plugin.Log log) Replace the logger. Used when a mojo is constructed directly (not via Maven's DI container) and so never had a logger injected —WsSyncMojodrivesPullWorkspaceMojoandPushMojoinstances it created itself.- Parameters:
log- the replacement logger
-
getPrompter
protected network.ike.plugin.support.IkePrompter getPrompter()TheIkePrompterfor this goal — built lazily from the session's interactive flag, or the test-injected instance. Callers that pass it to a static helper (e.g.FeatureFinishSupport.promptStaleBranchCleanup(File, List, String, String, IkePrompter, Log)) use this.- Returns:
- the prompter (never
null)
-
loadGraph
protected network.ike.workspace.WorkspaceGraph loadGraph()Load the manifest and build the workspace graph.- Returns:
- the workspace dependency graph
- Throws:
org.apache.maven.api.plugin.MojoException- if the manifest cannot be read
-
resolveManifest
Resolve the manifest path — explicit parameter, or search upward.- Returns:
- path to the workspace manifest file
- Throws:
org.apache.maven.api.plugin.MojoException- if the manifest cannot be found
-
workspaceRoot
Resolve the workspace root directory (parent of workspace.yaml).- Returns:
- the workspace root directory
- Throws:
org.apache.maven.api.plugin.MojoException- if the manifest cannot be found
-
gitStatus
-
gitBranch
-
gitShortSha
-
isWorkspaceMode
protected boolean isWorkspaceMode()Check whether a workspace.yaml exists in the directory hierarchy. Does not throw — returns false if no manifest is found.- Returns:
- true if running inside a workspace, false for a bare repo
-
requireParam
Prompt the user interactively for a required parameter when it was not supplied on the command line.Delegates to the
IkePrompter(IKE-Network/ike-issues#385): an inline prompt on a real terminal, an own-line prompt in a piped IDE runner. In batch mode it throws a clear error directing the user to pass the property explicitly.- Parameters:
currentValue- the value from the@Parameterfield (may be null)propertyName- the-Dproperty name (for the error message)promptLabel- human-readable label shown in the prompt; callers pass it without trailing punctuation (a": "separator is appended here)- Returns:
- the resolved value — either the original or user-supplied
- Throws:
org.apache.maven.api.plugin.MojoException- if no value can be obtained
-
validateFeatureName
Validate a feature-name string withFeatureName.of(String)and surface any rule violation as a cleanMojoException(the rawIllegalArgumentExceptionwould otherwise bubble up as a Maven internal error). Use this anywhere a feature name leaves the-Dfeature=command-line boundary (ike-issues#205).- Parameters:
feature- the candidate feature name (must already be resolved — i.e. non-null afterrequireParam(String, String, String)or auto-detection)- Returns:
- the validated
FeatureNamevalue - Throws:
org.apache.maven.api.plugin.MojoException- iffeaturefails theFeatureNamesyntax rules
-
validateSubprojectName
Validate a subproject-name string withSubprojectName.of(String)and surface any rule violation as aMojoException(ike-issues#295).- Parameters:
subproject- the candidate subproject name (already resolved — non-null afterrequireParam(String, String, String)or POM derivation)- Returns:
- the validated
SubprojectNamevalue - Throws:
org.apache.maven.api.plugin.MojoException- ifsubprojectfails theSubprojectNamesyntax rules
-
validateMavenVersion
Validate a Maven version string withMavenVersion.of(String)and surface any rule violation as aMojoException(ike-issues#295). Perfeedback_no_semver_assumptionthe validator accepts single-segment monotonic, semver-like, calendar-based, and branch-qualified versions; it does not enforce semver.- Parameters:
version- the candidate version string- Returns:
- the validated
MavenVersionvalue - Throws:
org.apache.maven.api.plugin.MojoException- ifversionfails theMavenVersionsyntax rules
-
confirm
Prompt the user with a yes/no question, accepting "y"/"yes"/"n"/"no" (case-insensitive). When invoked in a non-interactive context, the default is used.- Parameters:
label- the question to display (without trailing punctuation)defaultYes- whethertrue(yes) is the default- Returns:
truefor yes,falsefor no- Throws:
org.apache.maven.api.plugin.MojoException- if no answer can be obtained
-
selectFromList
Prompt the user to pick from a numbered list. Returns the chosen option, ornullwhen the list is empty.- Parameters:
label- prompt header (printed via the Prompter as a message)options- ordered list of choices- Returns:
- the chosen option, or
nullifoptionsis empty - Throws:
org.apache.maven.api.plugin.MojoException- if no valid choice can be obtained
-
workspaceName
Read the workspace name from the root POM's artifactId. Falls back to "Workspace" if the POM cannot be read.- Returns:
- the workspace name derived from the root POM artifactId
-
header
-
execute
public final void execute() throws org.apache.maven.api.plugin.MojoExceptionRun the goal and write its report.This method is
final: everyws:*goal follows the same template — do the work, then write exactly one report. Subclasses supply the work and the report content by implementingrunGoal(); they cannot overrideexecute()to skip the report. That is what makes report-writing structural — a goal that compiles necessarily writes a report, so the #407 bug class (a goal runs fine but silently writes none) becomes compiler-impossible (IKE-Network/ike-issues#413).The report lands in its per-goal file at the workspace root (
ws꞉goal-name.md);WorkspaceReportself-heals the nearest.gitignoreso reports never land in git. A-publishrun does not delete the matching-draftreport — both are timestamped history (ike-issues#413).- Specified by:
executein interfaceorg.apache.maven.api.plugin.Mojo- Throws:
org.apache.maven.api.plugin.MojoException- if the goal fails
-