Show More
@@ -8,6 +8,9 override CFLAGS += -std=gnu99 | |||||
8 | ifdef HGPATH |
|
8 | ifdef HGPATH | |
9 | override CPPFLAGS += -DHGPATH=\"$(HGPATH)\" |
|
9 | override CPPFLAGS += -DHGPATH=\"$(HGPATH)\" | |
10 | endif |
|
10 | endif | |
|
11 | ifdef HGPATHREL | |||
|
12 | override CPPFLAGS += -DHGPATHREL=\"$(HGPATHREL)\" | |||
|
13 | endif | |||
11 |
|
14 | |||
12 | DESTDIR = |
|
15 | DESTDIR = | |
13 | PREFIX = /usr/local |
|
16 | PREFIX = /usr/local |
@@ -30,3 +30,11 The following variables are available fo | |||||
30 | * CHGSOCKNAME specifies the socket path of the background cmdserver. |
|
30 | * CHGSOCKNAME specifies the socket path of the background cmdserver. | |
31 | * CHGTIMEOUT specifies how many seconds chg will wait before giving up |
|
31 | * CHGTIMEOUT specifies how many seconds chg will wait before giving up | |
32 | connecting to a cmdserver. If it is 0, chg will wait forever. Default: 60 |
|
32 | connecting to a cmdserver. If it is 0, chg will wait forever. Default: 60 | |
|
33 | ||||
|
34 | Build environment variables: | |||
|
35 | ||||
|
36 | * HGPATH: the path to the hg executable to call when CHGHG and HG are not set, | |||
|
37 | instead of "hg" | |||
|
38 | * HGPATHREL=1: when CHGHG and HG are not set, the hg executable will be ./hg | |||
|
39 | relative to the chg executable. Only works on linux, falls back to "hg" | |||
|
40 | otherwise. |
@@ -184,13 +184,46 static void setcmdserveropts(struct cmds | |||||
184 | abortmsg("too long TMPDIR or CHGSOCKNAME (r = %d)", r); |
|
184 | abortmsg("too long TMPDIR or CHGSOCKNAME (r = %d)", r); | |
185 | } |
|
185 | } | |
186 |
|
186 | |||
|
187 | /* If the current program is, say, /a/b/c/chg, returns /a/b/c/hg. */ | |||
|
188 | static char *getrelhgcmd(void) | |||
|
189 | { | |||
|
190 | ssize_t n; | |||
|
191 | char *res, *slash; | |||
|
192 | int maxsize = 4096; | |||
|
193 | res = malloc(maxsize); | |||
|
194 | if (res == NULL) | |||
|
195 | goto cleanup; | |||
|
196 | n = readlink("/proc/self/exe", res, maxsize); | |||
|
197 | if (n < 0 || n >= maxsize) | |||
|
198 | goto cleanup; | |||
|
199 | res[n] = '\0'; | |||
|
200 | slash = strrchr(res, '/'); | |||
|
201 | if (slash == NULL) | |||
|
202 | goto cleanup; | |||
|
203 | /* 4 is strlen("/hg") + nul byte */ | |||
|
204 | if (slash + 4 >= res + maxsize) | |||
|
205 | goto cleanup; | |||
|
206 | memcpy(slash, "/hg", 4); | |||
|
207 | return res; | |||
|
208 | cleanup: | |||
|
209 | free(res); | |||
|
210 | return NULL; | |||
|
211 | } | |||
|
212 | ||||
187 | static const char *gethgcmd(void) |
|
213 | static const char *gethgcmd(void) | |
188 | { |
|
214 | { | |
189 | static const char *hgcmd = NULL; |
|
215 | static const char *hgcmd = NULL; | |
|
216 | #ifdef HGPATHREL | |||
|
217 | int tryrelhgcmd = 1; | |||
|
218 | #else | |||
|
219 | int tryrelhgcmd = 0; | |||
|
220 | #endif | |||
190 | if (!hgcmd) { |
|
221 | if (!hgcmd) { | |
191 | hgcmd = getenv("CHGHG"); |
|
222 | hgcmd = getenv("CHGHG"); | |
192 | if (!hgcmd || hgcmd[0] == '\0') |
|
223 | if (!hgcmd || hgcmd[0] == '\0') | |
193 | hgcmd = getenv("HG"); |
|
224 | hgcmd = getenv("HG"); | |
|
225 | if (tryrelhgcmd && (!hgcmd || hgcmd[0] == '\0')) | |||
|
226 | hgcmd = getrelhgcmd(); | |||
194 | if (!hgcmd || hgcmd[0] == '\0') |
|
227 | if (!hgcmd || hgcmd[0] == '\0') | |
195 | #ifdef HGPATH |
|
228 | #ifdef HGPATH | |
196 | hgcmd = (HGPATH); |
|
229 | hgcmd = (HGPATH); |
General Comments 0
You need to be logged in to leave comments.
Login now