Merge branch 'ds/for-each-file-in-obj-micro-optim'
authorJunio C Hamano <gitster@pobox.com>
Wed, 13 Dec 2017 21:28:57 +0000 (13:28 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 13 Dec 2017 21:28:57 +0000 (13:28 -0800)
The code to iterate over loose object files got optimized.

* ds/for-each-file-in-obj-micro-optim:
sha1_file: use strbuf_add() instead of strbuf_addf()

1  2 
sha1_file.c
diff --combined sha1_file.c
index b44f5247caa9389f8d1c7643b7d9d99418d21f72,2fc8fa93b45f0b1d780822c0da09ea2bf73548af..3da70ac650a8cdeca6ef8a6a424a7740d38267d5
@@@ -39,64 -39,6 +39,64 @@@ const struct object_id empty_blob_oid 
        EMPTY_BLOB_SHA1_BIN_LITERAL
  };
  
 +static void git_hash_sha1_init(void *ctx)
 +{
 +      git_SHA1_Init((git_SHA_CTX *)ctx);
 +}
 +
 +static void git_hash_sha1_update(void *ctx, const void *data, size_t len)
 +{
 +      git_SHA1_Update((git_SHA_CTX *)ctx, data, len);
 +}
 +
 +static void git_hash_sha1_final(unsigned char *hash, void *ctx)
 +{
 +      git_SHA1_Final(hash, (git_SHA_CTX *)ctx);
 +}
 +
 +static void git_hash_unknown_init(void *ctx)
 +{
 +      die("trying to init unknown hash");
 +}
 +
 +static void git_hash_unknown_update(void *ctx, const void *data, size_t len)
 +{
 +      die("trying to update unknown hash");
 +}
 +
 +static void git_hash_unknown_final(unsigned char *hash, void *ctx)
 +{
 +      die("trying to finalize unknown hash");
 +}
 +
 +const struct git_hash_algo hash_algos[GIT_HASH_NALGOS] = {
 +      {
 +              NULL,
 +              0x00000000,
 +              0,
 +              0,
 +              0,
 +              git_hash_unknown_init,
 +              git_hash_unknown_update,
 +              git_hash_unknown_final,
 +              NULL,
 +              NULL,
 +      },
 +      {
 +              "sha-1",
 +              /* "sha1", big-endian */
 +              0x73686131,
 +              sizeof(git_SHA_CTX),
 +              GIT_SHA1_RAWSZ,
 +              GIT_SHA1_HEXSZ,
 +              git_hash_sha1_init,
 +              git_hash_sha1_update,
 +              git_hash_sha1_final,
 +              &empty_tree_oid,
 +              &empty_blob_oid,
 +      },
 +};
 +
  /*
   * This is meant to hold a *small* number of objects that you would
   * want read_sha1_file() to be able to return, but yet you do not want
@@@ -1222,9 -1164,6 +1222,9 @@@ int sha1_object_info_extended(const uns
                                    lookup_replace_object(sha1) :
                                    sha1;
  
 +      if (is_null_sha1(real))
 +              return -1;
 +
        if (!oi)
                oi = &blank_oi;
  
@@@ -1964,7 -1903,6 +1964,6 @@@ int for_each_file_in_obj_subdir(unsigne
        origlen = path->len;
        strbuf_complete(path, '/');
        strbuf_addf(path, "%02x", subdir_nr);
-       baselen = path->len;
  
        dir = opendir(path->buf);
        if (!dir) {
        }
  
        oid.hash[0] = subdir_nr;
+       strbuf_addch(path, '/');
+       baselen = path->len;
  
        while ((de = readdir(dir))) {
+               size_t namelen;
                if (is_dot_or_dotdot(de->d_name))
                        continue;
  
+               namelen = strlen(de->d_name);
                strbuf_setlen(path, baselen);
-               strbuf_addf(path, "/%s", de->d_name);
-               if (strlen(de->d_name) == GIT_SHA1_HEXSZ - 2 &&
+               strbuf_add(path, de->d_name, namelen);
+               if (namelen == GIT_SHA1_HEXSZ - 2 &&
                    !hex_to_bytes(oid.hash + 1, de->d_name,
                                  GIT_SHA1_RAWSZ - 1)) {
                        if (obj_cb) {
        }
        closedir(dir);
  
-       strbuf_setlen(path, baselen);
+       strbuf_setlen(path, baselen - 1);
        if (!r && subdir_cb)
                r = subdir_cb(subdir_nr, path->buf, data);