}
                /* If we got ENOENT there is no point continuing. */
                if (errno == ENOENT) {
-                       if (warn_if_not_exists)
-                               fprintf(stderr, "does not exist %s\n", source);
-                       return -1;
+                       if (!warn_if_not_exists)
+                               return -1;
+                       return error("does not exist %s", source);
                }
        }
        if (use_symlink) {
                if (stat(source, &st)) {
                        if (!warn_if_not_exists && errno == ENOENT)
                                return -1;
-                       fprintf(stderr, "cannot stat %s: %s\n", source,
-                               strerror(errno));
-                       return -1;
+                       return error("cannot stat %s: %s", source,
+                                    strerror(errno));
                }
                if (!symlink(source, dest)) {
                        pull_say("symlink %s\n", hex);
                if (ifd < 0) {
                        if (!warn_if_not_exists && errno == ENOENT)
                                return -1;
-                       fprintf(stderr, "cannot open %s\n", source);
-                       return -1;
+                       return error("cannot open %s", source);
                }
                ofd = open(dest, O_WRONLY | O_CREAT | O_EXCL, 0666);
                if (ofd < 0) {
-                       fprintf(stderr, "cannot open %s\n", dest);
                        close(ifd);
-                       return -1;
+                       return error("cannot open %s", dest);
                }
                status = copy_fd(ifd, ofd);
                close(ofd);
                if (status)
-                       fprintf(stderr, "cannot write %s\n", dest);
-               else
-                       pull_say("copy %s\n", hex);
-               return status;
+                       return error("cannot write %s", dest);
+               pull_say("copy %s\n", hex);
+               return 0;
        }
-       fprintf(stderr, "failed to copy %s with given copy methods.\n", hex);
-       return -1;
+       return error("failed to copy %s with given copy methods.", hex);
 }
 
 static int fetch_pack(const unsigned char *sha1)
                return -1;
        target = find_sha1_pack(sha1, packs);
        if (!target)
-               return error("Couldn't find %s: not separate or in any pack", 
+               return error("Couldn't find %s: not separate or in any pack",
                             sha1_to_hex(sha1));
        if (get_verbosely) {
                fprintf(stderr, "Getting pack %s\n",
                fprintf(stderr, " which contains %s\n",
                        sha1_to_hex(sha1));
        }
-       sprintf(filename, "%s/objects/pack/pack-%s.pack", 
+       sprintf(filename, "%s/objects/pack/pack-%s.pack",
                path, sha1_to_hex(target->sha1));
        copy_file(filename, sha1_pack_name(target->sha1),
                  sha1_to_hex(target->sha1), 1);
-       sprintf(filename, "%s/objects/pack/pack-%s.idx", 
+       sprintf(filename, "%s/objects/pack/pack-%s.idx",
                path, sha1_to_hex(target->sha1));
        copy_file(filename, sha1_pack_index_name(target->sha1),
                  sha1_to_hex(target->sha1), 1);
        char *hex = sha1_to_hex(sha1);
        char *dest_filename = sha1_file_name(sha1);
 
-       if (object_name_start < 0) {
+       if (object_name_start < 0) {
                strcpy(filename, path); /* e.g. git.git */
                strcat(filename, "/objects/");
                object_name_start = strlen(filename);
        ifd = open(filename, O_RDONLY);
        if (ifd < 0) {
                close(ifd);
-               fprintf(stderr, "cannot open %s\n", filename);
-               return -1;
+               return error("cannot open %s", filename);
        }
        if (read_in_full(ifd, hex, 40) != 40 || get_sha1_hex(hex, sha1)) {
                close(ifd);
-               fprintf(stderr, "cannot read from %s\n", filename);
-               return -1;
+               return error("cannot read from %s", filename);
        }
        close(ifd);
        pull_say("ref %s\n", sha1_to_hex(sha1));