{"thread":{"id":"11647","subject":"[PATCH] Improve use of lockfile API","startedAt":"2008-01-16T19:12:46Z","lastAt":"2008-01-16T19:36:19Z","messageCount":3,"participants":["Brandon Casey","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"65583","messageId":"478E572E.3020505@nrlssc.navy.mil","threadId":"11647","inReplyTo":null,"subject":"[PATCH] Improve use of lockfile API","fromName":"Brandon Casey","fromEmail":"casey@nrlssc.navy.mil","sentAt":"2008-01-16T19:12:46Z","receivedAt":"2008-01-16T19:12:46Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"-Remove remaining double close(2)'s.\n i.e. close() before commit_locked_index() or commit_lock_file()\n-New close_lock_file() function which will close() the lock descriptor and\n assign -1 to it, but will not remove or rename it.\n-commit_lock_file() was modified to detect and return -1 on failure\n to close the lock file.\n---\n\n\nThere are two places where we fdopen() the lock file descriptor.\nIn builtin-pack-refs.c and fast-import.c.\nPresently, I assigned -1 to the lock->fd and added a comment.\nAdditionally in bundle.c we must assign -1 to the lock->fd\nsince it is closed by start_command().\n\nWe could do something along the lines of:\n\nFILE* fdopen_lock_file(struct lock_file *lk)\n{\n\tFILE* f; \n\tif ((f = fdopen(lk->fd)) == NULL)\n\t\treturn NULL;\n\tlk->fd = -1;\n\treturn f;\n}\n\nBut that may be overkill.\nI'll think we'll probably catch this case since we are now\nchecking that the close() succeeds in commit_lock_file().\n\n-brandon\n\n\n builtin-add.c            |    2 +-\n builtin-apply.c          |    2 +-\n builtin-checkout-index.c |    4 ++--\n builtin-commit.c         |    9 ++++++---\n builtin-diff.c           |    2 +-\n builtin-fetch-pack.c     |    1 -\n builtin-mv.c             |    1 -\n builtin-pack-refs.c      |    4 ++++\n builtin-read-tree.c      |    2 +-\n builtin-rerere.c         |    4 ++--\n builtin-reset.c          |    1 -\n builtin-revert.c         |    4 ++--\n builtin-rm.c             |    2 +-\n builtin-update-index.c   |    2 +-\n builtin-write-tree.c     |    9 +++------\n bundle.c                 |   12 ++++++++----\n cache.h                  |    1 +\n config.c                 |    8 ++------\n fast-import.c            |   10 ++++++++--\n lockfile.c               |   17 ++++++++++++++---\n merge-recursive.c        |    2 +-\n refs.c                   |   12 ++++--------\n 22 files changed, 63 insertions(+), 48 deletions(-)\n\ndiff --git a/builtin-add.c b/builtin-add.c\nindex 5c29cc2..4a91e3e 100644\n--- a/builtin-add.c\n+++ b/builtin-add.c\n@@ -259,7 +259,7 @@ int cmd_add(int argc, const char **argv, const char *prefix)\n  finish:\n \tif (active_cache_changed) {\n \t\tif (write_cache(newfd, active_cache, active_nr) ||\n-\t\t    close(newfd) || commit_locked_index(&lock_file))\n+\t\t    commit_locked_index(&lock_file))\n \t\t\tdie(\"Unable to write new index file\");\n \t}\n \ndiff --git a/builtin-apply.c b/builtin-apply.c\nindex d57bb6e..15432b6 100644\n--- a/builtin-apply.c\n+++ b/builtin-apply.c\n@@ -2921,7 +2921,7 @@ int cmd_apply(int argc, const char **argv, const char *unused_prefix)\n \n \tif (update_index) {\n \t\tif (write_cache(newfd, active_cache, active_nr) ||\n-\t\t    close(newfd) || commit_locked_index(&lock_file))\n+\t\t    commit_locked_index(&lock_file))\n \t\t\tdie(\"Unable to write new index file\");\n \t}\n \ndiff --git a/builtin-checkout-index.c b/builtin-checkout-index.c\nindex 70d619d..7e42024 100644\n--- a/builtin-checkout-index.c\n+++ b/builtin-checkout-index.c\n@@ -246,8 +246,8 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)\n \t\t * want to update cache.\n \t\t */\n \t\tif (state.refresh_cache) {\n-\t\t\tclose(newfd); newfd = -1;\n \t\t\trollback_lock_file(&lock_file);\n+\t\t\tnewfd = -1;\n \t\t}\n \t\tstate.refresh_cache = 0;\n \t}\n@@ -297,7 +297,7 @@ int cmd_checkout_index(int argc, const char **argv, const char *prefix)\n \n \tif (0 <= newfd &&\n \t    (write_cache(newfd, active_cache, active_nr) ||\n-\t     close(newfd) || commit_locked_index(&lock_file)))\n+\t     commit_locked_index(&lock_file)))\n \t\tdie(\"Unable to write new index file\");\n \treturn 0;\n }\ndiff --git a/builtin-commit.c b/builtin-commit.c\nindex 16345e9..a764053 100644\n--- a/builtin-commit.c\n+++ b/builtin-commit.c\n@@ -237,7 +237,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)\n \t\tint fd = hold_locked_index(&index_lock, 1);\n \t\tadd_files_to_cache(0, also ? prefix : NULL, pathspec);\n \t\trefresh_cache(REFRESH_QUIET);\n-\t\tif (write_cache(fd, active_cache, active_nr))\n+\t\tif (write_cache(fd, active_cache, active_nr) ||\n+\t\t    close_lock_file(&index_lock))\n \t\t\tdie(\"unable to write new_index file\");\n \t\tcommit_style = COMMIT_NORMAL;\n \t\treturn index_lock.filename;\n@@ -298,7 +299,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)\n \tfd = hold_locked_index(&index_lock, 1);\n \tadd_remove_files(&partial);\n \trefresh_cache(REFRESH_QUIET);\n-\tif (write_cache(fd, active_cache, active_nr))\n+\tif (write_cache(fd, active_cache, active_nr) ||\n+\t    close_lock_file(&index_lock))\n \t\tdie(\"unable to write new_index file\");\n \n \tfd = hold_lock_file_for_update(&false_lock,\n@@ -308,7 +310,8 @@ static char *prepare_index(int argc, const char **argv, const char *prefix)\n \tadd_remove_files(&partial);\n \trefresh_cache(REFRESH_QUIET);\n \n-\tif (write_cache(fd, active_cache, active_nr))\n+\tif (write_cache(fd, active_cache, active_nr) ||\n+\t    close_lock_file(&false_lock))\n \t\tdie(\"unable to write temporary index file\");\n \treturn false_lock.filename;\n }\ndiff --git a/builtin-diff.c b/builtin-diff.c\nindex 29365a0..8d7a569 100644\n--- a/builtin-diff.c\n+++ b/builtin-diff.c\n@@ -190,7 +190,7 @@ static void refresh_index_quietly(void)\n \trefresh_cache(REFRESH_QUIET|REFRESH_UNMERGED);\n \n \tif (active_cache_changed &&\n-\t    !write_cache(fd, active_cache, active_nr) && !close(fd))\n+\t    !write_cache(fd, active_cache, active_nr))\n \t\tcommit_locked_index(lock_file);\n \n \trollback_lock_file(lock_file);\ndiff --git a/builtin-fetch-pack.c b/builtin-fetch-pack.c\nindex 807fa93..e68e015 100644\n--- a/builtin-fetch-pack.c\n+++ b/builtin-fetch-pack.c\n@@ -783,7 +783,6 @@ struct ref *fetch_pack(struct fetch_pack_args *my_args,\n \t\t\tunlink(shallow);\n \t\t\trollback_lock_file(&lock);\n \t\t} else {\n-\t\t\tclose(fd);\n \t\t\tcommit_lock_file(&lock);\n \t\t}\n \t}\ndiff --git a/builtin-mv.c b/builtin-mv.c\nindex a3f9ad1..990e213 100644\n--- a/builtin-mv.c\n+++ b/builtin-mv.c\n@@ -264,7 +264,6 @@ int cmd_mv(int argc, const char **argv, const char *prefix)\n \n \t\tif (active_cache_changed) {\n \t\t\tif (write_cache(newfd, active_cache, active_nr) ||\n-\t\t\t    close(newfd) ||\n \t\t\t    commit_locked_index(&lock_file))\n \t\t\t\tdie(\"Unable to write new index file\");\n \t\t}\ndiff --git a/builtin-pack-refs.c b/builtin-pack-refs.c\nindex 1923fb1..fbe451f 100644\n--- a/builtin-pack-refs.c\n+++ b/builtin-pack-refs.c\n@@ -108,6 +108,10 @@ static int pack_refs(unsigned int flags)\n \t\tdie(\"failed to write ref-pack file\");\n \tif (fflush(cbdata.refs_file) || fsync(fd) || fclose(cbdata.refs_file))\n \t\tdie(\"failed to write ref-pack file (%s)\", strerror(errno));\n+\t/* Since the lock file was fdopen()'ed and then fclose()'ed above,\n+\t * assign -1 to the lock file descriptor so that commit_lock_file()\n+\t * won't try to close() it. */\n+\tpacked.fd = -1;\n \tif (commit_lock_file(&packed) < 0)\n \t\tdie(\"unable to overwrite old ref-pack file (%s)\", strerror(errno));\n \tif (cbdata.flags & PACK_REFS_PRUNE)\ndiff --git a/builtin-read-tree.c b/builtin-read-tree.c\nindex 43cd56a..c0ea034 100644\n--- a/builtin-read-tree.c\n+++ b/builtin-read-tree.c\n@@ -283,7 +283,7 @@ int cmd_read_tree(int argc, const char **argv, const char *unused_prefix)\n \t}\n \n \tif (write_cache(newfd, active_cache, active_nr) ||\n-\t    close(newfd) || commit_locked_index(&lock_file))\n+\t    commit_locked_index(&lock_file))\n \t\tdie(\"unable to write new index file\");\n \treturn 0;\n }\ndiff --git a/builtin-rerere.c b/builtin-rerere.c\nindex 37e6248..a9e3ebc 100644\n--- a/builtin-rerere.c\n+++ b/builtin-rerere.c\n@@ -61,9 +61,9 @@ static int write_rr(struct path_list *rr, int out_fd)\n \t\t    write_in_full(out_fd, path, length) != length)\n \t\t\tdie(\"unable to write rerere record\");\n \t}\n-\tif (close(out_fd) != 0)\n+\tif (commit_lock_file(&write_lock) != 0)\n \t\tdie(\"unable to write rerere record\");\n-\treturn commit_lock_file(&write_lock);\n+\treturn 0;\n }\n \n static int handle_file(const char *path,\ndiff --git a/builtin-reset.c b/builtin-reset.c\nindex 10dba60..7ee811f 100644\n--- a/builtin-reset.c\n+++ b/builtin-reset.c\n@@ -108,7 +108,6 @@ static int update_index_refresh(int fd, struct lock_file *index_lock)\n \t\treturn error(\"Could not read index\");\n \tresult = refresh_cache(0) ? 1 : 0;\n \tif (write_cache(fd, active_cache, active_nr) ||\n-\t\t\tclose(fd) ||\n \t\t\tcommit_locked_index(index_lock))\n \t\treturn error (\"Could not refresh index\");\n \treturn result;\ndiff --git a/builtin-revert.c b/builtin-revert.c\nindex 4bf8eb2..358af53 100644\n--- a/builtin-revert.c\n+++ b/builtin-revert.c\n@@ -371,13 +371,13 @@ static int revert_or_cherry_pick(int argc, const char **argv)\n \t\t\t\t\ti++;\n \t\t\t}\n \t\t}\n-\t\tif (close(msg_fd) || commit_lock_file(&msg_file) < 0)\n+\t\tif (commit_lock_file(&msg_file) < 0)\n \t\t\tdie (\"Error wrapping up %s\", defmsg);\n \t\tfprintf(stderr, \"Automatic %s failed.%s\\n\",\n \t\t\tme, help_msg(commit->object.sha1));\n \t\texit(1);\n \t}\n-\tif (close(msg_fd) || commit_lock_file(&msg_file) < 0)\n+\tif (commit_lock_file(&msg_file) < 0)\n \t\tdie (\"Error wrapping up %s\", defmsg);\n \tfprintf(stderr, \"Finished one %s.\\n\", me);\n \ndiff --git a/builtin-rm.c b/builtin-rm.c\nindex a3d25e6..c0a8bb6 100644\n--- a/builtin-rm.c\n+++ b/builtin-rm.c\n@@ -250,7 +250,7 @@ int cmd_rm(int argc, const char **argv, const char *prefix)\n \n \tif (active_cache_changed) {\n \t\tif (write_cache(newfd, active_cache, active_nr) ||\n-\t\t    close(newfd) || commit_locked_index(&lock_file))\n+\t\t    commit_locked_index(&lock_file))\n \t\t\tdie(\"Unable to write new index file\");\n \t}\n \ndiff --git a/builtin-update-index.c b/builtin-update-index.c\nindex e1a938d..c3a14c7 100644\n--- a/builtin-update-index.c\n+++ b/builtin-update-index.c\n@@ -738,7 +738,7 @@ int cmd_update_index(int argc, const char **argv, const char *prefix)\n \t\t\t    get_index_file(), strerror(lock_error));\n \t\t}\n \t\tif (write_cache(newfd, active_cache, active_nr) ||\n-\t\t    close(newfd) || commit_locked_index(lock_file))\n+\t\t    commit_locked_index(lock_file))\n \t\t\tdie(\"Unable to write new index file\");\n \t}\n \ndiff --git a/builtin-write-tree.c b/builtin-write-tree.c\nindex b89d02e..d16b9ed 100644\n--- a/builtin-write-tree.c\n+++ b/builtin-write-tree.c\n@@ -35,11 +35,9 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)\n \t\t\t\t      missing_ok, 0) < 0)\n \t\t\tdie(\"git-write-tree: error building trees\");\n \t\tif (0 <= newfd) {\n-\t\t\tif (!write_cache(newfd, active_cache, active_nr)\n-\t\t\t\t\t&& !close(newfd)) {\n-\t\t\t\tcommit_lock_file(lock_file);\n+\t\t\tif (!write_cache(newfd, active_cache, active_nr) &&\n+\t\t\t    !commit_lock_file(lock_file))\n \t\t\t\tnewfd = -1;\n-\t\t\t}\n \t\t}\n \t\t/* Not being able to write is fine -- we are only interested\n \t\t * in updating the cache-tree part, and if the next caller\n@@ -60,8 +58,7 @@ int write_tree(unsigned char *sha1, int missing_ok, const char *prefix)\n \t\thashcpy(sha1, active_cache_tree->sha1);\n \n \tif (0 <= newfd)\n-\t\tclose(newfd);\n-\trollback_lock_file(lock_file);\n+\t\trollback_lock_file(lock_file);\n \n \treturn 0;\n }\ndiff --git a/bundle.c b/bundle.c\nindex 316aa74..61f388a 100644\n--- a/bundle.c\n+++ b/bundle.c\n@@ -317,6 +317,12 @@ int create_bundle(struct bundle_header *header, const char *path,\n \trls.git_cmd = 1;\n \tif (start_command(&rls))\n \t\treturn error(\"Could not spawn pack-objects\");\n+\n+\t/* start_command closed bundle_fd if it was > 1\n+\t * so set the lock fd to -1 so commit_lock_file()\n+\t * won't fail trying to close it */\n+\tlock.fd = -1;\n+\n \tfor (i = 0; i < revs.pending.nr; i++) {\n \t\tstruct object *object = revs.pending.objects[i].item;\n \t\tif (object->flags & UNINTERESTING)\n@@ -326,10 +332,8 @@ int create_bundle(struct bundle_header *header, const char *path,\n \t}\n \tif (finish_command(&rls))\n \t\treturn error (\"pack-objects died\");\n-\tclose(bundle_fd);\n-\tif (!bundle_to_stdout)\n-\t\tcommit_lock_file(&lock);\n-\treturn 0;\n+\n+\treturn bundle_to_stdout ? close(bundle_fd) : commit_lock_file(&lock);\n }\n \n int unbundle(struct bundle_header *header, int bundle_fd)\ndiff --git a/cache.h b/cache.h\nindex 39331c2..4f4495f 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -303,6 +303,7 @@ struct lock_file {\n \tchar filename[PATH_MAX];\n };\n extern int hold_lock_file_for_update(struct lock_file *, const char *path, int);\n+extern int close_lock_file(struct lock_file *);\n extern int commit_lock_file(struct lock_file *);\n \n extern int hold_locked_index(struct lock_file *, int);\ndiff --git a/config.c b/config.c\nindex 857deb6..526a3f4 100644\n--- a/config.c\n+++ b/config.c\n@@ -955,14 +955,12 @@ int git_config_set_multivar(const char* key, const char* value,\n \t\tmunmap(contents, contents_sz);\n \t}\n \n-\tif (close(fd) || commit_lock_file(lock) < 0) {\n+\tif (commit_lock_file(lock) < 0) {\n \t\tfprintf(stderr, \"Cannot commit config file!\\n\");\n \t\tret = 4;\n \t\tgoto out_free;\n \t}\n \n-\t/* fd is closed, so don't try to close it below. */\n-\tfd = -1;\n \t/*\n \t * lock is committed, so don't try to roll it back below.\n \t * NOTE: Since lockfile.c keeps a linked list of all created\n@@ -973,8 +971,6 @@ int git_config_set_multivar(const char* key, const char* value,\n \tret = 0;\n \n out_free:\n-\tif (0 <= fd)\n-\t\tclose(fd);\n \tif (lock)\n \t\trollback_lock_file(lock);\n \tfree(config_filename);\n@@ -1072,7 +1068,7 @@ int git_config_rename_section(const char *old_name, const char *new_name)\n \t}\n \tfclose(config_file);\n  unlock_and_out:\n-\tif (close(out_fd) || commit_lock_file(lock) < 0)\n+\tif (commit_lock_file(lock) < 0)\n \t\t\tret = error(\"Cannot commit config file!\");\n  out:\n \tfree(config_filename);\ndiff --git a/fast-import.c b/fast-import.c\nindex 82e9161..1ce631c 100644\n--- a/fast-import.c\n+++ b/fast-import.c\n@@ -1546,10 +1546,16 @@ static void dump_marks(void)\n \t}\n \n \tdump_marks_helper(f, 0, marks);\n-\tfclose(f);\n-\tif (commit_lock_file(&mark_lock))\n+\tif (ferror(f) || fclose(f))\n \t\tfailure |= error(\"Unable to write marks file %s: %s\",\n \t\t\tmark_file, strerror(errno));\n+\t/* Since the lock file was fdopen()'ed and then fclose()'ed above,\n+\t * assign -1 to the lock file descriptor so that commit_lock_file()\n+\t * won't try to close() it. */\n+\tmark_lock.fd = -1;\n+\tif (commit_lock_file(&mark_lock))\n+\t\tfailure |= error(\"Unable to write commit file %s: %s\",\n+\t\t\tmark_file, strerror(errno));\n }\n \n static int read_next_command(void)\ndiff --git a/lockfile.c b/lockfile.c\nindex f45d3ed..bcc4786 100644\n--- a/lockfile.c\n+++ b/lockfile.c\n@@ -13,7 +13,8 @@ static void remove_lock_file(void)\n \twhile (lock_file_list) {\n \t\tif (lock_file_list->owner == me &&\n \t\t    lock_file_list->filename[0]) {\n-\t\t\tclose(lock_file_list->fd);\n+\t\t\tif (lock_file_list->fd >= 0)\n+\t\t\t\tclose(lock_file_list->fd);\n \t\t\tunlink(lock_file_list->filename);\n \t\t}\n \t\tlock_file_list = lock_file_list->next;\n@@ -159,11 +160,20 @@ int hold_lock_file_for_update(struct lock_file *lk, const char *path, int die_on\n \treturn fd;\n }\n \n+int close_lock_file(struct lock_file *lk)\n+{\n+\tif (close(lk->fd))\n+\t\treturn -1;\n+\tlk->fd = -1;\n+\treturn 0;\n+}\n+\n int commit_lock_file(struct lock_file *lk)\n {\n \tchar result_file[PATH_MAX];\n \tint i;\n-\tclose(lk->fd);\n+\tif (lk->fd >= 0 && close_lock_file(lk))\n+\t\treturn -1;\n \tstrcpy(result_file, lk->filename);\n \ti = strlen(result_file) - 5; /* .lock */\n \tresult_file[i] = 0;\n@@ -196,7 +206,8 @@ int commit_locked_index(struct lock_file *lk)\n void rollback_lock_file(struct lock_file *lk)\n {\n \tif (lk->filename[0]) {\n-\t\tclose(lk->fd);\n+\t\tif (lk->fd >= 0)\n+\t\t\tclose(lk->fd);\n \t\tunlink(lk->filename);\n \t}\n \tlk->filename[0] = 0;\ndiff --git a/merge-recursive.c b/merge-recursive.c\nindex b34177d..c292a77 100644\n--- a/merge-recursive.c\n+++ b/merge-recursive.c\n@@ -1753,7 +1753,7 @@ int main(int argc, char *argv[])\n \n \tif (active_cache_changed &&\n \t    (write_cache(index_fd, active_cache, active_nr) ||\n-\t     close(index_fd) || commit_locked_index(lock)))\n+\t     commit_locked_index(lock)))\n \t\t\tdie (\"unable to write %s\", get_index_file());\n \n \treturn clean ? 0: 1;\ndiff --git a/refs.c b/refs.c\nindex 58f6d17..2c78956 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -864,7 +864,6 @@ static int repack_without_ref(const char *refname)\n \t\t\tdie(\"too long a refname '%s'\", list->name);\n \t\twrite_or_die(fd, line, len);\n \t}\n-\tclose(fd);\n \treturn commit_lock_file(&packlock);\n }\n \n@@ -1021,12 +1020,9 @@ int rename_ref(const char *oldref, const char *newref, const char *logmsg)\n \n void unlock_ref(struct ref_lock *lock)\n {\n-\tif (lock->lock_fd >= 0) {\n-\t\tclose(lock->lock_fd);\n-\t\t/* Do not free lock->lk -- atexit() still looks at them */\n-\t\tif (lock->lk)\n-\t\t\trollback_lock_file(lock->lk);\n-\t}\n+        /* Do not free lock->lk -- atexit() still looks at them */\n+        if (lock->lk)\n+        \trollback_lock_file(lock->lk);\n \tfree(lock->ref_name);\n \tfree(lock->orig_ref_name);\n \tfree(lock);\n@@ -1132,7 +1128,7 @@ int write_ref_sha1(struct ref_lock *lock,\n \t}\n \tif (write_in_full(lock->lock_fd, sha1_to_hex(sha1), 40) != 40 ||\n \t    write_in_full(lock->lock_fd, &term, 1) != 1\n-\t\t|| close(lock->lock_fd) < 0) {\n+\t    \t|| close_lock_file(lock->lk) < 0) {\n \t\terror(\"Couldn't write %s\", lock->lk->filename);\n \t\tunlock_ref(lock);\n \t\treturn -1;\n-- \n1.5.4.rc3.14.g44397-dirty\n"},{"id":"65588","messageId":"7v4pddr2jy.fsf@gitster.siamese.dyndns.org","threadId":"11647","inReplyTo":"478E572E.3020505@nrlssc.navy.mil","subject":"Re: [PATCH] Improve use of lockfile API","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-16T19:30:25Z","receivedAt":"2008-01-16T19:30:25Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Ok, our mails crossed.  I'll scrap part of my [2/2] and queue\nthis series perhaps to 'next' after review.\n"},{"id":"65590","messageId":"478E5CB3.8050401@nrlssc.navy.mil","threadId":"11647","inReplyTo":"7v4pddr2jy.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Improve use of lockfile API","fromName":"Brandon Casey","fromEmail":"casey@nrlssc.navy.mil","sentAt":"2008-01-16T19:36:19Z","receivedAt":"2008-01-16T19:36:19Z","isPatch":true,"sender":{"key":"drafnel@gmail.com","avatar":"https://avatars.githubusercontent.com/u/921167?v=4"},"body":"Junio C Hamano wrote:\n> Ok, our mails crossed.  I'll scrap part of my [2/2] and queue\n> this series perhaps to 'next' after review.\n\nYeah, I received yours while I was readying mine.\n\nAlso, I forgot to add signed-off. So please add:\n\nSigned-off-by: Brandon Casey <casey@nrlssc.navy.mil>\n\nwhen you commit, or I can resend if you like.\n\n-brandon\n"}]}