git-svn: Send deltas during commits
[gitweb.git] / builtin-prune.c
index 25f9304b829c9074e8a034eba5e34c38794058a4..c767a0ac8930166315c26d8ece2e72b4f1942d55 100644 (file)
@@ -7,12 +7,28 @@
 #include "parse-options.h"
 
 static const char * const prune_usage[] = {
-       "git-prune [-n] [--expire <time>] [--] [<head>...]",
+       "git prune [-n] [--expire <time>] [--] [<head>...]",
        NULL
 };
 static int show_only;
 static unsigned long expire;
 
+static int prune_tmp_object(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(fullpath);
+       return 0;
+}
+
 static int prune_object(char *path, const char *filename, const unsigned char *sha1)
 {
        const char *fullpath = mkpath("%s/%s", path, filename);
@@ -69,6 +85,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)
@@ -105,23 +125,9 @@ static void remove_temporary_files(void)
                        dirname);
                return;
        }
-       while ((de = readdir(dir)) != NULL) {
-               if (!prefixcmp(de->d_name, "tmp_")) {
-                       char name[PATH_MAX];
-                       int c = snprintf(name, PATH_MAX, "%s/%s",
-                                        dirname, de->d_name);
-                       if (c < 0 || c >= PATH_MAX)
-                               continue;
-                       if (expire) {
-                               struct stat st;
-                               if (stat(name, &st) != 0 || st.st_mtime >= expire)
-                                       continue;
-                       }
-                       printf("Removing stale temporary file %s\n", name);
-                       if (!show_only)
-                               unlink(name);
-               }
-       }
+       while ((de = readdir(dir)) != NULL)
+               if (!prefixcmp(de->d_name, "tmp_"))
+                       prune_tmp_object(dirname, de->d_name);
        closedir(dir);
 }
 
@@ -156,7 +162,6 @@ int cmd_prune(int argc, const char **argv, const char *prefix)
        mark_reachable_objects(&revs, 1);
        prune_object_dir(get_object_directory());
 
-       sync();
        prune_packed_objects(show_only);
        remove_temporary_files();
        return 0;