]> git.ipfire.org Git - thirdparty/git.git/commitdiff
ref: initialize ref name outside of check functions
authorshejialuo <shejialuo@gmail.com>
Wed, 20 Nov 2024 11:51:24 +0000 (19:51 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Nov 2024 23:21:32 +0000 (08:21 +0900)
We passes "refs_check_dir" to the "files_fsck_refs_name" function which
allows it to create the checked ref name later. However, when we
introduce a new check function, we have to allocate redundant memory and
re-calculate the ref name. It's bad for us to allocate redundant memory
and duplicate logic. Instead, we should allocate and calculate it only
once and pass the ref name to the check functions.

In order not to do repeat calculation, rename "refs_check_dir" to
"refname". And in "files_fsck_refs_dir", create a new strbuf "refname",
thus whenever we handle a new ref, calculate the name and call the check
functions one by one.

Mentored-by: Patrick Steinhardt <ps@pks.im>
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: shejialuo <shejialuo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/files-backend.c

index b055edc061973094b12ff27bfbad8f761e019e68..8edb700568499d278b1edc5915e786c25aec6fd4 100644 (file)
@@ -3501,12 +3501,12 @@ static int files_ref_store_remove_on_disk(struct ref_store *ref_store,
  */
 typedef int (*files_fsck_refs_fn)(struct ref_store *ref_store,
                                  struct fsck_options *o,
-                                 const char *refs_check_dir,
+                                 const char *refname,
                                  struct dir_iterator *iter);
 
 static int files_fsck_refs_name(struct ref_store *ref_store UNUSED,
                                struct fsck_options *o,
-                               const char *refs_check_dir,
+                               const char *refname,
                                struct dir_iterator *iter)
 {
        struct strbuf sb = STRBUF_INIT;
@@ -3522,11 +3522,10 @@ static int files_fsck_refs_name(struct ref_store *ref_store UNUSED,
        /*
         * This works right now because we never check the root refs.
         */
-       strbuf_addf(&sb, "%s/%s", refs_check_dir, iter->relative_path);
-       if (check_refname_format(sb.buf, 0)) {
+       if (check_refname_format(refname, 0)) {
                struct fsck_ref_report report = { 0 };
 
-               report.path = sb.buf;
+               report.path = refname;
                ret = fsck_report_ref(o, &report,
                                      FSCK_MSG_BAD_REF_NAME,
                                      "invalid refname format");
@@ -3542,6 +3541,7 @@ static int files_fsck_refs_dir(struct ref_store *ref_store,
                               const char *refs_check_dir,
                               files_fsck_refs_fn *fsck_refs_fn)
 {
+       struct strbuf refname = STRBUF_INIT;
        struct strbuf sb = STRBUF_INIT;
        struct dir_iterator *iter;
        int iter_status;
@@ -3560,11 +3560,15 @@ static int files_fsck_refs_dir(struct ref_store *ref_store,
                        continue;
                } else if (S_ISREG(iter->st.st_mode) ||
                           S_ISLNK(iter->st.st_mode)) {
+                       strbuf_reset(&refname);
+                       strbuf_addf(&refname, "%s/%s", refs_check_dir,
+                                   iter->relative_path);
+
                        if (o->verbose)
-                               fprintf_ln(stderr, "Checking %s/%s",
-                                          refs_check_dir, iter->relative_path);
+                               fprintf_ln(stderr, "Checking %s", refname.buf);
+
                        for (size_t i = 0; fsck_refs_fn[i]; i++) {
-                               if (fsck_refs_fn[i](ref_store, o, refs_check_dir, iter))
+                               if (fsck_refs_fn[i](ref_store, o, refname.buf, iter))
                                        ret = -1;
                        }
                } else {
@@ -3581,6 +3585,7 @@ static int files_fsck_refs_dir(struct ref_store *ref_store,
 
 out:
        strbuf_release(&sb);
+       strbuf_release(&refname);
        return ret;
 }