5 June 2024
MIgration of Run2.2i and Run3.1i
2.2i
REPO=/global/cfs/cdirs/lsst/production/gen3/DC2/Run2.2i/repo/butler.yaml
butler migrate show-current --butler $REPO
attributes: lsst.daf.butler.registry.attributes.DefaultButlerAttributeManager 1.0.0 -> f22a777cf382
collections: lsst.daf.butler.registry.collections.synthIntKey.SynthIntKeyCollectionManager 2.0.0 -> 8c57494cabcc (head)
datasets: lsst.daf.butler.registry.datasets.byDimensions._manager.ByDimensionsDatasetRecordStorageManagerUUID 1.0.0 -> 2101fbf51ad3
datastores: lsst.daf.butler.registry.bridge.monolithic.MonolithicDatastoreRegistryBridgeManager 0.2.0 -> a07b3b60e369 (head)
dimensions: lsst.daf.butler.registry.dimensions.static.StaticDimensionRecordStorageManager 6.0.1 -> 1601d5973bf8
dimensions-config: daf_butler 5 -> 2a8a32e1bec3
opaque: lsst.daf.butler.registry.opaque.ByNameOpaqueTableStorageManager 0.2.0 -> 77e5b803ad3f (head)
butler migrate upgrade $REPO 352c30854bb0
lsst.1fae088c80b6_py INFO: Locking exposure table
lsst.1fae088c80b6_py INFO: Checking that this is an unmodified daf_butler universe 5 repo
lsst.daf.butler.cli.utils ERROR: Caught an exception, details are in traceback:
Traceback (most recent call last):
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/cli/cmd/commands.py", line 142, in upgrade
script.migrate_upgrade(*args, **kwargs)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/script/migrate_upgrade.py", line 92, in migrate_upgrade
command.upgrade(cfg, revision, sql=sql)
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/command.py", line 403, in upgrade
script.run_env()
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/script/base.py", line 583, in run_env
util.load_python_file(self.dir, "env.py")
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
module = load_module_py(module_id, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
spec.loader.exec_module(module) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/_alembic/env.py", line 72, in <module>
run_migrations_online()
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/_alembic/env.py", line 66, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/runtime/environment.py", line 948, in run_migrations
self.get_context().run_migrations(**kw)
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/runtime/migration.py", line 627, in run_migrations
step.migration_fn(**kw)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/dimensions-config/1fae088c80b6.py", line 49, in upgrade
_validate_initial_dimension_universe(ctx)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/dimensions-config/1fae088c80b6.py", line 84, in _validate_initial_dimension_universe
ctx.attributes.validate_dimensions_json(5)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/butler_attributes.py", line 228, in validate_dimensions_json
raise err
ValueError: dimensions.json stored in database does not match expected daf_butler universe version 5.
Differences:
---
+++
@@ -109,12 +109,12 @@
"type": "int"
},
{
- "doc": "Earliest sequence number that might be related to this exposure.\n",
+ "doc": "The sequence number of the first exposure of the visit that contains this exposure.",
"name": "seq_start",
"type": "int"
},
{
- "doc": "Oldest sequence number that might be related to this exposure.\n",
+ "doc": "The sequence number of the final exposure of the visit that contains this exposure.",
"name": "seq_end",
"type": "int"
},
@@ -157,7 +157,7 @@
"type": "float"
},
{
- "doc": "Azimuth of the telescope at the start of the exposure in degrees. Can be NULL for observations that are not on sky, or for observations where the azimuth is not relevant.\n",
+ "doc": "Azimuth of the telescope at the start of the exposure in degrees. Can be NULL for observations that are not on sky, or for observations where the azimuth is not relevant.",
"name": "azimuth",
"type": "float"
},
@@ -167,7 +167,7 @@
"type": "float"
},
{
- "doc": "True if this exposure has some content that was simulated. This can be if the data itself were simulated or if parts of the header came from simulated systems, such as observations in the lab that are recorded as on-sky.\n",
+ "doc": "True if this exposure has some content that was simulated. This can be if the data itself were simulated or if parts of the header came from simulated systems, such as observations in the lab that are recorded as on-sky.",
"name": "has_simulated",
"type": "bool"
}
@@ -196,7 +196,7 @@
"type": "int"
},
{
- "doc": "The preferred visit system for this instrument.\n",
+ "doc": "The preferred visit system for this instrument.",
"name": "visit_system",
"type": "int"
},
@@ -366,7 +366,7 @@
"type": "int"
},
{
- "doc": "The sequence number of the first exposure that is part of this visit.\n",
+ "doc": "The sequence number of the first exposure that is part of this visit.",
"name": "seq_num",
"type": "int"
},
@@ -394,12 +394,12 @@
"type": "string"
},
{
- "doc": "Approximate azimuth of the telescope in degrees during the visit. Can only be approximate since it is continually changing during an observation and multiple exposures can be combined from a relatively long period.\n",
+ "doc": "Approximate azimuth of the telescope in degrees during the visit. Can only be approximate since it is continually changing during an observation and multiple exposures can be combined from a relatively long period.",
"name": "azimuth",
"type": "float"
},
{
- "doc": "Approximate zenith angle in degrees during the visit. Can only be approximate since it is continuously changing during an observation and multiple exposures can be combined from a relatively long period.\n",
+ "doc": "Approximate zenith angle in degrees during the visit. Can only be approximate since it is continuously changing during and observation and multiple visits can be combined from a relatively long period.\n",
"name": "zenith_angle",
"type": "float"
}
@@ -435,7 +435,7 @@
}
},
"visit_system": {
- "doc": "A system of self-consistent visit definitions, within which each exposure should appear at most once.\nA visit may belong to multiple visit systems, if the logical definitions for those systems happen to result in the same set of exposures - the main (and probably only) example is when a single-snap visit is observed, for which both the \"one-to-one\" visit system and a \"group by header metadata\" visit system will define the same single-exposure visit.\n",
+ "doc": "A system of self-consistent visit definitions, within which each exposure should appear at most once.\nA visit may belong to multiple visit systems, if the logical definitions for those systems happen to result in the same set of exposures - the main (and probably only) example is when a single-snap visit is observed, for which both the \"one-to-one\" visit system and a \"group by header metadata\" visit system will define the same single-exposure visit. ",
"keys": [
{
"name": "id",
@@ -459,7 +459,7 @@
},
"visit_system_membership": {
"always_join": true,
- "doc": "A many-to-many join table that relates visits to the visit_systems they belong to.\n",
+ "doc": "A many-to-many join table that relates visits to the visit_systems they belong to.",
"populated_by": "visit",
"requires": [
"visit",
Repositories originally created at dimension universe 1 or earlier may have incorrect documentation strings.
Re-run butler migrate with the flag '--options allow_dimension_universe_mismatch=1' to bypass this check.
This will overwrite any customizations made to the dimension universe.
This triggered the exemption noted here in the Rubin doc
Panel |
---|
Step 4b: Possible failure recovery needed for older repositoriesFor older repositories, the migration command in step 4a may fail with the following error: ValueError: dimensions.json stored in database does not match expected daf_butler universe version 5. This can happen because we recently began validating the configuration during migration, and there can be some minor discrepancies in older repositories. If this occurs, review the output to make sure that only documentation strings were incorrect, for example lines like: - "doc": "Earliest sequence number that might be related to this exposure.\n", If there are any changes that do not begin with "doc", do not attempt to finish the migration. Stop and ask for further guidance. If everything is OK, run the following command to complete the migration:
|
Rerunning with: butler migrate upgrade $REPO 352c30854bb0 --options allow_dimension_universe_mismatch=1
output
Code Block | ||
---|---|---|
| ||
lsst.1fae088c80b6_py INFO: Locking exposure table
lsst.1fae088c80b6_py INFO: Generating data for day_obs table from exposure_table
lsst.1fae088c80b6_py INFO: Loading instrument definition LSSTCam-imSim from class lsst.obs.lsst.LsstCamImSim
lsst.1fae088c80b6_py INFO: Creating day_obs table
lsst.1fae088c80b6_py INFO: Populating day_obs table
lsst.1fae088c80b6_py INFO: Creating instrument index for day_obs table
lsst.1fae088c80b6_py INFO: Updating exposure table to reference day_obs table
lsst.1fae088c80b6_py INFO: Creating group table
lsst.1fae088c80b6_py INFO: Populating group table
lsst.1fae088c80b6_py INFO: Creating instrument index for group table
lsst.1fae088c80b6_py INFO: Updating exposure table to reference group table
lsst.1fae088c80b6_py INFO: Updating dimensions.json in ButlerAttributes
lsst.352c30854bb0_py INFO: Checking that this is an unmodified daf_butler universe 6 repo
lsst.352c30854bb0_py INFO: Adding can_see_sky column to exposure table
lsst.352c30854bb0_py INFO: Populating can_see_sky column
lsst.352c30854bb0_py INFO: ...can_see_sky values were set for all exposure records.
lsst.352c30854bb0_py INFO: Updating dimensions.json in ButlerAttributes
|
Checking looks good:
butler migrate show-current --butler $REPO
attributes: lsst.daf.butler.registry.attributes.DefaultButlerAttributeManager 1.0.0 -> f22a777cf382
collections: lsst.daf.butler.registry.collections.synthIntKey.SynthIntKeyCollectionManager 2.0.0 -> 8c57494cabcc (head)
datasets: lsst.daf.butler.registry.datasets.byDimensions._manager.ByDimensionsDatasetRecordStorageManagerUUID 1.0.0 -> 2101fbf51ad3
datastores: lsst.daf.butler.registry.bridge.monolithic.MonolithicDatastoreRegistryBridgeManager 0.2.0 -> a07b3b60e369 (head)
dimensions: lsst.daf.butler.registry.dimensions.static.StaticDimensionRecordStorageManager 6.0.1 -> 1601d5973bf8
dimensions-config: daf_butler 7 -> 352c30854bb0 (head)
opaque: lsst.daf.butler.registry.opaque.ByNameOpaqueTableStorageManager 0.2.0 -> 77e5b803ad3f (head)
butler query-dimension-records --limit 10 $REPO exposure
instrument id day_obs group physical_filter obs_id exposure_time dark_time observation_type observation_reason seq_num seq_start seq_end target_name science_program tracking_ra tracking_dec sky_angle azimuth zenith_angle has_simulated can_see_sky timespan (TAI)
------------- --- -------- ----- --------------- ------ ------------- --------- ---------------- ------------------ ------- --------- ------- ----------- --------------- ----------------- ------------------ ------------------ ------- ------------------ ------------- ----------- ------------------------------------------
Run3.1i
REPO=/global/cfs/cdirs/lsst/production/gen3/DC2/Run3.1i/repo/butler.yaml
butler migrate show-current --butler $REPO
attributes: lsst.daf.butler.registry.attributes.DefaultButlerAttributeManager 1.0.0 -> f22a777cf382
collections: lsst.daf.butler.registry.collections.synthIntKey.SynthIntKeyCollectionManager 2.0.0 -> 8c57494cabcc (head)
datasets: lsst.daf.butler.registry.datasets.byDimensions._manager.ByDimensionsDatasetRecordStorageManagerUUID 1.0.0 -> 2101fbf51ad3
datastores: lsst.daf.butler.registry.bridge.monolithic.MonolithicDatastoreRegistryBridgeManager 0.2.0 -> a07b3b60e369 (head)
dimensions: lsst.daf.butler.registry.dimensions.static.StaticDimensionRecordStorageManager 6.0.1 -> 1601d5973bf8
dimensions-config: daf_butler 5 -> 2a8a32e1bec3
opaque: lsst.daf.butler.registry.opaque.ByNameOpaqueTableStorageManager 0.2.0 -> 77e5b803ad3f (head)
Same anticipated error as Run2.2i
butler migrate upgrade $REPO 352c30854bb0
lsst.1fae088c80b6_py INFO: Locking exposure table
lsst.1fae088c80b6_py INFO: Checking that this is an unmodified daf_butler universe 5 repo
lsst.daf.butler.cli.utils ERROR: Caught an exception, details are in traceback:
Traceback (most recent call last):
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/cli/cmd/commands.py", line 142, in upgrade
script.migrate_upgrade(*args, **kwargs)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/script/migrate_upgrade.py", line 92, in migrate_upgrade
command.upgrade(cfg, revision, sql=sql)
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/command.py", line 403, in upgrade
script.run_env()
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/script/base.py", line 583, in run_env
util.load_python_file(self.dir, "env.py")
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 95, in load_python_file
module = load_module_py(module_id, path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/util/pyfiles.py", line 113, in load_module_py
spec.loader.exec_module(module) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/_alembic/env.py", line 72, in <module>
run_migrations_online()
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/_alembic/env.py", line 66, in run_migrations_online
context.run_migrations()
File "<string>", line 8, in run_migrations
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/runtime/environment.py", line 948, in run_migrations
self.get_context().run_migrations(**kw)
File "/cvmfs/sw.lsst.eu/linux-x86_64/lsst_distrib/w_2024_21/conda/envs/lsst-scipipe-8.0.0-exact-ext/lib/python3.11/site-packages/alembic/runtime/migration.py", line 627, in run_migrations
step.migration_fn(**kw)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/dimensions-config/1fae088c80b6.py", line 49, in upgrade
_validate_initial_dimension_universe(ctx)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/migrations/dimensions-config/1fae088c80b6.py", line 84, in _validate_initial_dimension_universe
ctx.attributes.validate_dimensions_json(5)
File "/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate/python/lsst/daf/butler_migrate/butler_attributes.py", line 228, in validate_dimensions_json
raise err
ValueError: dimensions.json stored in database does not match expected daf_butler universe version 5.
Differences:
---
+++
@@ -109,12 +109,12 @@
"type": "int"
},
{
- "doc": "Earliest sequence number that might be related to this exposure.\n",
+ "doc": "The sequence number of the first exposure of the visit that contains this exposure.",
"name": "seq_start",
"type": "int"
},
{
- "doc": "Oldest sequence number that might be related to this exposure.\n",
+ "doc": "The sequence number of the final exposure of the visit that contains this exposure.",
"name": "seq_end",
"type": "int"
},
@@ -157,7 +157,7 @@
"type": "float"
},
{
- "doc": "Azimuth of the telescope at the start of the exposure in degrees. Can be NULL for observations that are not on sky, or for observations where the azimuth is not relevant.\n",
+ "doc": "Azimuth of the telescope at the start of the exposure in degrees. Can be NULL for observations that are not on sky, or for observations where the azimuth is not relevant.",
"name": "azimuth",
"type": "float"
},
@@ -167,7 +167,7 @@
"type": "float"
},
{
- "doc": "True if this exposure has some content that was simulated. This can be if the data itself were simulated or if parts of the header came from simulated systems, such as observations in the lab that are recorded as on-sky.\n",
+ "doc": "True if this exposure has some content that was simulated. This can be if the data itself were simulated or if parts of the header came from simulated systems, such as observations in the lab that are recorded as on-sky.",
"name": "has_simulated",
"type": "bool"
}
@@ -196,7 +196,7 @@
"type": "int"
},
{
- "doc": "The preferred visit system for this instrument.\n",
+ "doc": "The preferred visit system for this instrument.",
"name": "visit_system",
"type": "int"
},
@@ -366,7 +366,7 @@
"type": "int"
},
{
- "doc": "The sequence number of the first exposure that is part of this visit.\n",
+ "doc": "The sequence number of the first exposure that is part of this visit.",
"name": "seq_num",
"type": "int"
},
@@ -394,12 +394,12 @@
"type": "string"
},
{
- "doc": "Approximate azimuth of the telescope in degrees during the visit. Can only be approximate since it is continually changing during an observation and multiple exposures can be combined from a relatively long period.\n",
+ "doc": "Approximate azimuth of the telescope in degrees during the visit. Can only be approximate since it is continually changing during an observation and multiple exposures can be combined from a relatively long period.",
"name": "azimuth",
"type": "float"
},
{
- "doc": "Approximate zenith angle in degrees during the visit. Can only be approximate since it is continuously changing during an observation and multiple exposures can be combined from a relatively long period.\n",
+ "doc": "Approximate zenith angle in degrees during the visit. Can only be approximate since it is continuously changing during and observation and multiple visits can be combined from a relatively long period.\n",
"name": "zenith_angle",
"type": "float"
}
@@ -435,7 +435,7 @@
}
},
"visit_system": {
- "doc": "A system of self-consistent visit definitions, within which each exposure should appear at most once.\nA visit may belong to multiple visit systems, if the logical definitions for those systems happen to result in the same set of exposures - the main (and probably only) example is when a single-snap visit is observed, for which both the \"one-to-one\" visit system and a \"group by header metadata\" visit system will define the same single-exposure visit.\n",
+ "doc": "A system of self-consistent visit definitions, within which each exposure should appear at most once.\nA visit may belong to multiple visit systems, if the logical definitions for those systems happen to result in the same set of exposures - the main (and probably only) example is when a single-snap visit is observed, for which both the \"one-to-one\" visit system and a \"group by header metadata\" visit system will define the same single-exposure visit. ",
"keys": [
{
"name": "id",
@@ -459,7 +459,7 @@
},
"visit_system_membership": {
"always_join": true,
- "doc": "A many-to-many join table that relates visits to the visit_systems they belong to.\n",
+ "doc": "A many-to-many join table that relates visits to the visit_systems they belong to.",
"populated_by": "visit",
"requires": [
"visit",
Repositories originally created at dimension universe 1 or earlier may have incorrect documentation strings.
Re-run butler migrate with the flag '--options allow_dimension_universe_mismatch=1' to bypass this check.
This will overwrite any customizations made to the dimension universe.
descdm@perlmutter:login35:/pscratch/sd/d/descdm/schema-migration-v7/daf_butler_migrate> butler migrate upgrade $REPO 352c30854bb0 --options allow_dimension_universe_mismatch=1
lsst.1fae088c80b6_py INFO: Locking exposure table
lsst.1fae088c80b6_py INFO: Generating data for day_obs table from exposure_table
lsst.1fae088c80b6_py INFO: Loading instrument definition LSSTCam-imSim from class lsst.obs.lsst.LsstCamImSim
lsst.1fae088c80b6_py INFO: Creating day_obs table
lsst.1fae088c80b6_py INFO: Populating day_obs table
lsst.1fae088c80b6_py INFO: Creating instrument index for day_obs table
lsst.1fae088c80b6_py INFO: Updating exposure table to reference day_obs table
lsst.1fae088c80b6_py INFO: Creating group table
lsst.1fae088c80b6_py INFO: Populating group table
lsst.1fae088c80b6_py INFO: Creating instrument index for group table
lsst.1fae088c80b6_py INFO: Updating exposure table to reference group table
lsst.1fae088c80b6_py INFO: Updating dimensions.json in ButlerAttributes
lsst.352c30854bb0_py INFO: Checking that this is an unmodified daf_butler universe 6 repo
lsst.352c30854bb0_py INFO: Adding can_see_sky column to exposure table
lsst.352c30854bb0_py INFO: Populating can_see_sky column
lsst.352c30854bb0_py INFO: ...can_see_sky values were set for all exposure records.
lsst.352c30854bb0_py INFO: Updating dimensions.json in ButlerAttributes
Checking looks good
butler query-dimension-records --limit 10 $REPO exposure
instrument id day_obs group physical_filter obs_id exposure_time dark_time observation_type observation_reason seq_num seq_start seq_end target_name science_program tracking_ra tracking_dec sky_angle azimuth zenith_angle has_simulated can_see_sky timespan (TAI)
butler migrate show-current --butler $REPO
attributes: lsst.daf.butler.registry.attributes.DefaultButlerAttributeManager 1.0.0 -> f22a777cf382
collections: lsst.daf.butler.registry.collections.synthIntKey.SynthIntKeyCollectionManager 2.0.0 -> 8c57494cabcc (head)
datasets: lsst.daf.butler.registry.datasets.byDimensions._manager.ByDimensionsDatasetRecordStorageManagerUUID 1.0.0 -> 2101fbf51ad3
datastores: lsst.daf.butler.registry.bridge.monolithic.MonolithicDatastoreRegistryBridgeManager 0.2.0 -> a07b3b60e369 (head)
dimensions: lsst.daf.butler.registry.dimensions.static.StaticDimensionRecordStorageManager 6.0.1 -> 1601d5973bf8
dimensions-config: daf_butler 7 -> 352c30854bb0 (head)
opaque: lsst.daf.butler.registry.opaque.ByNameOpaqueTableStorageManager 0.2.0 -> 77e5b803ad3f (head)
3 June 2024
MIgration of DECam
...