[PATCH] git-daemon --syslog to log through syslog
[git.git] / read-tree.c
index 9ace5bb..ca80873 100644 (file)
@@ -12,6 +12,7 @@
 
 static int merge = 0;
 static int update = 0;
+static int index_only = 0;
 
 static int head_idx = -1;
 static int merge_size = 0;
@@ -306,6 +307,9 @@ static void verify_uptodate(struct cache_entry *ce)
 {
        struct stat st;
 
+       if (index_only)
+               return;
+
        if (!lstat(ce->name, &st)) {
                unsigned changed = ce_match_stat(ce, &st);
                if (!changed)
@@ -358,12 +362,15 @@ static int keep_entry(struct cache_entry *ce)
 static void show_stage_entry(FILE *o,
                             const char *label, const struct cache_entry *ce)
 {
-       fprintf(stderr, "%s%06o %s %d\t%s\n",
-               label,
-               ntohl(ce->ce_mode),
-               sha1_to_hex(ce->sha1),
-               ce_stage(ce),
-               ce->name);
+       if (!ce)
+               fprintf(o, "%s (missing)\n", label);
+       else
+               fprintf(o, "%s%06o %s %d\t%s\n",
+                       label,
+                       ntohl(ce->ce_mode),
+                       sha1_to_hex(ce->sha1),
+                       ce_stage(ce),
+                       ce->name);
 }
 #endif
 
@@ -576,7 +583,7 @@ static int read_cache_unmerged(void)
        return deleted;
 }
 
-static const char read_tree_usage[] = "git-read-tree (<sha> | -m [-u] <sha1> [<sha2> [<sha3>]])";
+static const char read_tree_usage[] = "git-read-tree (<sha> | -m [-u | -i] <sha1> [<sha2> [<sha3>]])";
 
 static struct cache_file cache_file;
 
@@ -595,12 +602,22 @@ int main(int argc, char **argv)
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
 
-               /* "-u" means "update", meaning that a merge will update the working directory */
+               /* "-u" means "update", meaning that a merge will update
+                * the working tree.
+                */
                if (!strcmp(arg, "-u")) {
                        update = 1;
                        continue;
                }
 
+               /* "-i" means "index only", meaning that a merge will
+                * not even look at the working tree.
+                */
+               if (!strcmp(arg, "-i")) {
+                       index_only = 1;
+                       continue;
+               }
+
                /* This differs from "-m" in that we'll silently ignore unmerged entries */
                if (!strcmp(arg, "--reset")) {
                        if (stage || merge)
@@ -628,13 +645,17 @@ int main(int argc, char **argv)
                        continue;
                }
 
+               /* using -u and -i at the same time makes no sense */
+               if (1 < index_only + update)
+                       usage(read_tree_usage);
+
                if (get_sha1(arg, sha1) < 0)
                        usage(read_tree_usage);
                if (list_tree(sha1) < 0)
                        die("failed to unpack tree object %s", arg);
                stage++;
        }
-       if (update && !merge)
+       if ((update||index_only) && !merge)
                usage(read_tree_usage);
        if (merge && !fn) {
                if (stage < 2)