-
Notifications
You must be signed in to change notification settings - Fork 92
Description
Description
I'd like a method on each *Command that either returns a string or passes the string to a caller-provided function.
The string should be the equivalent git command line invocation for the command.
Motivation
I'm writing automation, and I want to log the git operations the automation is performing. A natural way to do this is to log the operations as the equivalent git commands.
- The people reviewing the logs are familiar with git.
- In case of a problem it makes it easy to manually walk through the same operations the automation performed by copy/pasting the command.
Right now I'm doing this in Kotlin, and can do this with a lot of extension functions and some reflection to get at private properties. For example, for AddCommand:
inline fun <reified T : Any, R> T.getPrivateProperty(name: String): R? {
val field = this::class.java.getDeclaredField(name)
field.isAccessible = true
@Suppress("UNCHECKED_CAST")
return field.get(this) as R?
}
fun AddCommand.info(t: Terminal): AddCommand {
val update = if (getPrivateProperty<AddCommand, Boolean>("update") == true) " --update" else ""
val filePatterns = getPrivateProperty<AddCommand, Collection<String>>("filepatterns")
?.joinToString(" ")
t.info("- git add$update $filePatterns")
return this
}and then the call site looks like this:
val t = Terminal()
git.add()
.setUpdate(false)
.addFilePattern("foo")
.info(t)
.call()
which (for my use case) prints
- git add foo
to the terminal when this runs. This is specific to my use case and isn't very general, which is why I suggest the JGit equivalent (if implemented) should take a caller-provided function which receives the command string and decides what to do with it.
Alternatives considered
No response
Additional context
No response