Re: [RFC/PATCH 4/4] replace: add --edit option

2014-03-07 Thread Jeff King
On Thu, Mar 06, 2014 at 08:57:58PM -0500, Eric Sunshine wrote:

  +   if (strbuf_read(result, cmd.out, 41)  0)
  +   die_errno(unable to read from mktree);
  +   close(cmd.out);
  +
  +   if (finish_command(cmd))
  +   die(mktree reported failure);
  +   if (get_sha1_hex(result.buf, sha1)  0)
  +   die(mktree did not return an object name);
 
 strbuf_release(result);

Thanks for catching. I'll include it in any re-roll.

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/PATCH 4/4] replace: add --edit option

2014-03-06 Thread Eric Sunshine
On Thu, Mar 6, 2014 at 12:51 PM, Jeff King p...@peff.net wrote:
 This allows you to run:

 git replace --edit SHA1

 to get dumped in an editor with the contents of the object
 for SHA1. The result is then read back in and used as a
 replace object for SHA1. The writing/reading is
 type-aware, so you get to edit ls-tree output rather than
 the binary tree format.

 Signed-off-by: Jeff King p...@peff.net
 ---
 diff --git a/builtin/replace.c b/builtin/replace.c
 index a090302..3ed5f75 100644
 --- a/builtin/replace.c
 +++ b/builtin/replace.c
 @@ -176,6 +177,105 @@ static int replace_object(const char *object_ref, const 
 char *replace_ref, int f
 return replace_object_sha1(object_ref, object, replace_ref, repl, 
 force);
  }

 +/*
 + * Read a previously-exported (and possibly edited) object back from 
 filename,
 + * interpreting it as type, and writing the result to the object database.
 + * The sha1 of the written object is returned via sha1.
 + */
 +static void import_object(unsigned char *sha1, enum object_type type,
 + const char *filename)
 +{
 +   int fd;
 +
 +   fd = open(filename, O_RDONLY);
 +   if (fd  0)
 +   die_errno(unable to open %s for reading, filename);
 +
 +   if (type == OBJ_TREE) {
 +   const char *argv[] = { mktree, NULL };
 +   struct child_process cmd = { argv };
 +   struct strbuf result = STRBUF_INIT;
 +
 +   cmd.argv = argv;
 +   cmd.git_cmd = 1;
 +   cmd.in = fd;
 +   cmd.out = -1;
 +
 +   if (start_command(cmd))
 +   die(unable to spawn mktree);
 +
 +   if (strbuf_read(result, cmd.out, 41)  0)
 +   die_errno(unable to read from mktree);
 +   close(cmd.out);
 +
 +   if (finish_command(cmd))
 +   die(mktree reported failure);
 +   if (get_sha1_hex(result.buf, sha1)  0)
 +   die(mktree did not return an object name);

strbuf_release(result);

 +   } else {
 +   struct stat st;
 +   int flags = HASH_FORMAT_CHECK | HASH_WRITE_OBJECT;
 +
 +   if (fstat(fd, st)  0)
 +   die_errno(unable to fstat %s, filename);
 +   if (index_fd(sha1, fd, st, type, NULL, flags)  0)
 +   die(unable to write object to database);
 +   /* index_fd close()s fd for us */
 +   }
 +
 +   /*
 +* No need to close(fd) here; both run-command and index-fd
 +* will have done it for us.
 +*/
 +}
 --
 1.8.5.2.500.g8060133
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html