On Fri, Mar 10, 2017 at 2:00 AM, Bernhard E. Reiter <bernhard.reiter@xxxxxxxxxxxxx> wrote: > > git uses an pipe-and-exec approach to running a GnuPG binary > as writen in the documentation [1]: > > gpg.program > Use this custom program instead of "gpg" found on $PATH when making > or verifying a PGP signature. The program must support the same > command-line interface as GPG > > please consider using libgpgme interfacing to GnuPG, because the gpg > command-line interface is not considered an official API to GnuPG by the > GnuPG-devs and thus potentially unstable. Quite frankly, I will NAK this just based on previous bad experiences with using "helpful" libraries. Maybe you can lay my worries to rest, but the problems with libraries in this context tend to be - hard to personalize. At least right now, we just allow people to set their gpg binary. I'm betting that the library would pick whatever random preferred version, and in the process possibly screwed us. Example: what if somebody is actually using another pgp implementation entirely for some reason, and is just scripting around it? Or maybe he's using the regular gnupg, but using different keys for different projects (using "--homedir"). That's trivial with the current model. How trivial is that with a library? - existing configuration This is the main problem I've seen in the past. Using the "ssh" _program_ is easy. You add your keys, your config files, whatever, and it "just works" (or rather, you fight it once and it definitely doesn't "just" work, but then you copy your .ssh directory around for the rest of your and forget how it ever worked, but it does). Using "libssh2" is an exercise in futility, and you have to do a crazy amount of stupid "look up keys" and simple configuration in your .ssh/config (like per-host keys, hostname swizzling etc) just don't pick up the configurations you already did for the program. - UI For things like gpg, the UI is traditionally horrible. But there tends to be various things like password agents that help with caching passwords and/or add a graphical UI to get the password when necessary. - library versioning. I don't know why, but I've never *ever* met a library developer who realized that libraries were all about stable API's, and the library users don't want to fight different versions. And to make matters worse, the different versions (particularly if you end up having to use a development version due to bugs or required features etc) are always made horribly bad to even detect at built-time automatically with simple #ifdef etc, so now you have to do autoconf crap etc. Now, it may be that the pgpme library "just works" across architectures and handles all of the above situations as gracefully as the external program does. In that case - but _ONLY_ in that case - would a switch-over to the library possibly be a good thing. I'd be pleasantly surprised. But I *would* be surprised, because every time I've seen that "library vs program" model, I've seen the above issues. In fact, we have those exact issues very much in git itself too. Yes, I've used libgit2 (for subsurface). It's a pain in the arse to do *exactly* the above kinds of things, and the thing is, that isn't git-specific. So I'm very down on using external libraries unless they are stable and have no need for configuration etc. Things like zlib is fine - there just isn't much to configure outside of the "just how hard do you want me to try to compress". Nobody has a ".zlib/config" file that you need to worry about accessing etc. Of course, maybe pgpme is a world first, and actually does read your .gnupg/config file trivially, and has all the gpg agent integration that it picks up automatically, and allows various per-user configurations, and all my worries are bogus. But that would literally be the first time I've ever seen that. Linus