vcs-svn: avoid using ls command twice
authorDavid Barr <david.barr@cordelta.com>
Mon, 13 Dec 2010 06:09:31 +0000 (17:09 +1100)
committerJonathan Nieder <jrnieder@gmail.com>
Sat, 26 Mar 2011 06:00:05 +0000 (01:00 -0500)
Currently there are two functions to retrieve the mode and content
at a path:

const char *repo_read_path(const uint32_t *path);
uint32_t repo_read_mode(const uint32_t *path)

Replace them with a single function with two return values.  This
means we can use one round-trip to get the same information from
fast-import that previously took two.

Signed-off-by: David Barr <david.barr@cordelta.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
vcs-svn/repo_tree.c
vcs-svn/repo_tree.h
vcs-svn/svndump.c

index e75f58087c23f75fbb6b61fdf1a795e06d4832df..1681b654d1afa69884b695e0adc87d4031f7c230 100644 (file)
@@ -8,39 +8,23 @@
 #include "repo_tree.h"
 #include "fast_export.h"
 
-const char *repo_read_path(const uint32_t *path)
+const char *repo_read_path(const uint32_t *path, uint32_t *mode_out)
 {
        int err;
-       uint32_t dummy;
        static struct strbuf buf = STRBUF_INIT;
 
        strbuf_reset(&buf);
-       err = fast_export_ls(REPO_MAX_PATH_DEPTH, path, &dummy, &buf);
+       err = fast_export_ls(REPO_MAX_PATH_DEPTH, path, mode_out, &buf);
        if (err) {
                if (errno != ENOENT)
                        die_errno("BUG: unexpected fast_export_ls error");
+               /* Treat missing paths as directories. */
+               *mode_out = REPO_MODE_DIR;
                return NULL;
        }
        return buf.buf;
 }
 
-uint32_t repo_read_mode(const uint32_t *path)
-{
-       int err;
-       uint32_t result;
-       static struct strbuf dummy = STRBUF_INIT;
-
-       strbuf_reset(&dummy);
-       err = fast_export_ls(REPO_MAX_PATH_DEPTH, path, &result, &dummy);
-       if (err) {
-               if (errno != ENOENT)
-                       die_errno("BUG: unexpected fast_export_ls error");
-               /* Treat missing paths as directories. */
-               return REPO_MODE_DIR;
-       }
-       return result;
-}
-
 void repo_copy(uint32_t revision, const uint32_t *src, const uint32_t *dst)
 {
        int err;
index d690784fbbddd7743e9e97484cb81c2dbcf61327..f506352dc2d560442f7c45c7df35516fe3fef69e 100644 (file)
@@ -14,8 +14,7 @@
 uint32_t next_blob_mark(void);
 void repo_copy(uint32_t revision, const uint32_t *src, const uint32_t *dst);
 void repo_add(uint32_t *path, uint32_t mode, uint32_t blob_mark);
-const char *repo_read_path(const uint32_t *path);
-uint32_t repo_read_mode(const uint32_t *path);
+const char *repo_read_path(const uint32_t *path, uint32_t *mode_out);
 void repo_delete(uint32_t *path);
 void repo_commit(uint32_t revision, uint32_t author, char *log, uint32_t uuid,
                 uint32_t url, long unsigned timestamp);
index 7ecb227a6d62abd2031de44af646b19bc9fcf539..99a5ba0d1008083a2a0c868d1984f44c03ba4232 100644 (file)
@@ -246,8 +246,7 @@ static void handle_node(void)
                old_data = NULL;
        } else if (node_ctx.action == NODEACT_CHANGE) {
                uint32_t mode;
-               old_data = repo_read_path(node_ctx.dst);
-               mode = repo_read_mode(node_ctx.dst);
+               old_data = repo_read_path(node_ctx.dst, &mode);
                if (mode == REPO_MODE_DIR && type != REPO_MODE_DIR)
                        die("invalid dump: cannot modify a directory into a file");
                if (mode != REPO_MODE_DIR && type == REPO_MODE_DIR)