Ejecute `git add -p` desde ruby

Estoy intentando ejecutar git add -p desde ruby. El problema es que este command muestra porciones de files y espera la input del usuario, lo que puede abrir el editor de git. Los methods regulares de Kernel para ejecutar commands del sistema no funcionarán por este motivo. Intenté usar open3 y aquí está lo que obtuve hasta ahora:

 require "open3" Open3.popen3("\git add -p #{files_to_add.join(" ")}") do |stdin, stdout, stderr, wait_thr| end 

Sin embargo, no sé qué poner en el bloque y no puedo encontrar ninguna pista en los interwebs.

¿Alguna idea de cómo puedo resolver este problema?

NOTA: NO QUIERO usar CUALQUIER gem

EDITAR: open3 no está funcionando. Ahora estoy experimentando con pty . Esto es lo que tengo:

 require "pty" begin PTY.spawn("\git add -p #{files_to_add.join(" ")}") do |r, w, pid| begin r.each { |line| print line } rescue Errno::EIO end end rescue PTY::ChildExited => e puts "The child process exited!" end 

Este código imprime el primer fragment en el parche, pero luego la pregunta "git" pregunta (en otras palabras, el post de input estándar) no aparece. Obviamente no lo estoy imprimiendo en el código anterior, pero parece que no puedo descubrir cómo hacerlo. ¿Algunas ideas?

En el interior del module de biblioteca estándar pty (no se necesitan gems aquí) hay un module interno que puede require llamado llamado expect . Agregará un método esperado a IO.

Probablemente quieras algo como esto:

 require 'pty' require 'expect' PTY.spawn "git add -p" do |r, w, pid| w.sync = true r.expect ']? ' do |got| puts got puts 'responding with q' w.write "q\r" puts r.expect "\n", 9 end end