On Sat, Nov 8, 2014 at 6:00 AM, Nguyễn Thái Ngọc Duy <[email protected]> wrote:
> This allows the callback to use 'base' as a temporary buffer to
> quickly assemble full path "without" extra allocation. The caller has
> to restore it afterwards of course.
>
> Signed-off-by: Nguyễn Thái Ngọc Duy <[email protected]>
> ---
> diff --git a/merge-recursive.c b/merge-recursive.c
> index 1d332b8..1bd8c0d 100644
> --- a/merge-recursive.c
> +++ b/merge-recursive.c
> @@ -276,23 +276,20 @@ struct tree *write_tree_from_memory(struct
> merge_options *o)
> }
>
> static int save_files_dirs(const unsigned char *sha1,
> - const char *base, int baselen, const char *path,
> + struct strbuf *base, const char *path,
> unsigned int mode, int stage, void *context)
> {
> - int len = strlen(path);
> - char *newpath = xmalloc(baselen + len + 1);
> + int base_len = base->len;
Nit: The removed function argument was named 'baselen'. Also, patch
3/3 introduces a variable 'baseline' for the same purpose. Thus,
'base_len' here is a bit inconsistent.
> struct merge_options *o = context;
>
> - memcpy(newpath, base, baselen);
> - memcpy(newpath + baselen, path, len);
> - newpath[baselen + len] = '\0';
> + strbuf_addstr(base, path);
>
> if (S_ISDIR(mode))
> - string_list_insert(&o->current_directory_set, newpath);
> + string_list_insert(&o->current_directory_set, base->buf);
> else
> - string_list_insert(&o->current_file_set, newpath);
> - free(newpath);
> + string_list_insert(&o->current_file_set, base->buf);
>
> + strbuf_setlen(base, base_len);
> return (S_ISDIR(mode) ? READ_TREE_RECURSIVE : 0);
> }
>
> diff --git a/tree.c b/tree.c
> index bb02c1c..58ebfce 100644
> --- a/tree.c
> +++ b/tree.c
> @@ -30,9 +30,12 @@ static int read_one_entry_opt(const unsigned char *sha1,
> const char *base, int b
> return add_cache_entry(ce, opt);
> }
>
> -static int read_one_entry(const unsigned char *sha1, const char *base, int
> baselen, const char *pathname, unsigned mode, int stage, void *context)
> +static int read_one_entry(const unsigned char *sha1, struct strbuf *base,
> + const char *pathname, unsigned mode, int stage,
> + void *context)
> {
> - return read_one_entry_opt(sha1, base, baselen, pathname, mode, stage,
> + return read_one_entry_opt(sha1, base->buf, base->len, pathname,
> + mode, stage,
> ADD_CACHE_OK_TO_ADD|ADD_CACHE_SKIP_DFCHECK);
> }
>
> @@ -40,9 +43,12 @@ static int read_one_entry(const unsigned char *sha1, const
> char *base, int basel
> * This is used when the caller knows there is no existing entries at
> * the stage that will conflict with the entry being added.
> */
> -static int read_one_entry_quick(const unsigned char *sha1, const char *base,
> int baselen, const char *pathname, unsigned mode, int stage, void *context)
> +static int read_one_entry_quick(const unsigned char *sha1, struct strbuf
> *base,
> + const char *pathname, unsigned mode, int
> stage,
> + void *context)
> {
> - return read_one_entry_opt(sha1, base, baselen, pathname, mode, stage,
> + return read_one_entry_opt(sha1, base->buf, base->len, pathname,
> + mode, stage,
> ADD_CACHE_JUST_APPEND);
> }
>
> @@ -70,7 +76,7 @@ static int read_tree_1(struct tree *tree, struct strbuf
> *base,
> continue;
> }
>
> - switch (fn(entry.sha1, base->buf, base->len,
> + switch (fn(entry.sha1, base,
> entry.path, entry.mode, stage, context)) {
> case 0:
> continue;
> diff --git a/tree.h b/tree.h
> index d84ac63..d24125f 100644
> --- a/tree.h
> +++ b/tree.h
> @@ -4,6 +4,7 @@
> #include "object.h"
>
> extern const char *tree_type;
> +struct strbuf;
>
> struct tree {
> struct object object;
> @@ -22,7 +23,7 @@ void free_tree_buffer(struct tree *tree);
> struct tree *parse_tree_indirect(const unsigned char *sha1);
>
> #define READ_TREE_RECURSIVE 1
> -typedef int (*read_tree_fn_t)(const unsigned char *, const char *, int,
> const char *, unsigned int, int, void *);
> +typedef int (*read_tree_fn_t)(const unsigned char *, struct strbuf *, const
> char *, unsigned int, int, void *);
>
> extern int read_tree_recursive(struct tree *tree,
> const char *base, int baselen,
> --
> 2.1.0.rc0.78.gc0d8480
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html