git-fetch: exit with non-zero status when fast-forward check fails
[gitweb.git] / refs.c
diff --git a/refs.c b/refs.c
index ed2e3b16a7c843d75da361011b36c74d51f629b8..0e156c5dee1edff895c576a4491ec71f931ff492 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -322,6 +322,20 @@ int read_ref(const char *ref, unsigned char *sha1)
        return -1;
 }
 
+static int do_one_ref(const char *base, each_ref_fn fn, int trim,
+                     void *cb_data, struct ref_list *entry)
+{
+       if (strncmp(base, entry->name, trim))
+               return 0;
+       if (is_null_sha1(entry->sha1))
+               return 0;
+       if (!has_sha1_file(entry->sha1)) {
+               error("%s does not point to a valid object!", entry->name);
+               return 0;
+       }
+       return fn(entry->name + trim, entry->sha1, entry->flag, cb_data);
+}
+
 static int do_for_each_ref(const char *base, each_ref_fn fn, int trim,
                           void *cb_data)
 {
@@ -343,29 +357,15 @@ static int do_for_each_ref(const char *base, each_ref_fn fn, int trim,
                        entry = packed;
                        packed = packed->next;
                }
-               if (strncmp(base, entry->name, trim))
-                       continue;
-               if (is_null_sha1(entry->sha1))
-                       continue;
-               if (!has_sha1_file(entry->sha1)) {
-                       error("%s does not point to a valid object!", entry->name);
-                       continue;
-               }
-               retval = fn(entry->name + trim, entry->sha1,
-                           entry->flag, cb_data);
+               retval = do_one_ref(base, fn, trim, cb_data, entry);
                if (retval)
                        return retval;
        }
 
-       packed = packed ? packed : loose;
-       while (packed) {
-               if (!strncmp(base, packed->name, trim)) {
-                       retval = fn(packed->name + trim, packed->sha1,
-                                   packed->flag, cb_data);
-                       if (retval)
-                               return retval;
-               }
-               packed = packed->next;
+       for (packed = packed ? packed : loose; packed; packed = packed->next) {
+               retval = do_one_ref(base, fn, trim, cb_data, packed);
+               if (retval)
+                       return retval;
        }
        return 0;
 }
@@ -806,7 +806,7 @@ int write_ref_sha1(struct ref_lock *lock,
        return 0;
 }
 
-int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
+int read_ref_at(const char *ref, unsigned long at_time, int cnt, unsigned char *sha1)
 {
        const char *logfile, *logdata, *logend, *rec, *lastgt, *lastrec;
        char *tz_c;
@@ -839,7 +839,7 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
                if (!lastgt)
                        die("Log %s is corrupt.", logfile);
                date = strtoul(lastgt + 1, &tz_c, 10);
-               if (date <= at_time) {
+               if (date <= at_time || cnt == 0) {
                        if (lastrec) {
                                if (get_sha1_hex(lastrec, logged_sha1))
                                        die("Log %s is corrupt.", logfile);
@@ -870,6 +870,8 @@ int read_ref_at(const char *ref, unsigned long at_time, unsigned char *sha1)
                        return 0;
                }
                lastrec = rec;
+               if (cnt > 0)
+                       cnt--;
        }
 
        rec = logdata;