]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sha1_file: let for_each_file_in_obj_subdir() handle subdir names
authorRené Scharfe <l.s.r@web.de>
Sat, 24 Jun 2017 12:12:30 +0000 (14:12 +0200)
committerJunio C Hamano <gitster@pobox.com>
Sat, 24 Jun 2017 18:09:50 +0000 (11:09 -0700)
The function for_each_file_in_obj_subdir() takes a object subdirectory
number and expects the name of the same subdirectory to be included in
the path strbuf.  Avoid this redundancy by letting the function append
the hexadecimal subdirectory name itself.  This makes it a bit easier
and safer to use the function -- it becomes impossible to specify
different subdirectories in subdir_nr and path.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sha1_file.c
sha1_name.c

index 5e0ee2b68bcf50611a36edaf218bc89446303278..98ce85acf9cf41de536f55a880e0ae18ff1205f6 100644 (file)
@@ -3742,15 +3742,22 @@ int for_each_file_in_obj_subdir(int subdir_nr,
                                each_loose_subdir_fn subdir_cb,
                                void *data)
 {
-       size_t baselen = path->len;
-       DIR *dir = opendir(path->buf);
+       size_t origlen, baselen;
+       DIR *dir;
        struct dirent *de;
        int r = 0;
 
+       origlen = path->len;
+       strbuf_complete(path, '/');
+       strbuf_addf(path, "%02x", subdir_nr);
+       baselen = path->len;
+
+       dir = opendir(path->buf);
        if (!dir) {
-               if (errno == ENOENT)
-                       return 0;
-               return error_errno("unable to open %s", path->buf);
+               if (errno != ENOENT)
+                       r = error_errno("unable to open %s", path->buf);
+               strbuf_setlen(path, origlen);
+               return r;
        }
 
        while ((de = readdir(dir))) {
@@ -3788,6 +3795,8 @@ int for_each_file_in_obj_subdir(int subdir_nr,
        if (!r && subdir_cb)
                r = subdir_cb(subdir_nr, path->buf, data);
 
+       strbuf_setlen(path, origlen);
+
        return r;
 }
 
@@ -3797,15 +3806,12 @@ int for_each_loose_file_in_objdir_buf(struct strbuf *path,
                            each_loose_subdir_fn subdir_cb,
                            void *data)
 {
-       size_t baselen = path->len;
        int r = 0;
        int i;
 
        for (i = 0; i < 256; i++) {
-               strbuf_addf(path, "/%02x", i);
                r = for_each_file_in_obj_subdir(i, path, obj_cb, cruft_cb,
                                                subdir_cb, data);
-               strbuf_setlen(path, baselen);
                if (r)
                        break;
        }
index 76cb76a844ff2c916c55314d2447e12a5573e2f1..8de0e2d3b48144ad5c68b1282ce80677e7fccd57 100644 (file)
@@ -109,7 +109,6 @@ static void find_short_object_filename(struct disambiguate_state *ds)
 
                if (!alt->loose_objects_subdir_seen[subdir_nr]) {
                        struct strbuf *buf = alt_scratch_buf(alt);
-                       strbuf_addf(buf, "%02x/", subdir_nr);
                        for_each_file_in_obj_subdir(subdir_nr, buf,
                                                    append_loose_object,
                                                    NULL, NULL,