{"thread":{"id":"5769","subject":"[PATCH 2/2] Check packed refs when creating leading directories.","startedAt":"2006-09-30T20:02:16Z","lastAt":"2006-09-30T20:02:16Z","messageCount":1,"participants":["Christian Couder"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"28035","messageId":"20060930220216.233c6f7b.chriscool@tuxfamily.org","threadId":"5769","inReplyTo":null,"subject":"[PATCH 2/2] Check packed refs when creating leading directories.","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2006-09-30T20:02:16Z","receivedAt":"2006-09-30T20:02:16Z","isPatch":true,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"This patch adds an optionnal packed refs check to the\n\"safe_create_leading_directories\" function. This check is\ncontroled by a new int parameter \"check_packed_ref\" that\nmust be set.\n\nIn \"lock_ref_sha1_basic\", \"safe_create_leading_directories\"\nis now called with this parameter set, so that no directory\nfrotz can be created if there is already a frotz packed ref.\n\nThe previous check for this is removed from \"git-branch.sh\"\nas it is now useless.\n\nSigned-off-by: Christian Couder <chriscool@tuxfamily.org>\n---\n builtin-apply.c   |    2 +-\n cache.h           |    2 +-\n git-branch.sh     |   10 ----------\n local-fetch.c     |    2 +-\n merge-recursive.c |    2 +-\n refs.c            |    4 ++--\n server-info.c     |    4 ++--\n sha1_file.c       |   12 +++++++++++-\n 8 files changed, 19 insertions(+), 19 deletions(-)\n\ndiff --git a/builtin-apply.c b/builtin-apply.c\nindex de5f855..0d6a20c 100644\n--- a/builtin-apply.c\n+++ b/builtin-apply.c\n@@ -2291,7 +2291,7 @@ static void create_one_file(char *path, \n \t\treturn;\n \n \tif (errno == ENOENT) {\n-\t\tif (safe_create_leading_directories(path))\n+\t\tif (safe_create_leading_directories(path, 0))\n \t\t\treturn;\n \t\tif (!try_create_file(path, mode, buf, size))\n \t\t\treturn;\ndiff --git a/cache.h b/cache.h\nindex f37bc18..e05a7b0 100644\n--- a/cache.h\n+++ b/cache.h\n@@ -239,7 +239,7 @@ enum sharedrepo {\n };\n int git_config_perm(const char *var, const char *value);\n int adjust_shared_perm(const char *path);\n-int safe_create_leading_directories(char *path);\n+int safe_create_leading_directories(char *path, int check_packed_ref);\n char *enter_repo(char *path, int strict);\n \n /* Read and unpack a sha1 file into memory, write memory to a sha1 file */\ndiff --git a/git-branch.sh b/git-branch.sh\nindex c616830..bf84b30 100755\n--- a/git-branch.sh\n+++ b/git-branch.sh\n@@ -121,16 +121,6 @@ then\n \tdone\n fi\n \n-branchdir=$(dirname $branchname)\n-while test \"$branchdir\" != \".\"\n-do\n-\tif git-show-ref --verify --quiet -- \"refs/heads/$branchdir\"\n-\tthen\n-\t\tdie \"$branchdir already exists.\"\n-\tfi\n-\tbranchdir=$(dirname $branchdir)\n-done\n-\n prev=''\n if git-show-ref --verify --quiet -- \"refs/heads/$branchname\"\n then\ndiff --git a/local-fetch.c b/local-fetch.c\nindex 7b6875c..14672f6 100644\n--- a/local-fetch.c\n+++ b/local-fetch.c\n@@ -56,7 +56,7 @@ static int setup_indices(void)\n static int copy_file(const char *source, char *dest, const char *hex,\n \t\t     int warn_if_not_exists)\n {\n-\tsafe_create_leading_directories(dest);\n+\tsafe_create_leading_directories(dest, 0);\n \tif (use_link) {\n \t\tif (!link(source, dest)) {\n \t\t\tpull_say(\"link %s\\n\", hex);\ndiff --git a/merge-recursive.c b/merge-recursive.c\nindex 611cd95..4c9b6b2 100644\n--- a/merge-recursive.c\n+++ b/merge-recursive.c\n@@ -515,7 +515,7 @@ static int mkdir_p(const char *path, uns\n {\n \t/* path points to cache entries, so xstrdup before messing with it */\n \tchar *buf = xstrdup(path);\n-\tint result = safe_create_leading_directories(buf);\n+\tint result = safe_create_leading_directories(buf, 0);\n \tfree(buf);\n \treturn result;\n }\ndiff --git a/refs.c b/refs.c\nindex 5e3988b..1ac7d61 100644\n--- a/refs.c\n+++ b/refs.c\n@@ -506,7 +506,7 @@ static struct ref_lock *lock_ref_sha1_ba\n \tref_file = git_path(\"%s\", ref);\n \tlock->force_write = lstat(ref_file, &st) && errno == ENOENT;\n \n-\tif (safe_create_leading_directories(ref_file))\n+\tif (safe_create_leading_directories(ref_file, 1))\n \t\tdie(\"unable to create directory for %s\", ref_file);\n \tlock->lock_fd = hold_lock_file_for_update(lock->lk, ref_file, 1);\n \n@@ -549,7 +549,7 @@ static int log_ref_write(struct ref_lock\n \tconst char *committer;\n \n \tif (log_all_ref_updates) {\n-\t\tif (safe_create_leading_directories(lock->log_file) < 0)\n+\t\tif (safe_create_leading_directories(lock->log_file, 0) < 0)\n \t\t\treturn error(\"unable to create directory for %s\",\n \t\t\t\tlock->log_file);\n \t\toflags |= O_CREAT;\ndiff --git a/server-info.c b/server-info.c\nindex 6cd38be..455f333 100644\n--- a/server-info.c\n+++ b/server-info.c\n@@ -30,7 +30,7 @@ static int update_info_refs(int force)\n \tstrcpy(path1, path0);\n \tstrcpy(path1 + len, \"+\");\n \n-\tsafe_create_leading_directories(path0);\n+\tsafe_create_leading_directories(path0, 0);\n \tinfo_ref_fp = fopen(path1, \"w\");\n \tif (!info_ref_fp)\n \t\treturn error(\"unable to update %s\", path0);\n@@ -219,7 +219,7 @@ static int update_info_packs(int force)\n \n \tinit_pack_info(infofile, force);\n \n-\tsafe_create_leading_directories(name);\n+\tsafe_create_leading_directories(name, 0);\n \tfp = fopen(name, \"w\");\n \tif (!fp)\n \t\treturn error(\"cannot open %s\", name);\ndiff --git a/sha1_file.c b/sha1_file.c\nindex 18c2f88..b6c0da3 100644\n--- a/sha1_file.c\n+++ b/sha1_file.c\n@@ -74,7 +74,7 @@ int get_sha1_hex(const char *hex, unsign\n \treturn 0;\n }\n \n-int safe_create_leading_directories(char *path)\n+int safe_create_leading_directories(char *path, int check_packed_ref)\n {\n \tchar *pos = path;\n \tstruct stat st;\n@@ -102,6 +102,16 @@ int safe_create_leading_directories(char\n \t\t\t*pos = '/';\n \t\t\treturn -2;\n \t\t}\n+\t\telse if (check_packed_ref) {\n+\t\t\tunsigned char sha1[20];\n+\t\t\tconst char *ref = path + strlen(get_git_dir()) + 1;\n+\t\t\tif (resolve_packed_ref(ref, sha1, 1, NULL)) {\n+\t\t\t\trmdir(path);\n+\t\t\t\tfprintf(stderr, \"%s already exists.\\n\", ref);\n+\t\t\t\t*pos = '/';\n+\t\t\t\treturn -4;\n+\t\t\t}\n+\t\t}\n \t\t*pos++ = '/';\n \t}\n \treturn 0;\n-- \n1.4.2.1.g7cf04\n"}]}