[PATCH] pack-refs: dereference .git/packed-refs if it is a symlink
- From
- Peter Baumann <waste.manager@gmx.de>
- Date
- Apr 18, 2007, 10:28 UTC
- Message-ID
- <20070418102823.GA5586@xp.machine.xx>
- In-Reply-To
- <7v7isajfl1.fsf@assigned-by-dhcp.cox.net>
git-new-workdir creates a new working directory where everything necessary, including .git/packed-refs, is symlinked to your master repo. But git-pack-refs breaks the symlink, so you could accidentally loose some refs. This fixes it to first dereference .git/packed-refs if it is a symlink.
Signed-off-by: Peter Baumann <waste.manager@gmx.de> --- builtin-pack-refs.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-)
diff --git a/builtin-pack-refs.c b/builtin-pack-refs.c index d080e30..afa9b5a 100644 --- a/builtin-pack-refs.c +++ b/builtin-pack-refs.c @@ -89,6 +89,8 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix) { int fd, i; struct pack_refs_cb_data cbdata; + struct stat st; + char *ref_file_name; memset(&cbdata, 0, sizeof(cbdata)); @@ -113,7 +115,18 @@ int cmd_pack_refs(int argc, const char **argv, const char *prefix) if (i != argc) usage(builtin_pack_refs_usage); - fd = hold_lock_file_for_update(&packed, git_path("packed-refs"), 1); + ref_file_name = git_path("packed-refs"); + if (!lstat(ref_file_name, &st) && S_ISLNK(st.st_mode)) { + char *buf = xmalloc(st.st_size + 1); + if (readlink(ref_file_name, buf, st.st_size + 1) != st.st_size) { + free(buf); + die("readlink failed\n"); + } + buf[st.st_size] = '\0'; + ref_file_name = buf; + } + + fd = hold_lock_file_for_update(&packed, ref_file_name, 1); cbdata.refs_file = fdopen(fd, "w"); if (!cbdata.refs_file) die("unable to create ref-pack file structure (%s)",
-- 1.5.1