Kill the_index part 4
PATCH v3 1/23 archive.c: remove implicit dependency the_repository
In reply to Nguyễn Thái Ngọc DuyThe new "repo" field in archive_args has been added since b612ee202a (archive.c: avoid access to the_index - 2018-08-13). Use it instead of hard coding the_repository.
--- archive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
archive.c +1 -1
@@ -391,7 +391,7 @@ static void parse_treeish_arg(const char **argv,if (get_oid (name, &oid))die ("Not a valid object name" ); - commit =lookup_commit_reference_gently (the_repository, &oid,1 ); + commit =lookup_commit_reference_gently (ar_args->repo, &oid,1 );if (commit) { commit_sha1 = commit->object.oid.hash; archive_time = commit->date;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 2/23 read-cache.c: remove 'const' from index_has_changes()
In reply to Nguyễn Thái Ngọc DuyThis function calls do_diff_cache() which eventually needs to set this "istate" to unpack_options->src_index (*). This is an unfortunate fact that unpack_trees() _will_ destroy src_index so we can't really pass a const index_state there. Just remove 'const'.
(*) Right now diff_cache() in diff-lib.c assigns the_index to
src_index. But the plan is to get rid of the_index, so it should be 'istate' from here that gets assigned to src_index.
--- cache.h | 2 +- read-cache.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
cache.h +1 -1
@@ -703,7 +703,7 @@ extern int unmerged_index(const struct index_state *);* provided, the space-separated list of files that differ will be appended * to it. */ -extern int index_has_changes (const struct index_state *istate, +extern int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb);
read-cache.c +1 -1
@@ -2122,7 +2122,7 @@ int unmerged_index(const struct index_state *istate)return 0 ; } -int index_has_changes (const struct index_state *istate, +int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb) {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 3/23 diff.c: reduce implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duydiff and textconv code has so widespread use that it's hard to simply update their api and all call sites at once because it would result in a big patch. For now reduce the_index references to two places:diff_setup() and fill_textconv().
--- builtin/reset.c | 1 + diff.c | 176 +++++++++++++++++++++++++++------------------- diff.h | 3 + diffcore-break.c | 12 ++-- diffcore-delta.c | 12 ++-- diffcore-rename.c | 35 +++++---- diffcore.h | 13 ++-- line-log.c | 21 +++--- 8 files changed, 161 insertions(+), 112 deletions(-)
builtin/reset.c +1 -0
@@ -159,6 +159,7 @@ static int read_from_tree(const struct pathspec *pathspec, opt.format_callback = update_index_from_diff; opt.format_callback_data = &intent_to_add; opt.flags.override_submodule_config =1 ; + opt.repo = the_repository;if (do_diff_cache (tree_oid, &opt))return 1 ;
diff.c +102 -74
497 lines not on this page · raw message
diff.h +3 -0
@@ -18,6 +18,7 @@ struct userdiff_driver;struct oid_array ;struct commit ;struct combine_diff_path ; +struct repository ;typedef int (*pathchange_fn_t )(struct diff_options *options,struct combine_diff_path *path);
@@ -220,6 +221,8 @@ struct diff_options {/* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */ #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)int color_moved_ws_handling; + +struct repository *repo; };void diff_emit_submodule_del (struct diff_options *o,const char *line);
diffcore-break.c +7 -5
@@ -5,7 +5,8 @@#include "diff.h" #include "diffcore.h" -static int should_break (struct diff_filespec *src, +static int should_break (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int break_score,int *merge_score_p)
@@ -61,7 +62,8 @@ static int should_break(struct diff_filespec *src, !oidcmp(&src->oid, &dst->oid))return 0 ;/* they are the same */ -if (diff_populate_filespec (src,0 ) ||diff_populate_filespec (dst,0 )) +if (diff_populate_filespec (r, src,0 ) || +diff_populate_filespec (r, dst,0 ))return 0 ;/* error but caught downstream */ max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -71,7 +73,7 @@ static int should_break(struct diff_filespec *src,if (!src->size)return 0 ;/* we do not let empty files get renamed */ -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -114,7 +116,7 @@ static int should_break(struct diff_filespec *src,return 1 ; } -void diffcore_break (int break_score) +void diffcore_break (struct repository *r,int break_score) {struct diff_queue_struct *q = &diff_queued_diff;struct diff_queue_struct outq;
@@ -178,7 +180,7 @@ void diffcore_break(int break_score) object_type(p->one->mode) == OBJ_BLOB && object_type(p->two->mode) == OBJ_BLOB && !strcmp(p->one->path, p->two->path)) { -if (should_break (p->one, p->two, +if (should_break (r, p->one, p->two, break_score, &score)) {/* Split this into delete and create */ struct diff_filespec *null_one, *null_two;
diffcore-delta.c +7 -5
@@ -121,14 +121,15 @@ static int spanhash_cmp(const void *a_, const void *b_) a->hashval > b->hashval ?1 :0 ; } -static struct spanhash_top *hash_chars (struct diff_filespec *one) +static struct spanhash_top *hash_chars (struct repository *r, +struct diff_filespec *one) {int i, n;unsigned int accum1, accum2, hashval;struct spanhash_top *hash;unsigned char *buf = one->data;unsigned int sz = one->size; -int is_text = !diff_filespec_is_binary (one); +int is_text = !diff_filespec_is_binary (r, one); i =INITIAL_HASH_SIZE ; hash = xmalloc(st_add(sizeof(*hash),
@@ -162,7 +163,8 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one)return hash; } -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
@@ -177,14 +179,14 @@ int diffcore_count_changes(struct diff_filespec *src,if (src_count_p) src_count = *src_count_p;if (!src_count) { - src_count =hash_chars (src); + src_count =hash_chars (r, src);if (src_count_p) *src_count_p = src_count; }if (dst_count_p) dst_count = *dst_count_p;if (!dst_count) { - dst_count =hash_chars (dst); + dst_count =hash_chars (r, dst);if (dst_count_p) *dst_count_p = dst_count; }
diffcore-rename.c +22 -13
@@ -128,7 +128,8 @@ struct diff_score {short name_score; }; -static int estimate_similarity (struct diff_filespec *src, +static int estimate_similarity (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int minimum_score) {
@@ -165,10 +166,10 @@ static int estimate_similarity(struct diff_filespec *src,* say whether the size is valid or not!) */ if (!src->cnt_data && -diff_populate_filespec (src,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, src,CHECK_SIZE_ONLY ))return 0 ;if (!dst->cnt_data && -diff_populate_filespec (dst,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, dst,CHECK_SIZE_ONLY ))return 0 ; max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -186,12 +187,12 @@ static int estimate_similarity(struct diff_filespec *src,if (max_size * (MAX_SCORE -minimum_score) < delta_size *MAX_SCORE )return 0 ; -if (!src->cnt_data &&diff_populate_filespec (src,0 )) +if (!src->cnt_data &&diff_populate_filespec (r, src,0 ))return 0 ; -if (!dst->cnt_data &&diff_populate_filespec (dst,0 )) +if (!dst->cnt_data &&diff_populate_filespec (r, dst,0 ))return 0 ; -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -256,10 +257,11 @@ struct file_similarity {struct diff_filespec *filespec; }; -static unsigned int hash_filespec (struct diff_filespec *filespec) +static unsigned int hash_filespec (struct repository *r, +struct diff_filespec *filespec) {if (!filespec->oid_valid) { -if (diff_populate_filespec (filespec,0 )) +if (diff_populate_filespec (r, filespec,0 ))return 0 ;hash_object_file (filespec->data, filespec->size,"blob" , &filespec->oid);
@@ -280,7 +282,9 @@ static int find_identical_files(struct hashmap *srcs,/* * Find the best source match for specified destination. */ - p =hashmap_get_from_hash (srcs,hash_filespec (target),NULL ); + p =hashmap_get_from_hash (srcs, +hash_filespec (options->repo, target), +NULL );for (; p; p =hashmap_get_next (srcs, p)) {int score;struct diff_filespec *source = p->filespec;
@@ -316,14 +320,16 @@ static int find_identical_files(struct hashmap *srcs,return renames; } -static void insert_file_table (struct hashmap *table,int index,struct diff_filespec *filespec) +static void insert_file_table (struct repository *r, +struct hashmap *table,int index, +struct diff_filespec *filespec) {struct file_similarity *entry =xmalloc (sizeof (*entry)); entry->index = index; entry->filespec = filespec; -hashmap_entry_init (entry,hash_filespec (filespec)); +hashmap_entry_init (entry,hash_filespec (r, filespec));hashmap_add (table, entry); }
@@ -344,7 +350,9 @@ static int find_exact_renames(struct diff_options *options)*/ hashmap_init (&file_table,NULL ,NULL , rename_src_nr);for (i = rename_src_nr-1 ; i >=0 ; i--) -insert_file_table (&file_table, i, rename_src[i].p->one); +insert_file_table (options->repo, + &file_table, i, + rename_src[i].p->one);/* Walk the destinations and find best source match */ for (i =0 ; i < rename_dst_nr; i++)
@@ -557,7 +565,8 @@ void diffcore_rename(struct diff_options *options) diff_unmodified_pair(rename_src[j].p))continue ; - this_src.score =estimate_similarity (one, two, + this_src.score =estimate_similarity (options->repo, + one, two, minimum_score); this_src.name_score =basename_same (one, two); this_src.dst = i;
diffcore.h +7 -6
@@ -7,6 +7,8 @@#include "cache.h" struct diff_options ; +struct repository ; +struct userdiff_driver ;/* This header file is internal between diff.c and its diff transformers * (e.g. diffcore-rename, diffcore-pickaxe). Never include this header
@@ -26,8 +28,6 @@ struct diff_options;#define MINIMUM_BREAK_SIZE 400/* do not break a file smaller than this */ -struct userdiff_driver ; -struct diff_filespec {struct object_id oid;char *path;
@@ -61,10 +61,10 @@ void fill_filespec(struct diff_filespec *, const struct object_id *,#define CHECK_SIZE_ONLY 1#define CHECK_BINARY 2 -int diff_populate_filespec (struct diff_filespec *,unsigned int ); +int diff_populate_filespec (struct repository *,struct diff_filespec *,unsigned int );void diff_free_filespec_data (struct diff_filespec *);void diff_free_filespec_blob (struct diff_filespec *); -int diff_filespec_is_binary (struct diff_filespec *); +int diff_filespec_is_binary (struct repository *,struct diff_filespec *);struct diff_filepair {struct diff_filespec *one;
@@ -111,7 +111,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *, struct diff_filespec *);void diff_q (struct diff_queue_struct *,struct diff_filepair *); -void diffcore_break (int ); +void diffcore_break (struct repository *,int );void diffcore_rename (struct diff_options *);void diffcore_merge_broken (void );void diffcore_pickaxe (struct diff_options *);
@@ -142,7 +142,8 @@ void diff_debug_queue(const char *, struct diff_queue_struct *); #define diff_debug_queue(a,b) do { /* nothing */ } while (0)#endif -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
line-log.c +12 -9
@@ -508,7 +508,9 @@ static void fill_blob_sha1(struct commit *commit, struct diff_filespec *spec)return ; } -static void fill_line_ends (struct diff_filespec *spec,long *lines, +static void fill_line_ends (struct repository *r, +struct diff_filespec *spec, +long *lines,unsigned long **line_ends) {int num =0 , size =50 ;
@@ -516,7 +518,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines,unsigned long *ends =NULL ;char *data =NULL ; -if (diff_populate_filespec (spec,0 )) +if (diff_populate_filespec (r, spec,0 ))die ("Cannot read blob %s" ,oid_to_hex (&spec->oid));ALLOC_ARRAY (ends, size);
@@ -555,7 +557,8 @@ static const char *nth_line(void *data, long line) }static struct line_log_data * -parse_lines (struct commit *commit,const char *prefix,struct string_list *args) +parse_lines (struct repository *r,struct commit *commit, +const char *prefix,struct string_list *args) {long lines =0 ;unsigned long *ends =NULL ;
@@ -583,7 +586,7 @@ parse_lines(struct commit *commit, const char *prefix, struct string_list *args) spec =alloc_filespec (full_name);fill_blob_sha1 (commit, spec); -fill_line_ends (spec, &lines, &ends); +fill_line_ends (r, spec, &lines, &ends); cb_data.spec = spec; cb_data.lines = lines; cb_data.line_ends = ends;
@@ -739,7 +742,7 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_liststruct line_log_data *range; commit =check_single_commit (rev); - range =parse_lines (commit, prefix, args); + range =parse_lines (rev->diffopt.repo, commit, prefix, args);add_line_range (rev, commit, range);if (!rev->diffopt.detect_rename) {
@@ -891,8 +894,8 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rangreturn ;if (pair->one->oid_valid) -fill_line_ends (pair->one, &p_lines, &p_ends); -fill_line_ends (pair->two, &t_lines, &t_ends); +fill_line_ends (rev->diffopt.repo, pair->one, &p_lines, &p_ends); +fill_line_ends (rev->diffopt.repo, pair->two, &t_lines, &t_ends);fprintf (opt->file,"%s%sdiff --git a/%s b/%s%s\n" , prefix, c_meta, pair->one->path, pair->two->path, c_reset); fprintf(opt->file, "%s%s--- %s%s%s\n", prefix, c_meta,
@@ -1008,12 +1011,12 @@ static int process_diff_filepair(struct rev_info *rev,return 0 ;assert (pair->two->oid_valid); -diff_populate_filespec (pair->two,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->two,0 ); file_target.ptr = pair->two->data; file_target.size = pair->two->size;if (pair->one->oid_valid) { -diff_populate_filespec (pair->one,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->one,0 ); file_parent.ptr = pair->one->data; file_parent.size = pair->one->size; }else {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 4/23 combine-diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- combine-diff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
combine-diff.c +2 -1
@@ -1054,7 +1054,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,if (is_file) {struct strbuf buf =STRBUF_INIT ; -if (convert_to_git (&the_index, elem->path, result, len, &buf, global_conv_flags_eol)) { +if (convert_to_git (rev->diffopt.repo->index, + elem->path, result, len, &buf, global_conv_flags_eol)) {free (result); result =strbuf_detach (&buf, &len); result_size = len;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 5/23 blame.c: rename "repo" argument to "r"
In reply to Nguyễn Thái Ngọc DuyThe current naming convention for 'struct repository *' is 'r' for temporary variables or arguments. I did not notice this. Since we're updating blame.c again in the next patch, let's fix this.
--- blame.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
blame.c +18 -18
@@ -90,7 +90,7 @@ static struct blame_origin *get_origin(struct commit *commit, const char *path) -static void verify_working_tree_path (struct repository *repo, +static void verify_working_tree_path (struct repository *r,struct commit *work_tree,const char *path) {struct commit_list *parents;
@@ -102,15 +102,15 @@ static void verify_working_tree_path(struct repository *repo,unsigned mode;if (!get_tree_entry (commit_oid, path, &blob_oid, &mode) && -oid_object_info (repo, &blob_oid,NULL ) ==OBJ_BLOB ) +oid_object_info (r, &blob_oid,NULL ) ==OBJ_BLOB )return ; } - pos =index_name_pos (repo->index, path,strlen (path)); + pos =index_name_pos (r->index, path,strlen (path));if (pos >=0 ) ;/* path is in the index */ -else if (-1 - pos < repo->index->cache_nr && - !strcmp (repo->index->cache[-1 - pos]->name, path)) +else if (-1 - pos < r->index->cache_nr && + !strcmp (r->index->cache[-1 - pos]->name, path)) ;/* path is in the index, unmerged */ else die ("no such path '%s' in HEAD" , path);
@@ -166,7 +166,7 @@ static void set_commit_buffer_from_strbuf(struct commit *c, struct strbuf *sb)* Prepare a dummy commit that represents the work tree (or staged) item. * Note that annotating work tree item never works in the reverse. */ -static struct commit *fake_working_tree_commit (struct repository *repo, +static struct commit *fake_working_tree_commit (struct repository *r,struct diff_options *opt,const char *path,const char *contents_from)
@@ -183,7 +183,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,unsigned mode;struct strbuf msg =STRBUF_INIT ; -read_index (repo->index); +read_index (r->index);time (&now); commit =alloc_commit_node (the_repository); commit->object.parsed =1 ;
@@ -195,7 +195,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo, parent_tail =append_parent (parent_tail, &head_oid);append_merge_parents (parent_tail); -verify_working_tree_path (repo, commit, path); +verify_working_tree_path (r, commit, path); origin =make_origin (commit, path);
@@ -253,7 +253,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,if (strbuf_read (&buf,0 ,0 ) <0 )die_errno ("failed to read from stdin" ); } -convert_to_git (repo->index, path, buf.buf, buf.len, &buf,0 ); +convert_to_git (r->index, path, buf.buf, buf.len, &buf,0 ); origin->file.ptr = buf.buf; origin->file.size = buf.len;pretend_object_file (buf.buf, buf.len,OBJ_BLOB , &origin->blob_oid);
@@ -264,28 +264,28 @@ static struct commit *fake_working_tree_commit(struct repository *repo,* bits; we are not going to write this index out -- we just * want to run "diff-index --cached". */ -discard_index (repo->index); -read_index (repo->index); +discard_index (r->index); +read_index (r->index); len =strlen (path);if (!mode) { -int pos =index_name_pos (repo->index, path, len); +int pos =index_name_pos (r->index, path, len);if (0 <= pos) - mode = repo->index->cache[pos]->ce_mode; + mode = r->index->cache[pos]->ce_mode;else /* Let's not bother reading from HEAD tree */ mode =S_IFREG |0644 ; } - ce =make_empty_cache_entry (repo->index, len); + ce =make_empty_cache_entry (r->index, len);oidcpy (&ce->oid, &origin->blob_oid);memcpy (ce->name, path, len); ce->ce_flags =create_ce_flags (0 ); ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); -add_index_entry (repo->index, ce, +add_index_entry (r->index, ce,ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE ); -cache_tree_invalidate_path (repo->index, path); +cache_tree_invalidate_path (r->index, path);return commit; }
@@ -520,14 +520,14 @@ static void queue_blames(struct blame_scoreboard *sb, struct blame_origin *porig* * This also fills origin->mode for corresponding tree path. */ -static int fill_blob_sha1_and_mode (struct repository *repo, +static int fill_blob_sha1_and_mode (struct repository *r,struct blame_origin *origin) {if (!is_null_oid (&origin->blob_oid))return 0 ;if (get_tree_entry (&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode)) goto error_out; -if (oid_object_info (repo, &origin->blob_oid,NULL ) !=OBJ_BLOB ) +if (oid_object_info (r, &origin->blob_oid,NULL ) !=OBJ_BLOB ) goto error_out;return 0 ; error_out:
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 6/23 diff.c: remove the_index dependency in textconv() functions
In reply to Nguyễn Thái Ngọc Duy--- blame.c | 7 ++++--- builtin/cat-file.c | 6 ++++-- builtin/log.c | 3 ++- combine-diff.c | 27 ++++++++++++++++----------- diff.c | 17 +++++++++-------- diff.h | 9 +++++++-- diffcore-pickaxe.c | 4 ++-- grep.c | 2 +- 8 files changed, 45 insertions(+), 30 deletions(-)
blame.c +4 -3
@@ -234,7 +234,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,switch (st.st_mode &S_IFMT ) {case S_IFREG :if (opt->flags.allow_textconv && -textconv_object (read_from, mode, &null_oid,0 , &buf_ptr, &buf_len)) +textconv_object (r, read_from, mode, &null_oid,0 , &buf_ptr, &buf_len))strbuf_attach (&buf, buf_ptr, buf_len, buf_len +1 );else if (strbuf_read_file (&buf, read_from, st.st_size) != st.st_size)die_errno ("cannot open or read '%s'" , read_from);
@@ -318,7 +318,8 @@ static void fill_origin_blob(struct diff_options *opt, (*num_read_blob)++;if (opt->flags.allow_textconv && -textconv_object (o->path, o->mode, &o->blob_oid,1 , &file->ptr, &file_size)) +textconv_object (opt->repo, o->path, o->mode, + &o->blob_oid,1 , &file->ptr, &file_size)) ;else file->ptr = read_object_file(&o->blob_oid, &type,
@@ -1857,7 +1858,7 @@ void setup_scoreboard(struct blame_scoreboard *sb,die (_ ("no such path %s in %s" ), path, final_commit_name);if (sb->revs->diffopt.flags.allow_textconv && -textconv_object (path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, +textconv_object (sb->repo, path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, &sb->final_buf_size)) ;else
builtin/cat-file.c +4 -2
@@ -113,7 +113,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,die ("git cat-file --textconv %s: <object> must be <sha1:path>" , obj_name); -if (textconv_object (path, obj_context.mode, &oid,1 , &buf, &size)) +if (textconv_object (the_repository, path, obj_context.mode, + &oid,1 , &buf, &size))break ;/* else fallthrough */
@@ -305,7 +306,8 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d oid_to_hex(oid), data->rest); }else if (opt->cmdmode =='c' ) {enum object_type type; -if (!textconv_object (data->rest,0100644 , oid, +if (!textconv_object (the_repository, + data->rest,0100644 , oid,1 , &contents, &size)) contents = read_object_file(oid, &type,
builtin/log.c +2 -1
@@ -507,7 +507,8 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c &oidc, &obj_context))die (_ ("Not a valid object name %s" ), obj_name);if (!obj_context.path || - !textconv_object (obj_context.path, obj_context.mode, &oidc,1 , &buf, &size)) { + !textconv_object (the_repository, obj_context.path, + obj_context.mode, &oidc,1 , &buf, &size)) {free (obj_context.path);return stream_blob_to_fd (1 , oid,NULL ,0 ); }
combine-diff.c +16 -11
@@ -285,7 +285,8 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase,return base; } -static char *grab_blob (const struct object_id *oid,unsigned int mode, +static char *grab_blob (struct repository *r, +const struct object_id *oid,unsigned int mode,unsigned long *size,struct userdiff_driver *textconv,const char *path) {
@@ -304,7 +305,7 @@ static char *grab_blob(const struct object_id *oid, unsigned int mode, }else if (textconv) {struct diff_filespec *df =alloc_filespec (path);fill_filespec (df, oid,1 , mode); - *size =fill_textconv (textconv, df, &blob); + *size =fill_textconv (r, textconv, df, &blob);free_filespec (df); }else { blob =read_object_file (oid, &type, size);
@@ -389,7 +390,8 @@ static void consume_line(void *state_, char *line, unsigned long len) } } -static void combine_diff(const struct object_id *parent, unsigned int mode, +static void combine_diff(struct repository *r, + const struct object_id *parent, unsigned int mode, mmfile_t *result_file, struct sline *sline, unsigned int cnt, int n, int num_parent, int result_deleted,
@@ -407,7 +409,7 @@ static void combine_diff(const struct object_id *parent, unsigned int mode,if (result_deleted)return ;/* result deleted */ - parent_file.ptr =grab_blob (parent, mode, &sz, textconv, path); + parent_file.ptr =grab_blob (r, parent, mode, &sz, textconv, path); parent_file.size = sz;memset (&xpp,0 ,sizeof (xpp)); xpp.flags = flags;
@@ -993,7 +995,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,/* Read the result of merge first */ if (!working_tree_file) - result =grab_blob (&elem->oid, elem->mode, &result_size, + result =grab_blob (opt->repo, &elem->oid, elem->mode, &result_size, textconv, elem->path);else {/* Used by diff-tree to read from the working tree */
@@ -1016,15 +1018,16 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, }else if (S_ISDIR (st.st_mode)) {struct object_id oid;if (resolve_gitlink_ref (elem->path,"HEAD" , &oid) <0 ) - result =grab_blob (&elem->oid, elem->mode, - &result_size,NULL ,NULL ); + result =grab_blob (opt->repo, &elem->oid, + elem->mode, &result_size, +NULL ,NULL );else - result =grab_blob (&oid, elem->mode, + result =grab_blob (opt->repo, &oid, elem->mode, &result_size,NULL ,NULL ); }else if (textconv) {struct diff_filespec *df =alloc_filespec (elem->path);fill_filespec (df, &null_oid,0 , st.st_mode); - result_size =fill_textconv (textconv, df, &result); + result_size =fill_textconv (opt->repo, textconv, df, &result);free_filespec (df); }else if (0 <= (fd =open (elem->path,O_RDONLY ))) {size_t len =xsize_t (st.st_size);
@@ -1090,7 +1093,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,for (i =0 ; !is_binary && i < num_parent; i++) {char *buf;unsigned long size; - buf =grab_blob (&elem->parent[i].oid, + buf =grab_blob (opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &size,NULL ,NULL );if (buffer_is_binary (buf, size))
@@ -1146,7 +1150,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, } }if (i <= j) - combine_diff(&elem->parent[i].oid, + combine_diff(opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &result_file, sline, cnt, i, num_parent, result_deleted,
diff.c +9 -8
@@ -1700,8 +1700,8 @@ static void emit_rewrite_diff(const char *name_a,quote_two_c_style (&a_name, a_prefix, name_a,0 );quote_two_c_style (&b_name, b_prefix, name_b,0 ); - size_one =fill_textconv (textconv_one, one, &data_one); - size_two =fill_textconv (textconv_two, two, &data_two); + size_one =fill_textconv (o->repo, textconv_one, one, &data_one); + size_two =fill_textconv (o->repo, textconv_two, two, &data_two);memset (&ecbdata,0 ,sizeof (ecbdata)); ecbdata.color_diff =want_color (o->use_color);
@@ -3462,8 +3462,8 @@ static void builtin_diff(const char *name_a,strbuf_reset (&header); } - mf1.size =fill_textconv (textconv_one, one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); pe =diff_funcname_pattern (one);if (!pe)
@@ -6337,11 +6337,11 @@ static char *run_textconv(struct repository *r,return strbuf_detach (&buf, outsize); } -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf) { -struct repository *r = the_repository;size_t size;if (!driver) {
@@ -6386,7 +6386,8 @@ size_t fill_textconv(struct userdiff_driver *driver,return size; } -int textconv_object(const char *path, +int textconv_object(struct repository *r, + const char *path, unsigned mode, const struct object_id *oid, int oid_valid,
@@ -6404,7 +6405,7 @@ int textconv_object(const char *path,return 0 ; } - *buf_size =fill_textconv (textconv, df, buf); + *buf_size =fill_textconv (r, textconv, df, buf);free_filespec (df);return 1 ; }
diff.h +7 -2
@@ -442,7 +442,8 @@ int index_differs_from(const char *def, const struct diff_flags *flags,* struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer * that should be freed by the caller. */ -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf);
@@ -458,7 +459,11 @@ struct userdiff_driver *get_textconv(struct diff_filespec *one);* if the textconv driver exists. * Return 1 if the conversion succeeds, 0 otherwise. */ -int textconv_object (const char *path,unsigned mode,const struct object_id *oid,int oid_valid,char **buf,unsigned long *buf_size); +int textconv_object (struct repository *repo, +const char *path, +unsigned mode, +const struct object_id *oid,int oid_valid, +char **buf,unsigned long *buf_size);int parse_rename_score (const char **cp_p);
diffcore-pickaxe.c +2 -2
@@ -153,8 +153,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,if (textconv_one == textconv_two &&diff_unmodified_pair (p))return 0 ; - mf1.size =fill_textconv (textconv_one, p->one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, p->two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, p->one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, p->two, &mf2.ptr); ret = fn(DIFF_FILE_VALID(p->one) ? &mf1 : NULL, DIFF_FILE_VALID(p->two) ? &mf2 : NULL,
grep.c +1 -1
@@ -1741,7 +1741,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (driver, df, &buf); + size =fill_textconv (the_repository, driver, df, &buf);grep_read_unlock ();free_filespec (df);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 7/23 grep.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/grep.c | 4 ++-- builtin/log.c | 2 +- grep.c | 13 ++++++++----- grep.h | 7 +++++-- revision.c | 4 ++-- 5 files changed, 18 insertions(+), 12 deletions(-)
builtin/grep.c +2 -2
@@ -904,9 +904,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) OPT_END() }; -init_grep_defaults (); +init_grep_defaults (the_repository);git_config (grep_cmd_config,NULL ); -grep_init (&opt, prefix); +grep_init (&opt, the_repository, prefix);/* * If there is no -- then the paths must exist in the working
builtin/log.c +1 -1
@@ -115,7 +115,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,static void init_log_defaults (void ) { -init_grep_defaults (); +init_grep_defaults (the_repository);init_diff_ui_defaults (); decoration_style =auto_decoration_style ();
grep.c +8 -5
@@ -42,7 +42,7 @@ static void color_set(char *dst, const char *color_bytes)* We could let the compiler do this, but without C99 initializers * the code gets unwieldy and unreadable, so... */ -void init_grep_defaults (void ) +void init_grep_defaults (struct repository *repo) {struct grep_opt *opt = &grep_defaults;static int run_once;
@@ -52,6 +52,7 @@ void init_grep_defaults(void) run_once++;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->relative =1 ; opt->pathname =1 ; opt->max_depth =-1 ;
@@ -149,12 +150,13 @@ int grep_config(const char *var, const char *value, void *cb)* default values from the template we read the configuration * information in an earlier call to git_config(grep_config). */ -void grep_init (struct grep_opt *opt,const char *prefix) +void grep_init (struct grep_opt *opt,struct repository *repo,const char *prefix) {struct grep_opt *def = &grep_defaults;int i;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->prefix = prefix; opt->prefix_length = (prefix && *prefix) ?strlen (prefix) :0 ; opt->pattern_tail = &opt->pattern_list;
@@ -1708,7 +1710,8 @@ static int look_ahead(struct grep_opt *opt,return 0 ; } -static int fill_textconv_grep (struct userdiff_driver *driver, +static int fill_textconv_grep (struct repository *r, +struct userdiff_driver *driver,struct grep_source *gs) {struct diff_filespec *df;
@@ -1741,7 +1744,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (the_repository, driver, df, &buf); + size =fill_textconv (r, driver, df, &buf);grep_read_unlock ();free_filespec (df);
@@ -1837,7 +1840,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle try_lookahead =should_lookahead (opt); -if (fill_textconv_grep (textconv, gs) <0 ) +if (fill_textconv_grep (opt->repo, textconv, gs) <0 )return 0 ; bol = gs->buf;
grep.h +5 -2
@@ -36,6 +36,8 @@ typedef int pcre2_jit_stack;#include "thread-utils.h" #include "userdiff.h" +struct repository ; +enum grep_pat_token {GREP_PATTERN ,GREP_PATTERN_HEAD ,
@@ -136,6 +138,7 @@ struct grep_opt {struct grep_pat *header_list;struct grep_pat **header_tail;struct grep_expr *pattern_expression; +struct repository *repo;const char *prefix;int prefix_length;regex_t regexp;
@@ -183,9 +186,9 @@ struct grep_opt {void *output_priv; }; -extern void init_grep_defaults (void ); +extern void init_grep_defaults (struct repository *);extern int grep_config (const char *var,const char *value,void *); -extern void grep_init (struct grep_opt *,const char *prefix); +extern void grep_init (struct grep_opt *,struct repository *repo,const char *prefix);void grep_commit_pattern_type (enum grep_pattern_type ,struct grep_opt *opt);extern void append_grep_pat (struct grep_opt *opt,const char *pat,size_t patlen,const char *origin,int no,enum grep_pat_token t);
revision.c +2 -2
@@ -1464,8 +1464,8 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format =CMIT_FMT_DEFAULT ; revs->expand_tabs_in_log_default =8 ; -init_grep_defaults (); -grep_init (&revs->grep_filter, prefix); +init_grep_defaults (the_repository); +grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ;diff_setup (&revs->diffopt);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 8/23 diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyA new variant repo_diff_setup() is added that takes 'struct repository *' and diff_setup() becomes a thin macro around it that is protected by NO_THE_REPOSITORY_COMPATIBILITY_MACROS, similar to NO_THE_INDEX_.... The plan is these macros will always be defined for all library files and the macros are only accessible in builtin/
--- Documentation/technical/api-diff.txt | 4 ++-- blame.c | 20 +++++++++++--------- builtin/diff.c | 2 +- builtin/log.c | 2 +- builtin/merge.c | 2 +- builtin/range-diff.c | 2 +- diff-no-index.c | 9 +++++++-- diff.c | 4 ++-- diff.h | 7 +++++-- merge-recursive.c | 2 +- notes-merge.c | 4 ++-- patch-ids.c | 2 +- read-cache.c | 2 +- revision.c | 2 +- tree-diff.c | 2 +- 15 files changed, 38 insertions(+), 28 deletions(-)
Documentation/technical/api-diff.txt +2 -2
@@ -18,8 +18,8 @@ Calling sequence ---------------- * Prepare `struct diff_options` to record the set of diff options, and - then call `diff_setup()` to initialize this structure. This sets up - the vanilla default. + then call `repo_diff_setup()` to initialize this structure. This + sets up the vanilla default. * Fill in the options structure to specify desired output format, rename detection, etc. `diff_opt_parse()` can be used to parse options given
blame.c +11 -9
@@ -541,8 +541,9 @@ static int fill_blob_sha1_and_mode(struct repository *r,* We have an origin -- check if the same path exists in the * parent and return an origin structure to represent it. */ -static struct blame_origin *find_origin (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_origin (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin;struct diff_options diff_opts;
@@ -562,7 +563,7 @@ static struct blame_origin *find_origin(struct commit *parent,* and origin first. Most of the time they are the * same and diff-tree is fairly efficient about this. */ -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =0 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -629,14 +630,15 @@ static struct blame_origin *find_origin(struct commit *parent,* We have an origin -- find the path that corresponds to it in its * parent and return an origin structure to represent it. */ -static struct blame_origin *find_rename (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_rename (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin =NULL ;struct diff_options diff_opts;int i; -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =DIFF_DETECT_RENAME ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1260,7 +1262,7 @@ static void find_copy_in_parent(struct blame_scoreboard *sb,if (!unblamed)return ;/* nothing remains for this target */ -diff_setup (&diff_opts); +repo_diff_setup (sb->repo, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1442,7 +1444,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,* common cases, then we look for renames in the second pass. */ for (pass =0 ; pass <2 - sb->no_whole_file_rename; pass++) { -struct blame_origin *(*find)(struct commit *,struct blame_origin *); +struct blame_origin *(*find)(struct repository *,struct commit *,struct blame_origin *); find = pass ? find_rename : find_origin; for (i = 0, sg = first_scapegoat(revs, commit, sb->reverse);
@@ -1455,7 +1457,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,continue ;if (parse_commit (p))continue ; - porigin =find (p, origin); + porigin =find (sb->repo, p, origin);if (!porigin)continue ;if (!oidcmp (&porigin->blob_oid, &origin->blob_oid)) {
builtin/diff.c +1 -1
@@ -339,7 +339,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) }if (no_index)/* If this is a no-index diff, just run it and exit there. */ -diff_no_index (&rev, argc, argv); +diff_no_index (the_repository, &rev, argc, argv);/* Otherwise, we are doing the usual "git" diff */ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
builtin/log.c +1 -1
@@ -1361,7 +1361,7 @@ static void prepare_bases(struct base_tree_info *bases,return ;init_commit_base (&commit_base); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.flags.recursive =1 ;diff_setup_done (&diffopt);
builtin/merge.c +1 -1
@@ -452,7 +452,7 @@ static void finish(struct commit *head_commit, }if (new_head && show_diffstat) {struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.stat_width =-1 ;/* use full terminal width */ opts.stat_graph_width =-1 ;/* respect statGraphWidth config */ opts.output_format |=
builtin/range-diff.c +1 -1
@@ -34,7 +34,7 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)git_config (git_diff_ui_config,NULL ); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.output_format =DIFF_FORMAT_PATCH ; diffopt.flags.suppress_diff_headers =1 ; diffopt.output_prefix = output_prefix_cb;
diff-no-index.c +7 -2
@@ -233,7 +233,8 @@ static void fixup_paths(const char **path, struct strbuf *replacement) } } -void diff_no_index (struct rev_info *revs, +void diff_no_index (struct repository *r, +struct rev_info *revs,int argc,const char **argv) {int i;
@@ -241,7 +242,11 @@ void diff_no_index(struct rev_info *revs,struct strbuf replacement =STRBUF_INIT ;const char *prefix = revs->prefix; -diff_setup (&revs->diffopt); +/* +* FIXME: --no-index should not look at index and we should be +* able to pass NULL repo. Maybe later. +*/ +repo_diff_setup (r, &revs->diffopt);for (i =1 ; i < argc -2 ; ) {int j;if (!strcmp (argv[i],"--no-index" ))
diff.c +2 -2
@@ -4390,12 +4390,12 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)builtin_checkdiff (name, other, attr_path, p->one, p->two, o); } -void diff_setup (struct diff_options *options) +void repo_diff_setup (struct repository *r,struct diff_options *options) {memcpy (options, &default_diff_options,sizeof (*options)); options->file = stdout; - options->repo->index = &the_index; + options->repo = r; options->abbrev =DEFAULT_ABBREV ; options->line_termination ='\n' ;
diff.h +5 -2
@@ -336,7 +336,10 @@ int git_diff_basic_config(const char *var, const char *value, void *cb);int git_diff_heuristic_config (const char *var,const char *value,void *cb);void init_diff_ui_defaults (void );int git_diff_ui_config (const char *var,const char *value,void *cb); -void diff_setup (struct diff_options *); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define diff_setup (diffopts) repo_diff_setup(the_repository, diffopts) +#endif +void repo_diff_setup (struct repository *,struct diff_options *);int diff_opt_parse (struct diff_options *,const char **,int ,const char *);void diff_setup_done (struct diff_options *);int git_config_rename (const char *var,const char *value);
@@ -426,7 +429,7 @@ int diff_flush_patch_id(struct diff_options *, struct object_id *, int);int diff_result_code (struct diff_options *,int ); -void diff_no_index (struct rev_info *,int ,const char **); +void diff_no_index (struct repository *,struct rev_info *,int ,const char **);int index_differs_from (const char *def,const struct diff_flags *flags,int ita_invisible_in_index);
merge-recursive.c +1 -1
@@ -1812,7 +1812,7 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *o,struct diff_queue_struct *ret;struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.flags.recursive =1 ; opts.flags.rename_empty =0 ; opts.detect_rename =merge_detect_rename (o);
notes-merge.c +2 -2
@@ -126,7 +126,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,trace_printf ("\tdiff_tree_remote(base = %.7s, remote = %.7s)\n" ,oid_to_hex (base),oid_to_hex (remote)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
@@ -189,7 +189,7 @@ static void diff_tree_local(struct notes_merge_options *o,trace_printf ("\tdiff_tree_local(len = %i, base = %.7s, local = %.7s)\n" , len,oid_to_hex (base),oid_to_hex (local)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
patch-ids.c +1 -1
@@ -59,7 +59,7 @@ static int patch_id_cmp(const void *cmpfn_data,int init_patch_ids (struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -diff_setup (&ids->diffopts); +repo_diff_setup (the_repository, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
read-cache.c +1 -1
@@ -2137,7 +2137,7 @@ int index_has_changes(struct index_state *istate,if (tree || !get_oid_tree ("HEAD" , &cmp)) {struct diff_options opt; -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.exit_with_status =1 ;if (!sb) opt.flags.quick =1 ;
revision.c +1 -1
@@ -1468,7 +1468,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ; -diff_setup (&revs->diffopt); +repo_diff_setup (the_repository, &revs->diffopt);if (prefix && !revs->diffopt.prefix) { revs->diffopt.prefix = prefix; revs->diffopt.prefix_length =strlen (prefix);
tree-diff.c +1 -1
@@ -605,7 +605,7 @@ static void try_to_follow_renames(const struct object_id *old_oid, choice = q->queue[0 ]; q->nr =0 ; -diff_setup (&diff_opts); +repo_diff_setup (the_repository, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.flags.find_copies_harder =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 9/23 read-cache.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- read-cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
read-cache.c +2 -2
@@ -823,7 +823,7 @@ struct cache_entry *make_cache_entry(struct index_state *istate, ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); - ret =refresh_cache_entry (&the_index, ce, refresh_options); + ret =refresh_cache_entry (istate, ce, refresh_options);if (ret != ce)discard_cache_entry (ce);return ret;
@@ -1493,7 +1493,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,if (ignore_submodules &&S_ISGITLINK (ce->ce_mode))continue ; -if (pathspec && !ce_path_match (&the_index, ce, pathspec, seen)) +if (pathspec && !ce_path_match (istate, ce, pathspec, seen)) filtered =1 ;if (ce_stage (ce)) {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 10/23 diff-lib.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- diff-lib.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
diff-lib.c +10 -7
@@ -70,7 +70,7 @@ static int match_stat_with_submodule(struct diff_options *diffopt, struct stat *st, unsigned ce_option, unsigned *dirty_submodule) { - int changed = ce_match_stat(ce, st, ce_option); + int changed = ie_match_stat(diffopt->repo->index, ce, st, ce_option);if (S_ISGITLINK (ce->ce_mode)) {struct diff_flags orig_flags = diffopt->flags;if (!diffopt->flags.override_submodule_config)
@@ -93,15 +93,16 @@ int run_diff_files(struct rev_info *revs, unsigned int option)unsigned ce_option = ((option &DIFF_RACY_IS_MODIFIED ) ?CE_MATCH_RACY_IS_DIRTY :0 );uint64_t start =getnanotime (); +struct index_state *istate = revs->diffopt.repo->index;diff_set_mnemonic_prefix (&revs->diffopt,"i/" ,"w/" );if (diff_unmerged_stage <0 ) diff_unmerged_stage =2 ; - entries = active_nr; + entries = istate->cache_nr;for (i =0 ; i < entries; i++) {unsigned int oldmode, newmode; -struct cache_entry *ce = active_cache[i]; +struct cache_entry *ce = istate->cache[i];int changed;unsigned dirty_submodule =0 ;const struct object_id *old_oid, *new_oid;
@@ -109,7 +110,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)if (diff_can_quit_early (&revs->diffopt))break ; -if (!ce_path_match (&the_index, ce, &revs->prune_data,NULL )) +if (!ce_path_match (istate, ce, &revs->prune_data,NULL ))continue ;if (ce_stage (ce)) {
@@ -145,7 +146,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) dpath->mode = wt_mode;while (i < entries) { -struct cache_entry *nce = active_cache[i]; +struct cache_entry *nce = istate->cache[i];int stage;if (strcmp (ce->name, nce->name))
@@ -474,7 +475,9 @@ static int oneway_diff(const struct cache_entry * const *src,if (tree == o->df_conflict_entry) tree =NULL ; -if (ce_path_match (&the_index, idx ? idx : tree, &revs->prune_data,NULL )) { +if (ce_path_match (revs->diffopt.repo->index, + idx ? idx : tree, + &revs->prune_data,NULL )) {do_oneway_diff (o, idx, tree);if (diff_can_quit_early (&revs->diffopt)) { o->exiting_early =1 ;
@@ -506,7 +509,7 @@ static int diff_cache(struct rev_info *revs, opts.merge =1 ; opts.fn = oneway_diff; opts.unpack_data = revs; - opts.src_index = &the_index; + opts.src_index = revs->diffopt.repo->index; opts.dst_index =NULL ; opts.pathspec = &revs->diffopt.pathspec; opts.pathspec->recursive =1 ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 11/23 ll-merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- apply.c | 9 ++++++--- builtin/checkout.c | 3 ++- diff.c | 2 +- ll-merge.c | 17 +++++++++-------- ll-merge.h | 5 ++++- merge-blobs.c | 3 ++- merge-recursive.c | 3 ++- notes-merge.c | 3 ++- rerere.c | 10 ++++++---- 9 files changed, 34 insertions(+), 21 deletions(-)
apply.c +6 -3
@@ -3467,7 +3467,8 @@ static int load_preimage(struct apply_state *state,return 0 ; } -static int three_way_merge(struct image *image, +static int three_way_merge(struct apply_state *state, + struct image *image, char *path, const struct object_id *base, const struct object_id *ours,
@@ -3483,7 +3484,9 @@ static int three_way_merge(struct image *image, status =ll_merge (&result, path, &base_file,"base" , &our_file,"ours" , - &their_file,"theirs" ,NULL ); + &their_file,"theirs" , + state->repo->index, +NULL );free (base_file.ptr);free (our_file.ptr);free (their_file.ptr);
@@ -3595,7 +3598,7 @@ static int try_threeway(struct apply_state *state,clear_image (&tmp_image);/* in-core three-way merge between post and our using pre as base */ - status =three_way_merge (image, patch->new_name, + status =three_way_merge (state, image, patch->new_name, &pre_oid, &our_oid, &post_oid);if (status <0 ) {if (state->apply_verbosity > verbosity_silent)
builtin/checkout.c +2 -1
@@ -208,7 +208,8 @@ static int checkout_merged(int pos, const struct checkout *state)* merge.renormalize set, too */ status =ll_merge (&result_buf, path, &ancestor,"base" , - &ours,"ours" , &theirs,"theirs" ,NULL ); + &ours,"ours" , &theirs,"theirs" , + state->istate,NULL );free (ancestor.ptr);free (ours.ptr);free (theirs.ptr);
diff.c +1 -1
@@ -3637,7 +3637,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, data.lineno =0 ; data.o = o; data.ws_rule =whitespace_rule (attr_path); - data.conflict_marker_size =ll_merge_marker_size (attr_path); + data.conflict_marker_size =ll_merge_marker_size (o->repo->index, attr_path);if (fill_mmfile (o->repo, &mf1, one) <0 ||fill_mmfile (o->repo, &mf2, two) <0 )
ll-merge.c +9 -8
@@ -336,10 +336,10 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attrreturn &ll_merge_drv[LL_TEXT_MERGE ]; } -static void normalize_file (mmfile_t *mm,const char *path) +static void normalize_file (mmfile_t *mm,const char *path,struct index_state *istate) {struct strbuf strbuf =STRBUF_INIT ; -if (renormalize_buffer (&the_index, path, mm->ptr, mm->size, &strbuf)) { +if (renormalize_buffer (istate, path, mm->ptr, mm->size, &strbuf)) {free (mm->ptr); mm->size = strbuf.len; mm->ptr =strbuf_detach (&strbuf,NULL );
@@ -351,6 +351,7 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts) { static struct attr_check *check;
@@ -363,15 +364,15 @@ int ll_merge(mmbuffer_t *result_buf, opts = &default_opts;if (opts->renormalize) { -normalize_file (ancestor, path); -normalize_file (ours, path); -normalize_file (theirs, path); +normalize_file (ancestor, path, istate); +normalize_file (ours, path, istate); +normalize_file (theirs, path, istate); }if (!check) check =attr_check_initl ("merge" ,"conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check)) { +if (!git_check_attr (istate, path, check)) { ll_driver_name = check->items[0 ].value;if (check->items[1 ].value) { marker_size =atoi (check->items[1 ].value);
@@ -391,14 +392,14 @@ int ll_merge(mmbuffer_t *result_buf, opts, marker_size); } -int ll_merge_marker_size (const char *path) +int ll_merge_marker_size (struct index_state *istate,const char *path) {static struct attr_check *check;int marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;if (!check) check =attr_check_initl ("conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check) && check->items[0 ].value) { +if (!git_check_attr (istate, path, check) && check->items[0 ].value) { marker_size =atoi (check->items[0 ].value);if (marker_size <=0 ) marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;
ll-merge.h +4 -1
@@ -7,6 +7,8 @@#include "xdiff/xdiff.h" +struct index_state ; +struct ll_merge_options {unsigned virtual_ancestor :1 ;unsigned variant :2 ;/* favor ours, favor theirs, or union merge */
@@ -19,8 +21,9 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts); -int ll_merge_marker_size (const char *path); +int ll_merge_marker_size (struct index_state *istate,const char *path);#endif
merge-blobs.c +2 -1
@@ -41,7 +41,8 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our* common ancestor. */ merge_status =ll_merge (&res, path, base,NULL , - our,".our" , their,".their" ,NULL ); + our,".our" , their,".their" , + &the_index,NULL );if (merge_status <0 )return NULL ;
merge-recursive.c +2 -1
@@ -1083,7 +1083,8 @@ static int merge_3way(struct merge_options *o,read_mmblob (&src2, &b->oid); merge_status =ll_merge (result_buf, a->path, &orig, base_name, - &src1, name1, &src2, name2, &ll_opts); + &src1, name1, &src2, name2, + &the_index, &ll_opts);free (base_name);free (name1);
notes-merge.c +2 -1
@@ -348,7 +348,8 @@ static int ll_merge_in_worktree(struct notes_merge_options *o,read_mmblob (&remote, &p->remote); status =ll_merge (&result_buf,oid_to_hex (&p->obj), &base,NULL , - &local, o->local_ref, &remote, o->remote_ref,NULL ); + &local, o->local_ref, &remote, o->remote_ref, + &the_index,NULL );free (base.ptr);free (local.ptr);
rerere.c +6 -4
@@ -478,7 +478,7 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output {int hunk_no =0 ;struct rerere_io_file io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);memset (&io,0 ,sizeof (io)); io.io.getline = rerere_file_getline;
@@ -641,7 +641,8 @@ static int try_merge(const struct rerere_id *id, const char *path,* A three-way merge. Note that this honors user-customizable * low-level merge driver settings. */ - ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" ,NULL ); + ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" , + &the_index,NULL );free (base.ptr);free (other.ptr);
@@ -960,7 +961,7 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpuconst struct cache_entry *ce;int pos, len, i, hunk_no;struct rerere_io_mem io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);/* * Reproduce the conflicted merge in-core
@@ -995,7 +996,8 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu*/ ll_merge (&result, path, &mmfile[0 ],NULL , &mmfile[1 ],"ours" , - &mmfile[2 ],"theirs" ,NULL ); + &mmfile[2 ],"theirs" , + &the_index,NULL );for (i =0 ; i <3 ; i++)free (mmfile[i].ptr);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
Re: [PATCH v3 11/23] ll-merge.c: remove implicit dependency on the_index
Quoted 11 lines · Nguyễn Thái Ngọc Duy
--- apply.c | 9 ++++++--- builtin/checkout.c | 3 ++- diff.c | 2 +- ll-merge.c | 17 +++++++++-------- ll-merge.h | 5 ++++- merge-blobs.c | 3 ++- merge-recursive.c | 3 ++- notes-merge.c | 3 ++- rerere.c | 10 ++++++---- 9 files changed, 34 insertions(+), 21 deletions(-)
This one looks good to me. The only reason why low-level merge needs to care about the index is the renormalization, and the updated code seems to correctly carry around the istate in question.
PATCH v3 12/23 merge-blobs.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge-tree.c | 2 +- merge-blobs.c | 15 +++++++++++---- merge-blobs.h | 7 +++++-- 3 files changed, 17 insertions(+), 7 deletions(-)
builtin/merge-tree.c +1 -1
@@ -76,7 +76,7 @@ static void *result(struct merge_list *entry, unsigned long *size) their =NULL ;if (entry) their = entry->blob; -return merge_blobs (path, base, our, their, size); +return merge_blobs (&the_index, path, base, our, their, size); }static void *origin (struct merge_list *entry,unsigned long *size)
merge-blobs.c +11 -4
@@ -29,7 +29,12 @@ static void free_mmfile(mmfile_t *f)free (f->ptr); } -static void *three_way_filemerge (const char *path,mmfile_t *base,mmfile_t *our,mmfile_t *their,unsigned long *size) +static void *three_way_filemerge (struct index_state *istate, +const char *path, +mmfile_t *base, +mmfile_t *our, +mmfile_t *their, +unsigned long *size) {int merge_status;mmbuffer_t res;
@@ -42,7 +47,7 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our*/ merge_status =ll_merge (&res, path, base,NULL , our,".our" , their,".their" , - &the_index,NULL ); + istate,NULL );if (merge_status <0 )return NULL ;
@@ -50,7 +55,9 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *ourreturn res.ptr; } -void *merge_blobs (const char *path,struct blob *base,struct blob *our,struct blob *their,unsigned long *size) +void *merge_blobs (struct index_state *istate,const char *path, +struct blob *base,struct blob *our, +struct blob *their,unsigned long *size) {void *res =NULL ;mmfile_t f1, f2, common;
@@ -83,7 +90,7 @@ void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct common.ptr =xstrdup ("" ); common.size =0 ; } - res =three_way_filemerge (path, &common, &f1, &f2, size); + res =three_way_filemerge (istate, path, &common, &f1, &f2, size);free_mmfile (&common); out_free_f2_f1:free_mmfile (&f2);
merge-blobs.h +5 -2
@@ -1,8 +1,11 @@#ifndef MERGE_BLOBS_H #define MERGE_BLOBS_H -#include "blob.h" +struct blob ; +struct index_state ; -extern void *merge_blobs (const char *,struct blob *,struct blob *,struct blob *,unsigned long *); +extern void *merge_blobs (struct index_state *,const char *, +struct blob *,struct blob *, +struct blob *,unsigned long *);#endif /* MERGE_BLOBS_H */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 13/23 merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge.c | 8 +++++--- builtin/pull.c | 7 +++++-- cache.h | 6 ++++-- merge.c | 20 +++++++++++--------- sequencer.c | 6 +++--- 5 files changed, 28 insertions(+), 19 deletions(-)
builtin/merge.c +5 -3
@@ -728,8 +728,9 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,die (_ ("unable to write %s" ),get_index_file ());return clean ?0 :1 ; }else { -return try_merge_command (strategy, xopts_nr, xopts, - common, head_arg, remoteheads); +return try_merge_command (the_repository, + strategy, xopts_nr, xopts, + common, head_arg, remoteheads); } }
@@ -1470,7 +1471,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix) goto done; } -if (checkout_fast_forward (&head_commit->object.oid, +if (checkout_fast_forward (the_repository, + &head_commit->object.oid, &commit->object.oid, overwrite_ignore)) { ret =1 ;
builtin/pull.c +5 -2
@@ -562,7 +562,9 @@ static int pull_into_void(const struct object_id *merge_head,* index/worktree changes that the user already made on the unborn * branch. */ -if (checkout_fast_forward (the_hash_algo->empty_tree, merge_head,0 )) +if (checkout_fast_forward (the_repository, + the_hash_algo->empty_tree, + merge_head,0 ))return 1 ;if (update_ref ("initial pull" ,"HEAD" , merge_head, curr_head,0 ,UPDATE_REFS_DIE_ON_ERR ))
@@ -915,7 +917,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)"fast-forwarding your working tree from\n" "commit %s."), oid_to_hex(&orig_head)); -if (checkout_fast_forward (&orig_head, &curr_head,0 )) +if (checkout_fast_forward (the_repository, &orig_head, + &curr_head,0 )) die(_("Cannot fast-forward your working tree.\n" "After making sure that you saved anything precious from\n" "$ git diff %s\n"
cache.h +4 -2
@@ -1716,10 +1716,12 @@ extern struct startup_info *startup_info;/* merge.c */ struct commit_list ; -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes); -int checkout_fast_forward (const struct object_id *from, +int checkout_fast_forward (struct repository *r, +const struct object_id *from,const struct object_id *to,int overwrite_ignore);
merge.c +11 -9
@@ -14,7 +14,8 @@ static const char *merge_argument(struct commit *commit)return oid_to_hex (commit ? &commit->object.oid : the_hash_algo->empty_tree); } -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes) {
@@ -35,15 +36,16 @@ int try_merge_command(const char *strategy, size_t xopts_nr, ret =run_command_v_opt (args.argv,RUN_GIT_CMD );argv_array_clear (&args); -discard_cache (); -if (read_cache () <0 ) +discard_index (r->index); +if (read_index (r->index) <0 )die (_ ("failed to read the cache" )); -resolve_undo_clear (); +resolve_undo_clear_index (r->index);return ret; } -int checkout_fast_forward (const struct object_id *head, +int checkout_fast_forward (struct repository *r, +const struct object_id *head,const struct object_id *remote,int overwrite_ignore) {
@@ -54,7 +56,7 @@ int checkout_fast_forward(const struct object_id *head,struct dir_struct dir;struct lock_file lock_file =LOCK_INIT ; -refresh_cache (REFRESH_QUIET ); +refresh_index (r->index,REFRESH_QUIET ,NULL ,NULL ,NULL );if (hold_locked_index (&lock_file,LOCK_REPORT_ON_ERROR ) <0 )return -1 ;
@@ -86,8 +88,8 @@ int checkout_fast_forward(const struct object_id *head, } opts.head_idx =1 ; - opts.src_index = &the_index; - opts.dst_index = &the_index; + opts.src_index = r->index; + opts.dst_index = r->index; opts.update =1 ; opts.verbose_update =1 ; opts.merge =1 ;
@@ -101,7 +103,7 @@ int checkout_fast_forward(const struct object_id *head, }clear_unpack_trees_porcelain (&opts); -if (write_locked_index (&the_index, &lock_file,COMMIT_LOCK )) +if (write_locked_index (r->index, &lock_file,COMMIT_LOCK ))return error (_ ("unable to write new index file" ));return 0 ; }
sequencer.c +3 -3
@@ -470,8 +470,8 @@ static int fast_forward_to(const struct object_id *to, const struct object_id *fstruct strbuf sb =STRBUF_INIT ;struct strbuf err =STRBUF_INIT ; -read_cache (); -if (checkout_fast_forward (from, to,1 )) +read_index (&the_index); +if (checkout_fast_forward (the_repository, from, to,1 ))return -1 ;/* the callee should have complained already */ strbuf_addf (&sb,_ ("%s: fast-forward" ),_ (action_name (opts)));
@@ -1798,7 +1798,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,commit_list_insert (base, &common);commit_list_insert (next, &remotes); - res |=try_merge_command (opts->strategy, + res |=try_merge_command (the_repository, opts->strategy, opts->xopts_nr, (const char **)opts->xopts, common,oid_to_hex (&head), remotes);free_commit_list (common);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 14/23 patch-ids.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/log.c | 2 +- patch-ids.c | 4 ++-- patch-ids.h | 3 ++- revision.c | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-)
builtin/log.c +1 -1
@@ -914,7 +914,7 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)if ((flags1 &UNINTERESTING ) == (flags2 &UNINTERESTING ))die (_ ("Not a range." )); -init_patch_ids (ids); +init_patch_ids (the_repository, ids);/* given a range a..b get all patch ids for b..a */ init_revisions (&check_rev, rev->prefix);
patch-ids.c +2 -2
@@ -56,10 +56,10 @@ static int patch_id_cmp(const void *cmpfn_data,return oidcmp (&a->patch_id, &b->patch_id); } -int init_patch_ids (struct patch_ids *ids) +int init_patch_ids (struct repository *r,struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -repo_diff_setup (the_repository, &ids->diffopts); +repo_diff_setup (r, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
patch-ids.h +2 -1
@@ -6,6 +6,7 @@struct commit ;struct object_id ; +struct repository ;struct patch_id {struct hashmap_entry ent;
@@ -20,7 +21,7 @@ struct patch_ids {int commit_patch_id (struct commit *commit,struct diff_options *options,struct object_id *oid,int ); -int init_patch_ids (struct patch_ids *); +int init_patch_ids (struct repository *,struct patch_ids *);int free_patch_ids (struct patch_ids *);struct patch_id *add_commit_patch_id (struct commit *,struct patch_ids *);struct patch_id *has_commit_patch_id (struct commit *,struct patch_ids *);
revision.c +1 -1
@@ -877,7 +877,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)return ; left_first = left_count < right_count; -init_patch_ids (&ids); +init_patch_ids (the_repository, &ids); ids.diffopts.pathspec = revs->diffopt.pathspec;/* Compute patch-ids for one side */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
Re: [PATCH v3 14/23] patch-ids.c: remove implicit dependency on the_index
Quoted 2 lines · Nguyễn Thái Ngọc Duy
---
Junio would have to forge your Sign off here? (I just realize this holds true for the whole series, but it occurred to me in this patch, as I was looking at the diff_setup[_done] part on the previous round.
Re: [PATCH v3 14/23] patch-ids.c: remove implicit dependency on the_index
Quoted 8 lines · Stefan Beller
Quoted 2 lines · Nguyễn Thái Ngọc Duy
---
Junio would have to forge your Sign off here? (I just realize this holds true for the whole series, but it occurred to me in this patch, as I was looking at the diff_setup[_done] part on the previous round.
That is fine; as I said elsewhere, I am treating patches, other than regression fixes, sent to the list during prerelease freeze as mere "test data" for the 2.19-pre version of Git, and I may end up keeping the result of testing "git am" on them as topic branches, but there is no promise I'd do so. Reading patches on the list and commenting on them can be done without sign-offs; you can treat them as an early draft that is not meant for the final application.
I may come back to leftover patches in the list archive after the release is made, but honestly I'd prefer to see them sent afresh after the final for the next round, taking input from the review comments as necessary.
Re: [PATCH v3 14/23] patch-ids.c: remove implicit dependency on the_index
In reply to Stefan BellerQuoted 6 lines · Stefan Beller
Quoted 2 lines · Nguyễn Thái Ngọc Duy
---
Junio would have to forge your Sign off here?
I _knew_ I missed something in that "git format-patch" command but couldn't figure out what! Will resend (I have to fix your other comment about init_revisions anyway; my mistake)
Signature · 1 line
Duy
PATCH v3 15/23 sha1-file.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/difftool.c | 2 +- builtin/hash-object.c | 2 +- builtin/replace.c | 2 +- builtin/update-index.c | 2 +- cache.h | 4 ++-- diff.c | 20 ++++++++--------- notes-merge.c | 2 +- read-cache.c | 25 ++++++++++++--------- sha1-file.c | 50 ++++++++++++++++++++++++------------------ 9 files changed, 61 insertions(+), 48 deletions(-)
builtin/difftool.c +1 -1
@@ -112,7 +112,7 @@ static int use_wt_file(const char *workdir, const char *name,int fd =open (buf.buf,O_RDONLY );if (fd >=0 && - !index_fd (&wt_oid, fd, &st,OBJ_BLOB , name,0 )) { + !index_fd (&the_index, &wt_oid, fd, &st,OBJ_BLOB , name,0 )) {if (is_null_oid (oid)) {oidcpy (oid, &wt_oid); use =1 ;
builtin/hash-object.c +1 -1
@@ -40,7 +40,7 @@ static void hash_fd(int fd, const char *type, const char *path, unsigned flags,if (fstat (fd, &st) <0 || (literally ?hash_literally (&oid, fd, type, flags) - :index_fd (&oid, fd, &st,type_from_string (type), path, flags))) + :index_fd (&the_index, &oid, fd, &st,type_from_string (type), path, flags)))die ((flags &HASH_WRITE_OBJECT ) ?"Unable to add %s to database" :"Unable to hash %s" , path);
builtin/replace.c +1 -1
@@ -295,7 +295,7 @@ static int import_object(struct object_id *oid, enum object_type type,close (fd);return -1 ; } -if (index_fd (oid, fd, &st, type,NULL , flags) <0 ) +if (index_fd (&the_index, oid, fd, &st, type,NULL , flags) <0 )return error (_ ("unable to write object to database" ));/* index_fd close()s fd for us */ }
builtin/update-index.c +1 -1
@@ -282,7 +282,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int lenfill_stat_cache_info (ce, st); ce->ce_mode =ce_mode_from_stat (old, st->st_mode); -if (index_path (&ce->oid, path, st, +if (index_path (&the_index, &ce->oid, path, st, info_only ?0 :HASH_WRITE_OBJECT )) {discard_cache_entry (ce);return -1 ;
cache.h +2 -2
@@ -787,8 +787,8 @@ extern int ie_modified(struct index_state *, const struct cache_entry *, struct#define HASH_WRITE_OBJECT 1#define HASH_FORMAT_CHECK 2#define HASH_RENORMALIZE 4 -extern int index_fd (struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); -extern int index_path (struct object_id *oid,const char *path,struct stat *st,unsigned flags); +extern int index_fd (struct index_state *istate,struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); +extern int index_path (struct index_state *istate,struct object_id *oid,const char *path,struct stat *st,unsigned flags);/* * Record to sd the data from st that we use to check whether a file
diff.c +10 -10
@@ -4252,7 +4252,7 @@ static void run_diff_cmd(const char *pgm,fprintf (o->file,"* Unmerged path %s\n" , name); } -static void diff_fill_oid_info (struct diff_filespec *one) +static void diff_fill_oid_info (struct diff_filespec *one,struct index_state *istate) {if (DIFF_FILE_VALID (one)) {if (!one->oid_valid) {
@@ -4263,7 +4263,7 @@ static void diff_fill_oid_info(struct diff_filespec *one) }if (lstat (one->path, &st) <0 )die_errno ("stat '%s'" , one->path); -if (index_path (&one->oid, one->path, &st,0 )) +if (index_path (istate, &one->oid, one->path, &st,0 ))die ("cannot hash %s" , one->path); } }
@@ -4311,8 +4311,8 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)return ; } -diff_fill_oid_info (one); -diff_fill_oid_info (two); +diff_fill_oid_info (one, o->repo->index); +diff_fill_oid_info (two, o->repo->index); if (!pgm && DIFF_FILE_VALID(one) && DIFF_FILE_VALID(two) &&
@@ -4359,8 +4359,8 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_diffstat (name, other, p->one, p->two, diffstat, o, p);
@@ -4384,8 +4384,8 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_checkdiff (name, other, attr_path, p->one, p->two, o); }
@@ -5685,8 +5685,8 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oidif (DIFF_PAIR_UNMERGED (p))continue ; -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, options->repo->index); +diff_fill_oid_info (p->two, options->repo->index); len1 =remove_space (p->one->path,strlen (p->one->path)); len2 =remove_space (p->two->path,strlen (p->two->path));
notes-merge.c +1 -1
@@ -710,7 +710,7 @@ int notes_merge_commit(struct notes_merge_options *o,/* write file as blob, and add to partial_tree */ if (stat (path.buf, &st))die_errno ("Failed to stat '%s'" , path.buf); -if (index_path (&blob_oid, path.buf, &st,HASH_WRITE_OBJECT )) +if (index_path (&the_index, &blob_oid, path.buf, &st,HASH_WRITE_OBJECT ))die ("Failed to write blob object from '%s'" , path.buf);if (add_note (partial_tree, &obj_oid, &blob_oid,NULL )) die("Failed to add resolved note '%s' to notes tree",
read-cache.c +15 -10
@@ -205,14 +205,16 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) } } -static int ce_compare_data (const struct cache_entry *ce,struct stat *st) +static int ce_compare_data (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {int match =-1 ;int fd =git_open_cloexec (ce->name,O_RDONLY );if (fd >=0 ) {struct object_id oid; -if (!index_fd (&oid, fd, st,OBJ_BLOB , ce->name,0 )) +if (!index_fd (istate, &oid, fd, st,OBJ_BLOB , ce->name,0 )) match =oidcmp (&oid, &ce->oid);/* index_fd() closed the file descriptor already */ }
@@ -257,11 +259,13 @@ static int ce_compare_gitlink(const struct cache_entry *ce)return oidcmp (&oid, &ce->oid); } -static int ce_modified_check_fs (const struct cache_entry *ce,struct stat *st) +static int ce_modified_check_fs (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {switch (st->st_mode &S_IFMT ) {case S_IFREG : -if (ce_compare_data (ce, st)) +if (ce_compare_data (istate, ce, st))return DATA_CHANGED ;break ;case S_IFLNK :
@@ -407,7 +411,7 @@ int ie_match_stat(struct index_state *istate,if (assume_racy_is_modified) changed |=DATA_CHANGED ;else - changed |=ce_modified_check_fs (ce, st); + changed |=ce_modified_check_fs (istate, ce, st); }return changed;
@@ -447,7 +451,7 @@ int ie_modified(struct index_state *istate, (S_ISGITLINK(ce->ce_mode) || ce->ce_stat_data.sd_size != 0))return changed; - changed_fs =ce_modified_check_fs (ce, st); + changed_fs =ce_modified_check_fs (istate, ce, st);if (changed_fs)return changed | changed_fs;return 0 ;
@@ -753,7 +757,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, } }if (!intent_only) { -if (index_path (&ce->oid, path, st, newflags)) { +if (index_path (istate, &ce->oid, path, st, newflags)) {discard_cache_entry (ce);return error ("unable to index file %s" , path); }
@@ -2230,7 +2234,8 @@ static int ce_flush(git_hash_ctx *context, int fd, unsigned char *hash)return (write_in_full (fd, write_buffer, left) <0 ) ?-1 :0 ; } -static void ce_smudge_racily_clean_entry (struct cache_entry *ce) +static void ce_smudge_racily_clean_entry (struct index_state *istate, +struct cache_entry *ce) {/* * The only thing we care about in this function is to smudge the
@@ -2249,7 +2254,7 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce)return ;if (ce_match_stat_basic (ce, &st))return ; -if (ce_modified_check_fs (ce, &st)) { +if (ce_modified_check_fs (istate, ce, &st)) {/* This is "racily clean"; smudge it. Note that this * is a tricky code. At first glance, it may appear * that it can break with this sequence:
@@ -2494,7 +2499,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,if (ce->ce_flags &CE_REMOVE )continue ;if (!ce_uptodate (ce) &&is_racy_timestamp (istate, ce)) -ce_smudge_racily_clean_entry (ce); +ce_smudge_racily_clean_entry (istate, ce);if (is_null_oid (&ce->oid)) {static const char msg[] ="cache entry has null sha1: %s" ;static int allow =-1 ;
sha1-file.c +29 -21
134 lines not on this page · raw message
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 16/23 rerere.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyThe reason rerere(), rerere_forget() and rerere_remaining() take a struct repository instead of struct index_state is not obvious from the patch:
Deep in update_paths() and find_conflict(), hold_locked_index() and read_index() are called. These functions assumes the index path at $GIT_DIR/index which is not always true when you take an arbitrary index state. Taking a repository will allow us to point to the right index path later when we replace them with repo_ versions.
--- apply.c | 2 +- builtin/am.c | 4 +- builtin/commit.c | 2 +- builtin/merge.c | 2 +- builtin/rerere.c | 6 +-- rerere.c | 119 +++++++++++++++++++++++++---------------------- rerere.h | 10 ++-- sequencer.c | 4 +- 8 files changed, 81 insertions(+), 68 deletions(-)
apply.c +1 -1
@@ -4630,7 +4630,7 @@ static int write_out_results(struct apply_state *state, struct patch *list) }string_list_clear (&cpath,0 ); -rerere (0 ); +repo_rerere (state->repo,0 ); }return errs;
builtin/am.c +2 -2
@@ -1603,7 +1603,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa o.verbosity =0 ;if (merge_recursive_generic (&o, &our_tree, &their_tree,1 , bases, &result)) { -rerere (state->allow_rerere_autoupdate); +repo_rerere (the_repository, state->allow_rerere_autoupdate);free (their_tree_name);return error (_ ("Failed to merge in the changes." )); }
@@ -1898,7 +1898,7 @@ static void am_resolve(struct am_state *state) goto next; } -rerere (0 ); +repo_rerere (the_repository,0 );do_commit (state);
builtin/commit.c +1 -1
@@ -1651,7 +1651,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)"new_index file. Check that disk is not full and quota is\n" "not exceeded, and then \"git reset HEAD\" to recover.")); -rerere (0 ); +repo_rerere (the_repository,0 );run_command_v_opt (argv_gc_auto,RUN_GIT_CMD );run_commit_hook (use_editor,get_index_file (),"post-commit" ,NULL );if (amend && !no_post_rewrite) {
builtin/merge.c +1 -1
@@ -899,7 +899,7 @@ static int suggest_conflicts(void)fputs (msgbuf.buf, fp);strbuf_release (&msgbuf);fclose (fp); -rerere (allow_rerere_auto); +repo_rerere (the_repository, allow_rerere_auto);printf (_ ("Automatic merge failed; " "fix conflicts and then commit the result.\n" ));return 1 ;
builtin/rerere.c +3 -3
@@ -70,7 +70,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix) flags =RERERE_NOAUTOUPDATE ;if (argc <1 ) -return rerere (flags); +return repo_rerere (the_repository, flags);if (!strcmp (argv[0 ],"forget" )) {struct pathspec pathspec;
@@ -78,7 +78,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)warning ("'git rerere forget' without paths is deprecated" );parse_pathspec (&pathspec,0 ,PATHSPEC_PREFER_CWD , prefix, argv +1 ); -return rerere_forget (&pathspec); +return rerere_forget (the_repository, &pathspec); }if (!strcmp (argv[0 ],"clear" )) {
@@ -91,7 +91,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)for (i =0 ; i < merge_rr.nr; i++)printf ("%s\n" , merge_rr.items[i].string); }else if (!strcmp (argv[0 ],"remaining" )) { -rerere_remaining (&merge_rr); +rerere_remaining (the_repository, &merge_rr);for (i =0 ; i < merge_rr.nr; i++) {if (merge_rr.items[i].util !=RERERE_RESOLVED )printf ("%s\n" , merge_rr.items[i].string);
rerere.c +64 -55
361 lines not on this page · raw message
rerere.h +7 -3
@@ -4,6 +4,7 @@#include "string-list.h" struct pathspec ; +struct repository ;#define RERERE_AUTOUPDATE 01#define RERERE_NOAUTOUPDATE 02
@@ -23,7 +24,10 @@ struct rerere_id { };int setup_rerere (struct string_list *,int ); -int rerere (int ); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define rerere (flags) repo_rerere(the_repository, flags) +#endif +int repo_rerere (struct repository *,int );/* * Given the conflict ID and the name of a "file" used for replaying * the recorded resolution (e.g. "preimage", "postimage"), return the
@@ -31,8 +35,8 @@ int rerere(int);* return the path to the directory that houses these files. */ const char *rerere_path (const struct rerere_id *,const char *file); -int rerere_forget (struct pathspec *); -int rerere_remaining (struct string_list *); +int rerere_forget (struct repository *,struct pathspec *); +int rerere_remaining (struct repository *,struct string_list *);void rerere_clear (struct string_list *);void rerere_gc (struct string_list *);
sequencer.c +2 -2
@@ -1827,7 +1827,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit, : _("could not apply %s... %s"), short_commit_name(commit), msg.subject);print_advice (res ==1 , opts); -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto); goto leave; }
@@ -3146,7 +3146,7 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,rollback_lock_file (&lock);if (ret) -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto);else /* * In case of problems, we now want to return a positive
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 17/23 userdiff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- archive-zip.c | 14 +++++++++----- builtin/grep.c | 3 ++- combine-diff.c | 2 +- diff.c | 40 +++++++++++++++++++++++----------------- diff.h | 3 ++- diffcore-pickaxe.c | 4 ++-- grep.c | 21 ++++++++++++--------- grep.h | 3 ++- line-range.c | 2 +- userdiff.c | 5 +++-- userdiff.h | 3 ++- 11 files changed, 59 insertions(+), 41 deletions(-)
archive-zip.c +9 -5
@@ -264,9 +264,10 @@ static int has_only_ascii(const char *s) } } -static int entry_is_binary (const char *path,const void *buffer,size_t size) +static int entry_is_binary (struct index_state *istate,const char *path, +const void *buffer,size_t size) { -struct userdiff_driver *driver =userdiff_find_by_path (path); +struct userdiff_driver *driver =userdiff_find_by_path (istate, path);if (!driver) driver =userdiff_find_by_name ("default" );if (driver->binary !=-1 )
@@ -352,7 +353,8 @@ static int write_zip_entry(struct archiver_args *args,return error (_ ("cannot read %s" ),oid_to_hex (oid)); crc =crc32 (crc, buffer, size); - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buffer, size); out = buffer; }
@@ -428,7 +430,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen);write_or_die (1 , buf, readlen); }
@@ -460,7 +463,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen); zstream.next_in = buf;
builtin/grep.c +2 -1
@@ -103,7 +103,8 @@ static void add_work(struct grep_opt *opt, const struct grep_source *gs) todo[todo_end].source = *gs;if (opt->binary !=GREP_BINARY_TEXT ) -grep_source_load_driver (&todo[todo_end].source); +grep_source_load_driver (&todo[todo_end].source, + opt->repo->index); todo[todo_end].done =0 ;strbuf_reset (&todo[todo_end].out); todo_end = (todo_end +1 ) %ARRAY_SIZE (todo);
combine-diff.c +1 -1
@@ -987,7 +987,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,const char *line_prefix =diff_line_prefix (opt); context = opt->context; - userdiff =userdiff_find_by_path (elem->path); + userdiff =userdiff_find_by_path (opt->repo->index, elem->path);if (!userdiff) userdiff =userdiff_find_by_name ("default" );if (opt->flags.allow_textconv)
diff.c +23 -17
@@ -2093,23 +2093,25 @@ static void diff_words_flush(struct emit_callback *ecbdata) } } -static void diff_filespec_load_driver (struct diff_filespec *one) +static void diff_filespec_load_driver (struct diff_filespec *one, +struct index_state *istate) {/* Use already-loaded driver */ if (one->driver)return ;if (S_ISREG (one->mode)) - one->driver =userdiff_find_by_path (one->path); + one->driver =userdiff_find_by_path (istate, one->path);/* Fallback to default settings */ if (!one->driver) one->driver =userdiff_find_by_name ("default" ); } -static const char *userdiff_word_regex (struct diff_filespec *one) +static const char *userdiff_word_regex (struct diff_filespec *one, +struct index_state *istate) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return one->driver->word_regex; }
@@ -2132,9 +2134,9 @@ static void init_diff_words_data(struct emit_callback *ecbdata,xcalloc (1 ,sizeof (struct emitted_diff_symbols ));if (!o->word_regex) - o->word_regex =userdiff_word_regex (one); + o->word_regex =userdiff_word_regex (one, o->repo->index);if (!o->word_regex) - o->word_regex =userdiff_word_regex (two); + o->word_regex =userdiff_word_regex (two, o->repo->index);if (!o->word_regex) o->word_regex = diff_word_regex_cfg;if (o->word_regex) {
@@ -3257,7 +3259,7 @@ int diff_filespec_is_binary(struct repository *r, struct diff_filespec *one) {if (one->is_binary ==-1 ) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, r->index);if (one->driver->binary !=-1 ) one->is_binary = one->driver->binary;else {
@@ -3273,9 +3275,10 @@ int diff_filespec_is_binary(struct repository *r,return one->is_binary; } -static const struct userdiff_funcname *diff_funcname_pattern (struct diff_filespec *one) +static const struct userdiff_funcname * +diff_funcname_pattern (struct diff_options *o,struct diff_filespec *one) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, o->repo->index);return one->driver->funcname.pattern ? &one->driver->funcname :NULL ; }
@@ -3287,12 +3290,13 @@ void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const options->b_prefix = b; } -struct userdiff_driver *get_textconv (struct diff_filespec *one) +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one) {if (!DIFF_FILE_VALID (one))return NULL ; -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return userdiff_get_textconv (one->driver); }
@@ -3342,8 +3346,8 @@ static void builtin_diff(const char *name_a, }if (o->flags.allow_textconv) { - textconv_one =get_textconv (one); - textconv_two =get_textconv (two); + textconv_one =get_textconv (o->repo->index, one); + textconv_two =get_textconv (o->repo->index, two); }/* Never use a non-valid filename anywhere if at all possible */
@@ -3465,9 +3469,9 @@ static void builtin_diff(const char *name_a, mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); - pe =diff_funcname_pattern (one); + pe =diff_funcname_pattern (o, one);if (!pe) - pe =diff_funcname_pattern (two); + pe =diff_funcname_pattern (o, two);memset (&xpp,0 ,sizeof (xpp));memset (&xecfg,0 ,sizeof (xecfg));
@@ -4223,7 +4227,9 @@ static void run_diff_cmd(const char *pgm,if (o->flags.allow_external) { -struct userdiff_driver *drv =userdiff_find_by_path (attr_path); +struct userdiff_driver *drv; + + drv =userdiff_find_by_path (o->repo->index, attr_path);if (drv && drv->external) pgm = drv->external; }
@@ -6399,7 +6405,7 @@ int textconv_object(struct repository *r, df =alloc_filespec (path);fill_filespec (df, oid, oid_valid, mode); - textconv =get_textconv (df); + textconv =get_textconv (r->index, df);if (!textconv) {free_filespec (df);return 0 ;
diff.h +2 -1
@@ -455,7 +455,8 @@ size_t fill_textconv(struct repository *r,* and only if it has textconv enabled (otherwise return NULL). The result * can be passed to fill_textconv(). */ -struct userdiff_driver *get_textconv (struct diff_filespec *one); +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one);/* * Prepare diff_filespec and convert it using diff textconv API
diffcore-pickaxe.c +2 -2
@@ -139,8 +139,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,return 0 ;if (o->flags.allow_textconv) { - textconv_one =get_textconv (p->one); - textconv_two =get_textconv (p->two); + textconv_one =get_textconv (o->repo->index, p->one); + textconv_two =get_textconv (o->repo->index, p->two); }/*
grep.c +12 -9
@@ -11,7 +11,8 @@#include "help.h" static int grep_source_load (struct grep_source *gs); -static int grep_source_is_binary (struct grep_source *gs); +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate);static struct grep_opt grep_defaults;
@@ -1547,7 +1548,7 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo {xdemitconf_t *xecfg = opt->priv;if (xecfg && !xecfg->find_func) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);if (gs->driver->funcname.pattern) {const struct userdiff_funcname *pe = &gs->driver->funcname;xdiff_set_find_func (xecfg, pe->pattern, pe->cflags);
@@ -1804,7 +1805,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle opt->last_shown =0 ;if (opt->allow_textconv) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);/* * We might set up the shared textconv cache data here, which * is not thread-safe.
@@ -1821,11 +1822,11 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colleif (!textconv) {switch (opt->binary) {case GREP_BINARY_DEFAULT : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index)) binary_match_only =1 ;break ;case GREP_BINARY_NOMATCH : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index))return 0 ;/* Assume unmatch */ break ;case GREP_BINARY_TEXT :
@@ -2171,22 +2172,24 @@ static int grep_source_load(struct grep_source *gs)BUG ("invalid grep_source type to load" ); } -void grep_source_load_driver (struct grep_source *gs) +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate) {if (gs->driver)return ;grep_attr_lock ();if (gs->path) - gs->driver =userdiff_find_by_path (gs->path); + gs->driver =userdiff_find_by_path (istate, gs->path);if (!gs->driver) gs->driver =userdiff_find_by_name ("default" );grep_attr_unlock (); } -static int grep_source_is_binary (struct grep_source *gs) +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, istate);if (gs->driver->binary !=-1 )return gs->driver->binary;
grep.h +2 -1
@@ -220,7 +220,8 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type, const void *identifier);void grep_source_clear_data (struct grep_source *gs);void grep_source_clear (struct grep_source *gs); -void grep_source_load_driver (struct grep_source *gs); +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate);int grep_source (struct grep_opt *opt,struct grep_source *gs);
line-range.c +1 -1
@@ -198,7 +198,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (path); + drv =userdiff_find_by_path (&the_index, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
userdiff.c +3 -2
@@ -270,7 +270,8 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {return userdiff_find_by_namelen (name, len); } -struct userdiff_driver *userdiff_find_by_path (const char *path) +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path) {static struct attr_check *check;
@@ -278,7 +279,7 @@ struct userdiff_driver *userdiff_find_by_path(const char *path) check =attr_check_initl ("diff" ,NULL );if (!path)return NULL ; -if (git_check_attr (&the_index, path, check)) +if (git_check_attr (istate, path, check))return NULL ;if (ATTR_TRUE (check->items[0 ].value))
userdiff.h +2 -1
@@ -21,7 +21,8 @@ struct userdiff_driver {int userdiff_config (const char *k,const char *v);struct userdiff_driver *userdiff_find_by_name (const char *name); -struct userdiff_driver *userdiff_find_by_path (const char *path); +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path);/* * Initialize any textconv-related fields in the driver and return it, or NULL
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 18/23 line-range.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/blame.c | 2 +- line-log.c | 4 ++-- line-range.c | 22 ++++++++++++++-------- line-range.h | 6 ++++-- 4 files changed, 21 insertions(+), 13 deletions(-)
builtin/blame.c +1 -1
@@ -1001,7 +1001,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)long bottom, top;if (parse_range_arg (range_list.items[range_i].string, nth_line_cb, &sb, lno, anchor, - &bottom, &top, sb.path)) + &bottom, &top, sb.path, &the_index))usage (blame_usage);if ((!lno && (top || bottom)) || lno < bottom) die(Q_("file %s has only %lu line",
line-log.c +2 -2
@@ -574,7 +574,7 @@ parse_lines(struct repository *r, struct commit *commit,long begin =0 , end =0 ;long anchor; - name_part =skip_range_arg (item->string); + name_part =skip_range_arg (item->string, r->index);if (!name_part || *name_part !=':' || !name_part[1 ])die ("-L argument not 'start,end:file' or ':funcname:file': %s" , item->string);
@@ -599,7 +599,7 @@ parse_lines(struct repository *r, struct commit *commit,if (parse_range_arg (range_part, nth_line, &cb_data, lines, anchor, &begin, &end, - full_name)) + full_name, r->index))die ("malformed -L argument '%s'" , range_part);if ((!lines && (begin || end)) || lines < begin)die ("file %s has only %lu lines" , name_part, lines);
line-range.c +14 -8
@@ -163,9 +163,10 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char } } -static const char *parse_range_funcname (const char *arg,nth_line_fn_t nth_line_cb, -void *cb_data,long lines,long anchor,long *begin,long *end, -const char *path) +static const char *parse_range_funcname ( +const char *arg,nth_line_fn_t nth_line_cb, +void *cb_data,long lines,long anchor,long *begin,long *end, +const char *path,struct index_state *istate) {char *pattern;const char *term;
@@ -198,7 +199,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (&the_index, path); + drv =userdiff_find_by_path (istate, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
@@ -244,7 +245,8 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_int parse_range_arg (const char *arg,nth_line_fn_t nth_line_cb,void *cb_data,long lines,long anchor, -long *begin,long *end,const char *path) +long *begin,long *end, +const char *path,struct index_state *istate) { *begin = *end =0 ;
@@ -254,7 +256,9 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb, anchor = lines +1 ;if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) { - arg =parse_range_funcname (arg, nth_line_cb, cb_data, lines, anchor, begin, end, path); + arg =parse_range_funcname (arg, nth_line_cb, cb_data, + lines, anchor, begin, end, + path, istate);if (!arg || *arg)return -1 ;return 0 ;
@@ -275,10 +279,12 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,return 0 ; } -const char *skip_range_arg (const char *arg) +const char *skip_range_arg (const char *arg,struct index_state *istate) {if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) -return parse_range_funcname (arg,NULL ,NULL ,0 ,0 ,NULL ,NULL ,NULL ); +return parse_range_funcname (arg,NULL ,NULL , +0 ,0 ,NULL ,NULL , +NULL , istate); arg =parse_loc (arg,NULL ,NULL ,0 ,-1 ,NULL );
line-range.h +4 -2
@@ -1,6 +1,8 @@#ifndef LINE_RANGE_H #define LINE_RANGE_H +struct index_state ; +/* * Parse one item in an -L begin,end option w.r.t. the notional file * object 'cb_data' consisting of 'lines' lines.
@@ -23,7 +25,7 @@ int parse_range_arg(const char *arg,nth_line_fn_t nth_line_cb, void *cb_data, long lines, long anchor, long *begin, long *end, - const char *path); + const char *path, struct index_state *istate);/* * Scan past a range argument that could be parsed by
@@ -34,6 +36,6 @@ int parse_range_arg(const char *arg,* NULL in case the argument is obviously malformed. */ -const char *skip_range_arg (const char *arg); +const char *skip_range_arg (const char *arg,struct index_state *istate);#endif /* LINE_RANGE_H */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 19/23 submodule.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/pull.c | 2 +- submodule.c | 28 +++++++++++++++++----------- submodule.h | 9 ++++++--- transport.c | 9 ++++++--- 4 files changed, 30 insertions(+), 18 deletions(-)
builtin/pull.c +1 -1
@@ -944,7 +944,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)int ret =0 ;if ((recurse_submodules ==RECURSE_SUBMODULES_ON || recurse_submodules ==RECURSE_SUBMODULES_ON_DEMAND ) && -submodule_touches_in_range (&rebase_fork_point, &curr_head)) +submodule_touches_in_range (&the_index, &rebase_fork_point, &curr_head))die (_ ("cannot rebase with locally recorded submodule modifications" ));if (!autostash) {struct commit_list *list =NULL ;
submodule.c +17 -11
@@ -766,7 +766,8 @@ static void collect_changed_submodules_cb(struct diff_queue_struct *q,* have a corresponding 'struct oid_array' (in the 'util' field) which lists * what the submodule pointers were updated to during the change. */ -static void collect_changed_submodules (struct string_list *changed, +static void collect_changed_submodules (struct index_state *istate, +struct string_list *changed,struct argv_array *argv) {struct rev_info rev;
@@ -930,8 +931,10 @@ static int submodule_needs_pushing(const char *path, struct oid_array *commits)return 0 ; } -int find_unpushed_submodules (struct oid_array *commits, -const char *remotes_name,struct string_list *needs_pushing) +int find_unpushed_submodules (struct index_state *istate, +struct oid_array *commits, +const char *remotes_name, +struct string_list *needs_pushing) {struct string_list submodules =STRING_LIST_INIT_DUP ;struct string_list_item *name;
@@ -943,7 +946,7 @@ int find_unpushed_submodules(struct oid_array *commits,argv_array_push (&argv,"--not" );argv_array_pushf (&argv,"--remotes=%s" , remotes_name); -collect_changed_submodules (&submodules, &argv); +collect_changed_submodules (istate, &submodules, &argv);for_each_string_list_item (name, &submodules) {struct oid_array *commits = name->util;
@@ -1044,7 +1047,8 @@ static void submodule_push_check(const char *path, const char *head,die ("process for submodule '%s' failed" , path); } -int push_unpushed_submodules(struct oid_array *commits, +int push_unpushed_submodules(struct index_state *istate, + struct oid_array *commits, const struct remote *remote, const struct refspec *rs, const struct string_list *push_options,
@@ -1053,7 +1057,8 @@ int push_unpushed_submodules(struct oid_array *commits,int i, ret =1 ;struct string_list needs_pushing =STRING_LIST_INIT_DUP ; -if (!find_unpushed_submodules (commits, remote->name, &needs_pushing)) +if (!find_unpushed_submodules (istate, commits, + remote->name, &needs_pushing))return 1 ;/*
@@ -1110,7 +1115,7 @@ void check_for_new_submodule_commits(struct object_id *oid)oid_array_append (&ref_tips_after_fetch, oid); } -static void calculate_changed_submodule_paths (void ) +static void calculate_changed_submodule_paths (struct index_state *istate) {struct argv_array argv =ARGV_ARRAY_INIT ;struct string_list changed_submodules =STRING_LIST_INIT_DUP ;
@@ -1131,7 +1136,7 @@ static void calculate_changed_submodule_paths(void)* Collect all submodules (whether checked out or not) for which new * commits have been recorded upstream in "changed_submodule_names". */ -collect_changed_submodules (&changed_submodules, &argv); +collect_changed_submodules (istate, &changed_submodules, &argv);for_each_string_list_item (name, &changed_submodules) {struct oid_array *commits = name->util;
@@ -1158,7 +1163,8 @@ static void calculate_changed_submodule_paths(void) initialized_fetch_ref_tips =0 ; } -int submodule_touches_in_range (struct object_id *excl_oid, +int submodule_touches_in_range (struct index_state *istate, +struct object_id *excl_oid,struct object_id *incl_oid) {struct string_list subs =STRING_LIST_INIT_DUP ;
@@ -1176,7 +1182,7 @@ int submodule_touches_in_range(struct object_id *excl_oid,argv_array_push (&args,oid_to_hex (excl_oid)); } -collect_changed_submodules (&subs, &args); +collect_changed_submodules (istate, &subs, &args); ret = subs.nr;argv_array_clear (&args);
@@ -1346,7 +1352,7 @@ int fetch_populated_submodules(struct repository *r,argv_array_push (&spf.args,"--recurse-submodules-default" );/* default value, "--submodule-prefix" and its value are added later */ -calculate_changed_submodule_paths (); +calculate_changed_submodule_paths (r->index); run_processes_parallel(max_parallel_jobs, get_next_submodule, fetch_start_failure,
submodule.h +6 -3
@@ -102,13 +102,16 @@ int add_submodule_odb(const char *path);* Checks if there are submodule changes in a..b. If a is the null OID, * checks b and all its ancestors instead. */ -int submodule_touches_in_range (struct object_id *a, +int submodule_touches_in_range (struct index_state *istate, +struct object_id *a,struct object_id *b); -int find_unpushed_submodules (struct oid_array *commits, +int find_unpushed_submodules (struct index_state *istate, +struct oid_array *commits,const char *remotes_name,struct string_list *needs_pushing);struct refspec ; -int push_unpushed_submodules(struct oid_array *commits, +int push_unpushed_submodules(struct index_state *istate, + struct oid_array *commits, const struct remote *remote, const struct refspec *rs, const struct string_list *push_options,
transport.c +6 -3
@@ -1139,7 +1139,8 @@ int transport_push(struct transport *transport,oid_array_append (&commits, &ref->new_oid); - if (!push_unpushed_submodules(&commits, + if (!push_unpushed_submodules(&the_index, + &commits, transport->remote, rs, transport->push_options,
@@ -1163,8 +1164,10 @@ int transport_push(struct transport *transport,oid_array_append (&commits, &ref->new_oid); -if (find_unpushed_submodules (&commits, transport->remote->name, - &needs_pushing)) { +if (find_unpushed_submodules (&the_index, + &commits, + transport->remote->name, + &needs_pushing)) {oid_array_clear (&commits);die_with_unpushed_submodules (&needs_pushing); }
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 20/23 tree-diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- tree-diff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tree-diff.c +1 -1
@@ -605,7 +605,7 @@ static void try_to_follow_renames(const struct object_id *old_oid, choice = q->queue[0 ]; q->nr =0 ; -repo_diff_setup (the_repository, &diff_opts); +repo_diff_setup (opt->repo, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.flags.find_copies_harder =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 21/23 ws.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- apply.c | 8 +++++--- cache.h | 2 +- diff.c | 6 +++--- ws.c | 5 ++--- 4 files changed, 11 insertions(+), 10 deletions(-)
apply.c +5 -3
@@ -2131,10 +2131,12 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long siif (!use_patch (state, patch)) patch->ws_rule =0 ; +else if (patch->new_name) + patch->ws_rule =whitespace_rule (state->repo->index, + patch->new_name);else - patch->ws_rule =whitespace_rule (patch->new_name - ? patch->new_name - : patch->old_name); + patch->ws_rule =whitespace_rule (state->repo->index, + patch->old_name); patchsize = parse_single_patch(state, buffer + offset + hdrsize,
cache.h +1 -1
@@ -1694,7 +1694,7 @@ void shift_tree_by(const struct object_id *, const struct object_id *, struct ob/* All WS_* -- when extended, adapt diff.c emit_symbol */ #define WS_RULE_MASK 07777extern unsigned whitespace_rule_cfg; -extern unsigned whitespace_rule (const char *); +extern unsigned whitespace_rule (struct index_state *,const char *);extern unsigned parse_whitespace_rule (const char *);extern unsigned ws_check (const char *line,int len,unsigned ws_rule);extern void ws_check_emit (const char *line,int len,unsigned ws_rule,FILE *stream,const char *set,const char *reset,const char *ws);
diff.c +3 -3
@@ -1705,7 +1705,7 @@ static void emit_rewrite_diff(const char *name_a,memset (&ecbdata,0 ,sizeof (ecbdata)); ecbdata.color_diff =want_color (o->use_color); - ecbdata.ws_rule =whitespace_rule (name_b); + ecbdata.ws_rule =whitespace_rule (o->repo->index, name_b); ecbdata.opt = o;if (ecbdata.ws_rule &WS_BLANK_AT_EOF ) {mmfile_t mf1, mf2;
@@ -3480,7 +3480,7 @@ static void builtin_diff(const char *name_a, lbl[0 ] =NULL ; ecbdata.label_path = lbl; ecbdata.color_diff =want_color (o->use_color); - ecbdata.ws_rule =whitespace_rule (name_b); + ecbdata.ws_rule =whitespace_rule (o->repo->index, name_b);if (ecbdata.ws_rule &WS_BLANK_AT_EOF )check_blank_at_eof (&mf1, &mf2, &ecbdata); ecbdata.opt = o;
@@ -3640,7 +3640,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, data.filename = name_b ? name_b : name_a; data.lineno =0 ; data.o = o; - data.ws_rule =whitespace_rule (attr_path); + data.ws_rule =whitespace_rule (o->repo->index, attr_path); data.conflict_marker_size =ll_merge_marker_size (o->repo->index, attr_path); if (fill_mmfile(o->repo, &mf1, one) < 0 ||
ws.c +2 -3
@@ -3,7 +3,6 @@* * Copyright (c) 2007 Junio C Hamano */ -#include "cache.h" #include "attr.h"
@@ -71,14 +70,14 @@ unsigned parse_whitespace_rule(const char *string)return rule; } -unsigned whitespace_rule (const char *pathname) +unsigned whitespace_rule (struct index_state *istate,const char *pathname) {static struct attr_check *attr_whitespace_rule;if (!attr_whitespace_rule) attr_whitespace_rule =attr_check_initl ("whitespace" ,NULL ); -if (!git_check_attr (&the_index, pathname, attr_whitespace_rule)) { +if (!git_check_attr (istate, pathname, attr_whitespace_rule)) {const char *value; value = attr_whitespace_rule->items[0 ].value;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 22/23 revision.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- .../technical/api-revision-walking.txt | 2 +- bisect.c | 4 +-- builtin/add.c | 4 +-- builtin/am.c | 6 ++-- builtin/blame.c | 2 +- builtin/checkout.c | 4 +-- builtin/commit.c | 2 +- builtin/describe.c | 4 +-- builtin/diff-files.c | 2 +- builtin/diff-index.c | 2 +- builtin/diff-tree.c | 2 +- builtin/diff.c | 2 +- builtin/fast-export.c | 2 +- builtin/fmt-merge-msg.c | 2 +- builtin/log.c | 16 +++++----- builtin/merge.c | 4 +-- builtin/pack-objects.c | 2 +- builtin/prune.c | 2 +- builtin/reflog.c | 2 +- builtin/rev-list.c | 2 +- builtin/revert.c | 2 +- builtin/shortlog.c | 2 +- builtin/submodule--helper.c | 2 +- bundle.c | 4 +-- diff-lib.c | 4 +-- http-push.c | 2 +- merge-recursive.c | 2 +- pack-bitmap-write.c | 2 +- ref-filter.c | 2 +- remote.c | 2 +- revision.c | 32 +++++++++++-------- revision.h | 13 ++++++-- sequencer.c | 8 ++--- shallow.c | 2 +- submodule.c | 6 ++-- t/helper/test-revision-walking.c | 2 +- wt-status.c | 10 +++--- 37 files changed, 88 insertions(+), 77 deletions(-)
Documentation/technical/api-revision-walking.txt +1 -1
@@ -15,7 +15,7 @@ revision list. Functions --------- -`init_revisions`:: +`repo_init_revisions`:: Initialize a rev_info structure with default values. The second parameter may be NULL or can be prefix path, and then the `.prefix`
bisect.c +2 -2
@@ -632,7 +632,7 @@ static void bisect_rev_setup(struct rev_info *revs, const char *prefix,struct argv_array rev_argv =ARGV_ARRAY_INIT ;int i; -init_revisions (revs, prefix); +repo_init_revisions (the_repository, revs, prefix); revs->abbrev =0 ; revs->commit_format =CMIT_FMT_UNSPECIFIED ;
@@ -889,7 +889,7 @@ static void show_diff_tree(const char *prefix, struct commit *commit)struct rev_info opt;/* diff-tree init */ -init_revisions (&opt, prefix); +repo_init_revisions (the_repository, &opt, prefix);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ opt.abbrev =0 ; opt.diff =1 ;
builtin/add.c +2 -2
@@ -110,7 +110,7 @@ int add_files_to_cache(const char *prefix,memset (&data,0 ,sizeof (data)); data.flags = flags; -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);setup_revisions (0 ,NULL , &rev,NULL );if (pathspec)copy_pathspec (&rev.prune_data, pathspec);
@@ -232,7 +232,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix)if (read_cache () <0 )die (_ ("Could not read the index" )); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diffopt.context =7 ; argc =setup_revisions (argc, argv, &rev,NULL );
builtin/am.c +3 -3
@@ -1372,7 +1372,7 @@ static void write_commit_patch(const struct am_state *state, struct commit *commFILE *fp; fp =xfopen (am_path (state,"patch" ),"w" ); -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diff =1 ; rev_info.abbrev =0 ; rev_info.disable_stdin =1 ;
@@ -1407,7 +1407,7 @@ static void write_index_patch(const struct am_state *state) the_repository->hash_algo->empty_tree); fp =xfopen (am_path (state,"patch" ),"w" ); -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diff =1 ; rev_info.disable_stdin =1 ; rev_info.no_commit_id =1 ;
@@ -1565,7 +1565,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pastruct rev_info rev_info;const char *diff_filter_str ="--diff-filter=AM" ; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diffopt.output_format =DIFF_FORMAT_NAME_STATUS ;diff_opt_parse (&rev_info.diffopt, &diff_filter_str,1 , rev_info.prefix);add_pending_oid (&rev_info,"HEAD" , &our_tree,0 );
builtin/blame.c +1 -1
@@ -830,7 +830,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)setup_default_color_by_age ();git_config (git_blame_config, &output_option); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.date_mode = blame_date_mode; revs.diffopt.flags.allow_textconv =1 ; revs.diffopt.flags.follow_renames =1 ;
builtin/checkout.c +2 -2
@@ -392,7 +392,7 @@ static void show_local_changes(struct object *head, {struct rev_info rev;/* I think we want full paths, even if we're in a subdirectory. */ -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.diffopt.flags = opts->flags; rev.diffopt.output_format |=DIFF_FORMAT_NAME_STATUS ;diff_setup_done (&rev.diffopt);
@@ -801,7 +801,7 @@ static void orphaned_commit_warning(struct commit *old_commit, struct commit *nestruct rev_info revs;struct object *object = &old_commit->object; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );setup_revisions (0 ,NULL , &revs,NULL ); object->flags &= ~UNINTERESTING ;
builtin/commit.c +1 -1
@@ -980,7 +980,7 @@ static const char *find_author_by_nickname(const char *name)const char *av[20 ];int ac =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );strbuf_addf (&buf,"--author=%s" , name); av[++ac] ="--all" ; av[++ac] ="-i" ;
builtin/describe.c +2 -2
@@ -488,7 +488,7 @@ static void describe_blob(struct object_id oid, struct strbuf *dst)"--objects" ,"--in-commit-order" ,"--reverse" ,"HEAD" , NULL); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );if (setup_revisions (args.argc, args.argv, &revs,NULL ) >1 )BUG ("setup_revisions could not handle all args?" );
@@ -636,7 +636,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)if (0 <= fd)update_index_if_able (&the_index, &index_lock); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix);argv_array_pushv (&args, diff_index_args);if (setup_revisions (args.argc, args.argv, &revs,NULL ) !=1 )BUG ("malformed internal diff-index command line" );
builtin/diff-files.c +1 -1
@@ -25,7 +25,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)usage (diff_files_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ;precompose_argv (argc, argv);
builtin/diff-index.c +1 -1
@@ -22,7 +22,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)usage (diff_cache_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ;precompose_argv (argc, argv);
builtin/diff-tree.c +1 -1
@@ -110,7 +110,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)usage (diff_tree_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (opt, prefix); +repo_init_revisions (the_repository, opt, prefix);if (read_cache () <0 )die (_ ("index file corrupt" )); opt->abbrev =0 ;
builtin/diff.c +1 -1
@@ -318,7 +318,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)git_config (git_diff_ui_config,NULL );precompose_argv (argc, argv); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);if (no_index && argc != i +2 ) {if (no_index ==DIFF_NO_INDEX_IMPLICIT ) {
builtin/fast-export.c +1 -1
@@ -1033,7 +1033,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)/* we handle encodings */ git_config (git_default_config,NULL ); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix);init_revision_sources (&revision_sources); revs.topo_order =1 ; revs.sources = &revision_sources;
builtin/fmt-merge-msg.c +1 -1
@@ -642,7 +642,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,struct rev_info rev; head =lookup_commit_or_die (&head_oid,"HEAD" ); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.commit_format =CMIT_FMT_ONELINE ; rev.ignore_merges =1 ; rev.limited =1 ;
builtin/log.c +8 -8
@@ -467,7 +467,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diff =1 ; rev.simplify_history =0 ;memset (&opt,0 ,sizeof (opt));
@@ -585,7 +585,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)git_config (git_log_config,NULL );memset (&match_all,0 ,sizeof (match_all)); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diff =1 ; rev.always_show_header =1 ; rev.no_walk =REVISION_WALK_NO_WALK_SORTED ;
@@ -665,7 +665,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);init_reflog_walk (&rev.reflog_info); rev.verbose_header =1 ;memset (&opt,0 ,sizeof (opt));
@@ -704,7 +704,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.always_show_header =1 ;memset (&opt,0 ,sizeof (opt)); opt.def ="HEAD" ;
@@ -917,7 +917,7 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)init_patch_ids (the_repository, ids);/* given a range a..b get all patch ids for b..a */ -init_revisions (&check_rev, rev->prefix); +repo_init_revisions (the_repository, &check_rev, rev->prefix); check_rev.max_parents =1 ; o1->flags ^=UNINTERESTING ; o2->flags ^=UNINTERESTING ;
@@ -1367,7 +1367,7 @@ static void prepare_bases(struct base_tree_info *bases,oidcpy (&bases->base_commit, &base->object.oid); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.max_parents =1 ; revs.topo_order =1 ;for (i =0 ; i < total; i++) {
@@ -1528,7 +1528,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) extra_cc.strdup_strings =1 ;init_log_defaults ();git_config (git_format_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.commit_format =CMIT_FMT_EMAIL ; rev.expand_tabs_in_log_default =0 ; rev.verbose_header =1 ;
@@ -1939,7 +1939,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) } } -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); revs.max_parents =1 ;if (add_pending_commit (head, &revs,0 ))
builtin/merge.c +2 -2
@@ -389,7 +389,7 @@ static void squash_message(struct commit *commit, struct commit_list *remoteheadprintf (_ ("Squash commit -- not updating HEAD\n" )); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.ignore_merges =1 ; rev.commit_format =CMIT_FMT_MEDIUM ;
@@ -911,7 +911,7 @@ static int evaluate_result(void)struct rev_info rev;/* Check how many files differ. */ -init_revisions (&rev,"" ); +repo_init_revisions (the_repository, &rev,"" );setup_revisions (0 ,NULL , &rev,NULL ); rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ;
builtin/pack-objects.c +1 -1
@@ -2989,7 +2989,7 @@ static void get_object_list(int ac, const char **av)char line[1000 ];int flags =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); save_commit_buffer =0 ;setup_revisions (ac, av, &revs,NULL );
builtin/prune.c +1 -1
@@ -120,7 +120,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) save_commit_buffer =0 ; read_replace_refs =0 ; ref_paranoia =1 ; -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); argc =parse_options (argc, argv, prefix, options, prune_usage,0 );
builtin/reflog.c +1 -1
@@ -567,7 +567,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)* from reflog if the repository was pruned with older git. */ if (cb.cmd.stalefix) { -init_revisions (&cb.cmd.revs, prefix); +repo_init_revisions (the_repository, &cb.cmd.revs, prefix);if (flags &EXPIRE_REFLOGS_VERBOSE )printf ("Marking reachable objects..." );mark_reachable_objects (&cb.cmd.revs,0 ,0 ,NULL );
builtin/rev-list.c +1 -1
@@ -370,7 +370,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)usage (rev_list_usage);git_config (git_default_config,NULL ); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); revs.abbrev =DEFAULT_ABBREV ; revs.commit_format =CMIT_FMT_UNSPECIFIED ;
builtin/revert.c +1 -1
@@ -174,7 +174,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) }else {struct setup_revision_opt s_r_opt; opts->revs =xmalloc (sizeof (*opts->revs)); -init_revisions (opts->revs,NULL ); +repo_init_revisions (the_repository, opts->revs,NULL ); opts->revs->no_walk =REVISION_WALK_NO_WALK_UNSORTED ;if (argc <2 )usage_with_options (usage_str, options);
builtin/shortlog.c +1 -1
@@ -278,7 +278,7 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)git_config (git_default_config,NULL );shortlog_init (&log); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);parse_options_start (&ctx, argc, argv, prefix, options,PARSE_OPT_KEEP_DASHDASH |PARSE_OPT_KEEP_ARGV0 );
builtin/submodule--helper.c +1 -1
@@ -792,7 +792,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid, path, NULL);git_config (git_diff_basic_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ; diff_files_args.argc = setup_revisions(diff_files_args.argc, diff_files_args.argv,
bundle.c +2 -2
@@ -140,7 +140,7 @@ int verify_bundle(struct bundle_header *header, int verbose)int i, ret =0 , req_nr;const char *message =_ ("Repository lacks these prerequisite commits:" ); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );for (i =0 ; i < p->nr; i++) {struct ref_list_entry *e = p->list + i;struct object *o =parse_object (the_repository, &e->oid);
@@ -441,7 +441,7 @@ int create_bundle(struct bundle_header *header, const char *path,/* init revs to list objects for pack-objects later */ save_commit_buffer =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );/* write prerequisites */ if (compute_and_write_prerequisites (bundle_fd, &revs, argc, argv))
diff-lib.c +2 -2
@@ -542,7 +542,7 @@ int do_diff_cache(const struct object_id *tree_oid, struct diff_options *opt) {struct rev_info revs; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );copy_pathspec (&revs.prune_data, &opt->pathspec); revs.diffopt = *opt;
@@ -557,7 +557,7 @@ int index_differs_from(const char *def, const struct diff_flags *flags,struct rev_info rev;struct setup_revision_opt opt; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );memset (&opt,0 ,sizeof (opt)); opt.def = def;setup_revisions (0 ,NULL , &rev, &opt);
http-push.c +1 -1
@@ -1925,7 +1925,7 @@ int cmd_main(int argc, const char **argv)if (!push_all && !is_null_oid (&ref->old_oid))argv_array_pushf (&commit_argv,"^%s" ,oid_to_hex (&ref->old_oid)); -init_revisions (&revs,setup_git_directory ()); +repo_init_revisions (the_repository, &revs,setup_git_directory ());setup_revisions (commit_argv.argc, commit_argv.argv, &revs,NULL ); revs.edge_hint =0 ;/* just in case */
merge-recursive.c +1 -1
@@ -1115,7 +1115,7 @@ static int find_first_merges(struct object_array *result, const char *path,/* get all revisions that merge commit a */ xsnprintf (merged_revision,sizeof (merged_revision),"^%s" ,oid_to_hex (&a->object.oid)); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); rev_opts.submodule = path;/* FIXME: can't handle linked worktrees in submodules yet */ revs.single_worktree = path !=NULL ;
pack-bitmap-write.c +1 -1
@@ -261,7 +261,7 @@ void bitmap_writer_build(struct packing_data *to_pack)if (writer.show_progress) writer.progress =start_progress ("Building bitmaps" , writer.selected_nr); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.tag_objects =1 ; revs.tree_objects =1 ; revs.blob_objects =1 ;
ref-filter.c +1 -1
@@ -2138,7 +2138,7 @@ static void do_merge_filter(struct ref_filter_cbdata *ref_cbdata)struct ref_array *array = ref_cbdata->array;struct commit **to_clear =xcalloc (sizeof (struct commit *), array->nr); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );for (i =0 ; i < array->nr; i++) {struct ref_array_item *item = array->items[i];
remote.c +1 -1
@@ -1903,7 +1903,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs, oid_to_hex(&theirs->object.oid));argv_array_push (&argv,"--" ); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );setup_revisions (argv.argc, argv.argv, &revs,NULL );if (prepare_revision_walk (&revs))die ("revision walk setup failed" );
revision.c +18 -14
@@ -877,7 +877,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)return ; left_first = left_count < right_count; -init_patch_ids (the_repository, &ids); +init_patch_ids (revs->repo, &ids); ids.diffopts.pathspec = revs->diffopt.pathspec;/* Compute patch-ids for one side */
@@ -1370,8 +1370,8 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) {struct worktree **worktrees, **p; -read_cache (); -do_add_index_objects_to_pending (revs, &the_index); +read_index (revs->repo->index); +do_add_index_objects_to_pending (revs, revs->repo->index);if (revs->single_worktree)return ;
@@ -1439,10 +1439,13 @@ static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,return 1 ; } -void init_revisions (struct rev_info *revs,const char *prefix) +void repo_init_revisions (struct repository *r, +struct rev_info *revs, +const char *prefix) {memset (revs,0 ,sizeof (*revs)); + revs->repo = r; revs->abbrev =DEFAULT_ABBREV ; revs->ignore_merges =1 ; revs->simplify_history =1 ;
@@ -1464,11 +1467,11 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format =CMIT_FMT_DEFAULT ; revs->expand_tabs_in_log_default =8 ; -init_grep_defaults (the_repository); -grep_init (&revs->grep_filter, the_repository, prefix); +init_grep_defaults (revs->repo); +grep_init (&revs->grep_filter, revs->repo, prefix); revs->grep_filter.status_only =1 ; -repo_diff_setup (the_repository, &revs->diffopt); +repo_diff_setup (revs->repo, &revs->diffopt);if (prefix && !revs->diffopt.prefix) { revs->diffopt.prefix = prefix; revs->diffopt.prefix_length =strlen (prefix);
@@ -1496,6 +1499,7 @@ static void prepare_show_merge(struct rev_info *revs)struct object_id oid;const char **prune =NULL ;int i, prune_num =1 ;/* counting terminating NULL */ +struct index_state *istate = revs->repo->index;if (get_oid ("HEAD" , &oid))die ("--merge without HEAD?" );
@@ -1511,20 +1515,20 @@ static void prepare_show_merge(struct rev_info *revs)free_commit_list (bases); head->object.flags |=SYMMETRIC_LEFT ; -if (!active_nr) -read_cache (); -for (i =0 ; i < active_nr; i++) { -const struct cache_entry *ce = active_cache[i]; +if (!istate->cache_nr) +read_index (istate); +for (i =0 ; i < istate->cache_nr; i++) { +const struct cache_entry *ce = istate->cache[i];if (!ce_stage (ce))continue ; -if (ce_path_match (&the_index, ce, &revs->prune_data,NULL )) { +if (ce_path_match (istate, ce, &revs->prune_data,NULL )) { prune_num++;REALLOC_ARRAY (prune, prune_num); prune[prune_num-2 ] = ce->name; prune[prune_num-1 ] =NULL ; } -while ((i+1 < active_nr) && -ce_same_name (ce, active_cache[i+1 ])) +while ((i+1 < istate->cache_nr) && +ce_same_name (ce, istate->cache[i+1 ])) i++; }clear_pathspec (&revs->prune_data);
revision.h +10 -3
@@ -28,8 +28,9 @@#define DECORATE_SHORT_REFS 1#define DECORATE_FULL_REFS 2 -struct rev_info ;struct log_info ; +struct repository ; +struct rev_info ;struct string_list ;struct saved_parents ; define_shared_commit_slab(revision_sources, char *);
@@ -60,6 +61,7 @@ struct rev_info {/* Starting list */ struct commit_list *commits;struct object_array pending; +struct repository *repo;/* Parents of shown commits */ struct object_array boundary_commits;
@@ -248,12 +250,17 @@ extern volatile show_early_output_fn_t show_early_output;struct setup_revision_opt {const char *def;void (*tweak)(struct rev_info *,struct setup_revision_opt *); -const char *submodule; +const char *submodule;/* TODO: drop this and use rev_info->repo */ int assume_dashdash;unsigned revarg_opt; }; -void init_revisions (struct rev_info *revs,const char *prefix); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define init_revisions (revs, prefix) repo_init_revisions(the_repository, revs, prefix) +#endif +void repo_init_revisions (struct repository *r, +struct rev_info *revs, +const char *prefix);int setup_revisions (int argc,const char **argv,struct rev_info *revs,struct setup_revision_opt *); void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
sequencer.c +4 -4
@@ -1143,7 +1143,7 @@ void print_commit_summary(const char *prefix, const struct object_id *oid,strbuf_release (&author_ident);strbuf_release (&committer_ident); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);setup_revisions (0 ,NULL , &rev,NULL ); rev.diff =1 ;
@@ -2566,7 +2566,7 @@ static int make_patch(struct commit *commit, struct replay_opts *opts)strbuf_addf (&buf,"%s/patch" ,get_dir (opts));memset (&log_tree_opt,0 ,sizeof (log_tree_opt)); -init_revisions (&log_tree_opt,NULL ); +repo_init_revisions (the_repository, &log_tree_opt,NULL ); log_tree_opt.abbrev =0 ; log_tree_opt.diff =1 ; log_tree_opt.diffopt.output_format =DIFF_FORMAT_PATCH ;
@@ -3477,7 +3477,7 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)struct object_id orig, head;memset (&log_tree_opt,0 ,sizeof (log_tree_opt)); -init_revisions (&log_tree_opt,NULL ); +repo_init_revisions (the_repository, &log_tree_opt,NULL ); log_tree_opt.diff =1 ; log_tree_opt.diffopt.output_format =DIFF_FORMAT_DIFFSTAT ;
@@ -4212,7 +4212,7 @@ int sequencer_make_script(FILE *out, int argc, const char **argv,const char *insn = flags &TODO_LIST_ABBREVIATE_CMDS ?"p" :"pick" ;int rebase_merges = flags &TODO_LIST_REBASE_MERGES ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.verbose_header =1 ;if (!rebase_merges) revs.max_parents =1 ;
shallow.c +1 -1
@@ -184,7 +184,7 @@ struct commit_list *get_shallow_commits_by_rev_list(int ac, const char **av,is_repository_shallow (the_repository);/* make sure shallows are read */ -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); save_commit_buffer =0 ;setup_revisions (ac, av, &revs,NULL );
submodule.c +3 -3
@@ -428,7 +428,7 @@ static int prepare_submodule_summary(struct rev_info *rev, const char *path, {struct commit_list *list; -init_revisions (rev,NULL ); +repo_init_revisions (the_repository, rev,NULL );setup_revisions (0 ,NULL , rev,NULL ); rev->left_right =1 ; rev->first_parent_only =1 ;
@@ -773,7 +773,7 @@ static void collect_changed_submodules(struct index_state *istate,struct rev_info rev;const struct commit *commit; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (argv->argc, argv->argv, &rev,NULL );if (prepare_revision_walk (&rev))die ("revision walk setup failed" );
@@ -784,7 +784,7 @@ static void collect_changed_submodules(struct index_state *istate, data.changed = changed; data.commit_oid = &commit->object.oid; -init_revisions (&diff_rev,NULL ); +repo_init_revisions (the_repository, &diff_rev,NULL ); diff_rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ; diff_rev.diffopt.format_callback = collect_changed_submodules_cb; diff_rev.diffopt.format_callback_data = &data;
t/helper/test-revision-walking.c +1 -1
@@ -32,7 +32,7 @@ static int run_revision_walk(void)int argc =ARRAY_SIZE (argv) -1 ;int got_revision =0 ; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (argc, argv, &rev,NULL );if (prepare_revision_walk (&rev))die ("revision walk setup failed" );
wt-status.c +5 -5
@@ -582,7 +582,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s) {struct rev_info rev; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (0 ,NULL , &rev,NULL ); rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ; rev.diffopt.flags.dirty_submodules =1 ;
@@ -607,7 +607,7 @@ static void wt_status_collect_changes_index(struct wt_status *s)struct rev_info rev;struct setup_revision_opt opt; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );memset (&opt,0 ,sizeof (opt)); opt.def = s->is_initial ?empty_tree_oid_hex () : s->reference;setup_revisions (0 ,NULL , &rev, &opt);
@@ -982,7 +982,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s)int dirty_submodules;const char *c =color (WT_STATUS_HEADER , s); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.diffopt.flags.allow_textconv =1 ; rev.diffopt.ita_invisible_in_index =1 ;
@@ -2314,7 +2314,7 @@ int has_unstaged_changes(int ignore_submodules)struct rev_info rev_info;int result; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL );if (ignore_submodules) { rev_info.diffopt.flags.ignore_submodules =1 ; rev_info.diffopt.flags.override_submodule_config =1 ;
@@ -2336,7 +2336,7 @@ int has_uncommitted_changes(int ignore_submodules)if (is_cache_unborn ())return 0 ; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL );if (ignore_submodules) rev_info.diffopt.flags.ignore_submodules =1 ; rev_info.diffopt.flags.quick =1 ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v3 23/23 revision.c: reduce implicit dependency the_repository
In reply to Nguyễn Thái Ngọc Duy--- list-objects.c | 8 +++++--- revision.c | 44 +++++++++++++++++++++++--------------------- revision.h | 2 +- 3 files changed, 29 insertions(+), 25 deletions(-)
list-objects.c +5 -3
@@ -196,7 +196,7 @@ static void mark_edge_parents_uninteresting(struct commit *commit,struct commit *parent = parents->item;if (!(parent->object.flags &UNINTERESTING ))continue ; -mark_tree_uninteresting (get_commit_tree (parent)); +mark_tree_uninteresting (revs->repo,get_commit_tree (parent));if (revs->edge_hint && !(parent->object.flags &SHOWN )) { parent->object.flags |=SHOWN ;show_edge (parent);
@@ -213,7 +213,8 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)struct commit *commit = list->item;if (commit->object.flags &UNINTERESTING ) { -mark_tree_uninteresting (get_commit_tree (commit)); +mark_tree_uninteresting (revs->repo, +get_commit_tree (commit));if (revs->edge_hint_aggressive && !(commit->object.flags &SHOWN )) { commit->object.flags |=SHOWN ;show_edge (commit);
@@ -228,7 +229,8 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)struct commit *commit = (struct commit *)obj;if (obj->type !=OBJ_COMMIT || !(obj->flags &UNINTERESTING ))continue ; -mark_tree_uninteresting (get_commit_tree (commit)); +mark_tree_uninteresting (revs->repo, +get_commit_tree (commit));if (!(obj->flags &SHOWN )) { obj->flags |=SHOWN ;show_edge (commit);
revision.c +23 -21
149 lines not on this page · raw message
revision.h +1 -1
@@ -280,7 +280,7 @@ void put_revision_mark(const struct rev_info *revs, const struct commit *commit);void mark_parents_uninteresting (struct commit *commit); -void mark_tree_uninteresting (struct tree *tree); +void mark_tree_uninteresting (struct repository *r,struct tree *tree);void show_object_with_name (FILE *,struct object *,const char *);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
Quoted 4 lines · Nguyễn Thái Ngọc Duy
The last patch 24/24 has been merged into individual patches to add
repo_prefix and avoid breaking in-flight topics. "repo" argument is also moved up inrerere(),diff_setup()andinit_revisions().
yay!
So eventually we'd want to rename back to short names or we just postpone that decision if we want that in the future?
Quoted 18 lines
Documentation/technical/api-revision-walking.txt +1
-1@@ -15,7 +15,7 @@ revision list. Functions --------- -`init_revisions`:: +`repo_init_revisions`:: Initialize a rev_info structure with default values. The second parameter may be NULL or can be prefix path, and then the `.prefix`bisect.c +0
-0
bisect.c static void bisect_rev_setup(struct rev_info *revs, const char *prefix, · line 635
Quoted 5 lines
bisect.c +1
-1@@ -632,7 +632,7 @@ static void bisect_rev_setup(struct rev_info *revs, const char *prefix,struct argv_array rev_argv =ARGV_ARRAY_INIT ;int i; -repo_init_revisions (revs, the_repository, prefix); +repo_init_revisions (the_repository, revs, prefix);
Apparently I did not communicate clearly enough on the last round, Please note that the documentation is wrong with these patches applied:
`repo_init_revisions`::
[...] The second
parameter may be NULL or can be prefix path, and then the `.prefix`but the prefix parameter is the _third_ parameter in either order.
v4 cover Kill the_index part 4
In reply to Nguyễn Thái Ngọc Duyv4 includes one word change (interdiff below) and signoff (oops!).
Documentation/technical/api-revision-walking.txt +1 -1
@@ -17,7 +17,7 @@ Functions `repo_init_revisions`:: - Initialize a rev_info structure with default values. The second + Initialize a rev_info structure with default values. The third parameter may be NULL or can be prefix path, and then the `.prefix` variable will be set to it. This is typically the first function you want to call when you want to deal with a revision list. After calling
Nguyễn Thái Ngọc Duy (23):
archive.c: remove implicit dependency the_repository read-cache.c: remove 'const' from index_has_changes() diff.c: reduce implicit dependency on the_index combine-diff.c: remove implicit dependency on the_index blame.c: rename "repo" argument to "r"
diff.c: remove the_index dependency in textconv() functions grep.c: remove implicit dependency on the_index diff.c: remove implicit dependency on the_index read-cache.c: remove implicit dependency on the_index diff-lib.c: remove implicit dependency on the_index ll-merge.c: remove implicit dependency on the_index merge-blobs.c: remove implicit dependency on the_index merge.c: remove implicit dependency on the_index patch-ids.c: remove implicit dependency on the_index sha1-file.c: remove implicit dependency on the_index rerere.c: remove implicit dependency on the_index userdiff.c: remove implicit dependency on the_index line-range.c: remove implicit dependency on the_index submodule.c: remove implicit dependency on the_index tree-diff.c: remove implicit dependency on the_index ws.c: remove implicit dependency on the_index revision.c: remove implicit dependency on the_index revision.c: reduce implicit dependency the_repository
Documentation/technical/api-diff.txt | 4 +- .../technical/api-revision-walking.txt | 4 +- apply.c | 19 +- archive-zip.c | 14 +- archive.c | 2 +- bisect.c | 4 +- blame.c | 63 +++-- builtin/add.c | 4 +- builtin/am.c | 10 +- builtin/blame.c | 4 +- builtin/cat-file.c | 6 +- builtin/checkout.c | 7 +- builtin/commit.c | 4 +- builtin/describe.c | 4 +- builtin/diff-files.c | 2 +- builtin/diff-index.c | 2 +- builtin/diff-tree.c | 2 +- builtin/diff.c | 4 +- builtin/difftool.c | 2 +- builtin/fast-export.c | 2 +- builtin/fmt-merge-msg.c | 2 +- builtin/grep.c | 7 +- builtin/hash-object.c | 2 +- builtin/log.c | 25 +- builtin/merge-tree.c | 2 +- builtin/merge.c | 16 +- builtin/pack-objects.c | 2 +- builtin/prune.c | 2 +- builtin/pull.c | 9 +- builtin/range-diff.c | 2 +- builtin/reflog.c | 2 +- builtin/replace.c | 2 +- builtin/rerere.c | 6 +- builtin/reset.c | 1 + builtin/rev-list.c | 2 +- builtin/revert.c | 2 +- builtin/shortlog.c | 2 +- builtin/submodule--helper.c | 2 +- builtin/update-index.c | 2 +- bundle.c | 4 +- cache.h | 14 +- combine-diff.c | 32 ++- diff-lib.c | 21 +- diff-no-index.c | 9 +- diff.c | 261 ++++++++++-------- diff.h | 22 +- diffcore-break.c | 12 +- diffcore-delta.c | 12 +- diffcore-pickaxe.c | 8 +- diffcore-rename.c | 35 ++- diffcore.h | 13 +- grep.c | 34 ++- grep.h | 10 +- http-push.c | 2 +- line-log.c | 25 +- line-range.c | 22 +- line-range.h | 6 +- list-objects.c | 8 +- ll-merge.c | 17 +- ll-merge.h | 5 +- merge-blobs.c | 16 +- merge-blobs.h | 7 +- merge-recursive.c | 7 +- merge.c | 20 +- notes-merge.c | 9 +- pack-bitmap-write.c | 2 +- patch-ids.c | 4 +- patch-ids.h | 3 +- read-cache.c | 33 ++- ref-filter.c | 2 +- remote.c | 2 +- rerere.c | 121 ++++---- rerere.h | 10 +- revision.c | 76 ++--- revision.h | 15 +- sequencer.c | 18 +- sha1-file.c | 50 ++-- shallow.c | 2 +- submodule.c | 34 ++- submodule.h | 9 +- t/helper/test-revision-walking.c | 2 +- transport.c | 9 +- tree-diff.c | 2 +- userdiff.c | 5 +- userdiff.h | 3 +- ws.c | 5 +- wt-status.c | 10 +- 87 files changed, 749 insertions(+), 552 deletions(-)
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 1/23 archive.c: remove implicit dependency the_repository
The new "repo" field in archive_args has been added since b612ee202a (archive.c: avoid access to the_index - 2018-08-13). Use it instead of hard coding the_repository.
--- archive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
archive.c +1 -1
@@ -391,7 +391,7 @@ static void parse_treeish_arg(const char **argv,if (get_oid (name, &oid))die ("Not a valid object name" ); - commit =lookup_commit_reference_gently (the_repository, &oid,1 ); + commit =lookup_commit_reference_gently (ar_args->repo, &oid,1 );if (commit) { commit_sha1 = commit->object.oid.hash; archive_time = commit->date;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 2/23 read-cache.c: remove 'const' from index_has_changes()
In reply to Nguyễn Thái Ngọc DuyThis function calls do_diff_cache() which eventually needs to set this "istate" to unpack_options->src_index (*). This is an unfortunate fact that unpack_trees() _will_ destroy src_index so we can't really pass a const index_state there. Just remove 'const'.
(*) Right now diff_cache() in diff-lib.c assigns the_index to
src_index. But the plan is to get rid of the_index, so it should be 'istate' from here that gets assigned to src_index.
--- cache.h | 2 +- read-cache.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
cache.h +1 -1
@@ -703,7 +703,7 @@ extern int unmerged_index(const struct index_state *);* provided, the space-separated list of files that differ will be appended * to it. */ -extern int index_has_changes (const struct index_state *istate, +extern int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb);
read-cache.c +1 -1
@@ -2122,7 +2122,7 @@ int unmerged_index(const struct index_state *istate)return 0 ; } -int index_has_changes (const struct index_state *istate, +int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb) {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
Re: [PATCH v4 02/23] read-cache.c: remove 'const' from index_has_changes()
Quoted 3 lines · Nguyễn Thái Ngọc Duy
This function calls
do_diff_cache()which eventually needs to set this "istate" tounpack_options->src_index(*). This is an unfortunate fact thatunpack_trees()_will_ destroysrc_indexso we can't really pass a
Wasn't the whole point of introducing src_index and dst_index to unpack-trees API so that we can keep the src_index read-only by writing the result of merge to a separate in-core dst_index?
What does the above exactly mean by "will destroy src_index"? Is it now fundamental that src_index needs to lack constness, or is it something easy to fix?
Re: [PATCH v4 02/23] read-cache.c: remove 'const' from index_has_changes()
Quoted 7 lines · Junio C Hamano
Quoted 3 lines · Nguyễn Thái Ngọc Duy
This function calls
do_diff_cache()which eventually needs to set this "istate" tounpack_options->src_index(*). This is an unfortunate fact thatunpack_trees()_will_ destroysrc_indexso we can't really pass a
Quoted 7 lines
Wasn't the whole point of introducing
src_indexanddst_indexto unpack-trees API so that we can keep thesrc_indexread-only by writing the result of merge to a separate in-coredst_index?What does the above exactly mean by "will destroy
src_index"? Is it now fundamental thatsrc_indexneeds to lack constness, or is it something easy to fix?
"destroy" is probably a strong word, but we do modify the src_index, e.g.
mark_all_ce_unused(o->src_index);
mark_new_skip_worktree(.., o->src_index...
move_index_extensions(&o->result, o->src_index);
invalidate_ce_path();
all these update the source index. It is possible to fix, but I don't think it's exactly easy and may even incur some performance cost (e.g. if we stop modify ce_flags in the src_index, then we need to do one extra lookup to wherever we store these flags).
Signature · 1 line
Duy
Re: [PATCH v4 02/23] read-cache.c: remove 'const' from index_has_changes()
Quoted 23 lines · Duy Nguyen
Quoted 7 lines · Junio C Hamano
Quoted 3 lines · Nguyễn Thái Ngọc Duy
This function calls
do_diff_cache()which eventually needs to set this "istate" tounpack_options->src_index(*). This is an unfortunate fact thatunpack_trees()_will_ destroysrc_indexso we can't really pass aQuoted 7 lines
Wasn't the whole point of introducing
src_indexanddst_indexto unpack-trees API so that we can keep thesrc_indexread-only by writing the result of merge to a separate in-coredst_index?What does the above exactly mean by "will destroy
src_index"? Is it now fundamental thatsrc_indexneeds to lack constness, or is it something easy to fix?"destroy" is probably a strong word, but we do modify the
src_index, e.g.
mark_all_ce_unused(o->src_index);
mark_new_skip_worktree(..,o->src_index...
move_index_extensions(&o->result, o->src_index);
invalidate_ce_path();
Quoted 4 lines
all these update the source index. It is possible to fix, but I don't think it's exactly easy and may even incur some performance cost (e.g. if we stop modify
ce_flagsin thesrc_index, then we need to do one extra lookup to wherever we store these flags).
Ah, OK. I thought that we'd be doing something, if write_tree() is called on src_index before and after these operation, to cause us to see two different trees, which made me worried.
But what you mean is that transient bits in the istate or cache entries reachable from it are touched while we perform operations that are read-only in spirit, and we need to pass non const pointer around.
The phrasing in the log message does need to be updated to avoid similar confusion by future readers, but I think I understand and agree with the direction/approach.
Thanks.
PATCH v4 3/23 diff.c: reduce implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duydiff and textconv code has so widespread use that it's hard to simply update their api and all call sites at once because it would result in a big patch. For now reduce the_index references to two places:diff_setup() and fill_textconv().
--- builtin/reset.c | 1 + diff.c | 176 +++++++++++++++++++++++++++------------------- diff.h | 3 + diffcore-break.c | 12 ++-- diffcore-delta.c | 12 ++-- diffcore-rename.c | 35 +++++---- diffcore.h | 13 ++-- line-log.c | 21 +++--- 8 files changed, 161 insertions(+), 112 deletions(-)
builtin/reset.c +1 -0
@@ -159,6 +159,7 @@ static int read_from_tree(const struct pathspec *pathspec, opt.format_callback = update_index_from_diff; opt.format_callback_data = &intent_to_add; opt.flags.override_submodule_config =1 ; + opt.repo = the_repository;if (do_diff_cache (tree_oid, &opt))return 1 ;
diff.c +102 -74
497 lines not on this page · raw message
diff.h +3 -0
@@ -18,6 +18,7 @@ struct userdiff_driver;struct oid_array ;struct commit ;struct combine_diff_path ; +struct repository ;typedef int (*pathchange_fn_t )(struct diff_options *options,struct combine_diff_path *path);
@@ -220,6 +221,8 @@ struct diff_options {/* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */ #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)int color_moved_ws_handling; + +struct repository *repo; };void diff_emit_submodule_del (struct diff_options *o,const char *line);
diffcore-break.c +7 -5
@@ -5,7 +5,8 @@#include "diff.h" #include "diffcore.h" -static int should_break (struct diff_filespec *src, +static int should_break (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int break_score,int *merge_score_p)
@@ -61,7 +62,8 @@ static int should_break(struct diff_filespec *src, !oidcmp(&src->oid, &dst->oid))return 0 ;/* they are the same */ -if (diff_populate_filespec (src,0 ) ||diff_populate_filespec (dst,0 )) +if (diff_populate_filespec (r, src,0 ) || +diff_populate_filespec (r, dst,0 ))return 0 ;/* error but caught downstream */ max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -71,7 +73,7 @@ static int should_break(struct diff_filespec *src,if (!src->size)return 0 ;/* we do not let empty files get renamed */ -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -114,7 +116,7 @@ static int should_break(struct diff_filespec *src,return 1 ; } -void diffcore_break (int break_score) +void diffcore_break (struct repository *r,int break_score) {struct diff_queue_struct *q = &diff_queued_diff;struct diff_queue_struct outq;
@@ -178,7 +180,7 @@ void diffcore_break(int break_score) object_type(p->one->mode) == OBJ_BLOB && object_type(p->two->mode) == OBJ_BLOB && !strcmp(p->one->path, p->two->path)) { -if (should_break (p->one, p->two, +if (should_break (r, p->one, p->two, break_score, &score)) {/* Split this into delete and create */ struct diff_filespec *null_one, *null_two;
diffcore-delta.c +7 -5
@@ -121,14 +121,15 @@ static int spanhash_cmp(const void *a_, const void *b_) a->hashval > b->hashval ?1 :0 ; } -static struct spanhash_top *hash_chars (struct diff_filespec *one) +static struct spanhash_top *hash_chars (struct repository *r, +struct diff_filespec *one) {int i, n;unsigned int accum1, accum2, hashval;struct spanhash_top *hash;unsigned char *buf = one->data;unsigned int sz = one->size; -int is_text = !diff_filespec_is_binary (one); +int is_text = !diff_filespec_is_binary (r, one); i =INITIAL_HASH_SIZE ; hash = xmalloc(st_add(sizeof(*hash),
@@ -162,7 +163,8 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one)return hash; } -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
@@ -177,14 +179,14 @@ int diffcore_count_changes(struct diff_filespec *src,if (src_count_p) src_count = *src_count_p;if (!src_count) { - src_count =hash_chars (src); + src_count =hash_chars (r, src);if (src_count_p) *src_count_p = src_count; }if (dst_count_p) dst_count = *dst_count_p;if (!dst_count) { - dst_count =hash_chars (dst); + dst_count =hash_chars (r, dst);if (dst_count_p) *dst_count_p = dst_count; }
diffcore-rename.c +22 -13
@@ -128,7 +128,8 @@ struct diff_score {short name_score; }; -static int estimate_similarity (struct diff_filespec *src, +static int estimate_similarity (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int minimum_score) {
@@ -165,10 +166,10 @@ static int estimate_similarity(struct diff_filespec *src,* say whether the size is valid or not!) */ if (!src->cnt_data && -diff_populate_filespec (src,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, src,CHECK_SIZE_ONLY ))return 0 ;if (!dst->cnt_data && -diff_populate_filespec (dst,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, dst,CHECK_SIZE_ONLY ))return 0 ; max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -186,12 +187,12 @@ static int estimate_similarity(struct diff_filespec *src,if (max_size * (MAX_SCORE -minimum_score) < delta_size *MAX_SCORE )return 0 ; -if (!src->cnt_data &&diff_populate_filespec (src,0 )) +if (!src->cnt_data &&diff_populate_filespec (r, src,0 ))return 0 ; -if (!dst->cnt_data &&diff_populate_filespec (dst,0 )) +if (!dst->cnt_data &&diff_populate_filespec (r, dst,0 ))return 0 ; -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -256,10 +257,11 @@ struct file_similarity {struct diff_filespec *filespec; }; -static unsigned int hash_filespec (struct diff_filespec *filespec) +static unsigned int hash_filespec (struct repository *r, +struct diff_filespec *filespec) {if (!filespec->oid_valid) { -if (diff_populate_filespec (filespec,0 )) +if (diff_populate_filespec (r, filespec,0 ))return 0 ;hash_object_file (filespec->data, filespec->size,"blob" , &filespec->oid);
@@ -280,7 +282,9 @@ static int find_identical_files(struct hashmap *srcs,/* * Find the best source match for specified destination. */ - p =hashmap_get_from_hash (srcs,hash_filespec (target),NULL ); + p =hashmap_get_from_hash (srcs, +hash_filespec (options->repo, target), +NULL );for (; p; p =hashmap_get_next (srcs, p)) {int score;struct diff_filespec *source = p->filespec;
@@ -316,14 +320,16 @@ static int find_identical_files(struct hashmap *srcs,return renames; } -static void insert_file_table (struct hashmap *table,int index,struct diff_filespec *filespec) +static void insert_file_table (struct repository *r, +struct hashmap *table,int index, +struct diff_filespec *filespec) {struct file_similarity *entry =xmalloc (sizeof (*entry)); entry->index = index; entry->filespec = filespec; -hashmap_entry_init (entry,hash_filespec (filespec)); +hashmap_entry_init (entry,hash_filespec (r, filespec));hashmap_add (table, entry); }
@@ -344,7 +350,9 @@ static int find_exact_renames(struct diff_options *options)*/ hashmap_init (&file_table,NULL ,NULL , rename_src_nr);for (i = rename_src_nr-1 ; i >=0 ; i--) -insert_file_table (&file_table, i, rename_src[i].p->one); +insert_file_table (options->repo, + &file_table, i, + rename_src[i].p->one);/* Walk the destinations and find best source match */ for (i =0 ; i < rename_dst_nr; i++)
@@ -557,7 +565,8 @@ void diffcore_rename(struct diff_options *options) diff_unmodified_pair(rename_src[j].p))continue ; - this_src.score =estimate_similarity (one, two, + this_src.score =estimate_similarity (options->repo, + one, two, minimum_score); this_src.name_score =basename_same (one, two); this_src.dst = i;
diffcore.h +7 -6
@@ -7,6 +7,8 @@#include "cache.h" struct diff_options ; +struct repository ; +struct userdiff_driver ;/* This header file is internal between diff.c and its diff transformers * (e.g. diffcore-rename, diffcore-pickaxe). Never include this header
@@ -26,8 +28,6 @@ struct diff_options;#define MINIMUM_BREAK_SIZE 400/* do not break a file smaller than this */ -struct userdiff_driver ; -struct diff_filespec {struct object_id oid;char *path;
@@ -61,10 +61,10 @@ void fill_filespec(struct diff_filespec *, const struct object_id *,#define CHECK_SIZE_ONLY 1#define CHECK_BINARY 2 -int diff_populate_filespec (struct diff_filespec *,unsigned int ); +int diff_populate_filespec (struct repository *,struct diff_filespec *,unsigned int );void diff_free_filespec_data (struct diff_filespec *);void diff_free_filespec_blob (struct diff_filespec *); -int diff_filespec_is_binary (struct diff_filespec *); +int diff_filespec_is_binary (struct repository *,struct diff_filespec *);struct diff_filepair {struct diff_filespec *one;
@@ -111,7 +111,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *, struct diff_filespec *);void diff_q (struct diff_queue_struct *,struct diff_filepair *); -void diffcore_break (int ); +void diffcore_break (struct repository *,int );void diffcore_rename (struct diff_options *);void diffcore_merge_broken (void );void diffcore_pickaxe (struct diff_options *);
@@ -142,7 +142,8 @@ void diff_debug_queue(const char *, struct diff_queue_struct *); #define diff_debug_queue(a,b) do { /* nothing */ } while (0)#endif -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
line-log.c +12 -9
@@ -508,7 +508,9 @@ static void fill_blob_sha1(struct commit *commit, struct diff_filespec *spec)return ; } -static void fill_line_ends (struct diff_filespec *spec,long *lines, +static void fill_line_ends (struct repository *r, +struct diff_filespec *spec, +long *lines,unsigned long **line_ends) {int num =0 , size =50 ;
@@ -516,7 +518,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines,unsigned long *ends =NULL ;char *data =NULL ; -if (diff_populate_filespec (spec,0 )) +if (diff_populate_filespec (r, spec,0 ))die ("Cannot read blob %s" ,oid_to_hex (&spec->oid));ALLOC_ARRAY (ends, size);
@@ -555,7 +557,8 @@ static const char *nth_line(void *data, long line) }static struct line_log_data * -parse_lines (struct commit *commit,const char *prefix,struct string_list *args) +parse_lines (struct repository *r,struct commit *commit, +const char *prefix,struct string_list *args) {long lines =0 ;unsigned long *ends =NULL ;
@@ -583,7 +586,7 @@ parse_lines(struct commit *commit, const char *prefix, struct string_list *args) spec =alloc_filespec (full_name);fill_blob_sha1 (commit, spec); -fill_line_ends (spec, &lines, &ends); +fill_line_ends (r, spec, &lines, &ends); cb_data.spec = spec; cb_data.lines = lines; cb_data.line_ends = ends;
@@ -739,7 +742,7 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_liststruct line_log_data *range; commit =check_single_commit (rev); - range =parse_lines (commit, prefix, args); + range =parse_lines (rev->diffopt.repo, commit, prefix, args);add_line_range (rev, commit, range);if (!rev->diffopt.detect_rename) {
@@ -891,8 +894,8 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rangreturn ;if (pair->one->oid_valid) -fill_line_ends (pair->one, &p_lines, &p_ends); -fill_line_ends (pair->two, &t_lines, &t_ends); +fill_line_ends (rev->diffopt.repo, pair->one, &p_lines, &p_ends); +fill_line_ends (rev->diffopt.repo, pair->two, &t_lines, &t_ends);fprintf (opt->file,"%s%sdiff --git a/%s b/%s%s\n" , prefix, c_meta, pair->one->path, pair->two->path, c_reset); fprintf(opt->file, "%s%s--- %s%s%s\n", prefix, c_meta,
@@ -1008,12 +1011,12 @@ static int process_diff_filepair(struct rev_info *rev,return 0 ;assert (pair->two->oid_valid); -diff_populate_filespec (pair->two,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->two,0 ); file_target.ptr = pair->two->data; file_target.size = pair->two->size;if (pair->one->oid_valid) { -diff_populate_filespec (pair->one,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->one,0 ); file_parent.ptr = pair->one->data; file_parent.size = pair->one->size; }else {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 4/23 combine-diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- combine-diff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
combine-diff.c +2 -1
@@ -1054,7 +1054,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,if (is_file) {struct strbuf buf =STRBUF_INIT ; -if (convert_to_git (&the_index, elem->path, result, len, &buf, global_conv_flags_eol)) { +if (convert_to_git (rev->diffopt.repo->index, + elem->path, result, len, &buf, global_conv_flags_eol)) {free (result); result =strbuf_detach (&buf, &len); result_size = len;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 5/23 blame.c: rename "repo" argument to "r"
In reply to Nguyễn Thái Ngọc DuyThe current naming convention for 'struct repository *' is 'r' for temporary variables or arguments. I did not notice this. Since we're updating blame.c again in the next patch, let's fix this.
--- blame.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
blame.c +18 -18
@@ -90,7 +90,7 @@ static struct blame_origin *get_origin(struct commit *commit, const char *path) -static void verify_working_tree_path (struct repository *repo, +static void verify_working_tree_path (struct repository *r,struct commit *work_tree,const char *path) {struct commit_list *parents;
@@ -102,15 +102,15 @@ static void verify_working_tree_path(struct repository *repo,unsigned mode;if (!get_tree_entry (commit_oid, path, &blob_oid, &mode) && -oid_object_info (repo, &blob_oid,NULL ) ==OBJ_BLOB ) +oid_object_info (r, &blob_oid,NULL ) ==OBJ_BLOB )return ; } - pos =index_name_pos (repo->index, path,strlen (path)); + pos =index_name_pos (r->index, path,strlen (path));if (pos >=0 ) ;/* path is in the index */ -else if (-1 - pos < repo->index->cache_nr && - !strcmp (repo->index->cache[-1 - pos]->name, path)) +else if (-1 - pos < r->index->cache_nr && + !strcmp (r->index->cache[-1 - pos]->name, path)) ;/* path is in the index, unmerged */ else die ("no such path '%s' in HEAD" , path);
@@ -166,7 +166,7 @@ static void set_commit_buffer_from_strbuf(struct commit *c, struct strbuf *sb)* Prepare a dummy commit that represents the work tree (or staged) item. * Note that annotating work tree item never works in the reverse. */ -static struct commit *fake_working_tree_commit (struct repository *repo, +static struct commit *fake_working_tree_commit (struct repository *r,struct diff_options *opt,const char *path,const char *contents_from)
@@ -183,7 +183,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,unsigned mode;struct strbuf msg =STRBUF_INIT ; -read_index (repo->index); +read_index (r->index);time (&now); commit =alloc_commit_node (the_repository); commit->object.parsed =1 ;
@@ -195,7 +195,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo, parent_tail =append_parent (parent_tail, &head_oid);append_merge_parents (parent_tail); -verify_working_tree_path (repo, commit, path); +verify_working_tree_path (r, commit, path); origin =make_origin (commit, path);
@@ -253,7 +253,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,if (strbuf_read (&buf,0 ,0 ) <0 )die_errno ("failed to read from stdin" ); } -convert_to_git (repo->index, path, buf.buf, buf.len, &buf,0 ); +convert_to_git (r->index, path, buf.buf, buf.len, &buf,0 ); origin->file.ptr = buf.buf; origin->file.size = buf.len;pretend_object_file (buf.buf, buf.len,OBJ_BLOB , &origin->blob_oid);
@@ -264,28 +264,28 @@ static struct commit *fake_working_tree_commit(struct repository *repo,* bits; we are not going to write this index out -- we just * want to run "diff-index --cached". */ -discard_index (repo->index); -read_index (repo->index); +discard_index (r->index); +read_index (r->index); len =strlen (path);if (!mode) { -int pos =index_name_pos (repo->index, path, len); +int pos =index_name_pos (r->index, path, len);if (0 <= pos) - mode = repo->index->cache[pos]->ce_mode; + mode = r->index->cache[pos]->ce_mode;else /* Let's not bother reading from HEAD tree */ mode =S_IFREG |0644 ; } - ce =make_empty_cache_entry (repo->index, len); + ce =make_empty_cache_entry (r->index, len);oidcpy (&ce->oid, &origin->blob_oid);memcpy (ce->name, path, len); ce->ce_flags =create_ce_flags (0 ); ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); -add_index_entry (repo->index, ce, +add_index_entry (r->index, ce,ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE ); -cache_tree_invalidate_path (repo->index, path); +cache_tree_invalidate_path (r->index, path);return commit; }
@@ -520,14 +520,14 @@ static void queue_blames(struct blame_scoreboard *sb, struct blame_origin *porig* * This also fills origin->mode for corresponding tree path. */ -static int fill_blob_sha1_and_mode (struct repository *repo, +static int fill_blob_sha1_and_mode (struct repository *r,struct blame_origin *origin) {if (!is_null_oid (&origin->blob_oid))return 0 ;if (get_tree_entry (&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode)) goto error_out; -if (oid_object_info (repo, &origin->blob_oid,NULL ) !=OBJ_BLOB ) +if (oid_object_info (r, &origin->blob_oid,NULL ) !=OBJ_BLOB ) goto error_out;return 0 ; error_out:
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
Re: [PATCH v4 05/23] blame.c: rename "repo" argument to "r"
Quoted 3 lines · Nguyễn Thái Ngọc Duy
The current naming convention for 'struct repository *' is 'r' for temporary variables or arguments. I did not notice this. Since we're updating
blame.cagain in the next patch, let's fix this.
It is likely that we end up having to refer to an in-core repository object in many places, so giving a short-and-sweet 'r' to it makes quite a lot of sense. One thing we may want to do as preparation related to this effort is to sweep the codebase to make sure we do not use 'r' as a variable that refers to anything other than an in-core repository object.
Thanks.
PATCH v4 6/23 diff.c: remove the_index dependency in textconv() functions
In reply to Nguyễn Thái Ngọc Duy--- blame.c | 7 ++++--- builtin/cat-file.c | 6 ++++-- builtin/log.c | 3 ++- combine-diff.c | 27 ++++++++++++++++----------- diff.c | 17 +++++++++-------- diff.h | 9 +++++++-- diffcore-pickaxe.c | 4 ++-- grep.c | 2 +- 8 files changed, 45 insertions(+), 30 deletions(-)
blame.c +4 -3
@@ -234,7 +234,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,switch (st.st_mode &S_IFMT ) {case S_IFREG :if (opt->flags.allow_textconv && -textconv_object (read_from, mode, &null_oid,0 , &buf_ptr, &buf_len)) +textconv_object (r, read_from, mode, &null_oid,0 , &buf_ptr, &buf_len))strbuf_attach (&buf, buf_ptr, buf_len, buf_len +1 );else if (strbuf_read_file (&buf, read_from, st.st_size) != st.st_size)die_errno ("cannot open or read '%s'" , read_from);
@@ -318,7 +318,8 @@ static void fill_origin_blob(struct diff_options *opt, (*num_read_blob)++;if (opt->flags.allow_textconv && -textconv_object (o->path, o->mode, &o->blob_oid,1 , &file->ptr, &file_size)) +textconv_object (opt->repo, o->path, o->mode, + &o->blob_oid,1 , &file->ptr, &file_size)) ;else file->ptr = read_object_file(&o->blob_oid, &type,
@@ -1857,7 +1858,7 @@ void setup_scoreboard(struct blame_scoreboard *sb,die (_ ("no such path %s in %s" ), path, final_commit_name);if (sb->revs->diffopt.flags.allow_textconv && -textconv_object (path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, +textconv_object (sb->repo, path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, &sb->final_buf_size)) ;else
builtin/cat-file.c +4 -2
@@ -113,7 +113,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,die ("git cat-file --textconv %s: <object> must be <sha1:path>" , obj_name); -if (textconv_object (path, obj_context.mode, &oid,1 , &buf, &size)) +if (textconv_object (the_repository, path, obj_context.mode, + &oid,1 , &buf, &size))break ;/* else fallthrough */
@@ -305,7 +306,8 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d oid_to_hex(oid), data->rest); }else if (opt->cmdmode =='c' ) {enum object_type type; -if (!textconv_object (data->rest,0100644 , oid, +if (!textconv_object (the_repository, + data->rest,0100644 , oid,1 , &contents, &size)) contents = read_object_file(oid, &type,
builtin/log.c +2 -1
@@ -507,7 +507,8 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c &oidc, &obj_context))die (_ ("Not a valid object name %s" ), obj_name);if (!obj_context.path || - !textconv_object (obj_context.path, obj_context.mode, &oidc,1 , &buf, &size)) { + !textconv_object (the_repository, obj_context.path, + obj_context.mode, &oidc,1 , &buf, &size)) {free (obj_context.path);return stream_blob_to_fd (1 , oid,NULL ,0 ); }
combine-diff.c +16 -11
@@ -285,7 +285,8 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase,return base; } -static char *grab_blob (const struct object_id *oid,unsigned int mode, +static char *grab_blob (struct repository *r, +const struct object_id *oid,unsigned int mode,unsigned long *size,struct userdiff_driver *textconv,const char *path) {
@@ -304,7 +305,7 @@ static char *grab_blob(const struct object_id *oid, unsigned int mode, }else if (textconv) {struct diff_filespec *df =alloc_filespec (path);fill_filespec (df, oid,1 , mode); - *size =fill_textconv (textconv, df, &blob); + *size =fill_textconv (r, textconv, df, &blob);free_filespec (df); }else { blob =read_object_file (oid, &type, size);
@@ -389,7 +390,8 @@ static void consume_line(void *state_, char *line, unsigned long len) } } -static void combine_diff(const struct object_id *parent, unsigned int mode, +static void combine_diff(struct repository *r, + const struct object_id *parent, unsigned int mode, mmfile_t *result_file, struct sline *sline, unsigned int cnt, int n, int num_parent, int result_deleted,
@@ -407,7 +409,7 @@ static void combine_diff(const struct object_id *parent, unsigned int mode,if (result_deleted)return ;/* result deleted */ - parent_file.ptr =grab_blob (parent, mode, &sz, textconv, path); + parent_file.ptr =grab_blob (r, parent, mode, &sz, textconv, path); parent_file.size = sz;memset (&xpp,0 ,sizeof (xpp)); xpp.flags = flags;
@@ -993,7 +995,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,/* Read the result of merge first */ if (!working_tree_file) - result =grab_blob (&elem->oid, elem->mode, &result_size, + result =grab_blob (opt->repo, &elem->oid, elem->mode, &result_size, textconv, elem->path);else {/* Used by diff-tree to read from the working tree */
@@ -1016,15 +1018,16 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, }else if (S_ISDIR (st.st_mode)) {struct object_id oid;if (resolve_gitlink_ref (elem->path,"HEAD" , &oid) <0 ) - result =grab_blob (&elem->oid, elem->mode, - &result_size,NULL ,NULL ); + result =grab_blob (opt->repo, &elem->oid, + elem->mode, &result_size, +NULL ,NULL );else - result =grab_blob (&oid, elem->mode, + result =grab_blob (opt->repo, &oid, elem->mode, &result_size,NULL ,NULL ); }else if (textconv) {struct diff_filespec *df =alloc_filespec (elem->path);fill_filespec (df, &null_oid,0 , st.st_mode); - result_size =fill_textconv (textconv, df, &result); + result_size =fill_textconv (opt->repo, textconv, df, &result);free_filespec (df); }else if (0 <= (fd =open (elem->path,O_RDONLY ))) {size_t len =xsize_t (st.st_size);
@@ -1090,7 +1093,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,for (i =0 ; !is_binary && i < num_parent; i++) {char *buf;unsigned long size; - buf =grab_blob (&elem->parent[i].oid, + buf =grab_blob (opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &size,NULL ,NULL );if (buffer_is_binary (buf, size))
@@ -1146,7 +1150,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, } }if (i <= j) - combine_diff(&elem->parent[i].oid, + combine_diff(opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &result_file, sline, cnt, i, num_parent, result_deleted,
diff.c +9 -8
@@ -1700,8 +1700,8 @@ static void emit_rewrite_diff(const char *name_a,quote_two_c_style (&a_name, a_prefix, name_a,0 );quote_two_c_style (&b_name, b_prefix, name_b,0 ); - size_one =fill_textconv (textconv_one, one, &data_one); - size_two =fill_textconv (textconv_two, two, &data_two); + size_one =fill_textconv (o->repo, textconv_one, one, &data_one); + size_two =fill_textconv (o->repo, textconv_two, two, &data_two);memset (&ecbdata,0 ,sizeof (ecbdata)); ecbdata.color_diff =want_color (o->use_color);
@@ -3462,8 +3462,8 @@ static void builtin_diff(const char *name_a,strbuf_reset (&header); } - mf1.size =fill_textconv (textconv_one, one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); pe =diff_funcname_pattern (one);if (!pe)
@@ -6337,11 +6337,11 @@ static char *run_textconv(struct repository *r,return strbuf_detach (&buf, outsize); } -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf) { -struct repository *r = the_repository;size_t size;if (!driver) {
@@ -6386,7 +6386,8 @@ size_t fill_textconv(struct userdiff_driver *driver,return size; } -int textconv_object(const char *path, +int textconv_object(struct repository *r, + const char *path, unsigned mode, const struct object_id *oid, int oid_valid,
@@ -6404,7 +6405,7 @@ int textconv_object(const char *path,return 0 ; } - *buf_size =fill_textconv (textconv, df, buf); + *buf_size =fill_textconv (r, textconv, df, buf);free_filespec (df);return 1 ; }
diff.h +7 -2
@@ -442,7 +442,8 @@ int index_differs_from(const char *def, const struct diff_flags *flags,* struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer * that should be freed by the caller. */ -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf);
@@ -458,7 +459,11 @@ struct userdiff_driver *get_textconv(struct diff_filespec *one);* if the textconv driver exists. * Return 1 if the conversion succeeds, 0 otherwise. */ -int textconv_object (const char *path,unsigned mode,const struct object_id *oid,int oid_valid,char **buf,unsigned long *buf_size); +int textconv_object (struct repository *repo, +const char *path, +unsigned mode, +const struct object_id *oid,int oid_valid, +char **buf,unsigned long *buf_size);int parse_rename_score (const char **cp_p);
diffcore-pickaxe.c +2 -2
@@ -153,8 +153,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,if (textconv_one == textconv_two &&diff_unmodified_pair (p))return 0 ; - mf1.size =fill_textconv (textconv_one, p->one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, p->two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, p->one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, p->two, &mf2.ptr); ret = fn(DIFF_FILE_VALID(p->one) ? &mf1 : NULL, DIFF_FILE_VALID(p->two) ? &mf2 : NULL,
grep.c +1 -1
@@ -1741,7 +1741,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (driver, df, &buf); + size =fill_textconv (the_repository, driver, df, &buf);grep_read_unlock ();free_filespec (df);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 7/23 grep.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/grep.c | 4 ++-- builtin/log.c | 2 +- grep.c | 13 ++++++++----- grep.h | 7 +++++-- revision.c | 4 ++-- 5 files changed, 18 insertions(+), 12 deletions(-)
builtin/grep.c +2 -2
@@ -904,9 +904,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) OPT_END() }; -init_grep_defaults (); +init_grep_defaults (the_repository);git_config (grep_cmd_config,NULL ); -grep_init (&opt, prefix); +grep_init (&opt, the_repository, prefix);/* * If there is no -- then the paths must exist in the working
builtin/log.c +1 -1
@@ -115,7 +115,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,static void init_log_defaults (void ) { -init_grep_defaults (); +init_grep_defaults (the_repository);init_diff_ui_defaults (); decoration_style =auto_decoration_style ();
grep.c +8 -5
@@ -42,7 +42,7 @@ static void color_set(char *dst, const char *color_bytes)* We could let the compiler do this, but without C99 initializers * the code gets unwieldy and unreadable, so... */ -void init_grep_defaults (void ) +void init_grep_defaults (struct repository *repo) {struct grep_opt *opt = &grep_defaults;static int run_once;
@@ -52,6 +52,7 @@ void init_grep_defaults(void) run_once++;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->relative =1 ; opt->pathname =1 ; opt->max_depth =-1 ;
@@ -149,12 +150,13 @@ int grep_config(const char *var, const char *value, void *cb)* default values from the template we read the configuration * information in an earlier call to git_config(grep_config). */ -void grep_init (struct grep_opt *opt,const char *prefix) +void grep_init (struct grep_opt *opt,struct repository *repo,const char *prefix) {struct grep_opt *def = &grep_defaults;int i;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->prefix = prefix; opt->prefix_length = (prefix && *prefix) ?strlen (prefix) :0 ; opt->pattern_tail = &opt->pattern_list;
@@ -1708,7 +1710,8 @@ static int look_ahead(struct grep_opt *opt,return 0 ; } -static int fill_textconv_grep (struct userdiff_driver *driver, +static int fill_textconv_grep (struct repository *r, +struct userdiff_driver *driver,struct grep_source *gs) {struct diff_filespec *df;
@@ -1741,7 +1744,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (the_repository, driver, df, &buf); + size =fill_textconv (r, driver, df, &buf);grep_read_unlock ();free_filespec (df);
@@ -1837,7 +1840,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle try_lookahead =should_lookahead (opt); -if (fill_textconv_grep (textconv, gs) <0 ) +if (fill_textconv_grep (opt->repo, textconv, gs) <0 )return 0 ; bol = gs->buf;
grep.h +5 -2
@@ -36,6 +36,8 @@ typedef int pcre2_jit_stack;#include "thread-utils.h" #include "userdiff.h" +struct repository ; +enum grep_pat_token {GREP_PATTERN ,GREP_PATTERN_HEAD ,
@@ -136,6 +138,7 @@ struct grep_opt {struct grep_pat *header_list;struct grep_pat **header_tail;struct grep_expr *pattern_expression; +struct repository *repo;const char *prefix;int prefix_length;regex_t regexp;
@@ -183,9 +186,9 @@ struct grep_opt {void *output_priv; }; -extern void init_grep_defaults (void ); +extern void init_grep_defaults (struct repository *);extern int grep_config (const char *var,const char *value,void *); -extern void grep_init (struct grep_opt *,const char *prefix); +extern void grep_init (struct grep_opt *,struct repository *repo,const char *prefix);void grep_commit_pattern_type (enum grep_pattern_type ,struct grep_opt *opt);extern void append_grep_pat (struct grep_opt *opt,const char *pat,size_t patlen,const char *origin,int no,enum grep_pat_token t);
revision.c +2 -2
@@ -1464,8 +1464,8 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format =CMIT_FMT_DEFAULT ; revs->expand_tabs_in_log_default =8 ; -init_grep_defaults (); -grep_init (&revs->grep_filter, prefix); +init_grep_defaults (the_repository); +grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ;diff_setup (&revs->diffopt);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 8/23 diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyA new variant repo_diff_setup() is added that takes 'struct repository *' and diff_setup() becomes a thin macro around it that is protected by NO_THE_REPOSITORY_COMPATIBILITY_MACROS, similar to NO_THE_INDEX_.... The plan is these macros will always be defined for all library files and the macros are only accessible in builtin/
--- Documentation/technical/api-diff.txt | 4 ++-- blame.c | 20 +++++++++++--------- builtin/diff.c | 2 +- builtin/log.c | 2 +- builtin/merge.c | 2 +- builtin/range-diff.c | 2 +- diff-no-index.c | 9 +++++++-- diff.c | 4 ++-- diff.h | 7 +++++-- merge-recursive.c | 2 +- notes-merge.c | 4 ++-- patch-ids.c | 2 +- read-cache.c | 2 +- revision.c | 2 +- tree-diff.c | 2 +- 15 files changed, 38 insertions(+), 28 deletions(-)
Documentation/technical/api-diff.txt +2 -2
@@ -18,8 +18,8 @@ Calling sequence ---------------- * Prepare `struct diff_options` to record the set of diff options, and - then call `diff_setup()` to initialize this structure. This sets up - the vanilla default. + then call `repo_diff_setup()` to initialize this structure. This + sets up the vanilla default. * Fill in the options structure to specify desired output format, rename detection, etc. `diff_opt_parse()` can be used to parse options given
blame.c +11 -9
@@ -541,8 +541,9 @@ static int fill_blob_sha1_and_mode(struct repository *r,* We have an origin -- check if the same path exists in the * parent and return an origin structure to represent it. */ -static struct blame_origin *find_origin (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_origin (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin;struct diff_options diff_opts;
@@ -562,7 +563,7 @@ static struct blame_origin *find_origin(struct commit *parent,* and origin first. Most of the time they are the * same and diff-tree is fairly efficient about this. */ -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =0 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -629,14 +630,15 @@ static struct blame_origin *find_origin(struct commit *parent,* We have an origin -- find the path that corresponds to it in its * parent and return an origin structure to represent it. */ -static struct blame_origin *find_rename (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_rename (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin =NULL ;struct diff_options diff_opts;int i; -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =DIFF_DETECT_RENAME ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1260,7 +1262,7 @@ static void find_copy_in_parent(struct blame_scoreboard *sb,if (!unblamed)return ;/* nothing remains for this target */ -diff_setup (&diff_opts); +repo_diff_setup (sb->repo, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1442,7 +1444,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,* common cases, then we look for renames in the second pass. */ for (pass =0 ; pass <2 - sb->no_whole_file_rename; pass++) { -struct blame_origin *(*find)(struct commit *,struct blame_origin *); +struct blame_origin *(*find)(struct repository *,struct commit *,struct blame_origin *); find = pass ? find_rename : find_origin; for (i = 0, sg = first_scapegoat(revs, commit, sb->reverse);
@@ -1455,7 +1457,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,continue ;if (parse_commit (p))continue ; - porigin =find (p, origin); + porigin =find (sb->repo, p, origin);if (!porigin)continue ;if (!oidcmp (&porigin->blob_oid, &origin->blob_oid)) {
builtin/diff.c +1 -1
@@ -339,7 +339,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) }if (no_index)/* If this is a no-index diff, just run it and exit there. */ -diff_no_index (&rev, argc, argv); +diff_no_index (the_repository, &rev, argc, argv);/* Otherwise, we are doing the usual "git" diff */ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
builtin/log.c +1 -1
@@ -1361,7 +1361,7 @@ static void prepare_bases(struct base_tree_info *bases,return ;init_commit_base (&commit_base); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.flags.recursive =1 ;diff_setup_done (&diffopt);
builtin/merge.c +1 -1
@@ -452,7 +452,7 @@ static void finish(struct commit *head_commit, }if (new_head && show_diffstat) {struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.stat_width =-1 ;/* use full terminal width */ opts.stat_graph_width =-1 ;/* respect statGraphWidth config */ opts.output_format |=
builtin/range-diff.c +1 -1
@@ -34,7 +34,7 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)git_config (git_diff_ui_config,NULL ); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.output_format =DIFF_FORMAT_PATCH ; diffopt.flags.suppress_diff_headers =1 ; diffopt.output_prefix = output_prefix_cb;
diff-no-index.c +7 -2
@@ -233,7 +233,8 @@ static void fixup_paths(const char **path, struct strbuf *replacement) } } -void diff_no_index (struct rev_info *revs, +void diff_no_index (struct repository *r, +struct rev_info *revs,int argc,const char **argv) {int i;
@@ -241,7 +242,11 @@ void diff_no_index(struct rev_info *revs,struct strbuf replacement =STRBUF_INIT ;const char *prefix = revs->prefix; -diff_setup (&revs->diffopt); +/* +* FIXME: --no-index should not look at index and we should be +* able to pass NULL repo. Maybe later. +*/ +repo_diff_setup (r, &revs->diffopt);for (i =1 ; i < argc -2 ; ) {int j;if (!strcmp (argv[i],"--no-index" ))
diff.c +2 -2
@@ -4390,12 +4390,12 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)builtin_checkdiff (name, other, attr_path, p->one, p->two, o); } -void diff_setup (struct diff_options *options) +void repo_diff_setup (struct repository *r,struct diff_options *options) {memcpy (options, &default_diff_options,sizeof (*options)); options->file = stdout; - options->repo->index = &the_index; + options->repo = r; options->abbrev =DEFAULT_ABBREV ; options->line_termination ='\n' ;
diff.h +5 -2
@@ -336,7 +336,10 @@ int git_diff_basic_config(const char *var, const char *value, void *cb);int git_diff_heuristic_config (const char *var,const char *value,void *cb);void init_diff_ui_defaults (void );int git_diff_ui_config (const char *var,const char *value,void *cb); -void diff_setup (struct diff_options *); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define diff_setup (diffopts) repo_diff_setup(the_repository, diffopts) +#endif +void repo_diff_setup (struct repository *,struct diff_options *);int diff_opt_parse (struct diff_options *,const char **,int ,const char *);void diff_setup_done (struct diff_options *);int git_config_rename (const char *var,const char *value);
@@ -426,7 +429,7 @@ int diff_flush_patch_id(struct diff_options *, struct object_id *, int);int diff_result_code (struct diff_options *,int ); -void diff_no_index (struct rev_info *,int ,const char **); +void diff_no_index (struct repository *,struct rev_info *,int ,const char **);int index_differs_from (const char *def,const struct diff_flags *flags,int ita_invisible_in_index);
merge-recursive.c +1 -1
@@ -1812,7 +1812,7 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *o,struct diff_queue_struct *ret;struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.flags.recursive =1 ; opts.flags.rename_empty =0 ; opts.detect_rename =merge_detect_rename (o);
notes-merge.c +2 -2
@@ -126,7 +126,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,trace_printf ("\tdiff_tree_remote(base = %.7s, remote = %.7s)\n" ,oid_to_hex (base),oid_to_hex (remote)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
@@ -189,7 +189,7 @@ static void diff_tree_local(struct notes_merge_options *o,trace_printf ("\tdiff_tree_local(len = %i, base = %.7s, local = %.7s)\n" , len,oid_to_hex (base),oid_to_hex (local)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
patch-ids.c +1 -1
@@ -59,7 +59,7 @@ static int patch_id_cmp(const void *cmpfn_data,int init_patch_ids (struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -diff_setup (&ids->diffopts); +repo_diff_setup (the_repository, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
read-cache.c +1 -1
@@ -2137,7 +2137,7 @@ int index_has_changes(struct index_state *istate,if (tree || !get_oid_tree ("HEAD" , &cmp)) {struct diff_options opt; -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.exit_with_status =1 ;if (!sb) opt.flags.quick =1 ;
revision.c +1 -1
@@ -1468,7 +1468,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ; -diff_setup (&revs->diffopt); +repo_diff_setup (the_repository, &revs->diffopt);if (prefix && !revs->diffopt.prefix) { revs->diffopt.prefix = prefix; revs->diffopt.prefix_length =strlen (prefix);
tree-diff.c +1 -1
@@ -605,7 +605,7 @@ static void try_to_follow_renames(const struct object_id *old_oid, choice = q->queue[0 ]; q->nr =0 ; -diff_setup (&diff_opts); +repo_diff_setup (the_repository, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.flags.find_copies_harder =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 9/23 read-cache.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- read-cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
read-cache.c +2 -2
@@ -823,7 +823,7 @@ struct cache_entry *make_cache_entry(struct index_state *istate, ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); - ret =refresh_cache_entry (&the_index, ce, refresh_options); + ret =refresh_cache_entry (istate, ce, refresh_options);if (ret != ce)discard_cache_entry (ce);return ret;
@@ -1493,7 +1493,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,if (ignore_submodules &&S_ISGITLINK (ce->ce_mode))continue ; -if (pathspec && !ce_path_match (&the_index, ce, pathspec, seen)) +if (pathspec && !ce_path_match (istate, ce, pathspec, seen)) filtered =1 ;if (ce_stage (ce)) {
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 10/23 diff-lib.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- diff-lib.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
diff-lib.c +10 -7
@@ -70,7 +70,7 @@ static int match_stat_with_submodule(struct diff_options *diffopt, struct stat *st, unsigned ce_option, unsigned *dirty_submodule) { - int changed = ce_match_stat(ce, st, ce_option); + int changed = ie_match_stat(diffopt->repo->index, ce, st, ce_option);if (S_ISGITLINK (ce->ce_mode)) {struct diff_flags orig_flags = diffopt->flags;if (!diffopt->flags.override_submodule_config)
@@ -93,15 +93,16 @@ int run_diff_files(struct rev_info *revs, unsigned int option)unsigned ce_option = ((option &DIFF_RACY_IS_MODIFIED ) ?CE_MATCH_RACY_IS_DIRTY :0 );uint64_t start =getnanotime (); +struct index_state *istate = revs->diffopt.repo->index;diff_set_mnemonic_prefix (&revs->diffopt,"i/" ,"w/" );if (diff_unmerged_stage <0 ) diff_unmerged_stage =2 ; - entries = active_nr; + entries = istate->cache_nr;for (i =0 ; i < entries; i++) {unsigned int oldmode, newmode; -struct cache_entry *ce = active_cache[i]; +struct cache_entry *ce = istate->cache[i];int changed;unsigned dirty_submodule =0 ;const struct object_id *old_oid, *new_oid;
@@ -109,7 +110,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)if (diff_can_quit_early (&revs->diffopt))break ; -if (!ce_path_match (&the_index, ce, &revs->prune_data,NULL )) +if (!ce_path_match (istate, ce, &revs->prune_data,NULL ))continue ;if (ce_stage (ce)) {
@@ -145,7 +146,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) dpath->mode = wt_mode;while (i < entries) { -struct cache_entry *nce = active_cache[i]; +struct cache_entry *nce = istate->cache[i];int stage;if (strcmp (ce->name, nce->name))
@@ -474,7 +475,9 @@ static int oneway_diff(const struct cache_entry * const *src,if (tree == o->df_conflict_entry) tree =NULL ; -if (ce_path_match (&the_index, idx ? idx : tree, &revs->prune_data,NULL )) { +if (ce_path_match (revs->diffopt.repo->index, + idx ? idx : tree, + &revs->prune_data,NULL )) {do_oneway_diff (o, idx, tree);if (diff_can_quit_early (&revs->diffopt)) { o->exiting_early =1 ;
@@ -506,7 +509,7 @@ static int diff_cache(struct rev_info *revs, opts.merge =1 ; opts.fn = oneway_diff; opts.unpack_data = revs; - opts.src_index = &the_index; + opts.src_index = revs->diffopt.repo->index; opts.dst_index =NULL ; opts.pathspec = &revs->diffopt.pathspec; opts.pathspec->recursive =1 ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 11/23 ll-merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- apply.c | 9 ++++++--- builtin/checkout.c | 3 ++- diff.c | 2 +- ll-merge.c | 17 +++++++++-------- ll-merge.h | 5 ++++- merge-blobs.c | 3 ++- merge-recursive.c | 3 ++- notes-merge.c | 3 ++- rerere.c | 10 ++++++---- 9 files changed, 34 insertions(+), 21 deletions(-)
apply.c +6 -3
@@ -3467,7 +3467,8 @@ static int load_preimage(struct apply_state *state,return 0 ; } -static int three_way_merge(struct image *image, +static int three_way_merge(struct apply_state *state, + struct image *image, char *path, const struct object_id *base, const struct object_id *ours,
@@ -3483,7 +3484,9 @@ static int three_way_merge(struct image *image, status =ll_merge (&result, path, &base_file,"base" , &our_file,"ours" , - &their_file,"theirs" ,NULL ); + &their_file,"theirs" , + state->repo->index, +NULL );free (base_file.ptr);free (our_file.ptr);free (their_file.ptr);
@@ -3595,7 +3598,7 @@ static int try_threeway(struct apply_state *state,clear_image (&tmp_image);/* in-core three-way merge between post and our using pre as base */ - status =three_way_merge (image, patch->new_name, + status =three_way_merge (state, image, patch->new_name, &pre_oid, &our_oid, &post_oid);if (status <0 ) {if (state->apply_verbosity > verbosity_silent)
builtin/checkout.c +2 -1
@@ -208,7 +208,8 @@ static int checkout_merged(int pos, const struct checkout *state)* merge.renormalize set, too */ status =ll_merge (&result_buf, path, &ancestor,"base" , - &ours,"ours" , &theirs,"theirs" ,NULL ); + &ours,"ours" , &theirs,"theirs" , + state->istate,NULL );free (ancestor.ptr);free (ours.ptr);free (theirs.ptr);
diff.c +1 -1
@@ -3637,7 +3637,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, data.lineno =0 ; data.o = o; data.ws_rule =whitespace_rule (attr_path); - data.conflict_marker_size =ll_merge_marker_size (attr_path); + data.conflict_marker_size =ll_merge_marker_size (o->repo->index, attr_path);if (fill_mmfile (o->repo, &mf1, one) <0 ||fill_mmfile (o->repo, &mf2, two) <0 )
ll-merge.c +9 -8
@@ -336,10 +336,10 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attrreturn &ll_merge_drv[LL_TEXT_MERGE ]; } -static void normalize_file (mmfile_t *mm,const char *path) +static void normalize_file (mmfile_t *mm,const char *path,struct index_state *istate) {struct strbuf strbuf =STRBUF_INIT ; -if (renormalize_buffer (&the_index, path, mm->ptr, mm->size, &strbuf)) { +if (renormalize_buffer (istate, path, mm->ptr, mm->size, &strbuf)) {free (mm->ptr); mm->size = strbuf.len; mm->ptr =strbuf_detach (&strbuf,NULL );
@@ -351,6 +351,7 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts) { static struct attr_check *check;
@@ -363,15 +364,15 @@ int ll_merge(mmbuffer_t *result_buf, opts = &default_opts;if (opts->renormalize) { -normalize_file (ancestor, path); -normalize_file (ours, path); -normalize_file (theirs, path); +normalize_file (ancestor, path, istate); +normalize_file (ours, path, istate); +normalize_file (theirs, path, istate); }if (!check) check =attr_check_initl ("merge" ,"conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check)) { +if (!git_check_attr (istate, path, check)) { ll_driver_name = check->items[0 ].value;if (check->items[1 ].value) { marker_size =atoi (check->items[1 ].value);
@@ -391,14 +392,14 @@ int ll_merge(mmbuffer_t *result_buf, opts, marker_size); } -int ll_merge_marker_size (const char *path) +int ll_merge_marker_size (struct index_state *istate,const char *path) {static struct attr_check *check;int marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;if (!check) check =attr_check_initl ("conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check) && check->items[0 ].value) { +if (!git_check_attr (istate, path, check) && check->items[0 ].value) { marker_size =atoi (check->items[0 ].value);if (marker_size <=0 ) marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;
ll-merge.h +4 -1
@@ -7,6 +7,8 @@#include "xdiff/xdiff.h" +struct index_state ; +struct ll_merge_options {unsigned virtual_ancestor :1 ;unsigned variant :2 ;/* favor ours, favor theirs, or union merge */
@@ -19,8 +21,9 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts); -int ll_merge_marker_size (const char *path); +int ll_merge_marker_size (struct index_state *istate,const char *path);#endif
merge-blobs.c +2 -1
@@ -41,7 +41,8 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our* common ancestor. */ merge_status =ll_merge (&res, path, base,NULL , - our,".our" , their,".their" ,NULL ); + our,".our" , their,".their" , + &the_index,NULL );if (merge_status <0 )return NULL ;
merge-recursive.c +2 -1
@@ -1083,7 +1083,8 @@ static int merge_3way(struct merge_options *o,read_mmblob (&src2, &b->oid); merge_status =ll_merge (result_buf, a->path, &orig, base_name, - &src1, name1, &src2, name2, &ll_opts); + &src1, name1, &src2, name2, + &the_index, &ll_opts);free (base_name);free (name1);
notes-merge.c +2 -1
@@ -348,7 +348,8 @@ static int ll_merge_in_worktree(struct notes_merge_options *o,read_mmblob (&remote, &p->remote); status =ll_merge (&result_buf,oid_to_hex (&p->obj), &base,NULL , - &local, o->local_ref, &remote, o->remote_ref,NULL ); + &local, o->local_ref, &remote, o->remote_ref, + &the_index,NULL );free (base.ptr);free (local.ptr);
rerere.c +6 -4
@@ -478,7 +478,7 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output {int hunk_no =0 ;struct rerere_io_file io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);memset (&io,0 ,sizeof (io)); io.io.getline = rerere_file_getline;
@@ -641,7 +641,8 @@ static int try_merge(const struct rerere_id *id, const char *path,* A three-way merge. Note that this honors user-customizable * low-level merge driver settings. */ - ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" ,NULL ); + ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" , + &the_index,NULL );free (base.ptr);free (other.ptr);
@@ -960,7 +961,7 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpuconst struct cache_entry *ce;int pos, len, i, hunk_no;struct rerere_io_mem io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);/* * Reproduce the conflicted merge in-core
@@ -995,7 +996,8 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu*/ ll_merge (&result, path, &mmfile[0 ],NULL , &mmfile[1 ],"ours" , - &mmfile[2 ],"theirs" ,NULL ); + &mmfile[2 ],"theirs" , + &the_index,NULL );for (i =0 ; i <3 ; i++)free (mmfile[i].ptr);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 12/23 merge-blobs.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge-tree.c | 2 +- merge-blobs.c | 15 +++++++++++---- merge-blobs.h | 7 +++++-- 3 files changed, 17 insertions(+), 7 deletions(-)
builtin/merge-tree.c +1 -1
@@ -76,7 +76,7 @@ static void *result(struct merge_list *entry, unsigned long *size) their =NULL ;if (entry) their = entry->blob; -return merge_blobs (path, base, our, their, size); +return merge_blobs (&the_index, path, base, our, their, size); }static void *origin (struct merge_list *entry,unsigned long *size)
merge-blobs.c +11 -4
@@ -29,7 +29,12 @@ static void free_mmfile(mmfile_t *f)free (f->ptr); } -static void *three_way_filemerge (const char *path,mmfile_t *base,mmfile_t *our,mmfile_t *their,unsigned long *size) +static void *three_way_filemerge (struct index_state *istate, +const char *path, +mmfile_t *base, +mmfile_t *our, +mmfile_t *their, +unsigned long *size) {int merge_status;mmbuffer_t res;
@@ -42,7 +47,7 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our*/ merge_status =ll_merge (&res, path, base,NULL , our,".our" , their,".their" , - &the_index,NULL ); + istate,NULL );if (merge_status <0 )return NULL ;
@@ -50,7 +55,9 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *ourreturn res.ptr; } -void *merge_blobs (const char *path,struct blob *base,struct blob *our,struct blob *their,unsigned long *size) +void *merge_blobs (struct index_state *istate,const char *path, +struct blob *base,struct blob *our, +struct blob *their,unsigned long *size) {void *res =NULL ;mmfile_t f1, f2, common;
@@ -83,7 +90,7 @@ void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct common.ptr =xstrdup ("" ); common.size =0 ; } - res =three_way_filemerge (path, &common, &f1, &f2, size); + res =three_way_filemerge (istate, path, &common, &f1, &f2, size);free_mmfile (&common); out_free_f2_f1:free_mmfile (&f2);
merge-blobs.h +5 -2
@@ -1,8 +1,11 @@#ifndef MERGE_BLOBS_H #define MERGE_BLOBS_H -#include "blob.h" +struct blob ; +struct index_state ; -extern void *merge_blobs (const char *,struct blob *,struct blob *,struct blob *,unsigned long *); +extern void *merge_blobs (struct index_state *,const char *, +struct blob *,struct blob *, +struct blob *,unsigned long *);#endif /* MERGE_BLOBS_H */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 13/23 merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge.c | 8 +++++--- builtin/pull.c | 7 +++++-- cache.h | 6 ++++-- merge.c | 20 +++++++++++--------- sequencer.c | 6 +++--- 5 files changed, 28 insertions(+), 19 deletions(-)
builtin/merge.c +5 -3
@@ -728,8 +728,9 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,die (_ ("unable to write %s" ),get_index_file ());return clean ?0 :1 ; }else { -return try_merge_command (strategy, xopts_nr, xopts, - common, head_arg, remoteheads); +return try_merge_command (the_repository, + strategy, xopts_nr, xopts, + common, head_arg, remoteheads); } }
@@ -1470,7 +1471,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix) goto done; } -if (checkout_fast_forward (&head_commit->object.oid, +if (checkout_fast_forward (the_repository, + &head_commit->object.oid, &commit->object.oid, overwrite_ignore)) { ret =1 ;
builtin/pull.c +5 -2
@@ -562,7 +562,9 @@ static int pull_into_void(const struct object_id *merge_head,* index/worktree changes that the user already made on the unborn * branch. */ -if (checkout_fast_forward (the_hash_algo->empty_tree, merge_head,0 )) +if (checkout_fast_forward (the_repository, + the_hash_algo->empty_tree, + merge_head,0 ))return 1 ;if (update_ref ("initial pull" ,"HEAD" , merge_head, curr_head,0 ,UPDATE_REFS_DIE_ON_ERR ))
@@ -915,7 +917,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)"fast-forwarding your working tree from\n" "commit %s."), oid_to_hex(&orig_head)); -if (checkout_fast_forward (&orig_head, &curr_head,0 )) +if (checkout_fast_forward (the_repository, &orig_head, + &curr_head,0 )) die(_("Cannot fast-forward your working tree.\n" "After making sure that you saved anything precious from\n" "$ git diff %s\n"
cache.h +4 -2
@@ -1716,10 +1716,12 @@ extern struct startup_info *startup_info;/* merge.c */ struct commit_list ; -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes); -int checkout_fast_forward (const struct object_id *from, +int checkout_fast_forward (struct repository *r, +const struct object_id *from,const struct object_id *to,int overwrite_ignore);
merge.c +11 -9
@@ -14,7 +14,8 @@ static const char *merge_argument(struct commit *commit)return oid_to_hex (commit ? &commit->object.oid : the_hash_algo->empty_tree); } -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes) {
@@ -35,15 +36,16 @@ int try_merge_command(const char *strategy, size_t xopts_nr, ret =run_command_v_opt (args.argv,RUN_GIT_CMD );argv_array_clear (&args); -discard_cache (); -if (read_cache () <0 ) +discard_index (r->index); +if (read_index (r->index) <0 )die (_ ("failed to read the cache" )); -resolve_undo_clear (); +resolve_undo_clear_index (r->index);return ret; } -int checkout_fast_forward (const struct object_id *head, +int checkout_fast_forward (struct repository *r, +const struct object_id *head,const struct object_id *remote,int overwrite_ignore) {
@@ -54,7 +56,7 @@ int checkout_fast_forward(const struct object_id *head,struct dir_struct dir;struct lock_file lock_file =LOCK_INIT ; -refresh_cache (REFRESH_QUIET ); +refresh_index (r->index,REFRESH_QUIET ,NULL ,NULL ,NULL );if (hold_locked_index (&lock_file,LOCK_REPORT_ON_ERROR ) <0 )return -1 ;
@@ -86,8 +88,8 @@ int checkout_fast_forward(const struct object_id *head, } opts.head_idx =1 ; - opts.src_index = &the_index; - opts.dst_index = &the_index; + opts.src_index = r->index; + opts.dst_index = r->index; opts.update =1 ; opts.verbose_update =1 ; opts.merge =1 ;
@@ -101,7 +103,7 @@ int checkout_fast_forward(const struct object_id *head, }clear_unpack_trees_porcelain (&opts); -if (write_locked_index (&the_index, &lock_file,COMMIT_LOCK )) +if (write_locked_index (r->index, &lock_file,COMMIT_LOCK ))return error (_ ("unable to write new index file" ));return 0 ; }
sequencer.c +3 -3
@@ -470,8 +470,8 @@ static int fast_forward_to(const struct object_id *to, const struct object_id *fstruct strbuf sb =STRBUF_INIT ;struct strbuf err =STRBUF_INIT ; -read_cache (); -if (checkout_fast_forward (from, to,1 )) +read_index (&the_index); +if (checkout_fast_forward (the_repository, from, to,1 ))return -1 ;/* the callee should have complained already */ strbuf_addf (&sb,_ ("%s: fast-forward" ),_ (action_name (opts)));
@@ -1798,7 +1798,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,commit_list_insert (base, &common);commit_list_insert (next, &remotes); - res |=try_merge_command (opts->strategy, + res |=try_merge_command (the_repository, opts->strategy, opts->xopts_nr, (const char **)opts->xopts, common,oid_to_hex (&head), remotes);free_commit_list (common);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 14/23 patch-ids.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/log.c | 2 +- patch-ids.c | 4 ++-- patch-ids.h | 3 ++- revision.c | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-)
builtin/log.c +1 -1
@@ -914,7 +914,7 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)if ((flags1 &UNINTERESTING ) == (flags2 &UNINTERESTING ))die (_ ("Not a range." )); -init_patch_ids (ids); +init_patch_ids (the_repository, ids);/* given a range a..b get all patch ids for b..a */ init_revisions (&check_rev, rev->prefix);
patch-ids.c +2 -2
@@ -56,10 +56,10 @@ static int patch_id_cmp(const void *cmpfn_data,return oidcmp (&a->patch_id, &b->patch_id); } -int init_patch_ids (struct patch_ids *ids) +int init_patch_ids (struct repository *r,struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -repo_diff_setup (the_repository, &ids->diffopts); +repo_diff_setup (r, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
patch-ids.h +2 -1
@@ -6,6 +6,7 @@struct commit ;struct object_id ; +struct repository ;struct patch_id {struct hashmap_entry ent;
@@ -20,7 +21,7 @@ struct patch_ids {int commit_patch_id (struct commit *commit,struct diff_options *options,struct object_id *oid,int ); -int init_patch_ids (struct patch_ids *); +int init_patch_ids (struct repository *,struct patch_ids *);int free_patch_ids (struct patch_ids *);struct patch_id *add_commit_patch_id (struct commit *,struct patch_ids *);struct patch_id *has_commit_patch_id (struct commit *,struct patch_ids *);
revision.c +1 -1
@@ -877,7 +877,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)return ; left_first = left_count < right_count; -init_patch_ids (&ids); +init_patch_ids (the_repository, &ids); ids.diffopts.pathspec = revs->diffopt.pathspec;/* Compute patch-ids for one side */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 15/23 sha1-file.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/difftool.c | 2 +- builtin/hash-object.c | 2 +- builtin/replace.c | 2 +- builtin/update-index.c | 2 +- cache.h | 4 ++-- diff.c | 20 ++++++++--------- notes-merge.c | 2 +- read-cache.c | 25 ++++++++++++--------- sha1-file.c | 50 ++++++++++++++++++++++++------------------ 9 files changed, 61 insertions(+), 48 deletions(-)
builtin/difftool.c +1 -1
@@ -112,7 +112,7 @@ static int use_wt_file(const char *workdir, const char *name,int fd =open (buf.buf,O_RDONLY );if (fd >=0 && - !index_fd (&wt_oid, fd, &st,OBJ_BLOB , name,0 )) { + !index_fd (&the_index, &wt_oid, fd, &st,OBJ_BLOB , name,0 )) {if (is_null_oid (oid)) {oidcpy (oid, &wt_oid); use =1 ;
builtin/hash-object.c +1 -1
@@ -40,7 +40,7 @@ static void hash_fd(int fd, const char *type, const char *path, unsigned flags,if (fstat (fd, &st) <0 || (literally ?hash_literally (&oid, fd, type, flags) - :index_fd (&oid, fd, &st,type_from_string (type), path, flags))) + :index_fd (&the_index, &oid, fd, &st,type_from_string (type), path, flags)))die ((flags &HASH_WRITE_OBJECT ) ?"Unable to add %s to database" :"Unable to hash %s" , path);
builtin/replace.c +1 -1
@@ -295,7 +295,7 @@ static int import_object(struct object_id *oid, enum object_type type,close (fd);return -1 ; } -if (index_fd (oid, fd, &st, type,NULL , flags) <0 ) +if (index_fd (&the_index, oid, fd, &st, type,NULL , flags) <0 )return error (_ ("unable to write object to database" ));/* index_fd close()s fd for us */ }
builtin/update-index.c +1 -1
@@ -282,7 +282,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int lenfill_stat_cache_info (ce, st); ce->ce_mode =ce_mode_from_stat (old, st->st_mode); -if (index_path (&ce->oid, path, st, +if (index_path (&the_index, &ce->oid, path, st, info_only ?0 :HASH_WRITE_OBJECT )) {discard_cache_entry (ce);return -1 ;
cache.h +2 -2
@@ -787,8 +787,8 @@ extern int ie_modified(struct index_state *, const struct cache_entry *, struct#define HASH_WRITE_OBJECT 1#define HASH_FORMAT_CHECK 2#define HASH_RENORMALIZE 4 -extern int index_fd (struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); -extern int index_path (struct object_id *oid,const char *path,struct stat *st,unsigned flags); +extern int index_fd (struct index_state *istate,struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); +extern int index_path (struct index_state *istate,struct object_id *oid,const char *path,struct stat *st,unsigned flags);/* * Record to sd the data from st that we use to check whether a file
diff.c +10 -10
@@ -4252,7 +4252,7 @@ static void run_diff_cmd(const char *pgm,fprintf (o->file,"* Unmerged path %s\n" , name); } -static void diff_fill_oid_info (struct diff_filespec *one) +static void diff_fill_oid_info (struct diff_filespec *one,struct index_state *istate) {if (DIFF_FILE_VALID (one)) {if (!one->oid_valid) {
@@ -4263,7 +4263,7 @@ static void diff_fill_oid_info(struct diff_filespec *one) }if (lstat (one->path, &st) <0 )die_errno ("stat '%s'" , one->path); -if (index_path (&one->oid, one->path, &st,0 )) +if (index_path (istate, &one->oid, one->path, &st,0 ))die ("cannot hash %s" , one->path); } }
@@ -4311,8 +4311,8 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)return ; } -diff_fill_oid_info (one); -diff_fill_oid_info (two); +diff_fill_oid_info (one, o->repo->index); +diff_fill_oid_info (two, o->repo->index); if (!pgm && DIFF_FILE_VALID(one) && DIFF_FILE_VALID(two) &&
@@ -4359,8 +4359,8 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_diffstat (name, other, p->one, p->two, diffstat, o, p);
@@ -4384,8 +4384,8 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_checkdiff (name, other, attr_path, p->one, p->two, o); }
@@ -5685,8 +5685,8 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oidif (DIFF_PAIR_UNMERGED (p))continue ; -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, options->repo->index); +diff_fill_oid_info (p->two, options->repo->index); len1 =remove_space (p->one->path,strlen (p->one->path)); len2 =remove_space (p->two->path,strlen (p->two->path));
notes-merge.c +1 -1
@@ -710,7 +710,7 @@ int notes_merge_commit(struct notes_merge_options *o,/* write file as blob, and add to partial_tree */ if (stat (path.buf, &st))die_errno ("Failed to stat '%s'" , path.buf); -if (index_path (&blob_oid, path.buf, &st,HASH_WRITE_OBJECT )) +if (index_path (&the_index, &blob_oid, path.buf, &st,HASH_WRITE_OBJECT ))die ("Failed to write blob object from '%s'" , path.buf);if (add_note (partial_tree, &obj_oid, &blob_oid,NULL )) die("Failed to add resolved note '%s' to notes tree",
read-cache.c +15 -10
@@ -205,14 +205,16 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) } } -static int ce_compare_data (const struct cache_entry *ce,struct stat *st) +static int ce_compare_data (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {int match =-1 ;int fd =git_open_cloexec (ce->name,O_RDONLY );if (fd >=0 ) {struct object_id oid; -if (!index_fd (&oid, fd, st,OBJ_BLOB , ce->name,0 )) +if (!index_fd (istate, &oid, fd, st,OBJ_BLOB , ce->name,0 )) match =oidcmp (&oid, &ce->oid);/* index_fd() closed the file descriptor already */ }
@@ -257,11 +259,13 @@ static int ce_compare_gitlink(const struct cache_entry *ce)return oidcmp (&oid, &ce->oid); } -static int ce_modified_check_fs (const struct cache_entry *ce,struct stat *st) +static int ce_modified_check_fs (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {switch (st->st_mode &S_IFMT ) {case S_IFREG : -if (ce_compare_data (ce, st)) +if (ce_compare_data (istate, ce, st))return DATA_CHANGED ;break ;case S_IFLNK :
@@ -407,7 +411,7 @@ int ie_match_stat(struct index_state *istate,if (assume_racy_is_modified) changed |=DATA_CHANGED ;else - changed |=ce_modified_check_fs (ce, st); + changed |=ce_modified_check_fs (istate, ce, st); }return changed;
@@ -447,7 +451,7 @@ int ie_modified(struct index_state *istate, (S_ISGITLINK(ce->ce_mode) || ce->ce_stat_data.sd_size != 0))return changed; - changed_fs =ce_modified_check_fs (ce, st); + changed_fs =ce_modified_check_fs (istate, ce, st);if (changed_fs)return changed | changed_fs;return 0 ;
@@ -753,7 +757,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, } }if (!intent_only) { -if (index_path (&ce->oid, path, st, newflags)) { +if (index_path (istate, &ce->oid, path, st, newflags)) {discard_cache_entry (ce);return error ("unable to index file %s" , path); }
@@ -2230,7 +2234,8 @@ static int ce_flush(git_hash_ctx *context, int fd, unsigned char *hash)return (write_in_full (fd, write_buffer, left) <0 ) ?-1 :0 ; } -static void ce_smudge_racily_clean_entry (struct cache_entry *ce) +static void ce_smudge_racily_clean_entry (struct index_state *istate, +struct cache_entry *ce) {/* * The only thing we care about in this function is to smudge the
@@ -2249,7 +2254,7 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce)return ;if (ce_match_stat_basic (ce, &st))return ; -if (ce_modified_check_fs (ce, &st)) { +if (ce_modified_check_fs (istate, ce, &st)) {/* This is "racily clean"; smudge it. Note that this * is a tricky code. At first glance, it may appear * that it can break with this sequence:
@@ -2494,7 +2499,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,if (ce->ce_flags &CE_REMOVE )continue ;if (!ce_uptodate (ce) &&is_racy_timestamp (istate, ce)) -ce_smudge_racily_clean_entry (ce); +ce_smudge_racily_clean_entry (istate, ce);if (is_null_oid (&ce->oid)) {static const char msg[] ="cache entry has null sha1: %s" ;static int allow =-1 ;
sha1-file.c +29 -21
134 lines not on this page · raw message
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 16/23 rerere.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyThe reason rerere(), rerere_forget() and rerere_remaining() take a struct repository instead of struct index_state is not obvious from the patch:
Deep in update_paths() and find_conflict(), hold_locked_index() and read_index() are called. These functions assumes the index path at $GIT_DIR/index which is not always true when you take an arbitrary index state. Taking a repository will allow us to point to the right index path later when we replace them with repo_ versions.
--- apply.c | 2 +- builtin/am.c | 4 +- builtin/commit.c | 2 +- builtin/merge.c | 2 +- builtin/rerere.c | 6 +-- rerere.c | 119 +++++++++++++++++++++++++---------------------- rerere.h | 10 ++-- sequencer.c | 4 +- 8 files changed, 81 insertions(+), 68 deletions(-)
apply.c +1 -1
@@ -4630,7 +4630,7 @@ static int write_out_results(struct apply_state *state, struct patch *list) }string_list_clear (&cpath,0 ); -rerere (0 ); +repo_rerere (state->repo,0 ); }return errs;
builtin/am.c +2 -2
@@ -1603,7 +1603,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa o.verbosity =0 ;if (merge_recursive_generic (&o, &our_tree, &their_tree,1 , bases, &result)) { -rerere (state->allow_rerere_autoupdate); +repo_rerere (the_repository, state->allow_rerere_autoupdate);free (their_tree_name);return error (_ ("Failed to merge in the changes." )); }
@@ -1898,7 +1898,7 @@ static void am_resolve(struct am_state *state) goto next; } -rerere (0 ); +repo_rerere (the_repository,0 );do_commit (state);
builtin/commit.c +1 -1
@@ -1651,7 +1651,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)"new_index file. Check that disk is not full and quota is\n" "not exceeded, and then \"git reset HEAD\" to recover.")); -rerere (0 ); +repo_rerere (the_repository,0 );run_command_v_opt (argv_gc_auto,RUN_GIT_CMD );run_commit_hook (use_editor,get_index_file (),"post-commit" ,NULL );if (amend && !no_post_rewrite) {
builtin/merge.c +1 -1
@@ -899,7 +899,7 @@ static int suggest_conflicts(void)fputs (msgbuf.buf, fp);strbuf_release (&msgbuf);fclose (fp); -rerere (allow_rerere_auto); +repo_rerere (the_repository, allow_rerere_auto);printf (_ ("Automatic merge failed; " "fix conflicts and then commit the result.\n" ));return 1 ;
builtin/rerere.c +3 -3
@@ -70,7 +70,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix) flags =RERERE_NOAUTOUPDATE ;if (argc <1 ) -return rerere (flags); +return repo_rerere (the_repository, flags);if (!strcmp (argv[0 ],"forget" )) {struct pathspec pathspec;
@@ -78,7 +78,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)warning ("'git rerere forget' without paths is deprecated" );parse_pathspec (&pathspec,0 ,PATHSPEC_PREFER_CWD , prefix, argv +1 ); -return rerere_forget (&pathspec); +return rerere_forget (the_repository, &pathspec); }if (!strcmp (argv[0 ],"clear" )) {
@@ -91,7 +91,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)for (i =0 ; i < merge_rr.nr; i++)printf ("%s\n" , merge_rr.items[i].string); }else if (!strcmp (argv[0 ],"remaining" )) { -rerere_remaining (&merge_rr); +rerere_remaining (the_repository, &merge_rr);for (i =0 ; i < merge_rr.nr; i++) {if (merge_rr.items[i].util !=RERERE_RESOLVED )printf ("%s\n" , merge_rr.items[i].string);
rerere.c +64 -55
361 lines not on this page · raw message
rerere.h +7 -3
@@ -4,6 +4,7 @@#include "string-list.h" struct pathspec ; +struct repository ;#define RERERE_AUTOUPDATE 01#define RERERE_NOAUTOUPDATE 02
@@ -23,7 +24,10 @@ struct rerere_id { };int setup_rerere (struct string_list *,int ); -int rerere (int ); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define rerere (flags) repo_rerere(the_repository, flags) +#endif +int repo_rerere (struct repository *,int );/* * Given the conflict ID and the name of a "file" used for replaying * the recorded resolution (e.g. "preimage", "postimage"), return the
@@ -31,8 +35,8 @@ int rerere(int);* return the path to the directory that houses these files. */ const char *rerere_path (const struct rerere_id *,const char *file); -int rerere_forget (struct pathspec *); -int rerere_remaining (struct string_list *); +int rerere_forget (struct repository *,struct pathspec *); +int rerere_remaining (struct repository *,struct string_list *);void rerere_clear (struct string_list *);void rerere_gc (struct string_list *);
sequencer.c +2 -2
@@ -1827,7 +1827,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit, : _("could not apply %s... %s"), short_commit_name(commit), msg.subject);print_advice (res ==1 , opts); -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto); goto leave; }
@@ -3146,7 +3146,7 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,rollback_lock_file (&lock);if (ret) -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto);else /* * In case of problems, we now want to return a positive
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 17/23 userdiff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- archive-zip.c | 14 +++++++++----- builtin/grep.c | 3 ++- combine-diff.c | 2 +- diff.c | 40 +++++++++++++++++++++++----------------- diff.h | 3 ++- diffcore-pickaxe.c | 4 ++-- grep.c | 21 ++++++++++++--------- grep.h | 3 ++- line-range.c | 2 +- userdiff.c | 5 +++-- userdiff.h | 3 ++- 11 files changed, 59 insertions(+), 41 deletions(-)
archive-zip.c +9 -5
@@ -264,9 +264,10 @@ static int has_only_ascii(const char *s) } } -static int entry_is_binary (const char *path,const void *buffer,size_t size) +static int entry_is_binary (struct index_state *istate,const char *path, +const void *buffer,size_t size) { -struct userdiff_driver *driver =userdiff_find_by_path (path); +struct userdiff_driver *driver =userdiff_find_by_path (istate, path);if (!driver) driver =userdiff_find_by_name ("default" );if (driver->binary !=-1 )
@@ -352,7 +353,8 @@ static int write_zip_entry(struct archiver_args *args,return error (_ ("cannot read %s" ),oid_to_hex (oid)); crc =crc32 (crc, buffer, size); - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buffer, size); out = buffer; }
@@ -428,7 +430,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen);write_or_die (1 , buf, readlen); }
@@ -460,7 +463,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen); zstream.next_in = buf;
builtin/grep.c +2 -1
@@ -103,7 +103,8 @@ static void add_work(struct grep_opt *opt, const struct grep_source *gs) todo[todo_end].source = *gs;if (opt->binary !=GREP_BINARY_TEXT ) -grep_source_load_driver (&todo[todo_end].source); +grep_source_load_driver (&todo[todo_end].source, + opt->repo->index); todo[todo_end].done =0 ;strbuf_reset (&todo[todo_end].out); todo_end = (todo_end +1 ) %ARRAY_SIZE (todo);
combine-diff.c +1 -1
@@ -987,7 +987,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,const char *line_prefix =diff_line_prefix (opt); context = opt->context; - userdiff =userdiff_find_by_path (elem->path); + userdiff =userdiff_find_by_path (opt->repo->index, elem->path);if (!userdiff) userdiff =userdiff_find_by_name ("default" );if (opt->flags.allow_textconv)
diff.c +23 -17
@@ -2093,23 +2093,25 @@ static void diff_words_flush(struct emit_callback *ecbdata) } } -static void diff_filespec_load_driver (struct diff_filespec *one) +static void diff_filespec_load_driver (struct diff_filespec *one, +struct index_state *istate) {/* Use already-loaded driver */ if (one->driver)return ;if (S_ISREG (one->mode)) - one->driver =userdiff_find_by_path (one->path); + one->driver =userdiff_find_by_path (istate, one->path);/* Fallback to default settings */ if (!one->driver) one->driver =userdiff_find_by_name ("default" ); } -static const char *userdiff_word_regex (struct diff_filespec *one) +static const char *userdiff_word_regex (struct diff_filespec *one, +struct index_state *istate) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return one->driver->word_regex; }
@@ -2132,9 +2134,9 @@ static void init_diff_words_data(struct emit_callback *ecbdata,xcalloc (1 ,sizeof (struct emitted_diff_symbols ));if (!o->word_regex) - o->word_regex =userdiff_word_regex (one); + o->word_regex =userdiff_word_regex (one, o->repo->index);if (!o->word_regex) - o->word_regex =userdiff_word_regex (two); + o->word_regex =userdiff_word_regex (two, o->repo->index);if (!o->word_regex) o->word_regex = diff_word_regex_cfg;if (o->word_regex) {
@@ -3257,7 +3259,7 @@ int diff_filespec_is_binary(struct repository *r, struct diff_filespec *one) {if (one->is_binary ==-1 ) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, r->index);if (one->driver->binary !=-1 ) one->is_binary = one->driver->binary;else {
@@ -3273,9 +3275,10 @@ int diff_filespec_is_binary(struct repository *r,return one->is_binary; } -static const struct userdiff_funcname *diff_funcname_pattern (struct diff_filespec *one) +static const struct userdiff_funcname * +diff_funcname_pattern (struct diff_options *o,struct diff_filespec *one) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, o->repo->index);return one->driver->funcname.pattern ? &one->driver->funcname :NULL ; }
@@ -3287,12 +3290,13 @@ void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const options->b_prefix = b; } -struct userdiff_driver *get_textconv (struct diff_filespec *one) +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one) {if (!DIFF_FILE_VALID (one))return NULL ; -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return userdiff_get_textconv (one->driver); }
@@ -3342,8 +3346,8 @@ static void builtin_diff(const char *name_a, }if (o->flags.allow_textconv) { - textconv_one =get_textconv (one); - textconv_two =get_textconv (two); + textconv_one =get_textconv (o->repo->index, one); + textconv_two =get_textconv (o->repo->index, two); }/* Never use a non-valid filename anywhere if at all possible */
@@ -3465,9 +3469,9 @@ static void builtin_diff(const char *name_a, mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); - pe =diff_funcname_pattern (one); + pe =diff_funcname_pattern (o, one);if (!pe) - pe =diff_funcname_pattern (two); + pe =diff_funcname_pattern (o, two);memset (&xpp,0 ,sizeof (xpp));memset (&xecfg,0 ,sizeof (xecfg));
@@ -4223,7 +4227,9 @@ static void run_diff_cmd(const char *pgm,if (o->flags.allow_external) { -struct userdiff_driver *drv =userdiff_find_by_path (attr_path); +struct userdiff_driver *drv; + + drv =userdiff_find_by_path (o->repo->index, attr_path);if (drv && drv->external) pgm = drv->external; }
@@ -6399,7 +6405,7 @@ int textconv_object(struct repository *r, df =alloc_filespec (path);fill_filespec (df, oid, oid_valid, mode); - textconv =get_textconv (df); + textconv =get_textconv (r->index, df);if (!textconv) {free_filespec (df);return 0 ;
diff.h +2 -1
@@ -455,7 +455,8 @@ size_t fill_textconv(struct repository *r,* and only if it has textconv enabled (otherwise return NULL). The result * can be passed to fill_textconv(). */ -struct userdiff_driver *get_textconv (struct diff_filespec *one); +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one);/* * Prepare diff_filespec and convert it using diff textconv API
diffcore-pickaxe.c +2 -2
@@ -139,8 +139,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,return 0 ;if (o->flags.allow_textconv) { - textconv_one =get_textconv (p->one); - textconv_two =get_textconv (p->two); + textconv_one =get_textconv (o->repo->index, p->one); + textconv_two =get_textconv (o->repo->index, p->two); }/*
grep.c +12 -9
@@ -11,7 +11,8 @@#include "help.h" static int grep_source_load (struct grep_source *gs); -static int grep_source_is_binary (struct grep_source *gs); +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate);static struct grep_opt grep_defaults;
@@ -1547,7 +1548,7 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo {xdemitconf_t *xecfg = opt->priv;if (xecfg && !xecfg->find_func) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);if (gs->driver->funcname.pattern) {const struct userdiff_funcname *pe = &gs->driver->funcname;xdiff_set_find_func (xecfg, pe->pattern, pe->cflags);
@@ -1804,7 +1805,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle opt->last_shown =0 ;if (opt->allow_textconv) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);/* * We might set up the shared textconv cache data here, which * is not thread-safe.
@@ -1821,11 +1822,11 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colleif (!textconv) {switch (opt->binary) {case GREP_BINARY_DEFAULT : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index)) binary_match_only =1 ;break ;case GREP_BINARY_NOMATCH : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index))return 0 ;/* Assume unmatch */ break ;case GREP_BINARY_TEXT :
@@ -2171,22 +2172,24 @@ static int grep_source_load(struct grep_source *gs)BUG ("invalid grep_source type to load" ); } -void grep_source_load_driver (struct grep_source *gs) +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate) {if (gs->driver)return ;grep_attr_lock ();if (gs->path) - gs->driver =userdiff_find_by_path (gs->path); + gs->driver =userdiff_find_by_path (istate, gs->path);if (!gs->driver) gs->driver =userdiff_find_by_name ("default" );grep_attr_unlock (); } -static int grep_source_is_binary (struct grep_source *gs) +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, istate);if (gs->driver->binary !=-1 )return gs->driver->binary;
grep.h +2 -1
@@ -220,7 +220,8 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type, const void *identifier);void grep_source_clear_data (struct grep_source *gs);void grep_source_clear (struct grep_source *gs); -void grep_source_load_driver (struct grep_source *gs); +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate);int grep_source (struct grep_opt *opt,struct grep_source *gs);
line-range.c +1 -1
@@ -198,7 +198,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (path); + drv =userdiff_find_by_path (&the_index, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
userdiff.c +3 -2
@@ -270,7 +270,8 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {return userdiff_find_by_namelen (name, len); } -struct userdiff_driver *userdiff_find_by_path (const char *path) +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path) {static struct attr_check *check;
@@ -278,7 +279,7 @@ struct userdiff_driver *userdiff_find_by_path(const char *path) check =attr_check_initl ("diff" ,NULL );if (!path)return NULL ; -if (git_check_attr (&the_index, path, check)) +if (git_check_attr (istate, path, check))return NULL ;if (ATTR_TRUE (check->items[0 ].value))
userdiff.h +2 -1
@@ -21,7 +21,8 @@ struct userdiff_driver {int userdiff_config (const char *k,const char *v);struct userdiff_driver *userdiff_find_by_name (const char *name); -struct userdiff_driver *userdiff_find_by_path (const char *path); +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path);/* * Initialize any textconv-related fields in the driver and return it, or NULL
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 18/23 line-range.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/blame.c | 2 +- line-log.c | 4 ++-- line-range.c | 22 ++++++++++++++-------- line-range.h | 6 ++++-- 4 files changed, 21 insertions(+), 13 deletions(-)
builtin/blame.c +1 -1
@@ -1001,7 +1001,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)long bottom, top;if (parse_range_arg (range_list.items[range_i].string, nth_line_cb, &sb, lno, anchor, - &bottom, &top, sb.path)) + &bottom, &top, sb.path, &the_index))usage (blame_usage);if ((!lno && (top || bottom)) || lno < bottom) die(Q_("file %s has only %lu line",
line-log.c +2 -2
@@ -574,7 +574,7 @@ parse_lines(struct repository *r, struct commit *commit,long begin =0 , end =0 ;long anchor; - name_part =skip_range_arg (item->string); + name_part =skip_range_arg (item->string, r->index);if (!name_part || *name_part !=':' || !name_part[1 ])die ("-L argument not 'start,end:file' or ':funcname:file': %s" , item->string);
@@ -599,7 +599,7 @@ parse_lines(struct repository *r, struct commit *commit,if (parse_range_arg (range_part, nth_line, &cb_data, lines, anchor, &begin, &end, - full_name)) + full_name, r->index))die ("malformed -L argument '%s'" , range_part);if ((!lines && (begin || end)) || lines < begin)die ("file %s has only %lu lines" , name_part, lines);
line-range.c +14 -8
@@ -163,9 +163,10 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char } } -static const char *parse_range_funcname (const char *arg,nth_line_fn_t nth_line_cb, -void *cb_data,long lines,long anchor,long *begin,long *end, -const char *path) +static const char *parse_range_funcname ( +const char *arg,nth_line_fn_t nth_line_cb, +void *cb_data,long lines,long anchor,long *begin,long *end, +const char *path,struct index_state *istate) {char *pattern;const char *term;
@@ -198,7 +199,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (&the_index, path); + drv =userdiff_find_by_path (istate, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
@@ -244,7 +245,8 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_int parse_range_arg (const char *arg,nth_line_fn_t nth_line_cb,void *cb_data,long lines,long anchor, -long *begin,long *end,const char *path) +long *begin,long *end, +const char *path,struct index_state *istate) { *begin = *end =0 ;
@@ -254,7 +256,9 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb, anchor = lines +1 ;if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) { - arg =parse_range_funcname (arg, nth_line_cb, cb_data, lines, anchor, begin, end, path); + arg =parse_range_funcname (arg, nth_line_cb, cb_data, + lines, anchor, begin, end, + path, istate);if (!arg || *arg)return -1 ;return 0 ;
@@ -275,10 +279,12 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,return 0 ; } -const char *skip_range_arg (const char *arg) +const char *skip_range_arg (const char *arg,struct index_state *istate) {if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) -return parse_range_funcname (arg,NULL ,NULL ,0 ,0 ,NULL ,NULL ,NULL ); +return parse_range_funcname (arg,NULL ,NULL , +0 ,0 ,NULL ,NULL , +NULL , istate); arg =parse_loc (arg,NULL ,NULL ,0 ,-1 ,NULL );
line-range.h +4 -2
@@ -1,6 +1,8 @@#ifndef LINE_RANGE_H #define LINE_RANGE_H +struct index_state ; +/* * Parse one item in an -L begin,end option w.r.t. the notional file * object 'cb_data' consisting of 'lines' lines.
@@ -23,7 +25,7 @@ int parse_range_arg(const char *arg,nth_line_fn_t nth_line_cb, void *cb_data, long lines, long anchor, long *begin, long *end, - const char *path); + const char *path, struct index_state *istate);/* * Scan past a range argument that could be parsed by
@@ -34,6 +36,6 @@ int parse_range_arg(const char *arg,* NULL in case the argument is obviously malformed. */ -const char *skip_range_arg (const char *arg); +const char *skip_range_arg (const char *arg,struct index_state *istate);#endif /* LINE_RANGE_H */
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 19/23 submodule.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/pull.c | 2 +- submodule.c | 28 +++++++++++++++++----------- submodule.h | 9 ++++++--- transport.c | 9 ++++++--- 4 files changed, 30 insertions(+), 18 deletions(-)
builtin/pull.c +1 -1
@@ -944,7 +944,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix)int ret =0 ;if ((recurse_submodules ==RECURSE_SUBMODULES_ON || recurse_submodules ==RECURSE_SUBMODULES_ON_DEMAND ) && -submodule_touches_in_range (&rebase_fork_point, &curr_head)) +submodule_touches_in_range (&the_index, &rebase_fork_point, &curr_head))die (_ ("cannot rebase with locally recorded submodule modifications" ));if (!autostash) {struct commit_list *list =NULL ;
submodule.c +17 -11
@@ -766,7 +766,8 @@ static void collect_changed_submodules_cb(struct diff_queue_struct *q,* have a corresponding 'struct oid_array' (in the 'util' field) which lists * what the submodule pointers were updated to during the change. */ -static void collect_changed_submodules (struct string_list *changed, +static void collect_changed_submodules (struct index_state *istate, +struct string_list *changed,struct argv_array *argv) {struct rev_info rev;
@@ -930,8 +931,10 @@ static int submodule_needs_pushing(const char *path, struct oid_array *commits)return 0 ; } -int find_unpushed_submodules (struct oid_array *commits, -const char *remotes_name,struct string_list *needs_pushing) +int find_unpushed_submodules (struct index_state *istate, +struct oid_array *commits, +const char *remotes_name, +struct string_list *needs_pushing) {struct string_list submodules =STRING_LIST_INIT_DUP ;struct string_list_item *name;
@@ -943,7 +946,7 @@ int find_unpushed_submodules(struct oid_array *commits,argv_array_push (&argv,"--not" );argv_array_pushf (&argv,"--remotes=%s" , remotes_name); -collect_changed_submodules (&submodules, &argv); +collect_changed_submodules (istate, &submodules, &argv);for_each_string_list_item (name, &submodules) {struct oid_array *commits = name->util;
@@ -1044,7 +1047,8 @@ static void submodule_push_check(const char *path, const char *head,die ("process for submodule '%s' failed" , path); } -int push_unpushed_submodules(struct oid_array *commits, +int push_unpushed_submodules(struct index_state *istate, + struct oid_array *commits, const struct remote *remote, const struct refspec *rs, const struct string_list *push_options,
@@ -1053,7 +1057,8 @@ int push_unpushed_submodules(struct oid_array *commits,int i, ret =1 ;struct string_list needs_pushing =STRING_LIST_INIT_DUP ; -if (!find_unpushed_submodules (commits, remote->name, &needs_pushing)) +if (!find_unpushed_submodules (istate, commits, + remote->name, &needs_pushing))return 1 ;/*
@@ -1110,7 +1115,7 @@ void check_for_new_submodule_commits(struct object_id *oid)oid_array_append (&ref_tips_after_fetch, oid); } -static void calculate_changed_submodule_paths (void ) +static void calculate_changed_submodule_paths (struct index_state *istate) {struct argv_array argv =ARGV_ARRAY_INIT ;struct string_list changed_submodules =STRING_LIST_INIT_DUP ;
@@ -1131,7 +1136,7 @@ static void calculate_changed_submodule_paths(void)* Collect all submodules (whether checked out or not) for which new * commits have been recorded upstream in "changed_submodule_names". */ -collect_changed_submodules (&changed_submodules, &argv); +collect_changed_submodules (istate, &changed_submodules, &argv);for_each_string_list_item (name, &changed_submodules) {struct oid_array *commits = name->util;
@@ -1158,7 +1163,8 @@ static void calculate_changed_submodule_paths(void) initialized_fetch_ref_tips =0 ; } -int submodule_touches_in_range (struct object_id *excl_oid, +int submodule_touches_in_range (struct index_state *istate, +struct object_id *excl_oid,struct object_id *incl_oid) {struct string_list subs =STRING_LIST_INIT_DUP ;
@@ -1176,7 +1182,7 @@ int submodule_touches_in_range(struct object_id *excl_oid,argv_array_push (&args,oid_to_hex (excl_oid)); } -collect_changed_submodules (&subs, &args); +collect_changed_submodules (istate, &subs, &args); ret = subs.nr;argv_array_clear (&args);
@@ -1346,7 +1352,7 @@ int fetch_populated_submodules(struct repository *r,argv_array_push (&spf.args,"--recurse-submodules-default" );/* default value, "--submodule-prefix" and its value are added later */ -calculate_changed_submodule_paths (); +calculate_changed_submodule_paths (r->index); run_processes_parallel(max_parallel_jobs, get_next_submodule, fetch_start_failure,
submodule.h +6 -3
@@ -102,13 +102,16 @@ int add_submodule_odb(const char *path);* Checks if there are submodule changes in a..b. If a is the null OID, * checks b and all its ancestors instead. */ -int submodule_touches_in_range (struct object_id *a, +int submodule_touches_in_range (struct index_state *istate, +struct object_id *a,struct object_id *b); -int find_unpushed_submodules (struct oid_array *commits, +int find_unpushed_submodules (struct index_state *istate, +struct oid_array *commits,const char *remotes_name,struct string_list *needs_pushing);struct refspec ; -int push_unpushed_submodules(struct oid_array *commits, +int push_unpushed_submodules(struct index_state *istate, + struct oid_array *commits, const struct remote *remote, const struct refspec *rs, const struct string_list *push_options,
transport.c +6 -3
@@ -1139,7 +1139,8 @@ int transport_push(struct transport *transport,oid_array_append (&commits, &ref->new_oid); - if (!push_unpushed_submodules(&commits, + if (!push_unpushed_submodules(&the_index, + &commits, transport->remote, rs, transport->push_options,
@@ -1163,8 +1164,10 @@ int transport_push(struct transport *transport,oid_array_append (&commits, &ref->new_oid); -if (find_unpushed_submodules (&commits, transport->remote->name, - &needs_pushing)) { +if (find_unpushed_submodules (&the_index, + &commits, + transport->remote->name, + &needs_pushing)) {oid_array_clear (&commits);die_with_unpushed_submodules (&needs_pushing); }
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 20/23 tree-diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- tree-diff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tree-diff.c +1 -1
@@ -605,7 +605,7 @@ static void try_to_follow_renames(const struct object_id *old_oid, choice = q->queue[0 ]; q->nr =0 ; -repo_diff_setup (the_repository, &diff_opts); +repo_diff_setup (opt->repo, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.flags.find_copies_harder =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 21/23 ws.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- apply.c | 8 +++++--- cache.h | 2 +- diff.c | 6 +++--- ws.c | 5 ++--- 4 files changed, 11 insertions(+), 10 deletions(-)
apply.c +5 -3
@@ -2131,10 +2131,12 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long siif (!use_patch (state, patch)) patch->ws_rule =0 ; +else if (patch->new_name) + patch->ws_rule =whitespace_rule (state->repo->index, + patch->new_name);else - patch->ws_rule =whitespace_rule (patch->new_name - ? patch->new_name - : patch->old_name); + patch->ws_rule =whitespace_rule (state->repo->index, + patch->old_name); patchsize = parse_single_patch(state, buffer + offset + hdrsize,
cache.h +1 -1
@@ -1694,7 +1694,7 @@ void shift_tree_by(const struct object_id *, const struct object_id *, struct ob/* All WS_* -- when extended, adapt diff.c emit_symbol */ #define WS_RULE_MASK 07777extern unsigned whitespace_rule_cfg; -extern unsigned whitespace_rule (const char *); +extern unsigned whitespace_rule (struct index_state *,const char *);extern unsigned parse_whitespace_rule (const char *);extern unsigned ws_check (const char *line,int len,unsigned ws_rule);extern void ws_check_emit (const char *line,int len,unsigned ws_rule,FILE *stream,const char *set,const char *reset,const char *ws);
diff.c +3 -3
@@ -1705,7 +1705,7 @@ static void emit_rewrite_diff(const char *name_a,memset (&ecbdata,0 ,sizeof (ecbdata)); ecbdata.color_diff =want_color (o->use_color); - ecbdata.ws_rule =whitespace_rule (name_b); + ecbdata.ws_rule =whitespace_rule (o->repo->index, name_b); ecbdata.opt = o;if (ecbdata.ws_rule &WS_BLANK_AT_EOF ) {mmfile_t mf1, mf2;
@@ -3480,7 +3480,7 @@ static void builtin_diff(const char *name_a, lbl[0 ] =NULL ; ecbdata.label_path = lbl; ecbdata.color_diff =want_color (o->use_color); - ecbdata.ws_rule =whitespace_rule (name_b); + ecbdata.ws_rule =whitespace_rule (o->repo->index, name_b);if (ecbdata.ws_rule &WS_BLANK_AT_EOF )check_blank_at_eof (&mf1, &mf2, &ecbdata); ecbdata.opt = o;
@@ -3640,7 +3640,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, data.filename = name_b ? name_b : name_a; data.lineno =0 ; data.o = o; - data.ws_rule =whitespace_rule (attr_path); + data.ws_rule =whitespace_rule (o->repo->index, attr_path); data.conflict_marker_size =ll_merge_marker_size (o->repo->index, attr_path); if (fill_mmfile(o->repo, &mf1, one) < 0 ||
ws.c +2 -3
@@ -3,7 +3,6 @@* * Copyright (c) 2007 Junio C Hamano */ -#include "cache.h" #include "attr.h"
@@ -71,14 +70,14 @@ unsigned parse_whitespace_rule(const char *string)return rule; } -unsigned whitespace_rule (const char *pathname) +unsigned whitespace_rule (struct index_state *istate,const char *pathname) {static struct attr_check *attr_whitespace_rule;if (!attr_whitespace_rule) attr_whitespace_rule =attr_check_initl ("whitespace" ,NULL ); -if (!git_check_attr (&the_index, pathname, attr_whitespace_rule)) { +if (!git_check_attr (istate, pathname, attr_whitespace_rule)) {const char *value; value = attr_whitespace_rule->items[0 ].value;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 22/23 revision.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- .../technical/api-revision-walking.txt | 4 +-- bisect.c | 4 +-- builtin/add.c | 4 +-- builtin/am.c | 6 ++-- builtin/blame.c | 2 +- builtin/checkout.c | 4 +-- builtin/commit.c | 2 +- builtin/describe.c | 4 +-- builtin/diff-files.c | 2 +- builtin/diff-index.c | 2 +- builtin/diff-tree.c | 2 +- builtin/diff.c | 2 +- builtin/fast-export.c | 2 +- builtin/fmt-merge-msg.c | 2 +- builtin/log.c | 16 +++++----- builtin/merge.c | 4 +-- builtin/pack-objects.c | 2 +- builtin/prune.c | 2 +- builtin/reflog.c | 2 +- builtin/rev-list.c | 2 +- builtin/revert.c | 2 +- builtin/shortlog.c | 2 +- builtin/submodule--helper.c | 2 +- bundle.c | 4 +-- diff-lib.c | 4 +-- http-push.c | 2 +- merge-recursive.c | 2 +- pack-bitmap-write.c | 2 +- ref-filter.c | 2 +- remote.c | 2 +- revision.c | 32 +++++++++++-------- revision.h | 13 ++++++-- sequencer.c | 8 ++--- shallow.c | 2 +- submodule.c | 6 ++-- t/helper/test-revision-walking.c | 2 +- wt-status.c | 10 +++--- 37 files changed, 89 insertions(+), 78 deletions(-)
Documentation/technical/api-revision-walking.txt +2 -2
@@ -15,9 +15,9 @@ revision list. Functions --------- -`init_revisions`:: +`repo_init_revisions`:: - Initialize a rev_info structure with default values. The second + Initialize a rev_info structure with default values. The third parameter may be NULL or can be prefix path, and then the `.prefix` variable will be set to it. This is typically the first function you want to call when you want to deal with a revision list. After calling
bisect.c +2 -2
@@ -632,7 +632,7 @@ static void bisect_rev_setup(struct rev_info *revs, const char *prefix,struct argv_array rev_argv =ARGV_ARRAY_INIT ;int i; -init_revisions (revs, prefix); +repo_init_revisions (the_repository, revs, prefix); revs->abbrev =0 ; revs->commit_format =CMIT_FMT_UNSPECIFIED ;
@@ -889,7 +889,7 @@ static void show_diff_tree(const char *prefix, struct commit *commit)struct rev_info opt;/* diff-tree init */ -init_revisions (&opt, prefix); +repo_init_revisions (the_repository, &opt, prefix);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ opt.abbrev =0 ; opt.diff =1 ;
builtin/add.c +2 -2
@@ -110,7 +110,7 @@ int add_files_to_cache(const char *prefix,memset (&data,0 ,sizeof (data)); data.flags = flags; -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);setup_revisions (0 ,NULL , &rev,NULL );if (pathspec)copy_pathspec (&rev.prune_data, pathspec);
@@ -232,7 +232,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix)if (read_cache () <0 )die (_ ("Could not read the index" )); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diffopt.context =7 ; argc =setup_revisions (argc, argv, &rev,NULL );
builtin/am.c +3 -3
@@ -1372,7 +1372,7 @@ static void write_commit_patch(const struct am_state *state, struct commit *commFILE *fp; fp =xfopen (am_path (state,"patch" ),"w" ); -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diff =1 ; rev_info.abbrev =0 ; rev_info.disable_stdin =1 ;
@@ -1407,7 +1407,7 @@ static void write_index_patch(const struct am_state *state) the_repository->hash_algo->empty_tree); fp =xfopen (am_path (state,"patch" ),"w" ); -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diff =1 ; rev_info.disable_stdin =1 ; rev_info.no_commit_id =1 ;
@@ -1565,7 +1565,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pastruct rev_info rev_info;const char *diff_filter_str ="--diff-filter=AM" ; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL ); rev_info.diffopt.output_format =DIFF_FORMAT_NAME_STATUS ;diff_opt_parse (&rev_info.diffopt, &diff_filter_str,1 , rev_info.prefix);add_pending_oid (&rev_info,"HEAD" , &our_tree,0 );
builtin/blame.c +1 -1
@@ -830,7 +830,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)setup_default_color_by_age ();git_config (git_blame_config, &output_option); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.date_mode = blame_date_mode; revs.diffopt.flags.allow_textconv =1 ; revs.diffopt.flags.follow_renames =1 ;
builtin/checkout.c +2 -2
@@ -392,7 +392,7 @@ static void show_local_changes(struct object *head, {struct rev_info rev;/* I think we want full paths, even if we're in a subdirectory. */ -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.diffopt.flags = opts->flags; rev.diffopt.output_format |=DIFF_FORMAT_NAME_STATUS ;diff_setup_done (&rev.diffopt);
@@ -801,7 +801,7 @@ static void orphaned_commit_warning(struct commit *old_commit, struct commit *nestruct rev_info revs;struct object *object = &old_commit->object; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );setup_revisions (0 ,NULL , &revs,NULL ); object->flags &= ~UNINTERESTING ;
builtin/commit.c +1 -1
@@ -980,7 +980,7 @@ static const char *find_author_by_nickname(const char *name)const char *av[20 ];int ac =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );strbuf_addf (&buf,"--author=%s" , name); av[++ac] ="--all" ; av[++ac] ="-i" ;
builtin/describe.c +2 -2
@@ -488,7 +488,7 @@ static void describe_blob(struct object_id oid, struct strbuf *dst)"--objects" ,"--in-commit-order" ,"--reverse" ,"HEAD" , NULL); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );if (setup_revisions (args.argc, args.argv, &revs,NULL ) >1 )BUG ("setup_revisions could not handle all args?" );
@@ -636,7 +636,7 @@ int cmd_describe(int argc, const char **argv, const char *prefix)if (0 <= fd)update_index_if_able (&the_index, &index_lock); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix);argv_array_pushv (&args, diff_index_args);if (setup_revisions (args.argc, args.argv, &revs,NULL ) !=1 )BUG ("malformed internal diff-index command line" );
builtin/diff-files.c +1 -1
@@ -25,7 +25,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)usage (diff_files_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ;precompose_argv (argc, argv);
builtin/diff-index.c +1 -1
@@ -22,7 +22,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix)usage (diff_cache_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ;precompose_argv (argc, argv);
builtin/diff-tree.c +1 -1
@@ -110,7 +110,7 @@ int cmd_diff_tree(int argc, const char **argv, const char *prefix)usage (diff_tree_usage);git_config (git_diff_basic_config,NULL );/* no "diff" UI options */ -init_revisions (opt, prefix); +repo_init_revisions (the_repository, opt, prefix);if (read_cache () <0 )die (_ ("index file corrupt" )); opt->abbrev =0 ;
builtin/diff.c +1 -1
@@ -318,7 +318,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix)git_config (git_diff_ui_config,NULL );precompose_argv (argc, argv); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);if (no_index && argc != i +2 ) {if (no_index ==DIFF_NO_INDEX_IMPLICIT ) {
builtin/fast-export.c +1 -1
@@ -1033,7 +1033,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)/* we handle encodings */ git_config (git_default_config,NULL ); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix);init_revision_sources (&revision_sources); revs.topo_order =1 ; revs.sources = &revision_sources;
builtin/fmt-merge-msg.c +1 -1
@@ -642,7 +642,7 @@ int fmt_merge_msg(struct strbuf *in, struct strbuf *out,struct rev_info rev; head =lookup_commit_or_die (&head_oid,"HEAD" ); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.commit_format =CMIT_FMT_ONELINE ; rev.ignore_merges =1 ; rev.limited =1 ;
builtin/log.c +8 -8
@@ -467,7 +467,7 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diff =1 ; rev.simplify_history =0 ;memset (&opt,0 ,sizeof (opt));
@@ -585,7 +585,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)git_config (git_log_config,NULL );memset (&match_all,0 ,sizeof (match_all)); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.diff =1 ; rev.always_show_header =1 ; rev.no_walk =REVISION_WALK_NO_WALK_SORTED ;
@@ -665,7 +665,7 @@ int cmd_log_reflog(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);init_reflog_walk (&rev.reflog_info); rev.verbose_header =1 ;memset (&opt,0 ,sizeof (opt));
@@ -704,7 +704,7 @@ int cmd_log(int argc, const char **argv, const char *prefix)init_log_defaults ();git_config (git_log_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.always_show_header =1 ;memset (&opt,0 ,sizeof (opt)); opt.def ="HEAD" ;
@@ -917,7 +917,7 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)init_patch_ids (the_repository, ids);/* given a range a..b get all patch ids for b..a */ -init_revisions (&check_rev, rev->prefix); +repo_init_revisions (the_repository, &check_rev, rev->prefix); check_rev.max_parents =1 ; o1->flags ^=UNINTERESTING ; o2->flags ^=UNINTERESTING ;
@@ -1367,7 +1367,7 @@ static void prepare_bases(struct base_tree_info *bases,oidcpy (&bases->base_commit, &base->object.oid); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.max_parents =1 ; revs.topo_order =1 ;for (i =0 ; i < total; i++) {
@@ -1528,7 +1528,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix) extra_cc.strdup_strings =1 ;init_log_defaults ();git_config (git_format_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.commit_format =CMIT_FMT_EMAIL ; rev.expand_tabs_in_log_default =0 ; rev.verbose_header =1 ;
@@ -1939,7 +1939,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix) } } -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); revs.max_parents =1 ;if (add_pending_commit (head, &revs,0 ))
builtin/merge.c +2 -2
@@ -389,7 +389,7 @@ static void squash_message(struct commit *commit, struct commit_list *remoteheadprintf (_ ("Squash commit -- not updating HEAD\n" )); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.ignore_merges =1 ; rev.commit_format =CMIT_FMT_MEDIUM ;
@@ -911,7 +911,7 @@ static int evaluate_result(void)struct rev_info rev;/* Check how many files differ. */ -init_revisions (&rev,"" ); +repo_init_revisions (the_repository, &rev,"" );setup_revisions (0 ,NULL , &rev,NULL ); rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ;
builtin/pack-objects.c +1 -1
@@ -2989,7 +2989,7 @@ static void get_object_list(int ac, const char **av)char line[1000 ];int flags =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); save_commit_buffer =0 ;setup_revisions (ac, av, &revs,NULL );
builtin/prune.c +1 -1
@@ -120,7 +120,7 @@ int cmd_prune(int argc, const char **argv, const char *prefix) save_commit_buffer =0 ; read_replace_refs =0 ; ref_paranoia =1 ; -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); argc =parse_options (argc, argv, prefix, options, prune_usage,0 );
builtin/reflog.c +1 -1
@@ -567,7 +567,7 @@ static int cmd_reflog_expire(int argc, const char **argv, const char *prefix)* from reflog if the repository was pruned with older git. */ if (cb.cmd.stalefix) { -init_revisions (&cb.cmd.revs, prefix); +repo_init_revisions (the_repository, &cb.cmd.revs, prefix);if (flags &EXPIRE_REFLOGS_VERBOSE )printf ("Marking reachable objects..." );mark_reachable_objects (&cb.cmd.revs,0 ,0 ,NULL );
builtin/rev-list.c +1 -1
@@ -370,7 +370,7 @@ int cmd_rev_list(int argc, const char **argv, const char *prefix)usage (rev_list_usage);git_config (git_default_config,NULL ); -init_revisions (&revs, prefix); +repo_init_revisions (the_repository, &revs, prefix); revs.abbrev =DEFAULT_ABBREV ; revs.commit_format =CMIT_FMT_UNSPECIFIED ;
builtin/revert.c +1 -1
@@ -174,7 +174,7 @@ static int run_sequencer(int argc, const char **argv, struct replay_opts *opts) }else {struct setup_revision_opt s_r_opt; opts->revs =xmalloc (sizeof (*opts->revs)); -init_revisions (opts->revs,NULL ); +repo_init_revisions (the_repository, opts->revs,NULL ); opts->revs->no_walk =REVISION_WALK_NO_WALK_UNSORTED ;if (argc <2 )usage_with_options (usage_str, options);
builtin/shortlog.c +1 -1
@@ -278,7 +278,7 @@ int cmd_shortlog(int argc, const char **argv, const char *prefix)git_config (git_default_config,NULL );shortlog_init (&log); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);parse_options_start (&ctx, argc, argv, prefix, options,PARSE_OPT_KEEP_DASHDASH |PARSE_OPT_KEEP_ARGV0 );
builtin/submodule--helper.c +1 -1
@@ -792,7 +792,7 @@ static void status_submodule(const char *path, const struct object_id *ce_oid, path, NULL);git_config (git_diff_basic_config,NULL ); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix); rev.abbrev =0 ; diff_files_args.argc = setup_revisions(diff_files_args.argc, diff_files_args.argv,
bundle.c +2 -2
@@ -140,7 +140,7 @@ int verify_bundle(struct bundle_header *header, int verbose)int i, ret =0 , req_nr;const char *message =_ ("Repository lacks these prerequisite commits:" ); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );for (i =0 ; i < p->nr; i++) {struct ref_list_entry *e = p->list + i;struct object *o =parse_object (the_repository, &e->oid);
@@ -441,7 +441,7 @@ int create_bundle(struct bundle_header *header, const char *path,/* init revs to list objects for pack-objects later */ save_commit_buffer =0 ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );/* write prerequisites */ if (compute_and_write_prerequisites (bundle_fd, &revs, argc, argv))
diff-lib.c +2 -2
@@ -542,7 +542,7 @@ int do_diff_cache(const struct object_id *tree_oid, struct diff_options *opt) {struct rev_info revs; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );copy_pathspec (&revs.prune_data, &opt->pathspec); revs.diffopt = *opt;
@@ -557,7 +557,7 @@ int index_differs_from(const char *def, const struct diff_flags *flags,struct rev_info rev;struct setup_revision_opt opt; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );memset (&opt,0 ,sizeof (opt)); opt.def = def;setup_revisions (0 ,NULL , &rev, &opt);
http-push.c +1 -1
@@ -1925,7 +1925,7 @@ int cmd_main(int argc, const char **argv)if (!push_all && !is_null_oid (&ref->old_oid))argv_array_pushf (&commit_argv,"^%s" ,oid_to_hex (&ref->old_oid)); -init_revisions (&revs,setup_git_directory ()); +repo_init_revisions (the_repository, &revs,setup_git_directory ());setup_revisions (commit_argv.argc, commit_argv.argv, &revs,NULL ); revs.edge_hint =0 ;/* just in case */
merge-recursive.c +1 -1
@@ -1115,7 +1115,7 @@ static int find_first_merges(struct object_array *result, const char *path,/* get all revisions that merge commit a */ xsnprintf (merged_revision,sizeof (merged_revision),"^%s" ,oid_to_hex (&a->object.oid)); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); rev_opts.submodule = path;/* FIXME: can't handle linked worktrees in submodules yet */ revs.single_worktree = path !=NULL ;
pack-bitmap-write.c +1 -1
@@ -261,7 +261,7 @@ void bitmap_writer_build(struct packing_data *to_pack)if (writer.show_progress) writer.progress =start_progress ("Building bitmaps" , writer.selected_nr); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.tag_objects =1 ; revs.tree_objects =1 ; revs.blob_objects =1 ;
ref-filter.c +1 -1
@@ -2138,7 +2138,7 @@ static void do_merge_filter(struct ref_filter_cbdata *ref_cbdata)struct ref_array *array = ref_cbdata->array;struct commit **to_clear =xcalloc (sizeof (struct commit *), array->nr); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );for (i =0 ; i < array->nr; i++) {struct ref_array_item *item = array->items[i];
remote.c +1 -1
@@ -1903,7 +1903,7 @@ int stat_tracking_info(struct branch *branch, int *num_ours, int *num_theirs, oid_to_hex(&theirs->object.oid));argv_array_push (&argv,"--" ); -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL );setup_revisions (argv.argc, argv.argv, &revs,NULL );if (prepare_revision_walk (&revs))die ("revision walk setup failed" );
revision.c +18 -14
@@ -877,7 +877,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)return ; left_first = left_count < right_count; -init_patch_ids (the_repository, &ids); +init_patch_ids (revs->repo, &ids); ids.diffopts.pathspec = revs->diffopt.pathspec;/* Compute patch-ids for one side */
@@ -1370,8 +1370,8 @@ void add_index_objects_to_pending(struct rev_info *revs, unsigned int flags) {struct worktree **worktrees, **p; -read_cache (); -do_add_index_objects_to_pending (revs, &the_index); +read_index (revs->repo->index); +do_add_index_objects_to_pending (revs, revs->repo->index);if (revs->single_worktree)return ;
@@ -1439,10 +1439,13 @@ static int add_parents_only(struct rev_info *revs, const char *arg_, int flags,return 1 ; } -void init_revisions (struct rev_info *revs,const char *prefix) +void repo_init_revisions (struct repository *r, +struct rev_info *revs, +const char *prefix) {memset (revs,0 ,sizeof (*revs)); + revs->repo = r; revs->abbrev =DEFAULT_ABBREV ; revs->ignore_merges =1 ; revs->simplify_history =1 ;
@@ -1464,11 +1467,11 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format =CMIT_FMT_DEFAULT ; revs->expand_tabs_in_log_default =8 ; -init_grep_defaults (the_repository); -grep_init (&revs->grep_filter, the_repository, prefix); +init_grep_defaults (revs->repo); +grep_init (&revs->grep_filter, revs->repo, prefix); revs->grep_filter.status_only =1 ; -repo_diff_setup (the_repository, &revs->diffopt); +repo_diff_setup (revs->repo, &revs->diffopt);if (prefix && !revs->diffopt.prefix) { revs->diffopt.prefix = prefix; revs->diffopt.prefix_length =strlen (prefix);
@@ -1496,6 +1499,7 @@ static void prepare_show_merge(struct rev_info *revs)struct object_id oid;const char **prune =NULL ;int i, prune_num =1 ;/* counting terminating NULL */ +struct index_state *istate = revs->repo->index;if (get_oid ("HEAD" , &oid))die ("--merge without HEAD?" );
@@ -1511,20 +1515,20 @@ static void prepare_show_merge(struct rev_info *revs)free_commit_list (bases); head->object.flags |=SYMMETRIC_LEFT ; -if (!active_nr) -read_cache (); -for (i =0 ; i < active_nr; i++) { -const struct cache_entry *ce = active_cache[i]; +if (!istate->cache_nr) +read_index (istate); +for (i =0 ; i < istate->cache_nr; i++) { +const struct cache_entry *ce = istate->cache[i];if (!ce_stage (ce))continue ; -if (ce_path_match (&the_index, ce, &revs->prune_data,NULL )) { +if (ce_path_match (istate, ce, &revs->prune_data,NULL )) { prune_num++;REALLOC_ARRAY (prune, prune_num); prune[prune_num-2 ] = ce->name; prune[prune_num-1 ] =NULL ; } -while ((i+1 < active_nr) && -ce_same_name (ce, active_cache[i+1 ])) +while ((i+1 < istate->cache_nr) && +ce_same_name (ce, istate->cache[i+1 ])) i++; }clear_pathspec (&revs->prune_data);
revision.h +10 -3
@@ -28,8 +28,9 @@#define DECORATE_SHORT_REFS 1#define DECORATE_FULL_REFS 2 -struct rev_info ;struct log_info ; +struct repository ; +struct rev_info ;struct string_list ;struct saved_parents ; define_shared_commit_slab(revision_sources, char *);
@@ -60,6 +61,7 @@ struct rev_info {/* Starting list */ struct commit_list *commits;struct object_array pending; +struct repository *repo;/* Parents of shown commits */ struct object_array boundary_commits;
@@ -248,12 +250,17 @@ extern volatile show_early_output_fn_t show_early_output;struct setup_revision_opt {const char *def;void (*tweak)(struct rev_info *,struct setup_revision_opt *); -const char *submodule; +const char *submodule;/* TODO: drop this and use rev_info->repo */ int assume_dashdash;unsigned revarg_opt; }; -void init_revisions (struct rev_info *revs,const char *prefix); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define init_revisions (revs, prefix) repo_init_revisions(the_repository, revs, prefix) +#endif +void repo_init_revisions (struct repository *r, +struct rev_info *revs, +const char *prefix);int setup_revisions (int argc,const char **argv,struct rev_info *revs,struct setup_revision_opt *); void parse_revision_opt(struct rev_info *revs, struct parse_opt_ctx_t *ctx,
sequencer.c +4 -4
@@ -1143,7 +1143,7 @@ void print_commit_summary(const char *prefix, const struct object_id *oid,strbuf_release (&author_ident);strbuf_release (&committer_ident); -init_revisions (&rev, prefix); +repo_init_revisions (the_repository, &rev, prefix);setup_revisions (0 ,NULL , &rev,NULL ); rev.diff =1 ;
@@ -2566,7 +2566,7 @@ static int make_patch(struct commit *commit, struct replay_opts *opts)strbuf_addf (&buf,"%s/patch" ,get_dir (opts));memset (&log_tree_opt,0 ,sizeof (log_tree_opt)); -init_revisions (&log_tree_opt,NULL ); +repo_init_revisions (the_repository, &log_tree_opt,NULL ); log_tree_opt.abbrev =0 ; log_tree_opt.diff =1 ; log_tree_opt.diffopt.output_format =DIFF_FORMAT_PATCH ;
@@ -3477,7 +3477,7 @@ static int pick_commits(struct todo_list *todo_list, struct replay_opts *opts)struct object_id orig, head;memset (&log_tree_opt,0 ,sizeof (log_tree_opt)); -init_revisions (&log_tree_opt,NULL ); +repo_init_revisions (the_repository, &log_tree_opt,NULL ); log_tree_opt.diff =1 ; log_tree_opt.diffopt.output_format =DIFF_FORMAT_DIFFSTAT ;
@@ -4212,7 +4212,7 @@ int sequencer_make_script(FILE *out, int argc, const char **argv,const char *insn = flags &TODO_LIST_ABBREVIATE_CMDS ?"p" :"pick" ;int rebase_merges = flags &TODO_LIST_REBASE_MERGES ; -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); revs.verbose_header =1 ;if (!rebase_merges) revs.max_parents =1 ;
shallow.c +1 -1
@@ -184,7 +184,7 @@ struct commit_list *get_shallow_commits_by_rev_list(int ac, const char **av,is_repository_shallow (the_repository);/* make sure shallows are read */ -init_revisions (&revs,NULL ); +repo_init_revisions (the_repository, &revs,NULL ); save_commit_buffer =0 ;setup_revisions (ac, av, &revs,NULL );
submodule.c +3 -3
@@ -428,7 +428,7 @@ static int prepare_submodule_summary(struct rev_info *rev, const char *path, {struct commit_list *list; -init_revisions (rev,NULL ); +repo_init_revisions (the_repository, rev,NULL );setup_revisions (0 ,NULL , rev,NULL ); rev->left_right =1 ; rev->first_parent_only =1 ;
@@ -773,7 +773,7 @@ static void collect_changed_submodules(struct index_state *istate,struct rev_info rev;const struct commit *commit; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (argv->argc, argv->argv, &rev,NULL );if (prepare_revision_walk (&rev))die ("revision walk setup failed" );
@@ -784,7 +784,7 @@ static void collect_changed_submodules(struct index_state *istate, data.changed = changed; data.commit_oid = &commit->object.oid; -init_revisions (&diff_rev,NULL ); +repo_init_revisions (the_repository, &diff_rev,NULL ); diff_rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ; diff_rev.diffopt.format_callback = collect_changed_submodules_cb; diff_rev.diffopt.format_callback_data = &data;
t/helper/test-revision-walking.c +1 -1
@@ -32,7 +32,7 @@ static int run_revision_walk(void)int argc =ARRAY_SIZE (argv) -1 ;int got_revision =0 ; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (argc, argv, &rev,NULL );if (prepare_revision_walk (&rev))die ("revision walk setup failed" );
wt-status.c +5 -5
@@ -582,7 +582,7 @@ static void wt_status_collect_changes_worktree(struct wt_status *s) {struct rev_info rev; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );setup_revisions (0 ,NULL , &rev,NULL ); rev.diffopt.output_format |=DIFF_FORMAT_CALLBACK ; rev.diffopt.flags.dirty_submodules =1 ;
@@ -607,7 +607,7 @@ static void wt_status_collect_changes_index(struct wt_status *s)struct rev_info rev;struct setup_revision_opt opt; -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL );memset (&opt,0 ,sizeof (opt)); opt.def = s->is_initial ?empty_tree_oid_hex () : s->reference;setup_revisions (0 ,NULL , &rev, &opt);
@@ -982,7 +982,7 @@ static void wt_longstatus_print_verbose(struct wt_status *s)int dirty_submodules;const char *c =color (WT_STATUS_HEADER , s); -init_revisions (&rev,NULL ); +repo_init_revisions (the_repository, &rev,NULL ); rev.diffopt.flags.allow_textconv =1 ; rev.diffopt.ita_invisible_in_index =1 ;
@@ -2314,7 +2314,7 @@ int has_unstaged_changes(int ignore_submodules)struct rev_info rev_info;int result; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL );if (ignore_submodules) { rev_info.diffopt.flags.ignore_submodules =1 ; rev_info.diffopt.flags.override_submodule_config =1 ;
@@ -2336,7 +2336,7 @@ int has_uncommitted_changes(int ignore_submodules)if (is_cache_unborn ())return 0 ; -init_revisions (&rev_info,NULL ); +repo_init_revisions (the_repository, &rev_info,NULL );if (ignore_submodules) rev_info.diffopt.flags.ignore_submodules =1 ; rev_info.diffopt.flags.quick =1 ;
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
PATCH v4 23/23 revision.c: reduce implicit dependency the_repository
In reply to Nguyễn Thái Ngọc Duy--- list-objects.c | 8 +++++--- revision.c | 44 +++++++++++++++++++++++--------------------- revision.h | 2 +- 3 files changed, 29 insertions(+), 25 deletions(-)
list-objects.c +5 -3
@@ -196,7 +196,7 @@ static void mark_edge_parents_uninteresting(struct commit *commit,struct commit *parent = parents->item;if (!(parent->object.flags &UNINTERESTING ))continue ; -mark_tree_uninteresting (get_commit_tree (parent)); +mark_tree_uninteresting (revs->repo,get_commit_tree (parent));if (revs->edge_hint && !(parent->object.flags &SHOWN )) { parent->object.flags |=SHOWN ;show_edge (parent);
@@ -213,7 +213,8 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)struct commit *commit = list->item;if (commit->object.flags &UNINTERESTING ) { -mark_tree_uninteresting (get_commit_tree (commit)); +mark_tree_uninteresting (revs->repo, +get_commit_tree (commit));if (revs->edge_hint_aggressive && !(commit->object.flags &SHOWN )) { commit->object.flags |=SHOWN ;show_edge (commit);
@@ -228,7 +229,8 @@ void mark_edges_uninteresting(struct rev_info *revs, show_edge_fn show_edge)struct commit *commit = (struct commit *)obj;if (obj->type !=OBJ_COMMIT || !(obj->flags &UNINTERESTING ))continue ; -mark_tree_uninteresting (get_commit_tree (commit)); +mark_tree_uninteresting (revs->repo, +get_commit_tree (commit));if (!(obj->flags &SHOWN )) { obj->flags |=SHOWN ;show_edge (commit);
revision.c +23 -21
149 lines not on this page · raw message
revision.h +1 -1
@@ -280,7 +280,7 @@ void put_revision_mark(const struct rev_info *revs, const struct commit *commit);void mark_parents_uninteresting (struct commit *commit); -void mark_tree_uninteresting (struct tree *tree); +void mark_tree_uninteresting (struct repository *r,struct tree *tree);void show_object_with_name (FILE *,struct object *,const char *);
Signature · 1 line
2.19.0.rc0.337.ge906d732e7
v5 cover Kill the_index part 4
In reply to Nguyễn Thái Ngọc Duyv5 only has commit message update in one patch. range-diff below.
Also, from "What's cooking" today
Quoted 9 lines · Junio C Hamano
* nd/the-index (2018-09-17) 23 commits
...Will merge to 'next'.
As expected, this has close to irritating amount of textual conflicts with the topics in-flight. Hopefully we can minimize the pain by letting it pass through quickly?
No objection. I have to warn Junio though, there is still part 5, so the pain will be still there for a bit longer. Unless the new rebase and stash topics get merged first.
1: 9b907ae529 ! 1: 2203a5fbac read-cache.c: remove 'const' from index_has_changes()
@@ -3,16 +3,19 @@
read-cache.c: remove 'const' from index_has_changes()
This function calls do_diff_cache() which eventually needs to set this
- "istate" to unpack_options->src_index (*). This is an unfortunate fact
- that unpack_trees() _will_ destroy src_index so we can't really pass a
+ "istate" to unpack_options->src_index [1]. This is an unfortunate fact
+ that unpack_trees() _will_ update [2] src_index so we can't really pass a
const index_state there. Just remove 'const'.
- (*) Right now diff_cache() in diff-lib.c assigns the_index to
+ [1] Right now diff_cache() in diff-lib.c assigns the_index to
src_index. But the plan is to get rid of the_index, so it should be 'istate' from here that gets assigned to src_index.
+ [2] Some transient bits in the source index are touched. Optional
+ extensions can also be removed. But other than that the source
+ tree should still be valid.
+
- Signed-off-by: Junio C Hamano <[email protected]>
diff --git a/cache.h b/cache.h
--- a/cache.h
2: 27518df579 = 2: fc60c5dfcf diff.c: reduce implicit dependency on the_index 3: bd45a50b6d = 3: 9bb467ec06 combine-diff.c: remove implicit dependency on the_index 4: 90ac73d37b = 4: 4304405578 blame.c: rename "repo" argument to "r" 5: c36071a4ab = 5: 71c1bb997e diff.c: remove the_index dependency in textconv() functions 6: 9321bb37a9 = 6: 0c9371ebd6 grep.c: remove implicit dependency on the_index 7: 41b046463c = 7: e6aba3aad9 diff.c: remove implicit dependency on the_index 8: f0d1e5da57 = 8: 8e4c25023f read-cache.c: remove implicit dependency on the_index 9: 3b7c181005 = 9: f605feb11e diff-lib.c: remove implicit dependency on the_index 10: 0f2ed0b54d = 10: fb06c902e2 ll-merge.c: remove implicit dependency on the_index 11: 46d37956a5 = 11: 5a75125df6 merge-blobs.c: remove implicit dependency on the_index 12: 8b7e116fba = 12: c13cd5443d merge.c: remove implicit dependency on the_index 13: 7d5bd2dfbd = 13: 575aea07ed patch-ids.c: remove implicit dependency on the_index 14: c672034cb3 = 14: 78a0762057 sha1-file.c: remove implicit dependency on the_index 15: ce460601c2 = 15: 91bf6b553a rerere.c: remove implicit dependency on the_index 16: 5b338d60aa = 16: b0ee54a0ad userdiff.c: remove implicit dependency on the_index 17: af2269eba7 = 17: 6a7cea2510 line-range.c: remove implicit dependency on the_index 18: 8090b8415f = 18: a19193217a submodule.c: remove implicit dependency on the_index 19: 5db39ed3ef = 19: b0dc3a2f5d tree-diff.c: remove implicit dependency on the_index 20: d3811221c8 = 20: 60e495cd36 ws.c: remove implicit dependency on the_index 21: c313cf1f20 = 21: 5b3c7e6ca4 revision.c: remove implicit dependency on the_index 22: c915607c60 = 22: 357394f04d revision.c: reduce implicit dependency the_repository
Nguyễn Thái Ngọc Duy (23):
archive.c: remove implicit dependency the_repository read-cache.c: remove 'const' from index_has_changes() diff.c: reduce implicit dependency on the_index combine-diff.c: remove implicit dependency on the_index blame.c: rename "repo" argument to "r"
diff.c: remove the_index dependency in textconv() functions grep.c: remove implicit dependency on the_index diff.c: remove implicit dependency on the_index read-cache.c: remove implicit dependency on the_index diff-lib.c: remove implicit dependency on the_index ll-merge.c: remove implicit dependency on the_index merge-blobs.c: remove implicit dependency on the_index merge.c: remove implicit dependency on the_index patch-ids.c: remove implicit dependency on the_index sha1-file.c: remove implicit dependency on the_index rerere.c: remove implicit dependency on the_index userdiff.c: remove implicit dependency on the_index line-range.c: remove implicit dependency on the_index submodule.c: remove implicit dependency on the_index tree-diff.c: remove implicit dependency on the_index ws.c: remove implicit dependency on the_index revision.c: remove implicit dependency on the_index revision.c: reduce implicit dependency the_repository
Documentation/technical/api-diff.txt | 4 +- .../technical/api-revision-walking.txt | 4 +- apply.c | 19 +- archive-zip.c | 14 +- archive.c | 2 +- bisect.c | 4 +- blame.c | 63 +++-- builtin/add.c | 4 +- builtin/am.c | 10 +- builtin/blame.c | 4 +- builtin/cat-file.c | 6 +- builtin/checkout.c | 7 +- builtin/commit.c | 4 +- builtin/describe.c | 4 +- builtin/diff-files.c | 2 +- builtin/diff-index.c | 2 +- builtin/diff-tree.c | 2 +- builtin/diff.c | 4 +- builtin/difftool.c | 2 +- builtin/fast-export.c | 2 +- builtin/fmt-merge-msg.c | 2 +- builtin/grep.c | 7 +- builtin/hash-object.c | 2 +- builtin/log.c | 25 +- builtin/merge-tree.c | 2 +- builtin/merge.c | 16 +- builtin/pack-objects.c | 2 +- builtin/prune.c | 2 +- builtin/pull.c | 9 +- builtin/range-diff.c | 2 +- builtin/reflog.c | 2 +- builtin/replace.c | 2 +- builtin/rerere.c | 6 +- builtin/reset.c | 1 + builtin/rev-list.c | 2 +- builtin/revert.c | 2 +- builtin/shortlog.c | 2 +- builtin/submodule--helper.c | 2 +- builtin/update-index.c | 2 +- bundle.c | 4 +- cache.h | 14 +- combine-diff.c | 32 ++- diff-lib.c | 21 +- diff-no-index.c | 9 +- diff.c | 261 ++++++++++-------- diff.h | 22 +- diffcore-break.c | 12 +- diffcore-delta.c | 12 +- diffcore-pickaxe.c | 8 +- diffcore-rename.c | 35 ++- diffcore.h | 13 +- grep.c | 34 ++- grep.h | 10 +- http-push.c | 2 +- line-log.c | 25 +- line-range.c | 22 +- line-range.h | 6 +- list-objects.c | 8 +- ll-merge.c | 17 +- ll-merge.h | 5 +- merge-blobs.c | 16 +- merge-blobs.h | 7 +- merge-recursive.c | 7 +- merge.c | 20 +- notes-merge.c | 9 +- pack-bitmap-write.c | 2 +- patch-ids.c | 4 +- patch-ids.h | 3 +- read-cache.c | 33 ++- ref-filter.c | 2 +- remote.c | 2 +- rerere.c | 121 ++++---- rerere.h | 10 +- revision.c | 76 ++--- revision.h | 15 +- sequencer.c | 18 +- sha1-file.c | 50 ++-- shallow.c | 2 +- submodule.c | 34 ++- submodule.h | 9 +- t/helper/test-revision-walking.c | 2 +- transport.c | 9 +- tree-diff.c | 2 +- userdiff.c | 5 +- userdiff.h | 3 +- ws.c | 5 +- wt-status.c | 10 +- 87 files changed, 749 insertions(+), 552 deletions(-)
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 1/23 archive.c: remove implicit dependency the_repository
The new "repo" field in archive_args has been added since b612ee202a (archive.c: avoid access to the_index - 2018-08-13). Use it instead of hard coding the_repository.
--- archive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
archive.c +1 -1
@@ -391,7 +391,7 @@ static void parse_treeish_arg(const char **argv,if (get_oid (name, &oid))die ("Not a valid object name" ); - commit =lookup_commit_reference_gently (the_repository, &oid,1 ); + commit =lookup_commit_reference_gently (ar_args->repo, &oid,1 );if (commit) { commit_sha1 = commit->object.oid.hash; archive_time = commit->date;
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 2/23 read-cache.c: remove 'const' from index_has_changes()
In reply to Nguyễn Thái Ngọc DuyThis function calls do_diff_cache() which eventually needs to set this "istate" to unpack_options->src_index [1]. This is an unfortunate fact that unpack_trees() _will_ update [2] src_index so we can't really pass a const index_state there. Just remove 'const'.
[1] Right now diff_cache() in diff-lib.c assigns the_index to src_index. But the plan is to get rid of the_index, so it should be 'istate' from here that gets assigned to src_index.
[2] Some transient bits in the source index are touched. Optional extensions can also be removed. But other than that the source tree should still be valid.
--- cache.h | 2 +- read-cache.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
cache.h +1 -1
@@ -703,7 +703,7 @@ extern int unmerged_index(const struct index_state *);* provided, the space-separated list of files that differ will be appended * to it. */ -extern int index_has_changes (const struct index_state *istate, +extern int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb);
read-cache.c +1 -1
@@ -2122,7 +2122,7 @@ int unmerged_index(const struct index_state *istate)return 0 ; } -int index_has_changes (const struct index_state *istate, +int index_has_changes (struct index_state *istate,struct tree *tree,struct strbuf *sb) {
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 3/23 diff.c: reduce implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duydiff and textconv code has so widespread use that it's hard to simply update their api and all call sites at once because it would result in a big patch. For now reduce the_index references to two places:diff_setup() and fill_textconv().
--- builtin/reset.c | 1 + diff.c | 176 +++++++++++++++++++++++++++------------------- diff.h | 3 + diffcore-break.c | 12 ++-- diffcore-delta.c | 12 ++-- diffcore-rename.c | 35 +++++---- diffcore.h | 13 ++-- line-log.c | 21 +++--- 8 files changed, 161 insertions(+), 112 deletions(-)
builtin/reset.c +1 -0
@@ -159,6 +159,7 @@ static int read_from_tree(const struct pathspec *pathspec, opt.format_callback = update_index_from_diff; opt.format_callback_data = &intent_to_add; opt.flags.override_submodule_config =1 ; + opt.repo = the_repository;if (do_diff_cache (tree_oid, &opt))return 1 ;
diff.c +102 -74
497 lines not on this page · raw message
diff.h +3 -0
@@ -18,6 +18,7 @@ struct userdiff_driver;struct oid_array ;struct commit ;struct combine_diff_path ; +struct repository ;typedef int (*pathchange_fn_t )(struct diff_options *options,struct combine_diff_path *path);
@@ -220,6 +221,8 @@ struct diff_options {/* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */ #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)int color_moved_ws_handling; + +struct repository *repo; };void diff_emit_submodule_del (struct diff_options *o,const char *line);
diffcore-break.c +7 -5
@@ -5,7 +5,8 @@#include "diff.h" #include "diffcore.h" -static int should_break (struct diff_filespec *src, +static int should_break (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int break_score,int *merge_score_p)
@@ -61,7 +62,8 @@ static int should_break(struct diff_filespec *src, !oidcmp(&src->oid, &dst->oid))return 0 ;/* they are the same */ -if (diff_populate_filespec (src,0 ) ||diff_populate_filespec (dst,0 )) +if (diff_populate_filespec (r, src,0 ) || +diff_populate_filespec (r, dst,0 ))return 0 ;/* error but caught downstream */ max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -71,7 +73,7 @@ static int should_break(struct diff_filespec *src,if (!src->size)return 0 ;/* we do not let empty files get renamed */ -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -114,7 +116,7 @@ static int should_break(struct diff_filespec *src,return 1 ; } -void diffcore_break (int break_score) +void diffcore_break (struct repository *r,int break_score) {struct diff_queue_struct *q = &diff_queued_diff;struct diff_queue_struct outq;
@@ -178,7 +180,7 @@ void diffcore_break(int break_score) object_type(p->one->mode) == OBJ_BLOB && object_type(p->two->mode) == OBJ_BLOB && !strcmp(p->one->path, p->two->path)) { -if (should_break (p->one, p->two, +if (should_break (r, p->one, p->two, break_score, &score)) {/* Split this into delete and create */ struct diff_filespec *null_one, *null_two;
diffcore-delta.c +7 -5
@@ -121,14 +121,15 @@ static int spanhash_cmp(const void *a_, const void *b_) a->hashval > b->hashval ?1 :0 ; } -static struct spanhash_top *hash_chars (struct diff_filespec *one) +static struct spanhash_top *hash_chars (struct repository *r, +struct diff_filespec *one) {int i, n;unsigned int accum1, accum2, hashval;struct spanhash_top *hash;unsigned char *buf = one->data;unsigned int sz = one->size; -int is_text = !diff_filespec_is_binary (one); +int is_text = !diff_filespec_is_binary (r, one); i =INITIAL_HASH_SIZE ; hash = xmalloc(st_add(sizeof(*hash),
@@ -162,7 +163,8 @@ static struct spanhash_top *hash_chars(struct diff_filespec *one)return hash; } -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
@@ -177,14 +179,14 @@ int diffcore_count_changes(struct diff_filespec *src,if (src_count_p) src_count = *src_count_p;if (!src_count) { - src_count =hash_chars (src); + src_count =hash_chars (r, src);if (src_count_p) *src_count_p = src_count; }if (dst_count_p) dst_count = *dst_count_p;if (!dst_count) { - dst_count =hash_chars (dst); + dst_count =hash_chars (r, dst);if (dst_count_p) *dst_count_p = dst_count; }
diffcore-rename.c +22 -13
@@ -128,7 +128,8 @@ struct diff_score {short name_score; }; -static int estimate_similarity (struct diff_filespec *src, +static int estimate_similarity (struct repository *r, +struct diff_filespec *src,struct diff_filespec *dst,int minimum_score) {
@@ -165,10 +166,10 @@ static int estimate_similarity(struct diff_filespec *src,* say whether the size is valid or not!) */ if (!src->cnt_data && -diff_populate_filespec (src,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, src,CHECK_SIZE_ONLY ))return 0 ;if (!dst->cnt_data && -diff_populate_filespec (dst,CHECK_SIZE_ONLY )) +diff_populate_filespec (r, dst,CHECK_SIZE_ONLY ))return 0 ; max_size = ((src->size > dst->size) ? src->size : dst->size);
@@ -186,12 +187,12 @@ static int estimate_similarity(struct diff_filespec *src,if (max_size * (MAX_SCORE -minimum_score) < delta_size *MAX_SCORE )return 0 ; -if (!src->cnt_data &&diff_populate_filespec (src,0 )) +if (!src->cnt_data &&diff_populate_filespec (r, src,0 ))return 0 ; -if (!dst->cnt_data &&diff_populate_filespec (dst,0 )) +if (!dst->cnt_data &&diff_populate_filespec (r, dst,0 ))return 0 ; -if (diffcore_count_changes (src, dst, +if (diffcore_count_changes (r, src, dst, &src->cnt_data, &dst->cnt_data, &src_copied, &literal_added))return 0 ;
@@ -256,10 +257,11 @@ struct file_similarity {struct diff_filespec *filespec; }; -static unsigned int hash_filespec (struct diff_filespec *filespec) +static unsigned int hash_filespec (struct repository *r, +struct diff_filespec *filespec) {if (!filespec->oid_valid) { -if (diff_populate_filespec (filespec,0 )) +if (diff_populate_filespec (r, filespec,0 ))return 0 ;hash_object_file (filespec->data, filespec->size,"blob" , &filespec->oid);
@@ -280,7 +282,9 @@ static int find_identical_files(struct hashmap *srcs,/* * Find the best source match for specified destination. */ - p =hashmap_get_from_hash (srcs,hash_filespec (target),NULL ); + p =hashmap_get_from_hash (srcs, +hash_filespec (options->repo, target), +NULL );for (; p; p =hashmap_get_next (srcs, p)) {int score;struct diff_filespec *source = p->filespec;
@@ -316,14 +320,16 @@ static int find_identical_files(struct hashmap *srcs,return renames; } -static void insert_file_table (struct hashmap *table,int index,struct diff_filespec *filespec) +static void insert_file_table (struct repository *r, +struct hashmap *table,int index, +struct diff_filespec *filespec) {struct file_similarity *entry =xmalloc (sizeof (*entry)); entry->index = index; entry->filespec = filespec; -hashmap_entry_init (entry,hash_filespec (filespec)); +hashmap_entry_init (entry,hash_filespec (r, filespec));hashmap_add (table, entry); }
@@ -344,7 +350,9 @@ static int find_exact_renames(struct diff_options *options)*/ hashmap_init (&file_table,NULL ,NULL , rename_src_nr);for (i = rename_src_nr-1 ; i >=0 ; i--) -insert_file_table (&file_table, i, rename_src[i].p->one); +insert_file_table (options->repo, + &file_table, i, + rename_src[i].p->one);/* Walk the destinations and find best source match */ for (i =0 ; i < rename_dst_nr; i++)
@@ -557,7 +565,8 @@ void diffcore_rename(struct diff_options *options) diff_unmodified_pair(rename_src[j].p))continue ; - this_src.score =estimate_similarity (one, two, + this_src.score =estimate_similarity (options->repo, + one, two, minimum_score); this_src.name_score =basename_same (one, two); this_src.dst = i;
diffcore.h +7 -6
@@ -7,6 +7,8 @@#include "cache.h" struct diff_options ; +struct repository ; +struct userdiff_driver ;/* This header file is internal between diff.c and its diff transformers * (e.g. diffcore-rename, diffcore-pickaxe). Never include this header
@@ -26,8 +28,6 @@ struct diff_options;#define MINIMUM_BREAK_SIZE 400/* do not break a file smaller than this */ -struct userdiff_driver ; -struct diff_filespec {struct object_id oid;char *path;
@@ -61,10 +61,10 @@ void fill_filespec(struct diff_filespec *, const struct object_id *,#define CHECK_SIZE_ONLY 1#define CHECK_BINARY 2 -int diff_populate_filespec (struct diff_filespec *,unsigned int ); +int diff_populate_filespec (struct repository *,struct diff_filespec *,unsigned int );void diff_free_filespec_data (struct diff_filespec *);void diff_free_filespec_blob (struct diff_filespec *); -int diff_filespec_is_binary (struct diff_filespec *); +int diff_filespec_is_binary (struct repository *,struct diff_filespec *);struct diff_filepair {struct diff_filespec *one;
@@ -111,7 +111,7 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *, struct diff_filespec *);void diff_q (struct diff_queue_struct *,struct diff_filepair *); -void diffcore_break (int ); +void diffcore_break (struct repository *,int );void diffcore_rename (struct diff_options *);void diffcore_merge_broken (void );void diffcore_pickaxe (struct diff_options *);
@@ -142,7 +142,8 @@ void diff_debug_queue(const char *, struct diff_queue_struct *); #define diff_debug_queue(a,b) do { /* nothing */ } while (0)#endif -int diffcore_count_changes(struct diff_filespec *src, +int diffcore_count_changes(struct repository *r, + struct diff_filespec *src, struct diff_filespec *dst, void **src_count_p, void **dst_count_p,
line-log.c +12 -9
@@ -508,7 +508,9 @@ static void fill_blob_sha1(struct commit *commit, struct diff_filespec *spec)return ; } -static void fill_line_ends (struct diff_filespec *spec,long *lines, +static void fill_line_ends (struct repository *r, +struct diff_filespec *spec, +long *lines,unsigned long **line_ends) {int num =0 , size =50 ;
@@ -516,7 +518,7 @@ static void fill_line_ends(struct diff_filespec *spec, long *lines,unsigned long *ends =NULL ;char *data =NULL ; -if (diff_populate_filespec (spec,0 )) +if (diff_populate_filespec (r, spec,0 ))die ("Cannot read blob %s" ,oid_to_hex (&spec->oid));ALLOC_ARRAY (ends, size);
@@ -555,7 +557,8 @@ static const char *nth_line(void *data, long line) }static struct line_log_data * -parse_lines (struct commit *commit,const char *prefix,struct string_list *args) +parse_lines (struct repository *r,struct commit *commit, +const char *prefix,struct string_list *args) {long lines =0 ;unsigned long *ends =NULL ;
@@ -583,7 +586,7 @@ parse_lines(struct commit *commit, const char *prefix, struct string_list *args) spec =alloc_filespec (full_name);fill_blob_sha1 (commit, spec); -fill_line_ends (spec, &lines, &ends); +fill_line_ends (r, spec, &lines, &ends); cb_data.spec = spec; cb_data.lines = lines; cb_data.line_ends = ends;
@@ -739,7 +742,7 @@ void line_log_init(struct rev_info *rev, const char *prefix, struct string_liststruct line_log_data *range; commit =check_single_commit (rev); - range =parse_lines (commit, prefix, args); + range =parse_lines (rev->diffopt.repo, commit, prefix, args);add_line_range (rev, commit, range);if (!rev->diffopt.detect_rename) {
@@ -891,8 +894,8 @@ static void dump_diff_hacky_one(struct rev_info *rev, struct line_log_data *rangreturn ;if (pair->one->oid_valid) -fill_line_ends (pair->one, &p_lines, &p_ends); -fill_line_ends (pair->two, &t_lines, &t_ends); +fill_line_ends (rev->diffopt.repo, pair->one, &p_lines, &p_ends); +fill_line_ends (rev->diffopt.repo, pair->two, &t_lines, &t_ends);fprintf (opt->file,"%s%sdiff --git a/%s b/%s%s\n" , prefix, c_meta, pair->one->path, pair->two->path, c_reset); fprintf(opt->file, "%s%s--- %s%s%s\n", prefix, c_meta,
@@ -1008,12 +1011,12 @@ static int process_diff_filepair(struct rev_info *rev,return 0 ;assert (pair->two->oid_valid); -diff_populate_filespec (pair->two,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->two,0 ); file_target.ptr = pair->two->data; file_target.size = pair->two->size;if (pair->one->oid_valid) { -diff_populate_filespec (pair->one,0 ); +diff_populate_filespec (rev->diffopt.repo, pair->one,0 ); file_parent.ptr = pair->one->data; file_parent.size = pair->one->size; }else {
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 4/23 combine-diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- combine-diff.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
combine-diff.c +2 -1
@@ -1054,7 +1054,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,if (is_file) {struct strbuf buf =STRBUF_INIT ; -if (convert_to_git (&the_index, elem->path, result, len, &buf, global_conv_flags_eol)) { +if (convert_to_git (rev->diffopt.repo->index, + elem->path, result, len, &buf, global_conv_flags_eol)) {free (result); result =strbuf_detach (&buf, &len); result_size = len;
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 5/23 blame.c: rename "repo" argument to "r"
In reply to Nguyễn Thái Ngọc DuyThe current naming convention for 'struct repository *' is 'r' for temporary variables or arguments. I did not notice this. Since we're updating blame.c again in the next patch, let's fix this.
--- blame.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-)
blame.c +18 -18
@@ -90,7 +90,7 @@ static struct blame_origin *get_origin(struct commit *commit, const char *path) -static void verify_working_tree_path (struct repository *repo, +static void verify_working_tree_path (struct repository *r,struct commit *work_tree,const char *path) {struct commit_list *parents;
@@ -102,15 +102,15 @@ static void verify_working_tree_path(struct repository *repo,unsigned mode;if (!get_tree_entry (commit_oid, path, &blob_oid, &mode) && -oid_object_info (repo, &blob_oid,NULL ) ==OBJ_BLOB ) +oid_object_info (r, &blob_oid,NULL ) ==OBJ_BLOB )return ; } - pos =index_name_pos (repo->index, path,strlen (path)); + pos =index_name_pos (r->index, path,strlen (path));if (pos >=0 ) ;/* path is in the index */ -else if (-1 - pos < repo->index->cache_nr && - !strcmp (repo->index->cache[-1 - pos]->name, path)) +else if (-1 - pos < r->index->cache_nr && + !strcmp (r->index->cache[-1 - pos]->name, path)) ;/* path is in the index, unmerged */ else die ("no such path '%s' in HEAD" , path);
@@ -166,7 +166,7 @@ static void set_commit_buffer_from_strbuf(struct commit *c, struct strbuf *sb)* Prepare a dummy commit that represents the work tree (or staged) item. * Note that annotating work tree item never works in the reverse. */ -static struct commit *fake_working_tree_commit (struct repository *repo, +static struct commit *fake_working_tree_commit (struct repository *r,struct diff_options *opt,const char *path,const char *contents_from)
@@ -183,7 +183,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,unsigned mode;struct strbuf msg =STRBUF_INIT ; -read_index (repo->index); +read_index (r->index);time (&now); commit =alloc_commit_node (the_repository); commit->object.parsed =1 ;
@@ -195,7 +195,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo, parent_tail =append_parent (parent_tail, &head_oid);append_merge_parents (parent_tail); -verify_working_tree_path (repo, commit, path); +verify_working_tree_path (r, commit, path); origin =make_origin (commit, path);
@@ -253,7 +253,7 @@ static struct commit *fake_working_tree_commit(struct repository *repo,if (strbuf_read (&buf,0 ,0 ) <0 )die_errno ("failed to read from stdin" ); } -convert_to_git (repo->index, path, buf.buf, buf.len, &buf,0 ); +convert_to_git (r->index, path, buf.buf, buf.len, &buf,0 ); origin->file.ptr = buf.buf; origin->file.size = buf.len;pretend_object_file (buf.buf, buf.len,OBJ_BLOB , &origin->blob_oid);
@@ -264,28 +264,28 @@ static struct commit *fake_working_tree_commit(struct repository *repo,* bits; we are not going to write this index out -- we just * want to run "diff-index --cached". */ -discard_index (repo->index); -read_index (repo->index); +discard_index (r->index); +read_index (r->index); len =strlen (path);if (!mode) { -int pos =index_name_pos (repo->index, path, len); +int pos =index_name_pos (r->index, path, len);if (0 <= pos) - mode = repo->index->cache[pos]->ce_mode; + mode = r->index->cache[pos]->ce_mode;else /* Let's not bother reading from HEAD tree */ mode =S_IFREG |0644 ; } - ce =make_empty_cache_entry (repo->index, len); + ce =make_empty_cache_entry (r->index, len);oidcpy (&ce->oid, &origin->blob_oid);memcpy (ce->name, path, len); ce->ce_flags =create_ce_flags (0 ); ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); -add_index_entry (repo->index, ce, +add_index_entry (r->index, ce,ADD_CACHE_OK_TO_ADD |ADD_CACHE_OK_TO_REPLACE ); -cache_tree_invalidate_path (repo->index, path); +cache_tree_invalidate_path (r->index, path);return commit; }
@@ -520,14 +520,14 @@ static void queue_blames(struct blame_scoreboard *sb, struct blame_origin *porig* * This also fills origin->mode for corresponding tree path. */ -static int fill_blob_sha1_and_mode (struct repository *repo, +static int fill_blob_sha1_and_mode (struct repository *r,struct blame_origin *origin) {if (!is_null_oid (&origin->blob_oid))return 0 ;if (get_tree_entry (&origin->commit->object.oid, origin->path, &origin->blob_oid, &origin->mode)) goto error_out; -if (oid_object_info (repo, &origin->blob_oid,NULL ) !=OBJ_BLOB ) +if (oid_object_info (r, &origin->blob_oid,NULL ) !=OBJ_BLOB ) goto error_out;return 0 ; error_out:
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 6/23 diff.c: remove the_index dependency in textconv() functions
In reply to Nguyễn Thái Ngọc Duy--- blame.c | 7 ++++--- builtin/cat-file.c | 6 ++++-- builtin/log.c | 3 ++- combine-diff.c | 27 ++++++++++++++++----------- diff.c | 17 +++++++++-------- diff.h | 9 +++++++-- diffcore-pickaxe.c | 4 ++-- grep.c | 2 +- 8 files changed, 45 insertions(+), 30 deletions(-)
blame.c +4 -3
@@ -234,7 +234,7 @@ static struct commit *fake_working_tree_commit(struct repository *r,switch (st.st_mode &S_IFMT ) {case S_IFREG :if (opt->flags.allow_textconv && -textconv_object (read_from, mode, &null_oid,0 , &buf_ptr, &buf_len)) +textconv_object (r, read_from, mode, &null_oid,0 , &buf_ptr, &buf_len))strbuf_attach (&buf, buf_ptr, buf_len, buf_len +1 );else if (strbuf_read_file (&buf, read_from, st.st_size) != st.st_size)die_errno ("cannot open or read '%s'" , read_from);
@@ -318,7 +318,8 @@ static void fill_origin_blob(struct diff_options *opt, (*num_read_blob)++;if (opt->flags.allow_textconv && -textconv_object (o->path, o->mode, &o->blob_oid,1 , &file->ptr, &file_size)) +textconv_object (opt->repo, o->path, o->mode, + &o->blob_oid,1 , &file->ptr, &file_size)) ;else file->ptr = read_object_file(&o->blob_oid, &type,
@@ -1857,7 +1858,7 @@ void setup_scoreboard(struct blame_scoreboard *sb,die (_ ("no such path %s in %s" ), path, final_commit_name);if (sb->revs->diffopt.flags.allow_textconv && -textconv_object (path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, +textconv_object (sb->repo, path, o->mode, &o->blob_oid,1 , (char **) &sb->final_buf, &sb->final_buf_size)) ;else
builtin/cat-file.c +4 -2
@@ -113,7 +113,8 @@ static int cat_one_file(int opt, const char *exp_type, const char *obj_name,die ("git cat-file --textconv %s: <object> must be <sha1:path>" , obj_name); -if (textconv_object (path, obj_context.mode, &oid,1 , &buf, &size)) +if (textconv_object (the_repository, path, obj_context.mode, + &oid,1 , &buf, &size))break ;/* else fallthrough */
@@ -305,7 +306,8 @@ static void print_object_or_die(struct batch_options *opt, struct expand_data *d oid_to_hex(oid), data->rest); }else if (opt->cmdmode =='c' ) {enum object_type type; -if (!textconv_object (data->rest,0100644 , oid, +if (!textconv_object (the_repository, + data->rest,0100644 , oid,1 , &contents, &size)) contents = read_object_file(oid, &type,
builtin/log.c +2 -1
@@ -507,7 +507,8 @@ static int show_blob_object(const struct object_id *oid, struct rev_info *rev, c &oidc, &obj_context))die (_ ("Not a valid object name %s" ), obj_name);if (!obj_context.path || - !textconv_object (obj_context.path, obj_context.mode, &oidc,1 , &buf, &size)) { + !textconv_object (the_repository, obj_context.path, + obj_context.mode, &oidc,1 , &buf, &size)) {free (obj_context.path);return stream_blob_to_fd (1 , oid,NULL ,0 ); }
combine-diff.c +16 -11
@@ -285,7 +285,8 @@ static struct lline *coalesce_lines(struct lline *base, int *lenbase,return base; } -static char *grab_blob (const struct object_id *oid,unsigned int mode, +static char *grab_blob (struct repository *r, +const struct object_id *oid,unsigned int mode,unsigned long *size,struct userdiff_driver *textconv,const char *path) {
@@ -304,7 +305,7 @@ static char *grab_blob(const struct object_id *oid, unsigned int mode, }else if (textconv) {struct diff_filespec *df =alloc_filespec (path);fill_filespec (df, oid,1 , mode); - *size =fill_textconv (textconv, df, &blob); + *size =fill_textconv (r, textconv, df, &blob);free_filespec (df); }else { blob =read_object_file (oid, &type, size);
@@ -389,7 +390,8 @@ static void consume_line(void *state_, char *line, unsigned long len) } } -static void combine_diff(const struct object_id *parent, unsigned int mode, +static void combine_diff(struct repository *r, + const struct object_id *parent, unsigned int mode, mmfile_t *result_file, struct sline *sline, unsigned int cnt, int n, int num_parent, int result_deleted,
@@ -407,7 +409,7 @@ static void combine_diff(const struct object_id *parent, unsigned int mode,if (result_deleted)return ;/* result deleted */ - parent_file.ptr =grab_blob (parent, mode, &sz, textconv, path); + parent_file.ptr =grab_blob (r, parent, mode, &sz, textconv, path); parent_file.size = sz;memset (&xpp,0 ,sizeof (xpp)); xpp.flags = flags;
@@ -993,7 +995,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,/* Read the result of merge first */ if (!working_tree_file) - result =grab_blob (&elem->oid, elem->mode, &result_size, + result =grab_blob (opt->repo, &elem->oid, elem->mode, &result_size, textconv, elem->path);else {/* Used by diff-tree to read from the working tree */
@@ -1016,15 +1018,16 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, }else if (S_ISDIR (st.st_mode)) {struct object_id oid;if (resolve_gitlink_ref (elem->path,"HEAD" , &oid) <0 ) - result =grab_blob (&elem->oid, elem->mode, - &result_size,NULL ,NULL ); + result =grab_blob (opt->repo, &elem->oid, + elem->mode, &result_size, +NULL ,NULL );else - result =grab_blob (&oid, elem->mode, + result =grab_blob (opt->repo, &oid, elem->mode, &result_size,NULL ,NULL ); }else if (textconv) {struct diff_filespec *df =alloc_filespec (elem->path);fill_filespec (df, &null_oid,0 , st.st_mode); - result_size =fill_textconv (textconv, df, &result); + result_size =fill_textconv (opt->repo, textconv, df, &result);free_filespec (df); }else if (0 <= (fd =open (elem->path,O_RDONLY ))) {size_t len =xsize_t (st.st_size);
@@ -1090,7 +1093,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,for (i =0 ; !is_binary && i < num_parent; i++) {char *buf;unsigned long size; - buf =grab_blob (&elem->parent[i].oid, + buf =grab_blob (opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &size,NULL ,NULL );if (buffer_is_binary (buf, size))
@@ -1146,7 +1150,8 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent, } }if (i <= j) - combine_diff(&elem->parent[i].oid, + combine_diff(opt->repo, + &elem->parent[i].oid, elem->parent[i].mode, &result_file, sline, cnt, i, num_parent, result_deleted,
diff.c +9 -8
@@ -1700,8 +1700,8 @@ static void emit_rewrite_diff(const char *name_a,quote_two_c_style (&a_name, a_prefix, name_a,0 );quote_two_c_style (&b_name, b_prefix, name_b,0 ); - size_one =fill_textconv (textconv_one, one, &data_one); - size_two =fill_textconv (textconv_two, two, &data_two); + size_one =fill_textconv (o->repo, textconv_one, one, &data_one); + size_two =fill_textconv (o->repo, textconv_two, two, &data_two);memset (&ecbdata,0 ,sizeof (ecbdata)); ecbdata.color_diff =want_color (o->use_color);
@@ -3462,8 +3462,8 @@ static void builtin_diff(const char *name_a,strbuf_reset (&header); } - mf1.size =fill_textconv (textconv_one, one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); pe =diff_funcname_pattern (one);if (!pe)
@@ -6337,11 +6337,11 @@ static char *run_textconv(struct repository *r,return strbuf_detach (&buf, outsize); } -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf) { -struct repository *r = the_repository;size_t size;if (!driver) {
@@ -6386,7 +6386,8 @@ size_t fill_textconv(struct userdiff_driver *driver,return size; } -int textconv_object(const char *path, +int textconv_object(struct repository *r, + const char *path, unsigned mode, const struct object_id *oid, int oid_valid,
@@ -6404,7 +6405,7 @@ int textconv_object(const char *path,return 0 ; } - *buf_size =fill_textconv (textconv, df, buf); + *buf_size =fill_textconv (r, textconv, df, buf);free_filespec (df);return 1 ; }
diff.h +7 -2
@@ -442,7 +442,8 @@ int index_differs_from(const char *def, const struct diff_flags *flags,* struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer * that should be freed by the caller. */ -size_t fill_textconv (struct userdiff_driver *driver, +size_t fill_textconv (struct repository *r, +struct userdiff_driver *driver,struct diff_filespec *df,char **outbuf);
@@ -458,7 +459,11 @@ struct userdiff_driver *get_textconv(struct diff_filespec *one);* if the textconv driver exists. * Return 1 if the conversion succeeds, 0 otherwise. */ -int textconv_object (const char *path,unsigned mode,const struct object_id *oid,int oid_valid,char **buf,unsigned long *buf_size); +int textconv_object (struct repository *repo, +const char *path, +unsigned mode, +const struct object_id *oid,int oid_valid, +char **buf,unsigned long *buf_size);int parse_rename_score (const char **cp_p);
diffcore-pickaxe.c +2 -2
@@ -153,8 +153,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,if (textconv_one == textconv_two &&diff_unmodified_pair (p))return 0 ; - mf1.size =fill_textconv (textconv_one, p->one, &mf1.ptr); - mf2.size =fill_textconv (textconv_two, p->two, &mf2.ptr); + mf1.size =fill_textconv (o->repo, textconv_one, p->one, &mf1.ptr); + mf2.size =fill_textconv (o->repo, textconv_two, p->two, &mf2.ptr); ret = fn(DIFF_FILE_VALID(p->one) ? &mf1 : NULL, DIFF_FILE_VALID(p->two) ? &mf2 : NULL,
grep.c +1 -1
@@ -1741,7 +1741,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (driver, df, &buf); + size =fill_textconv (the_repository, driver, df, &buf);grep_read_unlock ();free_filespec (df);
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 7/23 grep.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/grep.c | 4 ++-- builtin/log.c | 2 +- grep.c | 13 ++++++++----- grep.h | 7 +++++-- revision.c | 4 ++-- 5 files changed, 18 insertions(+), 12 deletions(-)
builtin/grep.c +2 -2
@@ -904,9 +904,9 @@ int cmd_grep(int argc, const char **argv, const char *prefix) OPT_END() }; -init_grep_defaults (); +init_grep_defaults (the_repository);git_config (grep_cmd_config,NULL ); -grep_init (&opt, prefix); +grep_init (&opt, the_repository, prefix);/* * If there is no -- then the paths must exist in the working
builtin/log.c +1 -1
@@ -115,7 +115,7 @@ static int log_line_range_callback(const struct option *option, const char *arg,static void init_log_defaults (void ) { -init_grep_defaults (); +init_grep_defaults (the_repository);init_diff_ui_defaults (); decoration_style =auto_decoration_style ();
grep.c +8 -5
@@ -42,7 +42,7 @@ static void color_set(char *dst, const char *color_bytes)* We could let the compiler do this, but without C99 initializers * the code gets unwieldy and unreadable, so... */ -void init_grep_defaults (void ) +void init_grep_defaults (struct repository *repo) {struct grep_opt *opt = &grep_defaults;static int run_once;
@@ -52,6 +52,7 @@ void init_grep_defaults(void) run_once++;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->relative =1 ; opt->pathname =1 ; opt->max_depth =-1 ;
@@ -149,12 +150,13 @@ int grep_config(const char *var, const char *value, void *cb)* default values from the template we read the configuration * information in an earlier call to git_config(grep_config). */ -void grep_init (struct grep_opt *opt,const char *prefix) +void grep_init (struct grep_opt *opt,struct repository *repo,const char *prefix) {struct grep_opt *def = &grep_defaults;int i;memset (opt,0 ,sizeof (*opt)); + opt->repo = repo; opt->prefix = prefix; opt->prefix_length = (prefix && *prefix) ?strlen (prefix) :0 ; opt->pattern_tail = &opt->pattern_list;
@@ -1708,7 +1710,8 @@ static int look_ahead(struct grep_opt *opt,return 0 ; } -static int fill_textconv_grep (struct userdiff_driver *driver, +static int fill_textconv_grep (struct repository *r, +struct userdiff_driver *driver,struct grep_source *gs) {struct diff_filespec *df;
@@ -1741,7 +1744,7 @@ static int fill_textconv_grep(struct userdiff_driver *driver,* structure. */ grep_read_lock (); - size =fill_textconv (the_repository, driver, df, &buf); + size =fill_textconv (r, driver, df, &buf);grep_read_unlock ();free_filespec (df);
@@ -1837,7 +1840,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle try_lookahead =should_lookahead (opt); -if (fill_textconv_grep (textconv, gs) <0 ) +if (fill_textconv_grep (opt->repo, textconv, gs) <0 )return 0 ; bol = gs->buf;
grep.h +5 -2
@@ -36,6 +36,8 @@ typedef int pcre2_jit_stack;#include "thread-utils.h" #include "userdiff.h" +struct repository ; +enum grep_pat_token {GREP_PATTERN ,GREP_PATTERN_HEAD ,
@@ -136,6 +138,7 @@ struct grep_opt {struct grep_pat *header_list;struct grep_pat **header_tail;struct grep_expr *pattern_expression; +struct repository *repo;const char *prefix;int prefix_length;regex_t regexp;
@@ -183,9 +186,9 @@ struct grep_opt {void *output_priv; }; -extern void init_grep_defaults (void ); +extern void init_grep_defaults (struct repository *);extern int grep_config (const char *var,const char *value,void *); -extern void grep_init (struct grep_opt *,const char *prefix); +extern void grep_init (struct grep_opt *,struct repository *repo,const char *prefix);void grep_commit_pattern_type (enum grep_pattern_type ,struct grep_opt *opt);extern void append_grep_pat (struct grep_opt *opt,const char *pat,size_t patlen,const char *origin,int no,enum grep_pat_token t);
revision.c +2 -2
@@ -1464,8 +1464,8 @@ void init_revisions(struct rev_info *revs, const char *prefix) revs->commit_format =CMIT_FMT_DEFAULT ; revs->expand_tabs_in_log_default =8 ; -init_grep_defaults (); -grep_init (&revs->grep_filter, prefix); +init_grep_defaults (the_repository); +grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ;diff_setup (&revs->diffopt);
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 8/23 diff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyA new variant repo_diff_setup() is added that takes 'struct repository *' and diff_setup() becomes a thin macro around it that is protected by NO_THE_REPOSITORY_COMPATIBILITY_MACROS, similar to NO_THE_INDEX_.... The plan is these macros will always be defined for all library files and the macros are only accessible in builtin/
--- Documentation/technical/api-diff.txt | 4 ++-- blame.c | 20 +++++++++++--------- builtin/diff.c | 2 +- builtin/log.c | 2 +- builtin/merge.c | 2 +- builtin/range-diff.c | 2 +- diff-no-index.c | 9 +++++++-- diff.c | 4 ++-- diff.h | 7 +++++-- merge-recursive.c | 2 +- notes-merge.c | 4 ++-- patch-ids.c | 2 +- read-cache.c | 2 +- revision.c | 2 +- tree-diff.c | 2 +- 15 files changed, 38 insertions(+), 28 deletions(-)
Documentation/technical/api-diff.txt +2 -2
@@ -18,8 +18,8 @@ Calling sequence ---------------- * Prepare `struct diff_options` to record the set of diff options, and - then call `diff_setup()` to initialize this structure. This sets up - the vanilla default. + then call `repo_diff_setup()` to initialize this structure. This + sets up the vanilla default. * Fill in the options structure to specify desired output format, rename detection, etc. `diff_opt_parse()` can be used to parse options given
blame.c +11 -9
@@ -541,8 +541,9 @@ static int fill_blob_sha1_and_mode(struct repository *r,* We have an origin -- check if the same path exists in the * parent and return an origin structure to represent it. */ -static struct blame_origin *find_origin (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_origin (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin;struct diff_options diff_opts;
@@ -562,7 +563,7 @@ static struct blame_origin *find_origin(struct commit *parent,* and origin first. Most of the time they are the * same and diff-tree is fairly efficient about this. */ -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =0 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -629,14 +630,15 @@ static struct blame_origin *find_origin(struct commit *parent,* We have an origin -- find the path that corresponds to it in its * parent and return an origin structure to represent it. */ -static struct blame_origin *find_rename (struct commit *parent, -struct blame_origin *origin) +static struct blame_origin *find_rename (struct repository *r, +struct commit *parent, +struct blame_origin *origin) {struct blame_origin *porigin =NULL ;struct diff_options diff_opts;int i; -diff_setup (&diff_opts); +repo_diff_setup (r, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.detect_rename =DIFF_DETECT_RENAME ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1260,7 +1262,7 @@ static void find_copy_in_parent(struct blame_scoreboard *sb,if (!unblamed)return ;/* nothing remains for this target */ -diff_setup (&diff_opts); +repo_diff_setup (sb->repo, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
@@ -1442,7 +1444,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,* common cases, then we look for renames in the second pass. */ for (pass =0 ; pass <2 - sb->no_whole_file_rename; pass++) { -struct blame_origin *(*find)(struct commit *,struct blame_origin *); +struct blame_origin *(*find)(struct repository *,struct commit *,struct blame_origin *); find = pass ? find_rename : find_origin; for (i = 0, sg = first_scapegoat(revs, commit, sb->reverse);
@@ -1455,7 +1457,7 @@ static void pass_blame(struct blame_scoreboard *sb, struct blame_origin *origin,continue ;if (parse_commit (p))continue ; - porigin =find (p, origin); + porigin =find (sb->repo, p, origin);if (!porigin)continue ;if (!oidcmp (&porigin->blob_oid, &origin->blob_oid)) {
builtin/diff.c +1 -1
@@ -339,7 +339,7 @@ int cmd_diff(int argc, const char **argv, const char *prefix) }if (no_index)/* If this is a no-index diff, just run it and exit there. */ -diff_no_index (&rev, argc, argv); +diff_no_index (the_repository, &rev, argc, argv);/* Otherwise, we are doing the usual "git" diff */ rev.diffopt.skip_stat_unmatch = !!diff_auto_refresh_index;
builtin/log.c +1 -1
@@ -1361,7 +1361,7 @@ static void prepare_bases(struct base_tree_info *bases,return ;init_commit_base (&commit_base); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.flags.recursive =1 ;diff_setup_done (&diffopt);
builtin/merge.c +1 -1
@@ -452,7 +452,7 @@ static void finish(struct commit *head_commit, }if (new_head && show_diffstat) {struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.stat_width =-1 ;/* use full terminal width */ opts.stat_graph_width =-1 ;/* respect statGraphWidth config */ opts.output_format |=
builtin/range-diff.c +1 -1
@@ -34,7 +34,7 @@ int cmd_range_diff(int argc, const char **argv, const char *prefix)git_config (git_diff_ui_config,NULL ); -diff_setup (&diffopt); +repo_diff_setup (the_repository, &diffopt); diffopt.output_format =DIFF_FORMAT_PATCH ; diffopt.flags.suppress_diff_headers =1 ; diffopt.output_prefix = output_prefix_cb;
diff-no-index.c +7 -2
@@ -233,7 +233,8 @@ static void fixup_paths(const char **path, struct strbuf *replacement) } } -void diff_no_index (struct rev_info *revs, +void diff_no_index (struct repository *r, +struct rev_info *revs,int argc,const char **argv) {int i;
@@ -241,7 +242,11 @@ void diff_no_index(struct rev_info *revs,struct strbuf replacement =STRBUF_INIT ;const char *prefix = revs->prefix; -diff_setup (&revs->diffopt); +/* +* FIXME: --no-index should not look at index and we should be +* able to pass NULL repo. Maybe later. +*/ +repo_diff_setup (r, &revs->diffopt);for (i =1 ; i < argc -2 ; ) {int j;if (!strcmp (argv[i],"--no-index" ))
diff.c +2 -2
@@ -4390,12 +4390,12 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)builtin_checkdiff (name, other, attr_path, p->one, p->two, o); } -void diff_setup (struct diff_options *options) +void repo_diff_setup (struct repository *r,struct diff_options *options) {memcpy (options, &default_diff_options,sizeof (*options)); options->file = stdout; - options->repo->index = &the_index; + options->repo = r; options->abbrev =DEFAULT_ABBREV ; options->line_termination ='\n' ;
diff.h +5 -2
@@ -336,7 +336,10 @@ int git_diff_basic_config(const char *var, const char *value, void *cb);int git_diff_heuristic_config (const char *var,const char *value,void *cb);void init_diff_ui_defaults (void );int git_diff_ui_config (const char *var,const char *value,void *cb); -void diff_setup (struct diff_options *); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define diff_setup (diffopts) repo_diff_setup(the_repository, diffopts) +#endif +void repo_diff_setup (struct repository *,struct diff_options *);int diff_opt_parse (struct diff_options *,const char **,int ,const char *);void diff_setup_done (struct diff_options *);int git_config_rename (const char *var,const char *value);
@@ -426,7 +429,7 @@ int diff_flush_patch_id(struct diff_options *, struct object_id *, int);int diff_result_code (struct diff_options *,int ); -void diff_no_index (struct rev_info *,int ,const char **); +void diff_no_index (struct repository *,struct rev_info *,int ,const char **);int index_differs_from (const char *def,const struct diff_flags *flags,int ita_invisible_in_index);
merge-recursive.c +1 -1
@@ -1812,7 +1812,7 @@ static struct diff_queue_struct *get_diffpairs(struct merge_options *o,struct diff_queue_struct *ret;struct diff_options opts; -diff_setup (&opts); +repo_diff_setup (the_repository, &opts); opts.flags.recursive =1 ; opts.flags.rename_empty =0 ; opts.detect_rename =merge_detect_rename (o);
notes-merge.c +2 -2
@@ -126,7 +126,7 @@ static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,trace_printf ("\tdiff_tree_remote(base = %.7s, remote = %.7s)\n" ,oid_to_hex (base),oid_to_hex (remote)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
@@ -189,7 +189,7 @@ static void diff_tree_local(struct notes_merge_options *o,trace_printf ("\tdiff_tree_local(len = %i, base = %.7s, local = %.7s)\n" , len,oid_to_hex (base),oid_to_hex (local)); -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.recursive =1 ; opt.output_format =DIFF_FORMAT_NO_OUTPUT ;diff_setup_done (&opt);
patch-ids.c +1 -1
@@ -59,7 +59,7 @@ static int patch_id_cmp(const void *cmpfn_data,int init_patch_ids (struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -diff_setup (&ids->diffopts); +repo_diff_setup (the_repository, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
read-cache.c +1 -1
@@ -2137,7 +2137,7 @@ int index_has_changes(struct index_state *istate,if (tree || !get_oid_tree ("HEAD" , &cmp)) {struct diff_options opt; -diff_setup (&opt); +repo_diff_setup (the_repository, &opt); opt.flags.exit_with_status =1 ;if (!sb) opt.flags.quick =1 ;
revision.c +1 -1
@@ -1468,7 +1468,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)grep_init (&revs->grep_filter, the_repository, prefix); revs->grep_filter.status_only =1 ; -diff_setup (&revs->diffopt); +repo_diff_setup (the_repository, &revs->diffopt);if (prefix && !revs->diffopt.prefix) { revs->diffopt.prefix = prefix; revs->diffopt.prefix_length =strlen (prefix);
tree-diff.c +1 -1
@@ -605,7 +605,7 @@ static void try_to_follow_renames(const struct object_id *old_oid, choice = q->queue[0 ]; q->nr =0 ; -diff_setup (&diff_opts); +repo_diff_setup (the_repository, &diff_opts); diff_opts.flags.recursive =1 ; diff_opts.flags.find_copies_harder =1 ; diff_opts.output_format =DIFF_FORMAT_NO_OUTPUT ;
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 9/23 read-cache.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- read-cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
read-cache.c +2 -2
@@ -823,7 +823,7 @@ struct cache_entry *make_cache_entry(struct index_state *istate, ce->ce_namelen = len; ce->ce_mode =create_ce_mode (mode); - ret =refresh_cache_entry (&the_index, ce, refresh_options); + ret =refresh_cache_entry (istate, ce, refresh_options);if (ret != ce)discard_cache_entry (ce);return ret;
@@ -1493,7 +1493,7 @@ int refresh_index(struct index_state *istate, unsigned int flags,if (ignore_submodules &&S_ISGITLINK (ce->ce_mode))continue ; -if (pathspec && !ce_path_match (&the_index, ce, pathspec, seen)) +if (pathspec && !ce_path_match (istate, ce, pathspec, seen)) filtered =1 ;if (ce_stage (ce)) {
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 10/23 diff-lib.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- diff-lib.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
diff-lib.c +10 -7
@@ -70,7 +70,7 @@ static int match_stat_with_submodule(struct diff_options *diffopt, struct stat *st, unsigned ce_option, unsigned *dirty_submodule) { - int changed = ce_match_stat(ce, st, ce_option); + int changed = ie_match_stat(diffopt->repo->index, ce, st, ce_option);if (S_ISGITLINK (ce->ce_mode)) {struct diff_flags orig_flags = diffopt->flags;if (!diffopt->flags.override_submodule_config)
@@ -93,15 +93,16 @@ int run_diff_files(struct rev_info *revs, unsigned int option)unsigned ce_option = ((option &DIFF_RACY_IS_MODIFIED ) ?CE_MATCH_RACY_IS_DIRTY :0 );uint64_t start =getnanotime (); +struct index_state *istate = revs->diffopt.repo->index;diff_set_mnemonic_prefix (&revs->diffopt,"i/" ,"w/" );if (diff_unmerged_stage <0 ) diff_unmerged_stage =2 ; - entries = active_nr; + entries = istate->cache_nr;for (i =0 ; i < entries; i++) {unsigned int oldmode, newmode; -struct cache_entry *ce = active_cache[i]; +struct cache_entry *ce = istate->cache[i];int changed;unsigned dirty_submodule =0 ;const struct object_id *old_oid, *new_oid;
@@ -109,7 +110,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option)if (diff_can_quit_early (&revs->diffopt))break ; -if (!ce_path_match (&the_index, ce, &revs->prune_data,NULL )) +if (!ce_path_match (istate, ce, &revs->prune_data,NULL ))continue ;if (ce_stage (ce)) {
@@ -145,7 +146,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) dpath->mode = wt_mode;while (i < entries) { -struct cache_entry *nce = active_cache[i]; +struct cache_entry *nce = istate->cache[i];int stage;if (strcmp (ce->name, nce->name))
@@ -474,7 +475,9 @@ static int oneway_diff(const struct cache_entry * const *src,if (tree == o->df_conflict_entry) tree =NULL ; -if (ce_path_match (&the_index, idx ? idx : tree, &revs->prune_data,NULL )) { +if (ce_path_match (revs->diffopt.repo->index, + idx ? idx : tree, + &revs->prune_data,NULL )) {do_oneway_diff (o, idx, tree);if (diff_can_quit_early (&revs->diffopt)) { o->exiting_early =1 ;
@@ -506,7 +509,7 @@ static int diff_cache(struct rev_info *revs, opts.merge =1 ; opts.fn = oneway_diff; opts.unpack_data = revs; - opts.src_index = &the_index; + opts.src_index = revs->diffopt.repo->index; opts.dst_index =NULL ; opts.pathspec = &revs->diffopt.pathspec; opts.pathspec->recursive =1 ;
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 11/23 ll-merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- apply.c | 9 ++++++--- builtin/checkout.c | 3 ++- diff.c | 2 +- ll-merge.c | 17 +++++++++-------- ll-merge.h | 5 ++++- merge-blobs.c | 3 ++- merge-recursive.c | 3 ++- notes-merge.c | 3 ++- rerere.c | 10 ++++++---- 9 files changed, 34 insertions(+), 21 deletions(-)
apply.c +6 -3
@@ -3467,7 +3467,8 @@ static int load_preimage(struct apply_state *state,return 0 ; } -static int three_way_merge(struct image *image, +static int three_way_merge(struct apply_state *state, + struct image *image, char *path, const struct object_id *base, const struct object_id *ours,
@@ -3483,7 +3484,9 @@ static int three_way_merge(struct image *image, status =ll_merge (&result, path, &base_file,"base" , &our_file,"ours" , - &their_file,"theirs" ,NULL ); + &their_file,"theirs" , + state->repo->index, +NULL );free (base_file.ptr);free (our_file.ptr);free (their_file.ptr);
@@ -3595,7 +3598,7 @@ static int try_threeway(struct apply_state *state,clear_image (&tmp_image);/* in-core three-way merge between post and our using pre as base */ - status =three_way_merge (image, patch->new_name, + status =three_way_merge (state, image, patch->new_name, &pre_oid, &our_oid, &post_oid);if (status <0 ) {if (state->apply_verbosity > verbosity_silent)
builtin/checkout.c +2 -1
@@ -208,7 +208,8 @@ static int checkout_merged(int pos, const struct checkout *state)* merge.renormalize set, too */ status =ll_merge (&result_buf, path, &ancestor,"base" , - &ours,"ours" , &theirs,"theirs" ,NULL ); + &ours,"ours" , &theirs,"theirs" , + state->istate,NULL );free (ancestor.ptr);free (ours.ptr);free (theirs.ptr);
diff.c +1 -1
@@ -3637,7 +3637,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b, data.lineno =0 ; data.o = o; data.ws_rule =whitespace_rule (attr_path); - data.conflict_marker_size =ll_merge_marker_size (attr_path); + data.conflict_marker_size =ll_merge_marker_size (o->repo->index, attr_path);if (fill_mmfile (o->repo, &mf1, one) <0 ||fill_mmfile (o->repo, &mf2, two) <0 )
ll-merge.c +9 -8
@@ -336,10 +336,10 @@ static const struct ll_merge_driver *find_ll_merge_driver(const char *merge_attrreturn &ll_merge_drv[LL_TEXT_MERGE ]; } -static void normalize_file (mmfile_t *mm,const char *path) +static void normalize_file (mmfile_t *mm,const char *path,struct index_state *istate) {struct strbuf strbuf =STRBUF_INIT ; -if (renormalize_buffer (&the_index, path, mm->ptr, mm->size, &strbuf)) { +if (renormalize_buffer (istate, path, mm->ptr, mm->size, &strbuf)) {free (mm->ptr); mm->size = strbuf.len; mm->ptr =strbuf_detach (&strbuf,NULL );
@@ -351,6 +351,7 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts) { static struct attr_check *check;
@@ -363,15 +364,15 @@ int ll_merge(mmbuffer_t *result_buf, opts = &default_opts;if (opts->renormalize) { -normalize_file (ancestor, path); -normalize_file (ours, path); -normalize_file (theirs, path); +normalize_file (ancestor, path, istate); +normalize_file (ours, path, istate); +normalize_file (theirs, path, istate); }if (!check) check =attr_check_initl ("merge" ,"conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check)) { +if (!git_check_attr (istate, path, check)) { ll_driver_name = check->items[0 ].value;if (check->items[1 ].value) { marker_size =atoi (check->items[1 ].value);
@@ -391,14 +392,14 @@ int ll_merge(mmbuffer_t *result_buf, opts, marker_size); } -int ll_merge_marker_size (const char *path) +int ll_merge_marker_size (struct index_state *istate,const char *path) {static struct attr_check *check;int marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;if (!check) check =attr_check_initl ("conflict-marker-size" ,NULL ); -if (!git_check_attr (&the_index, path, check) && check->items[0 ].value) { +if (!git_check_attr (istate, path, check) && check->items[0 ].value) { marker_size =atoi (check->items[0 ].value);if (marker_size <=0 ) marker_size =DEFAULT_CONFLICT_MARKER_SIZE ;
ll-merge.h +4 -1
@@ -7,6 +7,8 @@#include "xdiff/xdiff.h" +struct index_state ; +struct ll_merge_options {unsigned virtual_ancestor :1 ;unsigned variant :2 ;/* favor ours, favor theirs, or union merge */
@@ -19,8 +21,9 @@ int ll_merge(mmbuffer_t *result_buf, mmfile_t *ancestor, const char *ancestor_label, mmfile_t *ours, const char *our_label, mmfile_t *theirs, const char *their_label, + struct index_state *istate, const struct ll_merge_options *opts); -int ll_merge_marker_size (const char *path); +int ll_merge_marker_size (struct index_state *istate,const char *path);#endif
merge-blobs.c +2 -1
@@ -41,7 +41,8 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our* common ancestor. */ merge_status =ll_merge (&res, path, base,NULL , - our,".our" , their,".their" ,NULL ); + our,".our" , their,".their" , + &the_index,NULL );if (merge_status <0 )return NULL ;
merge-recursive.c +2 -1
@@ -1083,7 +1083,8 @@ static int merge_3way(struct merge_options *o,read_mmblob (&src2, &b->oid); merge_status =ll_merge (result_buf, a->path, &orig, base_name, - &src1, name1, &src2, name2, &ll_opts); + &src1, name1, &src2, name2, + &the_index, &ll_opts);free (base_name);free (name1);
notes-merge.c +2 -1
@@ -348,7 +348,8 @@ static int ll_merge_in_worktree(struct notes_merge_options *o,read_mmblob (&remote, &p->remote); status =ll_merge (&result_buf,oid_to_hex (&p->obj), &base,NULL , - &local, o->local_ref, &remote, o->remote_ref,NULL ); + &local, o->local_ref, &remote, o->remote_ref, + &the_index,NULL );free (base.ptr);free (local.ptr);
rerere.c +6 -4
@@ -478,7 +478,7 @@ static int handle_file(const char *path, unsigned char *sha1, const char *output {int hunk_no =0 ;struct rerere_io_file io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);memset (&io,0 ,sizeof (io)); io.io.getline = rerere_file_getline;
@@ -641,7 +641,8 @@ static int try_merge(const struct rerere_id *id, const char *path,* A three-way merge. Note that this honors user-customizable * low-level merge driver settings. */ - ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" ,NULL ); + ret =ll_merge (result, path, &base,NULL , cur,"" , &other,"" , + &the_index,NULL );free (base.ptr);free (other.ptr);
@@ -960,7 +961,7 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpuconst struct cache_entry *ce;int pos, len, i, hunk_no;struct rerere_io_mem io; -int marker_size =ll_merge_marker_size (path); +int marker_size =ll_merge_marker_size (&the_index, path);/* * Reproduce the conflicted merge in-core
@@ -995,7 +996,8 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu*/ ll_merge (&result, path, &mmfile[0 ],NULL , &mmfile[1 ],"ours" , - &mmfile[2 ],"theirs" ,NULL ); + &mmfile[2 ],"theirs" , + &the_index,NULL );for (i =0 ; i <3 ; i++)free (mmfile[i].ptr);
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 12/23 merge-blobs.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge-tree.c | 2 +- merge-blobs.c | 15 +++++++++++---- merge-blobs.h | 7 +++++-- 3 files changed, 17 insertions(+), 7 deletions(-)
builtin/merge-tree.c +1 -1
@@ -76,7 +76,7 @@ static void *result(struct merge_list *entry, unsigned long *size) their =NULL ;if (entry) their = entry->blob; -return merge_blobs (path, base, our, their, size); +return merge_blobs (&the_index, path, base, our, their, size); }static void *origin (struct merge_list *entry,unsigned long *size)
merge-blobs.c +11 -4
@@ -29,7 +29,12 @@ static void free_mmfile(mmfile_t *f)free (f->ptr); } -static void *three_way_filemerge (const char *path,mmfile_t *base,mmfile_t *our,mmfile_t *their,unsigned long *size) +static void *three_way_filemerge (struct index_state *istate, +const char *path, +mmfile_t *base, +mmfile_t *our, +mmfile_t *their, +unsigned long *size) {int merge_status;mmbuffer_t res;
@@ -42,7 +47,7 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *our*/ merge_status =ll_merge (&res, path, base,NULL , our,".our" , their,".their" , - &the_index,NULL ); + istate,NULL );if (merge_status <0 )return NULL ;
@@ -50,7 +55,9 @@ static void *three_way_filemerge(const char *path, mmfile_t *base, mmfile_t *ourreturn res.ptr; } -void *merge_blobs (const char *path,struct blob *base,struct blob *our,struct blob *their,unsigned long *size) +void *merge_blobs (struct index_state *istate,const char *path, +struct blob *base,struct blob *our, +struct blob *their,unsigned long *size) {void *res =NULL ;mmfile_t f1, f2, common;
@@ -83,7 +90,7 @@ void *merge_blobs(const char *path, struct blob *base, struct blob *our, struct common.ptr =xstrdup ("" ); common.size =0 ; } - res =three_way_filemerge (path, &common, &f1, &f2, size); + res =three_way_filemerge (istate, path, &common, &f1, &f2, size);free_mmfile (&common); out_free_f2_f1:free_mmfile (&f2);
merge-blobs.h +5 -2
@@ -1,8 +1,11 @@#ifndef MERGE_BLOBS_H #define MERGE_BLOBS_H -#include "blob.h" +struct blob ; +struct index_state ; -extern void *merge_blobs (const char *,struct blob *,struct blob *,struct blob *,unsigned long *); +extern void *merge_blobs (struct index_state *,const char *, +struct blob *,struct blob *, +struct blob *,unsigned long *);#endif /* MERGE_BLOBS_H */
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 13/23 merge.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/merge.c | 8 +++++--- builtin/pull.c | 7 +++++-- cache.h | 6 ++++-- merge.c | 20 +++++++++++--------- sequencer.c | 6 +++--- 5 files changed, 28 insertions(+), 19 deletions(-)
builtin/merge.c +5 -3
@@ -728,8 +728,9 @@ static int try_merge_strategy(const char *strategy, struct commit_list *common,die (_ ("unable to write %s" ),get_index_file ());return clean ?0 :1 ; }else { -return try_merge_command (strategy, xopts_nr, xopts, - common, head_arg, remoteheads); +return try_merge_command (the_repository, + strategy, xopts_nr, xopts, + common, head_arg, remoteheads); } }
@@ -1470,7 +1471,8 @@ int cmd_merge(int argc, const char **argv, const char *prefix) goto done; } -if (checkout_fast_forward (&head_commit->object.oid, +if (checkout_fast_forward (the_repository, + &head_commit->object.oid, &commit->object.oid, overwrite_ignore)) { ret =1 ;
builtin/pull.c +5 -2
@@ -562,7 +562,9 @@ static int pull_into_void(const struct object_id *merge_head,* index/worktree changes that the user already made on the unborn * branch. */ -if (checkout_fast_forward (the_hash_algo->empty_tree, merge_head,0 )) +if (checkout_fast_forward (the_repository, + the_hash_algo->empty_tree, + merge_head,0 ))return 1 ;if (update_ref ("initial pull" ,"HEAD" , merge_head, curr_head,0 ,UPDATE_REFS_DIE_ON_ERR ))
@@ -915,7 +917,8 @@ int cmd_pull(int argc, const char **argv, const char *prefix)"fast-forwarding your working tree from\n" "commit %s."), oid_to_hex(&orig_head)); -if (checkout_fast_forward (&orig_head, &curr_head,0 )) +if (checkout_fast_forward (the_repository, &orig_head, + &curr_head,0 )) die(_("Cannot fast-forward your working tree.\n" "After making sure that you saved anything precious from\n" "$ git diff %s\n"
cache.h +4 -2
@@ -1716,10 +1716,12 @@ extern struct startup_info *startup_info;/* merge.c */ struct commit_list ; -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes); -int checkout_fast_forward (const struct object_id *from, +int checkout_fast_forward (struct repository *r, +const struct object_id *from,const struct object_id *to,int overwrite_ignore);
merge.c +11 -9
@@ -14,7 +14,8 @@ static const char *merge_argument(struct commit *commit)return oid_to_hex (commit ? &commit->object.oid : the_hash_algo->empty_tree); } -int try_merge_command (const char *strategy,size_t xopts_nr, +int try_merge_command (struct repository *r, +const char *strategy,size_t xopts_nr,const char **xopts,struct commit_list *common,const char *head_arg,struct commit_list *remotes) {
@@ -35,15 +36,16 @@ int try_merge_command(const char *strategy, size_t xopts_nr, ret =run_command_v_opt (args.argv,RUN_GIT_CMD );argv_array_clear (&args); -discard_cache (); -if (read_cache () <0 ) +discard_index (r->index); +if (read_index (r->index) <0 )die (_ ("failed to read the cache" )); -resolve_undo_clear (); +resolve_undo_clear_index (r->index);return ret; } -int checkout_fast_forward (const struct object_id *head, +int checkout_fast_forward (struct repository *r, +const struct object_id *head,const struct object_id *remote,int overwrite_ignore) {
@@ -54,7 +56,7 @@ int checkout_fast_forward(const struct object_id *head,struct dir_struct dir;struct lock_file lock_file =LOCK_INIT ; -refresh_cache (REFRESH_QUIET ); +refresh_index (r->index,REFRESH_QUIET ,NULL ,NULL ,NULL );if (hold_locked_index (&lock_file,LOCK_REPORT_ON_ERROR ) <0 )return -1 ;
@@ -86,8 +88,8 @@ int checkout_fast_forward(const struct object_id *head, } opts.head_idx =1 ; - opts.src_index = &the_index; - opts.dst_index = &the_index; + opts.src_index = r->index; + opts.dst_index = r->index; opts.update =1 ; opts.verbose_update =1 ; opts.merge =1 ;
@@ -101,7 +103,7 @@ int checkout_fast_forward(const struct object_id *head, }clear_unpack_trees_porcelain (&opts); -if (write_locked_index (&the_index, &lock_file,COMMIT_LOCK )) +if (write_locked_index (r->index, &lock_file,COMMIT_LOCK ))return error (_ ("unable to write new index file" ));return 0 ; }
sequencer.c +3 -3
@@ -470,8 +470,8 @@ static int fast_forward_to(const struct object_id *to, const struct object_id *fstruct strbuf sb =STRBUF_INIT ;struct strbuf err =STRBUF_INIT ; -read_cache (); -if (checkout_fast_forward (from, to,1 )) +read_index (&the_index); +if (checkout_fast_forward (the_repository, from, to,1 ))return -1 ;/* the callee should have complained already */ strbuf_addf (&sb,_ ("%s: fast-forward" ),_ (action_name (opts)));
@@ -1827,7 +1827,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit,commit_list_insert (base, &common);commit_list_insert (next, &remotes); - res |=try_merge_command (opts->strategy, + res |=try_merge_command (the_repository, opts->strategy, opts->xopts_nr, (const char **)opts->xopts, common,oid_to_hex (&head), remotes);free_commit_list (common);
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 14/23 patch-ids.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/log.c | 2 +- patch-ids.c | 4 ++-- patch-ids.h | 3 ++- revision.c | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-)
builtin/log.c +1 -1
@@ -914,7 +914,7 @@ static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)if ((flags1 &UNINTERESTING ) == (flags2 &UNINTERESTING ))die (_ ("Not a range." )); -init_patch_ids (ids); +init_patch_ids (the_repository, ids);/* given a range a..b get all patch ids for b..a */ init_revisions (&check_rev, rev->prefix);
patch-ids.c +2 -2
@@ -56,10 +56,10 @@ static int patch_id_cmp(const void *cmpfn_data,return oidcmp (&a->patch_id, &b->patch_id); } -int init_patch_ids (struct patch_ids *ids) +int init_patch_ids (struct repository *r,struct patch_ids *ids) {memset (ids,0 ,sizeof (*ids)); -repo_diff_setup (the_repository, &ids->diffopts); +repo_diff_setup (r, &ids->diffopts); ids->diffopts.detect_rename =0 ; ids->diffopts.flags.recursive =1 ;diff_setup_done (&ids->diffopts);
patch-ids.h +2 -1
@@ -6,6 +6,7 @@struct commit ;struct object_id ; +struct repository ;struct patch_id {struct hashmap_entry ent;
@@ -20,7 +21,7 @@ struct patch_ids {int commit_patch_id (struct commit *commit,struct diff_options *options,struct object_id *oid,int ); -int init_patch_ids (struct patch_ids *); +int init_patch_ids (struct repository *,struct patch_ids *);int free_patch_ids (struct patch_ids *);struct patch_id *add_commit_patch_id (struct commit *,struct patch_ids *);struct patch_id *has_commit_patch_id (struct commit *,struct patch_ids *);
revision.c +1 -1
@@ -877,7 +877,7 @@ static void cherry_pick_list(struct commit_list *list, struct rev_info *revs)return ; left_first = left_count < right_count; -init_patch_ids (&ids); +init_patch_ids (the_repository, &ids); ids.diffopts.pathspec = revs->diffopt.pathspec;/* Compute patch-ids for one side */
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 15/23 sha1-file.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/difftool.c | 2 +- builtin/hash-object.c | 2 +- builtin/replace.c | 2 +- builtin/update-index.c | 2 +- cache.h | 4 ++-- diff.c | 20 ++++++++--------- notes-merge.c | 2 +- read-cache.c | 25 ++++++++++++--------- sha1-file.c | 50 ++++++++++++++++++++++++------------------ 9 files changed, 61 insertions(+), 48 deletions(-)
builtin/difftool.c +1 -1
@@ -112,7 +112,7 @@ static int use_wt_file(const char *workdir, const char *name,int fd =open (buf.buf,O_RDONLY );if (fd >=0 && - !index_fd (&wt_oid, fd, &st,OBJ_BLOB , name,0 )) { + !index_fd (&the_index, &wt_oid, fd, &st,OBJ_BLOB , name,0 )) {if (is_null_oid (oid)) {oidcpy (oid, &wt_oid); use =1 ;
builtin/hash-object.c +1 -1
@@ -40,7 +40,7 @@ static void hash_fd(int fd, const char *type, const char *path, unsigned flags,if (fstat (fd, &st) <0 || (literally ?hash_literally (&oid, fd, type, flags) - :index_fd (&oid, fd, &st,type_from_string (type), path, flags))) + :index_fd (&the_index, &oid, fd, &st,type_from_string (type), path, flags)))die ((flags &HASH_WRITE_OBJECT ) ?"Unable to add %s to database" :"Unable to hash %s" , path);
builtin/replace.c +1 -1
@@ -295,7 +295,7 @@ static int import_object(struct object_id *oid, enum object_type type,close (fd);return -1 ; } -if (index_fd (oid, fd, &st, type,NULL , flags) <0 ) +if (index_fd (&the_index, oid, fd, &st, type,NULL , flags) <0 )return error (_ ("unable to write object to database" ));/* index_fd close()s fd for us */ }
builtin/update-index.c +1 -1
@@ -282,7 +282,7 @@ static int add_one_path(const struct cache_entry *old, const char *path, int lenfill_stat_cache_info (ce, st); ce->ce_mode =ce_mode_from_stat (old, st->st_mode); -if (index_path (&ce->oid, path, st, +if (index_path (&the_index, &ce->oid, path, st, info_only ?0 :HASH_WRITE_OBJECT )) {discard_cache_entry (ce);return -1 ;
cache.h +2 -2
@@ -787,8 +787,8 @@ extern int ie_modified(struct index_state *, const struct cache_entry *, struct#define HASH_WRITE_OBJECT 1#define HASH_FORMAT_CHECK 2#define HASH_RENORMALIZE 4 -extern int index_fd (struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); -extern int index_path (struct object_id *oid,const char *path,struct stat *st,unsigned flags); +extern int index_fd (struct index_state *istate,struct object_id *oid,int fd,struct stat *st,enum object_type type,const char *path,unsigned flags); +extern int index_path (struct index_state *istate,struct object_id *oid,const char *path,struct stat *st,unsigned flags);/* * Record to sd the data from st that we use to check whether a file
diff.c +10 -10
@@ -4252,7 +4252,7 @@ static void run_diff_cmd(const char *pgm,fprintf (o->file,"* Unmerged path %s\n" , name); } -static void diff_fill_oid_info (struct diff_filespec *one) +static void diff_fill_oid_info (struct diff_filespec *one,struct index_state *istate) {if (DIFF_FILE_VALID (one)) {if (!one->oid_valid) {
@@ -4263,7 +4263,7 @@ static void diff_fill_oid_info(struct diff_filespec *one) }if (lstat (one->path, &st) <0 )die_errno ("stat '%s'" , one->path); -if (index_path (&one->oid, one->path, &st,0 )) +if (index_path (istate, &one->oid, one->path, &st,0 ))die ("cannot hash %s" , one->path); } }
@@ -4311,8 +4311,8 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)return ; } -diff_fill_oid_info (one); -diff_fill_oid_info (two); +diff_fill_oid_info (one, o->repo->index); +diff_fill_oid_info (two, o->repo->index); if (!pgm && DIFF_FILE_VALID(one) && DIFF_FILE_VALID(two) &&
@@ -4359,8 +4359,8 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_diffstat (name, other, p->one, p->two, diffstat, o, p);
@@ -4384,8 +4384,8 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o)if (o->prefix_length)strip_prefix (o->prefix_length, &name, &other); -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, o->repo->index); +diff_fill_oid_info (p->two, o->repo->index);builtin_checkdiff (name, other, attr_path, p->one, p->two, o); }
@@ -5685,8 +5685,8 @@ static int diff_get_patch_id(struct diff_options *options, struct object_id *oidif (DIFF_PAIR_UNMERGED (p))continue ; -diff_fill_oid_info (p->one); -diff_fill_oid_info (p->two); +diff_fill_oid_info (p->one, options->repo->index); +diff_fill_oid_info (p->two, options->repo->index); len1 =remove_space (p->one->path,strlen (p->one->path)); len2 =remove_space (p->two->path,strlen (p->two->path));
notes-merge.c +1 -1
@@ -710,7 +710,7 @@ int notes_merge_commit(struct notes_merge_options *o,/* write file as blob, and add to partial_tree */ if (stat (path.buf, &st))die_errno ("Failed to stat '%s'" , path.buf); -if (index_path (&blob_oid, path.buf, &st,HASH_WRITE_OBJECT )) +if (index_path (&the_index, &blob_oid, path.buf, &st,HASH_WRITE_OBJECT ))die ("Failed to write blob object from '%s'" , path.buf);if (add_note (partial_tree, &obj_oid, &blob_oid,NULL )) die("Failed to add resolved note '%s' to notes tree",
read-cache.c +15 -10
@@ -205,14 +205,16 @@ void fill_stat_cache_info(struct cache_entry *ce, struct stat *st) } } -static int ce_compare_data (const struct cache_entry *ce,struct stat *st) +static int ce_compare_data (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {int match =-1 ;int fd =git_open_cloexec (ce->name,O_RDONLY );if (fd >=0 ) {struct object_id oid; -if (!index_fd (&oid, fd, st,OBJ_BLOB , ce->name,0 )) +if (!index_fd (istate, &oid, fd, st,OBJ_BLOB , ce->name,0 )) match =oidcmp (&oid, &ce->oid);/* index_fd() closed the file descriptor already */ }
@@ -257,11 +259,13 @@ static int ce_compare_gitlink(const struct cache_entry *ce)return oidcmp (&oid, &ce->oid); } -static int ce_modified_check_fs (const struct cache_entry *ce,struct stat *st) +static int ce_modified_check_fs (struct index_state *istate, +const struct cache_entry *ce, +struct stat *st) {switch (st->st_mode &S_IFMT ) {case S_IFREG : -if (ce_compare_data (ce, st)) +if (ce_compare_data (istate, ce, st))return DATA_CHANGED ;break ;case S_IFLNK :
@@ -407,7 +411,7 @@ int ie_match_stat(struct index_state *istate,if (assume_racy_is_modified) changed |=DATA_CHANGED ;else - changed |=ce_modified_check_fs (ce, st); + changed |=ce_modified_check_fs (istate, ce, st); }return changed;
@@ -447,7 +451,7 @@ int ie_modified(struct index_state *istate, (S_ISGITLINK(ce->ce_mode) || ce->ce_stat_data.sd_size != 0))return changed; - changed_fs =ce_modified_check_fs (ce, st); + changed_fs =ce_modified_check_fs (istate, ce, st);if (changed_fs)return changed | changed_fs;return 0 ;
@@ -753,7 +757,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, } }if (!intent_only) { -if (index_path (&ce->oid, path, st, newflags)) { +if (index_path (istate, &ce->oid, path, st, newflags)) {discard_cache_entry (ce);return error ("unable to index file %s" , path); }
@@ -2230,7 +2234,8 @@ static int ce_flush(git_hash_ctx *context, int fd, unsigned char *hash)return (write_in_full (fd, write_buffer, left) <0 ) ?-1 :0 ; } -static void ce_smudge_racily_clean_entry (struct cache_entry *ce) +static void ce_smudge_racily_clean_entry (struct index_state *istate, +struct cache_entry *ce) {/* * The only thing we care about in this function is to smudge the
@@ -2249,7 +2254,7 @@ static void ce_smudge_racily_clean_entry(struct cache_entry *ce)return ;if (ce_match_stat_basic (ce, &st))return ; -if (ce_modified_check_fs (ce, &st)) { +if (ce_modified_check_fs (istate, ce, &st)) {/* This is "racily clean"; smudge it. Note that this * is a tricky code. At first glance, it may appear * that it can break with this sequence:
@@ -2494,7 +2499,7 @@ static int do_write_index(struct index_state *istate, struct tempfile *tempfile,if (ce->ce_flags &CE_REMOVE )continue ;if (!ce_uptodate (ce) &&is_racy_timestamp (istate, ce)) -ce_smudge_racily_clean_entry (ce); +ce_smudge_racily_clean_entry (istate, ce);if (is_null_oid (&ce->oid)) {static const char msg[] ="cache entry has null sha1: %s" ;static int allow =-1 ;
sha1-file.c +29 -21
134 lines not on this page · raw message
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 16/23 rerere.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc DuyThe reason rerere(), rerere_forget() and rerere_remaining() take a struct repository instead of struct index_state is not obvious from the patch:
Deep in update_paths() and find_conflict(), hold_locked_index() and read_index() are called. These functions assumes the index path at $GIT_DIR/index which is not always true when you take an arbitrary index state. Taking a repository will allow us to point to the right index path later when we replace them with repo_ versions.
--- apply.c | 2 +- builtin/am.c | 4 +- builtin/commit.c | 2 +- builtin/merge.c | 2 +- builtin/rerere.c | 6 +-- rerere.c | 119 +++++++++++++++++++++++++---------------------- rerere.h | 10 ++-- sequencer.c | 4 +- 8 files changed, 81 insertions(+), 68 deletions(-)
apply.c +1 -1
@@ -4630,7 +4630,7 @@ static int write_out_results(struct apply_state *state, struct patch *list) }string_list_clear (&cpath,0 ); -rerere (0 ); +repo_rerere (state->repo,0 ); }return errs;
builtin/am.c +2 -2
@@ -1604,7 +1604,7 @@ static int fall_back_threeway(const struct am_state *state, const char *index_pa o.verbosity =0 ;if (merge_recursive_generic (&o, &our_tree, &their_tree,1 , bases, &result)) { -rerere (state->allow_rerere_autoupdate); +repo_rerere (the_repository, state->allow_rerere_autoupdate);free (their_tree_name);return error (_ ("Failed to merge in the changes." )); }
@@ -1899,7 +1899,7 @@ static void am_resolve(struct am_state *state) goto next; } -rerere (0 ); +repo_rerere (the_repository,0 );do_commit (state);
builtin/commit.c +1 -1
@@ -1651,7 +1651,7 @@ int cmd_commit(int argc, const char **argv, const char *prefix)"new_index file. Check that disk is not full and quota is\n" "not exceeded, and then \"git reset HEAD\" to recover.")); -rerere (0 ); +repo_rerere (the_repository,0 );run_command_v_opt (argv_gc_auto,RUN_GIT_CMD );run_commit_hook (use_editor,get_index_file (),"post-commit" ,NULL );if (amend && !no_post_rewrite) {
builtin/merge.c +1 -1
@@ -899,7 +899,7 @@ static int suggest_conflicts(void)fputs (msgbuf.buf, fp);strbuf_release (&msgbuf);fclose (fp); -rerere (allow_rerere_auto); +repo_rerere (the_repository, allow_rerere_auto);printf (_ ("Automatic merge failed; " "fix conflicts and then commit the result.\n" ));return 1 ;
builtin/rerere.c +3 -3
@@ -70,7 +70,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix) flags =RERERE_NOAUTOUPDATE ;if (argc <1 ) -return rerere (flags); +return repo_rerere (the_repository, flags);if (!strcmp (argv[0 ],"forget" )) {struct pathspec pathspec;
@@ -78,7 +78,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)warning ("'git rerere forget' without paths is deprecated" );parse_pathspec (&pathspec,0 ,PATHSPEC_PREFER_CWD , prefix, argv +1 ); -return rerere_forget (&pathspec); +return rerere_forget (the_repository, &pathspec); }if (!strcmp (argv[0 ],"clear" )) {
@@ -91,7 +91,7 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)for (i =0 ; i < merge_rr.nr; i++)printf ("%s\n" , merge_rr.items[i].string); }else if (!strcmp (argv[0 ],"remaining" )) { -rerere_remaining (&merge_rr); +rerere_remaining (the_repository, &merge_rr);for (i =0 ; i < merge_rr.nr; i++) {if (merge_rr.items[i].util !=RERERE_RESOLVED )printf ("%s\n" , merge_rr.items[i].string);
rerere.c +64 -55
361 lines not on this page · raw message
rerere.h +7 -3
@@ -4,6 +4,7 @@#include "string-list.h" struct pathspec ; +struct repository ;#define RERERE_AUTOUPDATE 01#define RERERE_NOAUTOUPDATE 02
@@ -23,7 +24,10 @@ struct rerere_id { };int setup_rerere (struct string_list *,int ); -int rerere (int ); +#ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS +#define rerere (flags) repo_rerere(the_repository, flags) +#endif +int repo_rerere (struct repository *,int );/* * Given the conflict ID and the name of a "file" used for replaying * the recorded resolution (e.g. "preimage", "postimage"), return the
@@ -31,8 +35,8 @@ int rerere(int);* return the path to the directory that houses these files. */ const char *rerere_path (const struct rerere_id *,const char *file); -int rerere_forget (struct pathspec *); -int rerere_remaining (struct string_list *); +int rerere_forget (struct repository *,struct pathspec *); +int rerere_remaining (struct repository *,struct string_list *);void rerere_clear (struct string_list *);void rerere_gc (struct string_list *);
sequencer.c +2 -2
@@ -1856,7 +1856,7 @@ static int do_pick_commit(enum todo_command command, struct commit *commit, : _("could not apply %s... %s"), short_commit_name(commit), msg.subject);print_advice (res ==1 , opts); -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto); goto leave; }
@@ -3175,7 +3175,7 @@ static int do_merge(struct commit *commit, const char *arg, int arg_len,rollback_lock_file (&lock);if (ret) -rerere (opts->allow_rerere_auto); +repo_rerere (the_repository, opts->allow_rerere_auto);else /* * In case of problems, we now want to return a positive
Signature · 1 line
2.19.0.640.gcd3aa10a8a
PATCH v5 17/23 userdiff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- archive-zip.c | 14 +++++++++----- builtin/grep.c | 3 ++- combine-diff.c | 2 +- diff.c | 40 +++++++++++++++++++++++----------------- diff.h | 3 ++- diffcore-pickaxe.c | 4 ++-- grep.c | 21 ++++++++++++--------- grep.h | 3 ++- line-range.c | 2 +- userdiff.c | 5 +++-- userdiff.h | 3 ++- 11 files changed, 59 insertions(+), 41 deletions(-)
archive-zip.c +9 -5
@@ -264,9 +264,10 @@ static int has_only_ascii(const char *s) } } -static int entry_is_binary (const char *path,const void *buffer,size_t size) +static int entry_is_binary (struct index_state *istate,const char *path, +const void *buffer,size_t size) { -struct userdiff_driver *driver =userdiff_find_by_path (path); +struct userdiff_driver *driver =userdiff_find_by_path (istate, path);if (!driver) driver =userdiff_find_by_name ("default" );if (driver->binary !=-1 )
@@ -352,7 +353,8 @@ static int write_zip_entry(struct archiver_args *args,return error (_ ("cannot read %s" ),oid_to_hex (oid)); crc =crc32 (crc, buffer, size); - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buffer, size); out = buffer; }
@@ -428,7 +430,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen);write_or_die (1 , buf, readlen); }
@@ -460,7 +463,8 @@ static int write_zip_entry(struct archiver_args *args,break ; crc =crc32 (crc, buf, readlen);if (is_binary ==-1 ) - is_binary =entry_is_binary (path_without_prefix, + is_binary =entry_is_binary (args->repo->index, + path_without_prefix, buf, readlen); zstream.next_in = buf;
builtin/grep.c +2 -1
@@ -103,7 +103,8 @@ static void add_work(struct grep_opt *opt, const struct grep_source *gs) todo[todo_end].source = *gs;if (opt->binary !=GREP_BINARY_TEXT ) -grep_source_load_driver (&todo[todo_end].source); +grep_source_load_driver (&todo[todo_end].source, + opt->repo->index); todo[todo_end].done =0 ;strbuf_reset (&todo[todo_end].out); todo_end = (todo_end +1 ) %ARRAY_SIZE (todo);
combine-diff.c +1 -1
@@ -987,7 +987,7 @@ static void show_patch_diff(struct combine_diff_path *elem, int num_parent,const char *line_prefix =diff_line_prefix (opt); context = opt->context; - userdiff =userdiff_find_by_path (elem->path); + userdiff =userdiff_find_by_path (opt->repo->index, elem->path);if (!userdiff) userdiff =userdiff_find_by_name ("default" );if (opt->flags.allow_textconv)
diff.c +23 -17
@@ -2093,23 +2093,25 @@ static void diff_words_flush(struct emit_callback *ecbdata) } } -static void diff_filespec_load_driver (struct diff_filespec *one) +static void diff_filespec_load_driver (struct diff_filespec *one, +struct index_state *istate) {/* Use already-loaded driver */ if (one->driver)return ;if (S_ISREG (one->mode)) - one->driver =userdiff_find_by_path (one->path); + one->driver =userdiff_find_by_path (istate, one->path);/* Fallback to default settings */ if (!one->driver) one->driver =userdiff_find_by_name ("default" ); } -static const char *userdiff_word_regex (struct diff_filespec *one) +static const char *userdiff_word_regex (struct diff_filespec *one, +struct index_state *istate) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return one->driver->word_regex; }
@@ -2132,9 +2134,9 @@ static void init_diff_words_data(struct emit_callback *ecbdata,xcalloc (1 ,sizeof (struct emitted_diff_symbols ));if (!o->word_regex) - o->word_regex =userdiff_word_regex (one); + o->word_regex =userdiff_word_regex (one, o->repo->index);if (!o->word_regex) - o->word_regex =userdiff_word_regex (two); + o->word_regex =userdiff_word_regex (two, o->repo->index);if (!o->word_regex) o->word_regex = diff_word_regex_cfg;if (o->word_regex) {
@@ -3257,7 +3259,7 @@ int diff_filespec_is_binary(struct repository *r, struct diff_filespec *one) {if (one->is_binary ==-1 ) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, r->index);if (one->driver->binary !=-1 ) one->is_binary = one->driver->binary;else {
@@ -3273,9 +3275,10 @@ int diff_filespec_is_binary(struct repository *r,return one->is_binary; } -static const struct userdiff_funcname *diff_funcname_pattern (struct diff_filespec *one) +static const struct userdiff_funcname * +diff_funcname_pattern (struct diff_options *o,struct diff_filespec *one) { -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, o->repo->index);return one->driver->funcname.pattern ? &one->driver->funcname :NULL ; }
@@ -3287,12 +3290,13 @@ void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const options->b_prefix = b; } -struct userdiff_driver *get_textconv (struct diff_filespec *one) +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one) {if (!DIFF_FILE_VALID (one))return NULL ; -diff_filespec_load_driver (one); +diff_filespec_load_driver (one, istate);return userdiff_get_textconv (one->driver); }
@@ -3342,8 +3346,8 @@ static void builtin_diff(const char *name_a, }if (o->flags.allow_textconv) { - textconv_one =get_textconv (one); - textconv_two =get_textconv (two); + textconv_one =get_textconv (o->repo->index, one); + textconv_two =get_textconv (o->repo->index, two); }/* Never use a non-valid filename anywhere if at all possible */
@@ -3465,9 +3469,9 @@ static void builtin_diff(const char *name_a, mf1.size =fill_textconv (o->repo, textconv_one, one, &mf1.ptr); mf2.size =fill_textconv (o->repo, textconv_two, two, &mf2.ptr); - pe =diff_funcname_pattern (one); + pe =diff_funcname_pattern (o, one);if (!pe) - pe =diff_funcname_pattern (two); + pe =diff_funcname_pattern (o, two);memset (&xpp,0 ,sizeof (xpp));memset (&xecfg,0 ,sizeof (xecfg));
@@ -4223,7 +4227,9 @@ static void run_diff_cmd(const char *pgm,if (o->flags.allow_external) { -struct userdiff_driver *drv =userdiff_find_by_path (attr_path); +struct userdiff_driver *drv; + + drv =userdiff_find_by_path (o->repo->index, attr_path);if (drv && drv->external) pgm = drv->external; }
@@ -6399,7 +6405,7 @@ int textconv_object(struct repository *r, df =alloc_filespec (path);fill_filespec (df, oid, oid_valid, mode); - textconv =get_textconv (df); + textconv =get_textconv (r->index, df);if (!textconv) {free_filespec (df);return 0 ;
diff.h +2 -1
@@ -455,7 +455,8 @@ size_t fill_textconv(struct repository *r,* and only if it has textconv enabled (otherwise return NULL). The result * can be passed to fill_textconv(). */ -struct userdiff_driver *get_textconv (struct diff_filespec *one); +struct userdiff_driver *get_textconv (struct index_state *istate, +struct diff_filespec *one);/* * Prepare diff_filespec and convert it using diff textconv API
diffcore-pickaxe.c +2 -2
@@ -139,8 +139,8 @@ static int pickaxe_match(struct diff_filepair *p, struct diff_options *o,return 0 ;if (o->flags.allow_textconv) { - textconv_one =get_textconv (p->one); - textconv_two =get_textconv (p->two); + textconv_one =get_textconv (o->repo->index, p->one); + textconv_two =get_textconv (o->repo->index, p->two); }/*
grep.c +12 -9
@@ -11,7 +11,8 @@#include "help.h" static int grep_source_load (struct grep_source *gs); -static int grep_source_is_binary (struct grep_source *gs); +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate);static struct grep_opt grep_defaults;
@@ -1547,7 +1548,7 @@ static int match_funcname(struct grep_opt *opt, struct grep_source *gs, char *bo {xdemitconf_t *xecfg = opt->priv;if (xecfg && !xecfg->find_func) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);if (gs->driver->funcname.pattern) {const struct userdiff_funcname *pe = &gs->driver->funcname;xdiff_set_find_func (xecfg, pe->pattern, pe->cflags);
@@ -1804,7 +1805,7 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colle opt->last_shown =0 ;if (opt->allow_textconv) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, opt->repo->index);/* * We might set up the shared textconv cache data here, which * is not thread-safe.
@@ -1821,11 +1822,11 @@ static int grep_source_1(struct grep_opt *opt, struct grep_source *gs, int colleif (!textconv) {switch (opt->binary) {case GREP_BINARY_DEFAULT : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index)) binary_match_only =1 ;break ;case GREP_BINARY_NOMATCH : -if (grep_source_is_binary (gs)) +if (grep_source_is_binary (gs, opt->repo->index))return 0 ;/* Assume unmatch */ break ;case GREP_BINARY_TEXT :
@@ -2171,22 +2172,24 @@ static int grep_source_load(struct grep_source *gs)BUG ("invalid grep_source type to load" ); } -void grep_source_load_driver (struct grep_source *gs) +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate) {if (gs->driver)return ;grep_attr_lock ();if (gs->path) - gs->driver =userdiff_find_by_path (gs->path); + gs->driver =userdiff_find_by_path (istate, gs->path);if (!gs->driver) gs->driver =userdiff_find_by_name ("default" );grep_attr_unlock (); } -static int grep_source_is_binary (struct grep_source *gs) +static int grep_source_is_binary (struct grep_source *gs, +struct index_state *istate) { -grep_source_load_driver (gs); +grep_source_load_driver (gs, istate);if (gs->driver->binary !=-1 )return gs->driver->binary;
grep.h +2 -1
@@ -220,7 +220,8 @@ void grep_source_init(struct grep_source *gs, enum grep_source_type type, const void *identifier);void grep_source_clear_data (struct grep_source *gs);void grep_source_clear (struct grep_source *gs); -void grep_source_load_driver (struct grep_source *gs); +void grep_source_load_driver (struct grep_source *gs, +struct index_state *istate);int grep_source (struct grep_opt *opt,struct grep_source *gs);
line-range.c +1 -1
@@ -198,7 +198,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (path); + drv =userdiff_find_by_path (&the_index, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
userdiff.c +3 -2
@@ -270,7 +270,8 @@ struct userdiff_driver *userdiff_find_by_name(const char *name) {return userdiff_find_by_namelen (name, len); } -struct userdiff_driver *userdiff_find_by_path (const char *path) +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path) {static struct attr_check *check;
@@ -278,7 +279,7 @@ struct userdiff_driver *userdiff_find_by_path(const char *path) check =attr_check_initl ("diff" ,NULL );if (!path)return NULL ; -if (git_check_attr (&the_index, path, check)) +if (git_check_attr (istate, path, check))return NULL ;if (ATTR_TRUE (check->items[0 ].value))
userdiff.h +2 -1
@@ -21,7 +21,8 @@ struct userdiff_driver {int userdiff_config (const char *k,const char *v);struct userdiff_driver *userdiff_find_by_name (const char *name); -struct userdiff_driver *userdiff_find_by_path (const char *path); +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path);/* * Initialize any textconv-related fields in the driver and return it, or NULL
Signature · 1 line
2.19.0.640.gcd3aa10a8a
Re: [PATCH v5 17/23] userdiff.c: remove implicit dependency on the_index
Quoted 5 lines · Nguyễn Thái Ngọc Duy
userdiff.h +0
-0
userdiff.h struct userdiff_driver { · line 28
Quoted 9 lines
userdiff.h +2
-1@@ -21,7 +21,8 @@ struct userdiff_driver {int userdiff_config (const char *k,const char *v);struct userdiff_driver *userdiff_find_by_name (const char *name); -struct userdiff_driver *userdiff_find_by_path (const char *path); +struct userdiff_driver *userdiff_find_by_path (struct index_state *istate, +const char *path);/* * Initialize any textconv-related fields in the driver and return it, or NULL
This needs fix described in
https://public-inbox.org/git/[email protected]/
I can squash it in.
Re: [PATCH v5 17/23] userdiff.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duydiff.c static void diff_words_flush(struct emit_callback *ecbdata) · line 2097
Quoted 11 lines · Nguyễn Thái Ngọc Duy
diff.c +2
-1@@ -2093,23 +2093,25 @@ static void diff_words_flush(struct emit_callback *ecbdata) } } -static void diff_filespec_load_driver (struct diff_filespec *one) +static void diff_filespec_load_driver (struct diff_filespec *one, +struct index_state *istate)
I hadn't looked at this topic until today, when I tried merging next with some of my other local bits and ran into conflicts. I found the idea of passing index_state here, rather than the whole "struct repository", a bit curious.
I get why you're doing it: your topic here only cares about removing index dependencies, so you did the minimal thing to move that forward.
But if you think about what this function is doing, it is quite clearly dependent on the whole repository, since the userdiff config we're looking up may come from repo config.
So I think in the long run this probably should take a repository argument, and use r->index instead of a separate istate argument. That said, I'm not totally opposed to taking this incremental step and letting somebody later sort out the config portions. I wonder if it would be worth calling that out in the commit message to help that later person. But I guess it is a bit late if this is already in next.
Maybe this email will serve the same purpose. :)
-Peff
Re: [PATCH v5 17/23] userdiff.c: remove implicit dependency on the_index
Quoted 6 lines · Jeff King
I get why you're doing it: your topic here only cares about removing index dependencies, so you did the minimal thing to move that forward.
But if you think about what this function is doing, it is quite clearly dependent on the whole repository, since the userdiff config we're looking up may come from repo config.
In the case of userdiff that is pretty much limited to read-only operation, I fully agree, but in more general cases, we would need to pass both the repository and an in-core index separately, I would say. Imagine doing a partial commit, where we construct a separate istate that is not the "repo's index" and use that to write out a tree object to be wrapped in a new commit, and update the current branch ref.
Re: [PATCH v5 17/23] userdiff.c: remove implicit dependency on the_index
Quoted 9 lines · Junio C Hamano
Quoted 6 lines · Jeff King
I get why you're doing it: your topic here only cares about removing index dependencies, so you did the minimal thing to move that forward.
But if you think about what this function is doing, it is quite clearly dependent on the whole repository, since the userdiff config we're looking up may come from repo config.
Quoted 7 lines
In the case of userdiff that is pretty much limited to read-only operation, I fully agree, but in more general cases, we would need to pass both the repository and an in-core index separately, I would say. Imagine doing a partial commit, where we construct a separate istate that is not the "repo's index" and use that to write out a tree object to be wrapped in a new commit, and update the current branch ref.
Yeah, agreed. I was actually puzzled at first why userdiff needs to know about the index at all. But the answer is that the attr code may read .gitattributes out of the index. It's _possible_ somebody would want to do that with an index besides the normal repo one, but I find it somewhat unlikely. I think my instinct there is based on it being "read-only", as you said.
One thing that confused me even more is that diff_options now has a "struct repository" field in it. I get how that saves passing it around, but I also wonder if it may run into similar issues at some point. I'm perfectly willing to punt on it until it actually comes up in practice, though.
-Peff
Re: [PATCH v5 17/23] userdiff.c: remove implicit dependency on the_index
In reply to Jeff KingQuoted 27 lines · Jeff King
diff.c static void diff_words_flush(struct emit_callback *ecbdata) · line 2097
Quoted 11 lines · Nguyễn Thái Ngọc Duy
diff.c +2
-1@@ -2093,23 +2093,25 @@ static void diff_words_flush(struct emit_callback *ecbdata) } } -static void diff_filespec_load_driver (struct diff_filespec *one) +static void diff_filespec_load_driver (struct diff_filespec *one, +struct index_state *istate)I hadn't looked at this topic until today, when I tried merging next with some of my other local bits and ran into conflicts. I found the idea of passing
index_statehere, rather than the whole "struct repository", a bit curious.I get why you're doing it: your topic here only cares about removing index dependencies, so you did the minimal thing to move that forward.
But if you think about what this function is doing, it is quite clearly dependent on the whole repository, since the userdiff config we're looking up may come from repo config.
Quoted 6 lines
So I think in the long run this probably should take a repository argument, and use
r->indexinstead of a separate istate argument. That said, I'm not totally opposed to taking this incremental step and letting somebody later sort out the config portions. I wonder if it would be worth calling that out in the commit message to help that later person. But I guess it is a bit late if this is already in next.
Maybe. When I made this series, I tried to reduce the access scope as much as possible. If it turns out it needs more, we can always turn "struct index_state *" into "struct repository *" later,
Signature · 1 line
Duy
PATCH v5 18/23 line-range.c: remove implicit dependency on the_index
In reply to Nguyễn Thái Ngọc Duy--- builtin/blame.c | 2 +- line-log.c | 4 ++-- line-range.c | 22 ++++++++++++++-------- line-range.h | 6 ++++-- 4 files changed, 21 insertions(+), 13 deletions(-)
builtin/blame.c +1 -1
@@ -1001,7 +1001,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix)long bottom, top;if (parse_range_arg (range_list.items[range_i].string, nth_line_cb, &sb, lno, anchor, - &bottom, &top, sb.path)) + &bottom, &top, sb.path, &the_index))usage (blame_usage);if ((!lno && (top || bottom)) || lno < bottom) die(Q_("file %s has only %lu line",
line-log.c +2 -2
@@ -574,7 +574,7 @@ parse_lines(struct repository *r, struct commit *commit,long begin =0 , end =0 ;long anchor; - name_part =skip_range_arg (item->string); + name_part =skip_range_arg (item->string, r->index);if (!name_part || *name_part !=':' || !name_part[1 ])die ("-L argument not 'start,end:file' or ':funcname:file': %s" , item->string);
@@ -599,7 +599,7 @@ parse_lines(struct repository *r, struct commit *commit,if (parse_range_arg (range_part, nth_line, &cb_data, lines, anchor, &begin, &end, - full_name)) + full_name, r->index))die ("malformed -L argument '%s'" , range_part);if ((!lines && (begin || end)) || lines < begin)die ("file %s has only %lu lines" , name_part, lines);
line-range.c +14 -8
@@ -163,9 +163,10 @@ static const char *find_funcname_matching_regexp(xdemitconf_t *xecfg, const char } } -static const char *parse_range_funcname (const char *arg,nth_line_fn_t nth_line_cb, -void *cb_data,long lines,long anchor,long *begin,long *end, -const char *path) +static const char *parse_range_funcname ( +const char *arg,nth_line_fn_t nth_line_cb, +void *cb_data,long lines,long anchor,long *begin,long *end, +const char *path,struct index_state *istate) {char *pattern;const char *term;
@@ -198,7 +199,7 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_ anchor--;/* input is in human terms */ start =nth_line_cb (cb_data, anchor); - drv =userdiff_find_by_path (&the_index, path); + drv =userdiff_find_by_path (istate, path);if (drv && drv->funcname.pattern) {const struct userdiff_funcname *pe = &drv->funcname; xecfg =xcalloc (1 ,sizeof (*xecfg));
@@ -244,7 +245,8 @@ static const char *parse_range_funcname(const char *arg, nth_line_fn_t nth_line_int parse_range_arg (const char *arg,nth_line_fn_t nth_line_cb,void *cb_data,long lines,long anchor, -long *begin,long *end,const char *path) +long *begin,long *end, +const char *path,struct index_state *istate) { *begin = *end =0 ;
@@ -254,7 +256,9 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb, anchor = lines +1 ;if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) { - arg =parse_range_funcname (arg, nth_line_cb, cb_data, lines, anchor, begin, end, path); + arg =parse_range_funcname (arg, nth_line_cb, cb_data, + lines, anchor, begin, end, + path, istate);if (!arg || *arg)return -1 ;return 0 ;
@@ -275,10 +279,12 @@ int parse_range_arg(const char *arg, nth_line_fn_t nth_line_cb,return 0 ; } -const char *skip_range_arg (const char *arg) +const char *skip_range_arg (const char *arg,struct index_state *istate) {if (*arg ==':' || (*arg =='^' && *(arg +1 ) ==':' )) -return parse_range_funcname (arg,NULL ,NULL ,0 ,0 ,NULL ,NULL ,NULL ); +return parse_range_funcname (arg,NULL ,NULL , +0 ,0 ,NULL ,NULL , +NULL , istate); arg =parse_loc (arg,NULL ,NULL ,0 ,-1 ,NULL );
line-range.h +4 -2
@@ -1,6 +1,8 @@#ifndef LINE_RANGE_H #define LINE_RANGE_H +struct index_state ; +/* * Parse one item in an -L begin,end option w.r.t. the notional file * object 'cb_data' consisting of 'lines' lines.
@@ -23,7 +25,7 @@ int parse_range_arg(const char *arg,nth_line_fn_t nth_line_cb, void *cb_data, long lines, long anchor, long *begin, long *end, - const char *path); + const char *path, struct index_state *istate);/* * Scan past a range argument that could be parsed by
@@ -34,6 +36,6 @@ int parse_range_arg(const char *arg,* NULL in case the argument is obviously malformed. */ -const char *skip_range_arg (const char *arg); +const char *skip_range_arg (const char *arg,struct index_state *istate);#endif /* LINE_RANGE_H */
Signature · 1 line
2.19.0.640.gcd3aa10a8a