Merge branch 'maint'
[gitweb.git] / builtin-prune.c
index 947de8cf258c73d8a327ef3a1daed417ba533f1b..7b4ec80e62997fe70f53c92380cd4d66e80d62a0 100644 (file)
@@ -7,13 +7,14 @@
 #include "parse-options.h"
 
 static const char * const prune_usage[] = {
-       "git prune [-n] [--expire <time>] [--] [<head>...]",
+       "git prune [-n] [-v] [--expire <time>] [--] [<head>...]",
        NULL
 };
 static int show_only;
+static int verbose;
 static unsigned long expire;
 
-static int prune_tmp_object(char *path, const char *filename)
+static int prune_tmp_object(const char *path, const char *filename)
 {
        const char *fullpath = mkpath("%s/%s", path, filename);
        if (expire) {
@@ -39,11 +40,12 @@ static int prune_object(char *path, const char *filename, const unsigned char *s
                if (st.st_mtime > expire)
                        return 0;
        }
-       if (show_only) {
+       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");
-       } else
+       }
+       if (!show_only)
                unlink(fullpath);
        return 0;
 }
@@ -69,11 +71,6 @@ static int prune_dir(int i, char *path)
                        if (de->d_name[0] != '.')
                                break;
                        continue;
-               case 14:
-                       if (prefixcmp(de->d_name, "tmp_obj_"))
-                               break;
-                       prune_tmp_object(path, de->d_name);
-                       continue;
                case 38:
                        sprintf(name, "%02x", i);
                        memcpy(name+2, de->d_name, len+1);
@@ -90,6 +87,10 @@ static int prune_dir(int i, char *path)
                        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)
@@ -111,24 +112,22 @@ static void prune_object_dir(const char *path)
 /*
  * Write errors (particularly out of space) can result in
  * failed temporary packs (and more rarely indexes and other
- * files begining with "tmp_") accumulating in the
- * object directory.
+ * files begining with "tmp_") accumulating in the object
+ * and the pack directories.
  */
-static void remove_temporary_files(void)
+static void remove_temporary_files(const char *path)
 {
        DIR *dir;
        struct dirent *de;
-       char* dirname=get_object_directory();
 
-       dir = opendir(dirname);
+       dir = opendir(path);
        if (!dir) {
-               fprintf(stderr, "Unable to open object directory %s\n",
-                       dirname);
+               fprintf(stderr, "Unable to open directory %s\n", path);
                return;
        }
        while ((de = readdir(dir)) != NULL)
                if (!prefixcmp(de->d_name, "tmp_"))
-                       prune_tmp_object(dirname, de->d_name);
+                       prune_tmp_object(path, de->d_name);
        closedir(dir);
 }
 
@@ -138,10 +137,13 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
        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;
        init_revisions(&revs, prefix);
@@ -164,6 +166,9 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
        prune_object_dir(get_object_directory());
 
        prune_packed_objects(show_only);
-       remove_temporary_files();
+       remove_temporary_files(get_object_directory());
+       s = xstrdup(mkpath("%s/pack", get_object_directory()));
+       remove_temporary_files(s);
+       free(s);
        return 0;
 }