Files#
odx.lock#
The resolved commit of every merge and package, written only by odx and always in the same layout, so locking twice without upstream changes gives a byte-identical file. Commit it.
# Generated by odx. Do not edit.
version = 1
[odoo]
url = "https://github.com/OCA/OCB.git"
rev = "<commit>"
[[repositories]]
name = "pos"
url = "https://github.com/OCA/pos.git"
base = "17.0"
base_sha = "<commit>"
result_tree = "<tree>"
[[repositories.merges]]
source = { pr = 123 } # the configured merge: pr, sha, or branch (+ remote)
sha = "<commit>"
tree = "<tree>"
patch_id = "<patch id>"
mirror_ref = "refs/odx/<commit>"
status = "pinned" # merged | skipped | pinned
upstream_head = "<commit>" # a newer head that was not adopted
upstream_head_ci = "red" # green | red | pending | unknown
upstream_head_classification = "base-also-failing" # red | base-also-failing | other-addon
pinned_since = "2026-10-12"
[packages.odoo-addon-pos-vouchers]
group = "oca_unmerged"
url = "https://github.com/OCA/pos.git"
source = { pr = 45 }
subdirectory = "pos_vouchers"
sha = "<commit>"
Repositories are sorted by name, merges keep the configured order, packages
are sorted by name. A lockfile written by a newer odx is refused with a
request to upgrade; an older format is refused with a request to run
odx lock --migrate. odx drop removes the dropped merge or package from
the lockfile as well.
.odx/mutes.toml#
Project decisions about upstream suggestions. Every mute needs a kind and a
free-text reason; a deferred mute also needs an expiry date or a re-check
trigger.
[[mute]]
match = "OCA/pos#789" # or "OCA/pos@<commit>"
patch_ids = ["<patch id>"]
kind = "not-wanted" # not-applicable | not-needed | superseded | already-present | declined | not-wanted | deferred
reason = "We do not use the loyalty program"
expires = "2027-01-01"
recheck = "never" # target-code-change | never
environments = ["test"] # empty: every environment
muted_by = "developer@example.com"
muted_at = "2026-10-12"