git-read-tree: some "final" cleanups
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 6 Jun 2005 21:33:11 +0000 (14:33 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 6 Jun 2005 21:33:11 +0000 (14:33 -0700)
Looking good, but hey, it's not like I even have a real testcase for any
of this.  But unlike the mess that this was yerstday, today read-cache
is pretty readable and understandable.  Which is always a good sign.

read-tree.c

index 4acbb6b3f25cd5cb50dda3ac34b1b37edad639b1..2fb27e9743614bc1f01b4bc4b0b4b96de6d1a1ce 100644 (file)
@@ -221,7 +221,9 @@ static void check_updates(struct cache_entry **src, int nr)
        }
 }
 
-static void merge_cache(struct cache_entry **src, int nr, int (*fn)(struct cache_entry **, struct cache_entry **))
+typedef int (*merge_fn_t)(struct cache_entry **, struct cache_entry **);
+
+static void merge_cache(struct cache_entry **src, int nr, merge_fn_t fn)
 {
        struct cache_entry **dst = src;
 
@@ -296,20 +298,14 @@ int main(int argc, char **argv)
                stage++;
        }
        if (merge) {
-               switch (stage) {
-               case 4: /* Three-way merge */
-                       merge_cache(active_cache, active_nr, threeway_merge);
-                       break;
-               case 3: /* Update from one tree to another */
-                       merge_cache(active_cache, active_nr, twoway_merge);
-                       check_updates(active_cache, active_nr);
-                       break;
-               case 2: /* Just read a tree, merge with old cache contents */
-                       merge_cache(active_cache, active_nr, oneway_merge);
-                       break;
-               default:
+               static const merge_fn_t merge_function[] = {
+                       [1] = oneway_merge,
+                       [2] = twoway_merge,
+                       [3] = threeway_merge,
+               };
+               if (stage < 2 || stage > 4)
                        die("just how do you expect me to merge %d trees?", stage-1);
-               }
+               merge_cache(active_cache, active_nr, merge_function[stage-1]);
        }
        if (write_cache(newfd, active_cache, active_nr) ||
            commit_index_file(&cache_file))