This series makes rebase --am honor the .gitattributes file for subsequent patches when a patch changes it. Changes from v2: * Rename has_path_suffix to ends_with_path_components. Changes from v1: * Add has_path_suffix in a separate commit. brian m. carlson (2): path: add a function to check for path suffix apply: reload .gitattributes after patching it apply.c | 7 +++++++ convert.c | 9 ++++++++- convert.h | 6 ++++++ path.c | 39 ++++++++++++++++++++++++++++++--------- path.h | 3 +++ t/t3400-rebase.sh | 23 +++++++++++++++++++++++ 6 files changed, 77 insertions(+), 10 deletions(-) Range-diff against v2: 1: 125fda966c ! 1: 14c853420b path: add a function to check for path suffix @@ Commit message have one to check for a path suffix. For a plain filename, we can use basename, but that requires an allocation, since POSIX allows it to modify its argument. Refactor strip_path_suffix into a helper function - and a new function, has_path_suffix to meet this need. + and a new function, ends_with_path_components, to meet this need. Signed-off-by: brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> @@ path.c: static inline int chomp_trailing_dir_sep(const char *path, int len) +} + +/* -+ * Returns true if the path ends with suffix, considering only complete path -+ * components and false otherwise. ++ * Returns true if the path ends with components, considering only complete path ++ * components, and false otherwise. + */ -+int has_path_suffix(const char *path, const char *suffix) ++int ends_with_path_components(const char *path, const char *components) +{ -+ return stripped_path_suffix_offset(path, suffix) != -1; ++ return stripped_path_suffix_offset(path, components) != -1; +} + /* @@ path.h: const char *git_path_merge_head(struct repository *r); const char *git_path_shallow(struct repository *r); + -+int has_path_suffix(const char *path, const char *suffix); ++int ends_with_path_components(const char *path, const char *components); + #endif /* PATH_H */ 2: f54af7e595 ! 2: 5f4402b38d apply: reload .gitattributes after patching it @@ apply.c: static int apply_patch(struct apply_state *state, listp = &patch->next; + + if (!flush_attributes && patch->new_name && -+ has_path_suffix(patch->new_name, GITATTRIBUTES_FILE)) ++ ends_with_path_components(patch->new_name, GITATTRIBUTES_FILE)) + flush_attributes = 1; } else {