commit_ref_update(): write error message to *err, not stderr
[gitweb.git] / refs / files-backend.c
index ad9cd86457c4795d52f578687306afec65548d54..2d3a8c669a5b04a7e70da881f70e04dc5ba96c5e 100644 (file)
@@ -1477,7 +1477,16 @@ int read_raw_ref(const char *refname, unsigned char *sha1,
 
        /* Is it a directory? */
        if (S_ISDIR(st.st_mode)) {
-               errno = EISDIR;
+               /*
+                * Even though there is a directory where the loose
+                * ref is supposed to be, there could still be a
+                * packed ref:
+                */
+               if (resolve_missing_loose_ref(refname, sha1, flags)) {
+                       errno = EISDIR;
+                       goto out;
+               }
+               ret = 0;
                goto out;
        }
 
@@ -2710,7 +2719,7 @@ static int commit_ref_update(struct ref_lock *lock,
                }
        }
        if (commit_ref(lock)) {
-               error("Couldn't set %s", lock->ref_name);
+               strbuf_addf(err, "Couldn't set %s", lock->ref_name);
                unlock_ref(lock);
                return -1;
        }