You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.9 KiB

  1. # ADR 076: Combine Spec and Tendermint Repositories
  2. ## Changelog
  3. - 2022-02-04: Initial Draft. (@tychoish)
  4. ## Status
  5. Accepted.
  6. ## Context
  7. While the specification for Tendermint was originally in the same
  8. repository as the Go implementation, at some point the specification
  9. was split from the core repository and maintained separately from the
  10. implementation. While this makes sense in promoting a conceptual
  11. separation of specification and implementation, in practice this
  12. separation was a premature optimization, apparently aimed at supporting
  13. alternate implementations of Tendermint.
  14. The operational and documentary burden of maintaining a separate
  15. spec repo has not returned value to justify its cost. There are no active
  16. projects to develop alternate implementations of Tendermint based on the
  17. common specification, and having separate repositories creates an ongoing
  18. burden to coordinate versions, documentation, and releases.
  19. ## Decision
  20. The specification repository will be merged back into the Tendermint
  21. core repository.
  22. Stakeholders including representatives from the maintainers of the
  23. spec, the Go implementation, and the Tendermint Rust library, agreed
  24. to merge the repositories in the Tendermint core dev meeting on 27
  25. January 2022, including @williambanfield @cmwaters @creachadair and
  26. @thanethomson.
  27. ## Alternative Approaches
  28. The main alternative we considered was to keep separate repositories,
  29. and to introduce a coordinated versioning scheme between the two, so
  30. that users could figure out which spec versions go with which versions
  31. of the core implementation.
  32. We decided against this on the grounds that it would further complicate
  33. the release process for _both_ repositories, without mitigating any of
  34. the other existing issues.
  35. ## Detailed Design
  36. Clone and merge the master branch of the `tendermint/spec` repository
  37. as a branch of the `tendermint/tendermint`, to ensure the commit history
  38. of both repositories remains intact.
  39. ### Implementation Instructions
  40. 1. Within the `tendermint` repository, execute the following commands
  41. to add a new branch with the history of the master branch of `spec`:
  42. ```bash
  43. git remote add spec git@github.com:tendermint/spec.git
  44. git fetch spec
  45. git checkout -b spec-master spec/master
  46. mkdir spec
  47. git ls-tree -z --name-only HEAD | xargs -0 -I {} git mv {} subdir/
  48. git commit -m "spec: organize specification prior to merge"
  49. git checkout -b spec-merge-mainline origin/master
  50. git merge --allow-unrelated-histories spec-master
  51. ```
  52. This merges the spec into the `tendermint/tendermint` repository as
  53. a normal branch. This commit can also be backported to the 0.35
  54. branch, if needed.
  55. 2. Migrate outstanding issues from `tendermint/spec` to the
  56. `tendermint/tendermint` repository.
  57. 3. In the specification repository, add redirect to the README and mark
  58. the repository as archived.
  59. ## Consequences
  60. ### Positive
  61. Easier maintenance for the specification will obviate a number of
  62. complicated and annoying versioning problems, and will help prevent the
  63. possibility of the specification and the implementation drifting apart.
  64. Additionally, co-locating the specification will help encourage
  65. cross-pollination and collaboration, between engineers focusing on the
  66. specification and the protocol and engineers focusing on the implementation.
  67. ### Negative
  68. Co-locating the spec and Go implementation has the potential effect of
  69. prioritizing the Go implementation with regards to the spec, and
  70. making it difficult to think about alternate implementations of the
  71. Tendermint algorithm. Although we may want to foster additional
  72. Tendermint implementations in the future, this isn't an active goal
  73. in our current roadmap, and *not* merging these repos doesn't
  74. change the fact that the Go implementation of Tendermint is already the
  75. primary implementation.
  76. ### Neutral
  77. N/A
  78. ## References
  79. - https://github.com/tendermint/spec
  80. - https://github.com/tendermint/tendermint