提交 14660801 编写于 作者: J Junio C Hamano

Merge branch 'js/more-win'

* js/more-win:
  help (Windows): Display HTML in default browser using Windows' shell API
  help.c: Add support for htmldir relative to git_exec_path()
  Move code interpreting path relative to exec-dir to new function system_path()
...@@ -115,18 +115,8 @@ static void copy_templates(const char *template_dir) ...@@ -115,18 +115,8 @@ static void copy_templates(const char *template_dir)
if (!template_dir) if (!template_dir)
template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT); template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
if (!template_dir) { if (!template_dir)
/* template_dir = system_path(DEFAULT_GIT_TEMPLATE_DIR);
* if the hard-coded template is relative, it is
* interpreted relative to the exec_dir
*/
template_dir = DEFAULT_GIT_TEMPLATE_DIR;
if (!is_absolute_path(template_dir)) {
struct strbuf d = STRBUF_INIT;
strbuf_addf(&d, "%s/%s", git_exec_path(), template_dir);
template_dir = strbuf_detach(&d, NULL);
}
}
strcpy(template_path, template_dir); strcpy(template_path, template_dir);
template_len = strlen(template_path); template_len = strlen(template_path);
if (template_path[template_len-1] != '/') { if (template_path[template_len-1] != '/') {
......
...@@ -1017,3 +1017,25 @@ sig_handler_t mingw_signal(int sig, sig_handler_t handler) ...@@ -1017,3 +1017,25 @@ sig_handler_t mingw_signal(int sig, sig_handler_t handler)
timer_fn = handler; timer_fn = handler;
return old; return old;
} }
static const char *make_backslash_path(const char *path)
{
static char buf[PATH_MAX + 1];
char *c;
if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
die("Too long path: %.*s", 60, path);
for (c = buf; *c; c++) {
if (*c == '/')
*c = '\\';
}
return buf;
}
void mingw_open_html(const char *unixpath)
{
const char *htmlpath = make_backslash_path(unixpath);
printf("Launching default browser to display HTML ...\n");
ShellExecute(NULL, "open", htmlpath, NULL, "\\", 0);
}
...@@ -202,6 +202,9 @@ sig_handler_t mingw_signal(int sig, sig_handler_t handler); ...@@ -202,6 +202,9 @@ sig_handler_t mingw_signal(int sig, sig_handler_t handler);
#define PATH_SEP ';' #define PATH_SEP ';'
#define PRIuMAX "I64u" #define PRIuMAX "I64u"
void mingw_open_html(const char *path);
#define open_html mingw_open_html
/* /*
* helpers * helpers
*/ */
......
...@@ -581,15 +581,8 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data) ...@@ -581,15 +581,8 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
const char *git_etc_gitconfig(void) const char *git_etc_gitconfig(void)
{ {
static const char *system_wide; static const char *system_wide;
if (!system_wide) { if (!system_wide)
system_wide = ETC_GITCONFIG; system_wide = system_path(ETC_GITCONFIG);
if (!is_absolute_path(system_wide)) {
/* interpret path relative to exec-dir */
struct strbuf d = STRBUF_INIT;
strbuf_addf(&d, "%s/%s", git_exec_path(), system_wide);
system_wide = strbuf_detach(&d, NULL);
}
}
return system_wide; return system_wide;
} }
......
...@@ -40,6 +40,16 @@ static const char *builtin_exec_path(void) ...@@ -40,6 +40,16 @@ static const char *builtin_exec_path(void)
#endif #endif
} }
const char *system_path(const char *path)
{
if (!is_absolute_path(path)) {
struct strbuf d = STRBUF_INIT;
strbuf_addf(&d, "%s/%s", git_exec_path(), path);
path = strbuf_detach(&d, NULL);
}
return path;
}
void git_set_argv_exec_path(const char *exec_path) void git_set_argv_exec_path(const char *exec_path)
{ {
argv_exec_path = exec_path; argv_exec_path = exec_path;
......
...@@ -6,6 +6,6 @@ extern const char* git_exec_path(void); ...@@ -6,6 +6,6 @@ extern const char* git_exec_path(void);
extern void setup_path(const char *); extern void setup_path(const char *);
extern int execv_git_cmd(const char **argv); /* NULL terminated */ extern int execv_git_cmd(const char **argv); /* NULL terminated */
extern int execl_git_cmd(const char *cmd, ...); extern int execl_git_cmd(const char *cmd, ...);
extern const char *system_path(const char *path);
#endif /* GIT_EXEC_CMD_H */ #endif /* GIT_EXEC_CMD_H */
...@@ -633,15 +633,29 @@ static void show_info_page(const char *git_cmd) ...@@ -633,15 +633,29 @@ static void show_info_page(const char *git_cmd)
static void get_html_page_path(struct strbuf *page_path, const char *page) static void get_html_page_path(struct strbuf *page_path, const char *page)
{ {
struct stat st; struct stat st;
const char *html_path = system_path(GIT_HTML_PATH);
/* Check that we have a git documentation directory. */ /* Check that we have a git documentation directory. */
if (stat(GIT_HTML_PATH "/git.html", &st) || !S_ISREG(st.st_mode)) if (stat(mkpath("%s/git.html", html_path), &st)
die("'%s': not a documentation directory.", GIT_HTML_PATH); || !S_ISREG(st.st_mode))
die("'%s': not a documentation directory.", html_path);
strbuf_init(page_path, 0); strbuf_init(page_path, 0);
strbuf_addf(page_path, GIT_HTML_PATH "/%s.html", page); strbuf_addf(page_path, "%s/%s.html", html_path, page);
} }
/*
* If open_html is not defined in a platform-specific way (see for
* example compat/mingw.h), we use the script web--browse to display
* HTML.
*/
#ifndef open_html
void open_html(const char *path)
{
execl_git_cmd("web--browse", "-c", "help.browser", path, NULL);
}
#endif
static void show_html_page(const char *git_cmd) static void show_html_page(const char *git_cmd)
{ {
const char *page = cmd_to_page(git_cmd); const char *page = cmd_to_page(git_cmd);
...@@ -649,7 +663,7 @@ static void show_html_page(const char *git_cmd) ...@@ -649,7 +663,7 @@ static void show_html_page(const char *git_cmd)
get_html_page_path(&page_path, page); get_html_page_path(&page_path, page);
execl_git_cmd("web--browse", "-c", "help.browser", page_path.buf, NULL); open_html(page_path.buf);
} }
void help_unknown_cmd(const char *cmd) void help_unknown_cmd(const char *cmd)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册