# HG changeset patch # User Augie Fackler # Date 2020-11-07 20:02:53 # Node ID 61d63a7744902577e1fc43725a8b23f1a7ba4770 # Parent c2837640aeb0274f6c4684d545fa5e0db32ca569 # Parent 8711dc13474ce3d6db8c21389a994867331e348d merge with stable diff --git a/contrib/chg/chg.c b/contrib/chg/chg.c --- a/contrib/chg/chg.c +++ b/contrib/chg/chg.c @@ -8,6 +8,7 @@ */ #include +#include #include #include #include @@ -269,6 +270,31 @@ static void execcmdserver(const struct c } } + /* close any open files to avoid hanging locks */ + DIR *dp = opendir("/proc/self/fd"); + if (dp != NULL) { + debugmsg("closing files based on /proc contents"); + struct dirent *de; + while ((de = readdir(dp))) { + char *end; + long fd_value = strtol(de->d_name, &end, 10); + if (end == de->d_name) { + /* unable to convert to int (. or ..) */ + continue; + } + if (errno == ERANGE) { + debugmsg("tried to parse %s, but range error occurred", de->d_name); + continue; + } + if (fd_value > STDERR_FILENO) { + int res = close(fd_value); + if (res) { + debugmsg("tried to close fd %ld: %d (errno: %d)", fd_value, res, errno); + } + } + } + } + if (putenv("CHGINTERNALMARK=") != 0) abortmsgerrno("failed to putenv"); if (execvp(hgcmd, (char **)argv) < 0) diff --git a/mercurial/crecord.py b/mercurial/crecord.py --- a/mercurial/crecord.py +++ b/mercurial/crecord.py @@ -1250,7 +1250,7 @@ class curseschunkselector(object): self.numstatuslines, 0, self.yscreensize - self.numstatuslines, - self.xscreensize, + self.xscreensize - 1, ) except curses.error: pass