Skip to main content
Moderne OnlyThis recipe is proprietary to Moderne and runs on the Moderne platform or CLI — it isn’t part of the open-source catalog. Available with a Moderne subscription.Contact Sales

Find members held in more than one environment

Recipe IDio.moderne.mainframe.inventory.FindEnvironmentCopies
Artifactio.moderne.recipe:recipes-mainframe

Report every member an environment library holds a copy of, one row from each copy to each of the others, saying whether the two still agree and by how many lines they differ. Promotion is supposed to leave the same member in each environment, and when it stops doing so nothing announces it: the copy that was fixed in production and never merged back reads like every other. A bind deck is the one member meant to differ — it names the DB2 subsystem it binds on, the collection its packages land in and the library it reads its DBRMs from — so a deck differing in exactly those names is reported as bound elsewhere rather than as drift. Each pair is also a COPIED_TO relationship between the two copies as library members, and every copy with company is marked.

Single recipeOpenRewriteModerne Proprietary License
Try in PlatformTry this recipe in the Moderne platform. Not a user yet? You’ll get a no-setup demo environment, with nothing to install or configure.

Options​

1 parameters
1 optional
ParameterExampleTypeRequired
layout{application}/{environment}StringOptional
Which folders of a path say where a member is held. A segment written as itself is matched as itself, {environment} takes the segment naming the environment and {application} the one naming the application whose library it is, and what is left of the path is the member. Defaults to environments/{environment}, which reads environments/PROD/ctlcard/SRTCLM01.ctl as ctlcard/SRTCLM01.ctl in PROD. A shop keeping a library per application per environment writes {application}/{environment} instead.

Usage​

Run this recipe

This recipe has no required configuration options. Users of Moderne can run it via the Moderne CLI.

You will need to have configured the Moderne CLI on your machine before you can run the following command.

shell
mod run . --recipe FindEnvironmentCopies

To also set the recipe's optional settings, add them to the command. The values below are examples, not recommendations; see Options for what each one does.

With optional settings (example values)
mod run . --recipe FindEnvironmentCopies --recipe-option "layout='{application}/{environment}'"

If the recipe is not available locally, then you can install it using:

RELEASE resolves to the newest release and LATEST to the newest build of any kind, including snapshots. Either one lets mod config recipes upgrade pull in later versions without editing this command; a pinned version stays where you put it.

mod config recipes jar install io.moderne.recipe:recipes-mainframe:RELEASE

Data tables​

Environment copies
io.moderne.mainframe.analysis.table.EnvironmentCopies

The same member held in more than one environment's libraries, and whether the copies still agree. Read from one copy's side, so a member promoted through three environments has a row from each of the three to each of the other two.

Export after a run
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.EnvironmentCopies
ColumnDescription
MemberThe member name both copies answer to.
Component typeWhat the member is, in the types of ComponentIndex. Empty for a plain text member no DD names, which the portfolio has no type for.
EnvironmentThe environment this copy is held in, as the segment of its path that names one: SLPROD, PREPROD, PROD.
Source pathThis copy's file.
Owning applicationThe application whose library this is, where the layout says which segment names it. Empty where an environment holds one library for the whole site, which is what the default layout reads.
Other environmentThe environment the copy this row compares against is held in.
Other source pathThat copy's file.
ComparisonIDENTICAL where the two are the same line for line, ENVIRONMENT_NAMES where a bind deck differs only in the subsystem, collection and DBRM library it binds on, and DIVERGED where they differ anywhere else. Only the last is drift somebody has to answer for.
Differing linesHow many of this copy's lines the other copy has not. Lines are matched wherever they sit, so a card moved is not a difference and a card changed is one on each side. Counted as written, so a bind deck bound on another subsystem has differing lines and no drift.
COBOL relationships
org.openrewrite.mainframe.cobol.table.CobolRelationships

Relationships between different COBOL resources.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.mainframe.cobol.table.CobolRelationships
ColumnDescription
DependentThe resource that defines the relationship.
Dependent typeThe resource type of the resource that defines the relationship.
ActionThe action that links the dependent and dependency.
DependencyThe resource that is exercised or linked to.
Dependency typeThe resource type of the resource that is exercised or linked to.
Dependency missingIndicates whether the dependency is a known resource.
Action metadataAdditional data about the action.
Dependent pathThe source file the dependent's statement was written in, or null when the dependent is a name that has no source here.
Dependent lineThe one-based line the dependent's statement was written on, or null when it has no source here.
Dependency pathThe source file the dependency was written in, or null when the dependency is a name that has no source here, such as a vendor copybook.
Dependency lineThe one-based line the dependency's statement was written on, or null when the dependency is a whole file rather than a statement within one.
Source files that had results
org.openrewrite.table.SourcesFileResults

Source files that were modified by the recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileResults
ColumnDescription
Source path before the runThe source path of the file before the run. null when a source file was created during the run.
Source path after the runA recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run.
Parent of the recipe that made changesIn a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all.
Recipe that made changesThe specific recipe that made a change.
Estimated time savingAn estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds.
CycleThe recipe cycle in which the change was made.
Source files that had search results
org.openrewrite.table.SearchResults

Search results that were found during the recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SearchResults
ColumnDescription
Source path of search result before the runThe source path of the file with the search result markers present.
Source path of search result after run the runA recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run.
ResultThe trimmed printed tree of the LST element that the marker is attached to.
DescriptionThe content of the description of the marker.
Recipe that added the search markerThe specific recipe that added the Search marker.
Source files that errored on a recipe
org.openrewrite.table.SourcesFileErrors

The details of all errors produced by a recipe run.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileErrors
ColumnDescription
Source pathThe file that failed to parse.
Recipe that made changesThe specific recipe that made a change.
Stack traceThe stack trace of the failure.
Recipe performance
org.openrewrite.table.RecipeRunStats

Statistics used in analyzing the performance of recipes.

Export after a run
mod study . --last-recipe-run \
--data-table org.openrewrite.table.RecipeRunStats
ColumnDescription
The recipeThe recipe whose stats are being measured both individually and cumulatively.
Source file countThe number of source files the recipe ran over.
Source file changed countThe number of source files which were changed in the recipe run. Includes files created, deleted, and edited.
Cumulative scanning time (ns)The total time spent across the scanning phase of this recipe.
Max scanning time (ns)The max time scanning any one source file.
Cumulative edit time (ns)The total time spent across the editing phase of this recipe.
Max edit time (ns)The max time editing any one source file.