git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[RFC PATCH 0/6] [RFC] Introduce cgit-rs, a Rust wrapper around libgit.a

From
Josh Steadmon <steadmon@google.com>
Date
Aug 7, 2024, 18:21 UTC
Message-ID
<cover.1723054623.git.steadmon@google.com>

When we, the Git team at Google, first embarked on the libification journey, we didn’t have a specific consumer to build a library for but instead were interested in the various potential benefits of libification for many use cases such as VFSes and submodules. Without a specific consumer, it has been difficult to evaluate the scope of what is necessary or not even for the first library, git-std-lib. Attempting to solve problems such as error handling, symbol collisions, and internal/external interfaces, in addition to separating out a library turns out to be both too complex of a task to both develop and review all at once. While we strive to eventually build an ideal library, we have also realized in order to make meaningful and consistent progress, we have to solve these problems iteratively in smaller pieces. That is why over the last month, we have been working with the jj project [1] to understand their current usage of libgit2-rs [2] and gitoxide [3] and future library functionality they would be interested in. In doing so, we have built cgit-rs, a Rust wrapper around libgit.a that allows Rust code to call various basic Git functions.

[1] https://github.com/martinvonz/jj [2] https://github.com/rust-lang/git2-rs [3] https://github.com/Byron/gitoxide

This series provides a small Rust wrapper library around parts of libgit.a, and a proof-of-concept Rust executable that uses the library to interface with Git. Additionally, we have tested building JJ with our library and used it to replace some of the libgit2-rs uses.

This exercise has clarified a lot of things for us, and we believe that
developing this wrapper further provides benefits both for downstream
consumers and the Git project itself:
* cgit-rs provides wrappers for Rust consumers of libraries (eg. jj)
* cgit-rs suggests focus areas for libification
  * shows us what potential challenges we face with library consumers
* Git libification improves git interfaces
* Libification improves cgit-rs FFI.

We are putting error handling on hold for now since it is too complex and we intend other CLIs to be our first customers, in which case printing out errors is not the worst.

While the wrapper itself lives in contrib/, there are a couple of patches that touch git.git code. These patches are necessary for the wrapper, but not for git.git itself, which may seem unnecessary to merge. However, I would argue that other languages (not just limited to Rust) have issues calling functions that require a pointer to non-generic objects and essentially require a redefinition in their own language.

We're sending this series as RFC because there is remaining work we'd like to do, but we'd like to get early feedback on this approach, and particularly to ask for advice on a few topics:

* alternative methods of exposing only a subset of symbols in our
  library
* bikeshedding on the name (yes, really). There is an active, unrelated
  CGit project [4] that we only recently became aware of. We originally
  took the name "cgit" because at $DAYJOB we sometimes refer to git.git
  as "cgit" to distinguish it from jgit [5].
* gauging the level of interest in calling Git code from Rust

[4] https://git.zx2c4.com/cgit [5] https://www.eclipse.org/jgit

Remaining work includes:
* finding a better solution to the common-main split. We should probably
  have a separate initialization function including all of main() up to
  the call to cmd_main(), which can then be exposed in cgit-rs.
* adding unit and integration tests
* Makefile cleanup, particularly adding config.mak options that
  developers can set to run Rust builds and tests by default
* automating the process of exporting additional functions via cgit-rs
  (possibly with a wrapper script around bindgen [6])
[6] https://github.com/rust-lang/rust-bindgen

Finally, a quick discussion about symbol collisions: if functions are not prepended with “libgit_” or something similar, it leaves us open to collision issues in the future – so this probably would’ve happened with libification in general to begin with. Therefore it seems necessary to have to wrap all the symbols we are looking to expose. While this seem non-ideal, we couldn’t come up with a better method. Our next best alternative is to simply expose all symbols by default, but this leads to symbol collisions when library users link both cgit-rs and libgit2-rs.

Calvin Wan (2):
  contrib/cgit-rs: add repo initialization and config access
  contrib/cgit-rs: add a subset of configset wrappers
Josh Steadmon (4):
  common-main: split common_exit() into a new file
  repository: add initialize_repo wrapper without pointer
  contrib/cgit-rs: introduce Rust wrapper for libgit.a
  config: add git_configset_alloc
 .gitignore                             |  1 +
 Makefile                               | 14 ++++
 common-exit.c                          | 26 +++++++
 common-main.c                          | 24 -------
 config.c                               |  5 ++
 config.h                               |  5 ++
 contrib/cgit-rs/Cargo.lock             | 99 ++++++++++++++++++++++++++
 contrib/cgit-rs/Cargo.toml             | 17 +++++
 contrib/cgit-rs/README.md              | 15 ++++
 contrib/cgit-rs/build.rs               | 33 +++++++++
 contrib/cgit-rs/public_symbol_export.c | 72 +++++++++++++++++++
 contrib/cgit-rs/public_symbol_export.h | 26 +++++++
 contrib/cgit-rs/src/lib.rs             | 81 +++++++++++++++++++++
 contrib/cgit-rs/src/main.rs            | 44 ++++++++++++
 repository.c                           |  9 +++
 repository.h                           |  1 +
 16 files changed, 448 insertions(+), 24 deletions(-)
 create mode 100644 common-exit.c
 create mode 100644 contrib/cgit-rs/Cargo.lock
 create mode 100644 contrib/cgit-rs/Cargo.toml
 create mode 100644 contrib/cgit-rs/README.md
 create mode 100644 contrib/cgit-rs/build.rs
 create mode 100644 contrib/cgit-rs/public_symbol_export.c
 create mode 100644 contrib/cgit-rs/public_symbol_export.h
 create mode 100644 contrib/cgit-rs/src/lib.rs
 create mode 100644 contrib/cgit-rs/src/main.rs
base-commit: 557ae147e6cdc9db121269b058c757ac5092f9c9
-- 
2.46.0.rc2.264.g509ed76dc8-goog
Next: Josh Steadmon
Message 1 of 217 in “[RFC] Introduce cgit-rs, a Rust wrapper around libgit.a”
  1. 0/6 [RFC] Introduce cgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Aug 7, 2024
  2. 1/6 common-main: split common_exit() into a new fileJosh Steadmon, Aug 7, 2024
  3. Junio C HamanoAug 7, 2024
  4. Josh SteadmonAug 7, 2024
  5. 2/6 repository: add initialize_repo wrapper without pointerJosh Steadmon, Aug 7, 2024
  6. Mike HommeyAug 7, 2024
  7. Josh SteadmonAug 7, 2024
  8. Mike HommeyAug 7, 2024
  9. Josh SteadmonAug 8, 2024
  10. 3/6 contrib/cgit-rs: introduce Rust wrapper for libgit.aJosh Steadmon, Aug 7, 2024
  11. brian m. carlsonAug 7, 2024
  12. rsbecker@nexbridge.comAug 7, 2024
  13. Josh SteadmonAug 7, 2024
  14. rsbecker@nexbridge.comAug 7, 2024
  15. Josh SteadmonAug 8, 2024
  16. rsbecker@nexbridge.comAug 8, 2024
  17. Junio C HamanoAug 8, 2024
  18. rsbecker@nexbridge.comAug 8, 2024
  19. rsbecker@nexbridge.comAug 12, 2024
  20. Josh SteadmonAug 7, 2024
  21. brian m. carlsonAug 7, 2024
  22. Junio C HamanoAug 8, 2024
  23. Josh SteadmonAug 8, 2024
  24. Josh SteadmonAug 8, 2024
  25. Kyle LippincottAug 8, 2024
  26. Josh SteadmonAug 8, 2024
  27. Mike HommeyAug 7, 2024
  28. Josh SteadmonAug 7, 2024
  29. Mike HommeyAug 8, 2024
  30. Josh SteadmonAug 8, 2024
  31. 4/6 contrib/cgit-rs: add repo initialization and config accessJosh Steadmon, Aug 7, 2024
  32. brian m. carlsonAug 7, 2024
  33. Josh SteadmonAug 7, 2024
  34. brian m. carlsonAug 8, 2024
  35. 5/6 config: add git_configset_allocJosh Steadmon, Aug 7, 2024
  36. 6/6 contrib/cgit-rs: add a subset of configset wrappersJosh Steadmon, Aug 7, 2024
  37. brian m. carlsonAug 7, 2024
  38. Junio C HamanoAug 7, 2024
  39. Josh SteadmonAug 8, 2024
  40. Calvin WanSep 4, 2024
  41. brian m. carlsonSep 4, 2024
  42. Calvin WanSep 6, 2024
  43. brian m. carlsonSep 7, 2024
  44. Junio C HamanoSep 4, 2024
  45. brian m. carlsonSep 4, 2024
  46. Junio C HamanoSep 4, 2024
  47. Josh SteadmonSep 4, 2024
  48. brian m. carlsonAug 7, 2024
  49. Josh SteadmonAug 7, 2024
  50. brian m. carlsonAug 8, 2024
  51. Josh SteadmonAug 9, 2024
  52. Jason A. DonenfeldAug 8, 2024
  53. Dragan SimicAug 8, 2024
  54. rsbecker@nexbridge.comAug 8, 2024
  55. Dragan SimicAug 8, 2024
  56. Junio C HamanoAug 8, 2024
  57. Junio C HamanoAug 9, 2024
  58. Junio C HamanoAug 9, 2024
  59. Josh SteadmonAug 9, 2024
  60. Junio C HamanoAug 9, 2024
  61. Junio C HamanoAug 9, 2024
  62. Josh SteadmonAug 9, 2024
  63. Junio C HamanoAug 9, 2024
  64. 0/5 Introduce cgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Aug 9, 2024
  65. 1/5 common-main: split init and exit code into new filesJosh Steadmon, Aug 9, 2024
  66. 2/5 cgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Aug 9, 2024
  67. 3/5 cgit-sys: add repo initialization and config accessJosh Steadmon, Aug 9, 2024
  68. 4/5 config: add git_configset_alloc() and git_configset_clear_and_free()Josh Steadmon, Aug 9, 2024
  69. Phillip WoodAug 12, 2024
  70. Josh SteadmonAug 12, 2024
  71. Kyle LippincottAug 12, 2024
  72. phillip.wood123@gmail.comAug 13, 2024
  73. Junio C HamanoAug 13, 2024
  74. phillip.wood123@gmail.comAug 13, 2024
  75. Josh SteadmonOct 2, 2024
  76. Patrick SteinhardtAug 16, 2024
  77. Josh SteadmonOct 2, 2024
  78. 5/5 cgit: add higher-level cgit crateJosh Steadmon, Aug 9, 2024
  79. Phillip WoodAug 12, 2024
  80. Calvin WanAug 21, 2024
  81. Kyle LippincottAug 21, 2024
  82. Phillip WoodAug 22, 2024
  83. Phillip WoodAug 22, 2024
  84. Josh SteadmonOct 2, 2024
  85. Junio C HamanoAug 9, 2024
  86. Jason A. DonenfeldAug 10, 2024
  87. Dragan SimicAug 11, 2024
  88. Eric SunshineAug 11, 2024
  89. Dragan SimicAug 11, 2024
  90. Eric SunshineAug 11, 2024
  91. Dragan SimicAug 11, 2024
  92. Junio C HamanoAug 12, 2024
  93. Eric SunshineAug 12, 2024
  94. Junio C HamanoAug 12, 2024
  95. Josh SteadmonAug 12, 2024
  96. Patrick SteinhardtAug 16, 2024
  97. brian m. carlsonAug 16, 2024
  98. Eric SunshineAug 17, 2024
  99. Junio C HamanoAug 18, 2024
  100. brian m. carlsonAug 12, 2024
  101. Dragan SimicAug 12, 2024
  102. Josh SteadmonAug 12, 2024
  103. Junio C HamanoAug 12, 2024
  104. Junio C HamanoAug 12, 2024
  105. 0/6 Introduce libgit-rs, a Rust wrapper around libgit.aCalvin Wan, Sep 6, 2024
  106. 1/6 common-main: split init and exit code into new filesCalvin Wan, Sep 6, 2024
  107. 2/6 libgit-sys: introduce Rust wrapper for libgit.aCalvin Wan, Sep 6, 2024
  108. Eric SunshineSep 6, 2024
  109. Mike HommeySep 6, 2024
  110. Junio C HamanoSep 8, 2024
  111. Josh SteadmonSep 18, 2024
  112. Calvin WanSep 10, 2024
  113. Josh SteadmonSep 18, 2024
  114. 3/6 libgit-sys: add repo initialization and config accessCalvin Wan, Sep 6, 2024
  115. Eric SunshineSep 6, 2024
  116. Josh SteadmonSep 18, 2024
  117. Junio C HamanoSep 6, 2024
  118. Josh SteadmonSep 18, 2024
  119. Patrick SteinhardtSep 10, 2024
  120. Josh SteadmonOct 7, 2024
  121. Josh SteadmonOct 8, 2024
  122. 4/6 config: add git_configset_alloc() and git_configset_clear_and_free()Calvin Wan, Sep 6, 2024
  123. Eric SunshineSep 6, 2024
  124. Patrick SteinhardtSep 10, 2024
  125. Phillip WoodSep 10, 2024
  126. Junio C HamanoSep 10, 2024
  127. Calvin WanSep 10, 2024
  128. Josh SteadmonOct 2, 2024
  129. 5/6 libgit: add higher-level libgit crateCalvin Wan, Sep 6, 2024
  130. Junio C HamanoSep 7, 2024
  131. Junio C HamanoSep 9, 2024
  132. Calvin WanSep 10, 2024
  133. Junio C HamanoSep 10, 2024
  134. Josh SteadmonSep 17, 2024
  135. Junio C HamanoSep 18, 2024
  136. Josh SteadmonOct 7, 2024
  137. Josh SteadmonSep 17, 2024
  138. 6/6 Makefile: add option to build and test libgit-rs and libgit-rs-sysCalvin Wan, Sep 6, 2024
  139. Sean AllredSep 7, 2024
  140. Junio C HamanoSep 8, 2024
  141. Calvin WanSep 10, 2024
  142. brian m. carlsonSep 13, 2024
  143. Josh SteadmonOct 7, 2024
  144. Josh SteadmonOct 2, 2024
  145. 0/5 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Oct 8, 2024
  146. 1/5 common-main: split init and exit code into new filesJosh Steadmon, Oct 8, 2024
  147. 2/5 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Oct 8, 2024
  148. 3/5 libgit-sys: also export some config_set functionsJosh Steadmon, Oct 8, 2024
  149. 4/5 libgit: add higher-level libgit crateJosh Steadmon, Oct 8, 2024
  150. Eric SunshineOct 9, 2024
  151. Josh SteadmonOct 9, 2024
  152. Josh SteadmonOct 9, 2024
  153. 5/5 Makefile: add option to build and test libgit-rs and libgit-rs-sysJosh Steadmon, Oct 8, 2024
  154. Junio C HamanoOct 8, 2024
  155. rsbecker@nexbridge.comOct 9, 2024
  156. Josh SteadmonOct 14, 2024
  157. Junio C HamanoOct 9, 2024
  158. Josh SteadmonOct 9, 2024
  159. Junio C HamanoOct 10, 2024
  160. Josh SteadmonOct 14, 2024
  161. Junio C HamanoOct 9, 2024
  162. Josh SteadmonOct 9, 2024
  163. 0/5 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Oct 15, 2024
  164. 1/5 common-main: split init and exit code into new filesJosh Steadmon, Oct 15, 2024
  165. 2/5 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Oct 15, 2024
  166. 3/5 libgit-sys: also export some config_set functionsJosh Steadmon, Oct 15, 2024
  167. 4/5 libgit: add higher-level libgit crateJosh Steadmon, Oct 15, 2024
  168. 5/5 Makefile: add option to build and test libgit-rs and libgit-rs-sysJosh Steadmon, Oct 15, 2024
  169. Junio C HamanoDec 3, 2024
  170. 0/5 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Jan 15, 2025
  171. 1/5 common-main: split init and exit code into new filesJosh Steadmon, Jan 15, 2025
  172. Junio C HamanoJan 15, 2025
  173. Junio C HamanoJan 16, 2025
  174. Junio C HamanoJan 16, 2025
  175. Patrick SteinhardtJan 17, 2025
  176. Josh SteadmonJan 21, 2025
  177. 2/5 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Jan 15, 2025
  178. Junio C HamanoJan 15, 2025
  179. Josh SteadmonJan 22, 2025
  180. Josh SteadmonJan 27, 2025
  181. 3/5 libgit-sys: also export some config_set functionsJosh Steadmon, Jan 15, 2025
  182. 4/5 libgit: add higher-level libgit crateJosh Steadmon, Jan 15, 2025
  183. brian m. carlsonJan 21, 2025
  184. Josh SteadmonJan 22, 2025
  185. 5/5 Makefile: add option to build and test libgit-rs and libgit-rs-sysJosh Steadmon, Jan 15, 2025
  186. Junio C HamanoJan 15, 2025
  187. brian m. carlsonJan 21, 2025
  188. Junio C HamanoJan 21, 2025
  189. 0/4 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Jan 28, 2025
  190. 1/4 common-main: split init and exit code into new filesJosh Steadmon, Jan 28, 2025
  191. 2/4 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Jan 28, 2025
  192. Phillip WoodJan 28, 2025
  193. Josh SteadmonJan 28, 2025
  194. Junio C HamanoJan 28, 2025
  195. 3/4 libgit-sys: also export some config_set functionsJosh Steadmon, Jan 28, 2025
  196. Phillip WoodJan 28, 2025
  197. Josh SteadmonJan 28, 2025
  198. 4/4 libgit: add higher-level libgit crateJosh Steadmon, Jan 28, 2025
  199. Junio C HamanoJan 28, 2025
  200. Josh SteadmonJan 28, 2025
  201. Junio C HamanoJan 28, 2025
  202. 0/4 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Jan 28, 2025
  203. 1/4 common-main: split init and exit code into new filesJosh Steadmon, Jan 28, 2025
  204. 2/4 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Jan 28, 2025
  205. Junio C HamanoJan 28, 2025
  206. Josh SteadmonJan 29, 2025
  207. 3/4 libgit-sys: also export some config_set functionsJosh Steadmon, Jan 28, 2025
  208. 4/4 libgit: add higher-level libgit crateJosh Steadmon, Jan 28, 2025
  209. Phillip WoodJan 29, 2025
  210. Josh SteadmonJan 29, 2025
  211. 0/4 Introduce libgit-rs, a Rust wrapper around libgit.aJosh Steadmon, Jan 29, 2025
  212. 1/4 common-main: split init and exit code into new filesJosh Steadmon, Jan 29, 2025
  213. 2/4 libgit-sys: introduce Rust wrapper for libgit.aJosh Steadmon, Jan 29, 2025
  214. 3/4 libgit-sys: also export some config_set functionsJosh Steadmon, Jan 29, 2025
  215. 4/4 libgit: add higher-level libgit crateJosh Steadmon, Jan 29, 2025
  216. phillip.wood123@gmail.comJan 30, 2025
  217. Junio C HamanoJan 30, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.