From: Matthias Kestenholz Date: Wed, 2 Aug 2006 16:32:32 +0000 (+0200) Subject: Make git-prune-packed a builtin X-Git-Tag: v1.4.2-rc3~12 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=53bb2c002a53cdd0746444defbf5323ea21eb8d5;p=git.git Make git-prune-packed a builtin Signed-off-by: Matthias Kestenholz Signed-off-by: Junio C Hamano --- diff --git a/Makefile b/Makefile index e66e9b16a..fd45cd19b 100644 --- a/Makefile +++ b/Makefile @@ -178,7 +178,7 @@ PROGRAMS = \ git-hash-object$X git-index-pack$X git-local-fetch$X \ git-merge-base$X \ git-merge-index$X git-mktag$X git-mktree$X git-pack-objects$X git-patch-id$X \ - git-peek-remote$X git-prune-packed$X git-receive-pack$X \ + git-peek-remote$X git-receive-pack$X \ git-send-pack$X git-shell$X \ git-show-index$X git-ssh-fetch$X \ git-ssh-upload$X git-unpack-file$X \ @@ -197,7 +197,7 @@ BUILT_INS = git-log$X git-whatchanged$X git-show$X git-update-ref$X \ git-read-tree$X git-commit-tree$X git-write-tree$X \ git-apply$X git-show-branch$X git-diff-files$X git-update-index$X \ git-diff-index$X git-diff-stages$X git-diff-tree$X git-cat-file$X \ - git-fmt-merge-msg$X git-prune$X git-mv$X + git-fmt-merge-msg$X git-prune$X git-mv$X git-prune-packed$X # what 'all' will build and 'install' will install, in gitexecdir ALL_PROGRAMS = $(PROGRAMS) $(SIMPLE_PROGRAMS) $(SCRIPTS) @@ -254,7 +254,7 @@ BUILTIN_OBJS = \ builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \ builtin-cat-file.o builtin-mailsplit.o builtin-stripspace.o \ builtin-update-ref.o builtin-fmt-merge-msg.o builtin-prune.o \ - builtin-mv.o + builtin-mv.o builtin-prune-packed.o GITLIBS = $(LIB_FILE) $(XDIFF_LIB) LIBS = $(GITLIBS) -lz diff --git a/builtin-prune-packed.c b/builtin-prune-packed.c new file mode 100644 index 000000000..d0ff336c1 --- /dev/null +++ b/builtin-prune-packed.c @@ -0,0 +1,77 @@ +#include "cache.h" + +static const char prune_packed_usage[] = +"git-prune-packed [-n]"; + +static int dryrun; + +static void prune_dir(int i, DIR *dir, char *pathname, int len) +{ + struct dirent *de; + char hex[40]; + + sprintf(hex, "%02x", i); + while ((de = readdir(dir)) != NULL) { + unsigned char sha1[20]; + if (strlen(de->d_name) != 38) + continue; + memcpy(hex+2, de->d_name, 38); + if (get_sha1_hex(hex, sha1)) + continue; + if (!has_sha1_pack(sha1)) + continue; + memcpy(pathname + len, de->d_name, 38); + if (dryrun) + printf("rm -f %s\n", pathname); + else if (unlink(pathname) < 0) + error("unable to unlink %s", pathname); + } + pathname[len] = 0; + rmdir(pathname); +} + +static void prune_packed_objects(void) +{ + int i; + static char pathname[PATH_MAX]; + const char *dir = get_object_directory(); + int len = strlen(dir); + + if (len > PATH_MAX - 42) + die("impossible object directory"); + memcpy(pathname, dir, len); + if (len && pathname[len-1] != '/') + pathname[len++] = '/'; + for (i = 0; i < 256; i++) { + DIR *d; + + sprintf(pathname + len, "%02x/", i); + d = opendir(pathname); + if (!d) + continue; + prune_dir(i, d, pathname, len + 3); + closedir(d); + } +} + +int cmd_prune_packed(int argc, char **argv, const char *prefix) +{ + int i; + + for (i = 1; i < argc; i++) { + const char *arg = argv[i]; + + if (*arg == '-') { + if (!strcmp(arg, "-n")) + dryrun = 1; + else + usage(prune_packed_usage); + continue; + } + /* Handle arguments here .. */ + usage(prune_packed_usage); + } + sync(); + prune_packed_objects(); + return 0; +} diff --git a/builtin.h b/builtin.h index f10d3b77c..7ddfe2891 100644 --- a/builtin.h +++ b/builtin.h @@ -20,6 +20,7 @@ extern int cmd_format_patch(int argc, const char **argv, const char *prefix); extern int cmd_count_objects(int argc, const char **argv, const char *prefix); extern int cmd_prune(int argc, const char **argv, const char *prefix); +extern int cmd_prune_packed(int argc, const char **argv, const char *prefix); extern int cmd_push(int argc, const char **argv, const char *prefix); extern int cmd_grep(int argc, const char **argv, const char *prefix); diff --git a/git.c b/git.c index 110e82e9a..5b50762de 100644 --- a/git.c +++ b/git.c @@ -263,6 +263,7 @@ static void handle_internal_command(int argc, const char **argv, char **envp) { "fmt-merge-msg", cmd_fmt_merge_msg, NEEDS_PREFIX }, { "prune", cmd_prune, NEEDS_PREFIX }, { "mv", cmd_mv, NEEDS_PREFIX }, + { "prune-packed", cmd_prune_packed, NEEDS_PREFIX }, }; int i; diff --git a/prune-packed.c b/prune-packed.c deleted file mode 100644 index d24b09711..000000000 --- a/prune-packed.c +++ /dev/null @@ -1,79 +0,0 @@ -#include "cache.h" - -static const char prune_packed_usage[] = -"git-prune-packed [-n]"; - -static int dryrun; - -static void prune_dir(int i, DIR *dir, char *pathname, int len) -{ - struct dirent *de; - char hex[40]; - - sprintf(hex, "%02x", i); - while ((de = readdir(dir)) != NULL) { - unsigned char sha1[20]; - if (strlen(de->d_name) != 38) - continue; - memcpy(hex+2, de->d_name, 38); - if (get_sha1_hex(hex, sha1)) - continue; - if (!has_sha1_pack(sha1)) - continue; - memcpy(pathname + len, de->d_name, 38); - if (dryrun) - printf("rm -f %s\n", pathname); - else if (unlink(pathname) < 0) - error("unable to unlink %s", pathname); - } - pathname[len] = 0; - rmdir(pathname); -} - -static void prune_packed_objects(void) -{ - int i; - static char pathname[PATH_MAX]; - const char *dir = get_object_directory(); - int len = strlen(dir); - - if (len > PATH_MAX - 42) - die("impossible object directory"); - memcpy(pathname, dir, len); - if (len && pathname[len-1] != '/') - pathname[len++] = '/'; - for (i = 0; i < 256; i++) { - DIR *d; - - sprintf(pathname + len, "%02x/", i); - d = opendir(pathname); - if (!d) - continue; - prune_dir(i, d, pathname, len + 3); - closedir(d); - } -} - -int main(int argc, char **argv) -{ - int i; - - setup_git_directory(); - - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; - - if (*arg == '-') { - if (!strcmp(arg, "-n")) - dryrun = 1; - else - usage(prune_packed_usage); - continue; - } - /* Handle arguments here .. */ - usage(prune_packed_usage); - } - sync(); - prune_packed_objects(); - return 0; -}