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