diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-22 08:42:18 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2010-02-22 14:29:41 -0800 |
commit | 81b50f3ce40bfdd66e5d967bf82be001039a9a98 (patch) | |
tree | 7e86bb81e83c9fad73dcbdaa0ef33038137b4274 /builtin-prune.c | |
parent | 241b9254e1c8ff071d8054f8b6fbe1883b389d69 (diff) | |
download | git-81b50f3ce40bfdd66e5d967bf82be001039a9a98.tar.gz |
Move 'builtin-*' into a 'builtin/' subdirectory
This shrinks the top-level directory a bit, and makes it much more
pleasant to use auto-completion on the thing. Instead of
[torvalds@nehalem git]$ em buil<tab>
Display all 180 possibilities? (y or n)
[torvalds@nehalem git]$ em builtin-sh
builtin-shortlog.c builtin-show-branch.c builtin-show-ref.c
builtin-shortlog.o builtin-show-branch.o builtin-show-ref.o
[torvalds@nehalem git]$ em builtin-shor<tab>
builtin-shortlog.c builtin-shortlog.o
[torvalds@nehalem git]$ em builtin-shortlog.c
you get
[torvalds@nehalem git]$ em buil<tab> [type]
builtin/ builtin.h
[torvalds@nehalem git]$ em builtin [auto-completes to]
[torvalds@nehalem git]$ em builtin/sh<tab> [type]
shortlog.c shortlog.o show-branch.c show-branch.o show-ref.c show-ref.o
[torvalds@nehalem git]$ em builtin/sho [auto-completes to]
[torvalds@nehalem git]$ em builtin/shor<tab> [type]
shortlog.c shortlog.o
[torvalds@nehalem git]$ em builtin/shortlog.c
which doesn't seem all that different, but not having that annoying
break in "Display all 180 possibilities?" is quite a relief.
NOTE! If you do this in a clean tree (no object files etc), or using an
editor that has auto-completion rules that ignores '*.o' files, you
won't see that annoying 'Display all 180 possibilities?' message - it
will just show the choices instead. I think bash has some cut-off
around 100 choices or something.
So the reason I see this is that I'm using an odd editory, and thus
don't have the rules to cut down on auto-completion. But you can
simulate that by using 'ls' instead, or something similar.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin-prune.c')
-rw-r--r-- | builtin-prune.c | 169 |
1 files changed, 0 insertions, 169 deletions
diff --git a/builtin-prune.c b/builtin-prune.c deleted file mode 100644 index 4675f6054f..0000000000 --- a/builtin-prune.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "cache.h" -#include "commit.h" -#include "diff.h" -#include "revision.h" -#include "builtin.h" -#include "reachable.h" -#include "parse-options.h" -#include "dir.h" - -static const char * const prune_usage[] = { - "git prune [-n] [-v] [--expire <time>] [--] [<head>...]", - NULL -}; -static int show_only; -static int verbose; -static unsigned long expire; - -static int prune_tmp_object(const char *path, const char *filename) -{ - const char *fullpath = mkpath("%s/%s", path, filename); - if (expire) { - struct stat st; - if (lstat(fullpath, &st)) - return error("Could not stat '%s'", fullpath); - if (st.st_mtime > expire) - return 0; - } - printf("Removing stale temporary file %s\n", fullpath); - if (!show_only) - unlink_or_warn(fullpath); - return 0; -} - -static int prune_object(char *path, const char *filename, const unsigned char *sha1) -{ - const char *fullpath = mkpath("%s/%s", path, filename); - if (expire) { - struct stat st; - if (lstat(fullpath, &st)) - return error("Could not stat '%s'", fullpath); - if (st.st_mtime > expire) - return 0; - } - if (show_only || verbose) { - enum object_type type = sha1_object_info(sha1, NULL); - printf("%s %s\n", sha1_to_hex(sha1), - (type > 0) ? typename(type) : "unknown"); - } - if (!show_only) - unlink_or_warn(fullpath); - return 0; -} - -static int prune_dir(int i, char *path) -{ - DIR *dir = opendir(path); - struct dirent *de; - - if (!dir) - return 0; - - while ((de = readdir(dir)) != NULL) { - char name[100]; - unsigned char sha1[20]; - - if (is_dot_or_dotdot(de->d_name)) - continue; - if (strlen(de->d_name) == 38) { - sprintf(name, "%02x", i); - memcpy(name+2, de->d_name, 39); - if (get_sha1_hex(name, sha1) < 0) - break; - - /* - * Do we know about this object? - * It must have been reachable - */ - if (lookup_object(sha1)) - continue; - - prune_object(path, de->d_name, sha1); - continue; - } - if (!prefixcmp(de->d_name, "tmp_obj_")) { - prune_tmp_object(path, de->d_name); - continue; - } - fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name); - } - if (!show_only) - rmdir(path); - closedir(dir); - return 0; -} - -static void prune_object_dir(const char *path) -{ - int i; - for (i = 0; i < 256; i++) { - static char dir[4096]; - sprintf(dir, "%s/%02x", path, i); - prune_dir(i, dir); - } -} - -/* - * Write errors (particularly out of space) can result in - * failed temporary packs (and more rarely indexes and other - * files beginning with "tmp_") accumulating in the object - * and the pack directories. - */ -static void remove_temporary_files(const char *path) -{ - DIR *dir; - struct dirent *de; - - dir = opendir(path); - if (!dir) { - fprintf(stderr, "Unable to open directory %s\n", path); - return; - } - while ((de = readdir(dir)) != NULL) - if (!prefixcmp(de->d_name, "tmp_")) - prune_tmp_object(path, de->d_name); - closedir(dir); -} - -int cmd_prune(int argc, const char **argv, const char *prefix) -{ - struct rev_info revs; - const struct option options[] = { - OPT_BOOLEAN('n', NULL, &show_only, - "do not remove, show only"), - OPT_BOOLEAN('v', NULL, &verbose, - "report pruned objects"), - OPT_DATE(0, "expire", &expire, - "expire objects older than <time>"), - OPT_END() - }; - char *s; - - save_commit_buffer = 0; - read_replace_refs = 0; - init_revisions(&revs, prefix); - - argc = parse_options(argc, argv, prefix, options, prune_usage, 0); - while (argc--) { - unsigned char sha1[20]; - const char *name = *argv++; - - if (!get_sha1(name, sha1)) { - struct object *object = parse_object(sha1); - if (!object) - die("bad object: %s", name); - add_pending_object(&revs, object, ""); - } - else - die("unrecognized argument: %s", name); - } - mark_reachable_objects(&revs, 1); - prune_object_dir(get_object_directory()); - - prune_packed_objects(show_only); - remove_temporary_files(get_object_directory()); - s = xstrdup(mkpath("%s/pack", get_object_directory())); - remove_temporary_files(s); - free(s); - return 0; -} |