{"thread":{"id":"5923","subject":"[PATCH 2/2] When packing and pruning refs, remove \"deleted-refs\".","startedAt":"2006-10-14T13:41:09Z","lastAt":"2006-10-14T13:41:09Z","messageCount":1,"participants":["Christian Couder"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"28762","messageId":"20061014154109.9a093319.chriscool@tuxfamily.org","threadId":"5923","inReplyTo":null,"subject":"[PATCH 2/2] When packing and pruning refs, remove \"deleted-refs\".","fromName":"Christian Couder","fromEmail":"chriscool@tuxfamily.org","sentAt":"2006-10-14T13:41:09Z","receivedAt":"2006-10-14T13:41:09Z","isPatch":true,"sender":{"key":"christian.couder@gmail.com","avatar":"https://avatars.githubusercontent.com/u/208954?v=4"},"body":"When running \"git pack-refs --prune\" we have to also prune\ndeleted ref files. To do this, remove recusively everything\nunder \"$GIT_DIR/deleted-refs\".\n\nThe new \"remove_all_recursive\" function has been copied from\n\"remove_empty_dir_recursive\" in \"refs.c\".\n\nSigned-off-by: Christian Couder <chriscool@tuxfamily.org>\n---\n builtin-pack-refs.c |   42 ++++++++++++++++++++++++++++++++++++++++++\n 1 files changed, 42 insertions(+), 0 deletions(-)\n\ndiff --git a/builtin-pack-refs.c b/builtin-pack-refs.c\nindex 1087657..84ca170 100644\n--- a/builtin-pack-refs.c\n+++ b/builtin-pack-refs.c\n@@ -54,12 +54,54 @@ static void prune_ref(struct ref_to_prun\n \t}\n }\n \n+static int remove_all_recursive(char *path)\n+{\n+\tDIR *dir = opendir(path);\n+\tstruct dirent *e;\n+\tint ret = 0;\n+\tint len = strlen(path);\n+\n+\tif (!dir)\n+\t\treturn unlink(path);\n+\tif (path[len-1] != '/')\n+\t\tpath[len++] = '/';\n+\twhile ((e = readdir(dir)) != NULL) {\n+\t\tstruct stat st;\n+\t\tint namlen;\n+\t\tif ((e->d_name[0] == '.') &&\n+\t\t    ((e->d_name[1] == 0) ||\n+\t\t     ((e->d_name[1] == '.') && e->d_name[2] == 0)))\n+\t\t\tcontinue; /* \".\" and \"..\" */\n+\n+\t\tnamlen = strlen(e->d_name);\n+\t\tif ((len + namlen < PATH_MAX) &&\n+\t\t    strcpy(path + len, e->d_name) &&\n+\t\t    !lstat(path, &st) &&\n+\t\t    (S_ISDIR(st.st_mode) ?\n+\t\t     !remove_all_recursive(path) :\n+\t\t     !unlink(path)))\n+\t\t\tcontinue; /* happy */\n+\n+\t\t/* path too long, stat, rmdir or unlink fails */\n+\t\tret = -1;\n+\t\tbreak;\n+\t}\n+\tclosedir(dir);\n+\tif (!ret) {\n+\t\tpath[len] = 0;\n+\t\tret = rmdir(path);\n+\t}\n+\treturn ret;\n+}\n+\n static void prune_refs(struct ref_to_prune *r)\n {\n \twhile (r) {\n \t\tprune_ref(r);\n \t\tr = r->next;\n \t}\n+\n+\tremove_all_recursive(git_path(\"deleted-refs\"));\n }\n \n static struct lock_file packed;\n-- \n1.4.3.rc2.gbcf275-dirty\n"}]}