diff options
| author | Junio C Hamano <gitster@pobox.com> | 2016-09-12 15:34:31 -0700 | 
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2016-09-12 15:34:31 -0700 | 
| commit | 305d7f133956a5f43c94d938beabbfbb0ac1753c (patch) | |
| tree | 6f3324895e1885de1a7369da012c5132b9104176 /path.c | |
| parent | cda1bbd474805e653dda8a71d4ea3790e2a66cbb (diff) | |
| parent | fd47ae6a5b9cc0cfc56c1f7c43db612d26ca4b75 (diff) | |
| download | git-305d7f133956a5f43c94d938beabbfbb0ac1753c.tar.gz | |
Merge branch 'jk/diff-submodule-diff-inline'
The "git diff --submodule={short,log}" mechanism has been enhanced
to allow "--submodule=diff" to show the patch between the submodule
commits bound to the superproject.
* jk/diff-submodule-diff-inline:
  diff: teach diff to display submodule difference with an inline diff
  submodule: refactor show_submodule_summary with helper function
  submodule: convert show_submodule_summary to use struct object_id *
  allow do_submodule_path to work even if submodule isn't checked out
  diff: prepare for additional submodule formats
  graph: add support for --line-prefix on all graph-aware output
  diff.c: remove output_prefix_length field
  cache: add empty_tree_oid object and helper function
Diffstat (limited to 'path.c')
| -rw-r--r-- | path.c | 39 | 
1 files changed, 33 insertions, 6 deletions
@@ -6,6 +6,7 @@  #include "string-list.h"  #include "dir.h"  #include "worktree.h" +#include "submodule-config.h"  static int get_st_mode_bits(const char *path, int *mode)  { @@ -468,12 +469,16 @@ const char *worktree_git_path(const struct worktree *wt, const char *fmt, ...)  	return pathname->buf;  } -static void do_submodule_path(struct strbuf *buf, const char *path, -			      const char *fmt, va_list args) +/* Returns 0 on success, negative on failure. */ +#define SUBMODULE_PATH_ERR_NOT_CONFIGURED -1 +static int do_submodule_path(struct strbuf *buf, const char *path, +			     const char *fmt, va_list args)  {  	const char *git_dir;  	struct strbuf git_submodule_common_dir = STRBUF_INIT;  	struct strbuf git_submodule_dir = STRBUF_INIT; +	const struct submodule *sub; +	int err = 0;  	strbuf_addstr(buf, path);  	strbuf_complete(buf, '/'); @@ -484,6 +489,17 @@ static void do_submodule_path(struct strbuf *buf, const char *path,  		strbuf_reset(buf);  		strbuf_addstr(buf, git_dir);  	} +	if (!is_git_directory(buf->buf)) { +		gitmodules_config(); +		sub = submodule_from_path(null_sha1, path); +		if (!sub) { +			err = SUBMODULE_PATH_ERR_NOT_CONFIGURED; +			goto cleanup; +		} +		strbuf_reset(buf); +		strbuf_git_path(buf, "%s/%s", "modules", sub->name); +	} +  	strbuf_addch(buf, '/');  	strbuf_addbuf(&git_submodule_dir, buf); @@ -494,27 +510,38 @@ static void do_submodule_path(struct strbuf *buf, const char *path,  	strbuf_cleanup_path(buf); +cleanup:  	strbuf_release(&git_submodule_dir);  	strbuf_release(&git_submodule_common_dir); + +	return err;  }  char *git_pathdup_submodule(const char *path, const char *fmt, ...)  { +	int err;  	va_list args;  	struct strbuf buf = STRBUF_INIT;  	va_start(args, fmt); -	do_submodule_path(&buf, path, fmt, args); +	err = do_submodule_path(&buf, path, fmt, args);  	va_end(args); +	if (err) { +		strbuf_release(&buf); +		return NULL; +	}  	return strbuf_detach(&buf, NULL);  } -void strbuf_git_path_submodule(struct strbuf *buf, const char *path, -			       const char *fmt, ...) +int strbuf_git_path_submodule(struct strbuf *buf, const char *path, +			      const char *fmt, ...)  { +	int err;  	va_list args;  	va_start(args, fmt); -	do_submodule_path(buf, path, fmt, args); +	err = do_submodule_path(buf, path, fmt, args);  	va_end(args); + +	return err;  }  static void do_git_common_path(struct strbuf *buf,  | 
