* Re: [msysGit] Problem with apply
From: Erik Faye-Lund @ 2009-12-31 12:49 UTC (permalink / raw)
To: richardpreen; +Cc: msysgit, Git Mailing List
In-Reply-To: <SNT131-ds16B1679EFC8F74B62D4630C4780@phx.gbl>
This isn't a Windows specific question, and would be better for the
main git mailing list. I'm CC'ing it in hope that someone there knows
the answer.
On Thu, Dec 31, 2009 at 1:26 PM, <richardpreen@hotmail.com> wrote:
> I'm trying to use git to create a binary diff of two files and then apply
> the diff to the first file in an attempt to make both files the same (just
> testing the concept);
>
> git diff --binary --no-index original\t1.ppt modified\t1.ppt >
> original\my.diff
> cd original
> git apply my.diff
>
> This is giving me the following error message;
> fatal: git diff header lacks filename information (line 3)
>
> Any suggestions as to where I've gone wrong?
> Thanks.
--
Erik "kusma" Faye-Lund
^ permalink raw reply
* [PATCH] git-gui: Add hotkeys for "Unstage from commit" and "Revert changes"
From: public_vi @ 2009-12-31 13:32 UTC (permalink / raw)
To: git; +Cc: public_vi
From: Vitaly _Vi Shukela <public_vi@tut.by>
Signed-off-by: Vitaly _Vi Shukela <public_vi@tut.by>
---
git-gui/git-gui.sh | 10 ++++++++--
1 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh
index 14b92ba..28270ad 100755
--- a/git-gui/git-gui.sh
+++ b/git-gui/git-gui.sh
@@ -2509,12 +2509,14 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {
[list .mbar.commit entryconf [.mbar.commit index last] -state]
.mbar.commit add command -label [mc "Unstage From Commit"] \
- -command do_unstage_selection
+ -command do_unstage_selection \
+ -accelerator $M1T-U
lappend disable_on_lock \
[list .mbar.commit entryconf [.mbar.commit index last] -state]
.mbar.commit add command -label [mc "Revert Changes"] \
- -command do_revert_selection
+ -command do_revert_selection \
+ -accelerator $M1T-J
lappend disable_on_lock \
[list .mbar.commit entryconf [.mbar.commit index last] -state]
@@ -3254,6 +3256,10 @@ unset gm
bind $ui_comm <$M1B-Key-Return> {do_commit;break}
bind $ui_comm <$M1B-Key-t> {do_add_selection;break}
bind $ui_comm <$M1B-Key-T> {do_add_selection;break}
+bind $ui_comm <$M1B-Key-u> {do_unstage_selection;break}
+bind $ui_comm <$M1B-Key-U> {do_unstage_selection;break}
+bind $ui_comm <$M1B-Key-j> {do_revert_selection;break}
+bind $ui_comm <$M1B-Key-J> {do_revert_selection;break}
bind $ui_comm <$M1B-Key-i> {do_add_all;break}
bind $ui_comm <$M1B-Key-I> {do_add_all;break}
bind $ui_comm <$M1B-Key-x> {tk_textCut %W;break}
--
1.6.5.6
^ permalink raw reply related
* Re: [PATCH 1/2] MinGW: Use pid_t more consequently, introduce uid_t for greater compatibility
From: Johannes Sixt @ 2009-12-31 13:50 UTC (permalink / raw)
To: Sebastian Schuberth; +Cc: git
In-Reply-To: <bdca99240912291649h1c727072q3b1e4099cab426df@mail.gmail.com>
Sebastian Schuberth schrieb:
> On Tue, Dec 29, 2009 at 22:09, Johannes Sixt <j6t@kdbg.org> wrote:
>
>>> MinGW: Use pid_t more consequently, introduce uid_t for greater
>>> compatibility
>> Why this? Compatibility with what? What's the problem with the status quo?
>
> I wanted to include Hany's Dos2Unix tool (hd2u) into msysGit.
We have dos2unix. What's wrong with it?
-- Hannes
^ permalink raw reply
* Re: [PATCH 1/2] MinGW: Use pid_t more consequently, introduce uid_t for greater compatibility
From: Johannes Schindelin @ 2009-12-31 14:12 UTC (permalink / raw)
To: Johannes Sixt; +Cc: Sebastian Schuberth, git
In-Reply-To: <4B3CAC2D.5050500@kdbg.org>
Hi,
On Thu, 31 Dec 2009, Johannes Sixt wrote:
> Sebastian Schuberth schrieb:
> > On Tue, Dec 29, 2009 at 22:09, Johannes Sixt <j6t@kdbg.org> wrote:
> >
> > > > MinGW: Use pid_t more consequently, introduce uid_t for greater
> > > > compatibility
> > > Why this? Compatibility with what? What's the problem with the status quo?
> >
> > I wanted to include Hany's Dos2Unix tool (hd2u) into msysGit.
>
> We have dos2unix. What's wrong with it?
hd2u can handle mixed line endings, and it has a dry run mode IIUC.
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH 1/2] MinGW: Use pid_t more consequently, introduce uid_t for greater compatibility
From: Sebastian Schuberth @ 2009-12-31 14:14 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: Johannes Sixt, git
In-Reply-To: <alpine.DEB.1.00.0912311511350.4985@pacific.mpi-cbg.de>
On Thu, Dec 31, 2009 at 15:12, Johannes Schindelin
<Johannes.Schindelin@gmx.de> wrote:
>> > I wanted to include Hany's Dos2Unix tool (hd2u) into msysGit.
>>
>> We have dos2unix. What's wrong with it?
>
> hd2u can handle mixed line endings, and it has a dry run mode IIUC.
Right. One of the best features over dos2unix IMHO is that hd2u can
detect line-endings (and any problems like mixed / stray line-endings)
without actually modifying any files. This makes it a very nice tool
to detect any line-ending issues in the working tree of cross-platform
projects due to wrong autocrlf configurations.
--
Sebastian Schuberth
^ permalink raw reply
* Re: [PATCH 1/2] MinGW: Use pid_t more consequently, introduce uid_t for greater compatibility
From: Johannes Schindelin @ 2009-12-31 14:20 UTC (permalink / raw)
To: Johannes Sixt; +Cc: Sebastian Schuberth, git
In-Reply-To: <alpine.DEB.1.00.0912311511350.4985@pacific.mpi-cbg.de>
Hi,
On Thu, 31 Dec 2009, Johannes Schindelin wrote:
> On Thu, 31 Dec 2009, Johannes Sixt wrote:
>
> > Sebastian Schuberth schrieb:
> > > On Tue, Dec 29, 2009 at 22:09, Johannes Sixt <j6t@kdbg.org> wrote:
> > >
> > > > > MinGW: Use pid_t more consequently, introduce uid_t for greater
> > > > > compatibility
> > > > Why this? Compatibility with what? What's the problem with the
> > > > status quo?
> > >
> > > I wanted to include Hany's Dos2Unix tool (hd2u) into msysGit.
> >
> > We have dos2unix. What's wrong with it?
>
> hd2u can handle mixed line endings, and it has a dry run mode IIUC.
Having said that, I strongly feel this issue is over-discussed. We'll
just carry the necessary patches in 4msysgit.git and you can do what you
want.
Ciao,
Dscho
^ permalink raw reply
* Re: [Updated PATCH 1/2] Report exec errors from run-command
From: Tarmigan @ 2009-12-31 14:44 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <20091231104835.GA18848@Knoppix>
On Thu, Dec 31, 2009 at 5:48 AM, Ilari Liusvaara
<ilari.liusvaara@elisanet.fi> wrote:
> On Thu, Dec 31, 2009 at 12:26:48AM -0500, Tarmigan wrote:
>> On Wed, Dec 30, 2009 at 5:52 AM, Ilari Liusvaara
>> <ilari.liusvaara@elisanet.fi> wrote:
>>
>> I was testing pu and 'git diff' and 'git log' would hang forever.
>
> V3 just sent to list. Should fix this issue.
Yep, that fixed it.
Thanks,
Tarmigan
^ permalink raw reply
* Re: [PATCH v2] cvsserver: make the output of 'update' more compatible with cvs.
From: Martin Langhoff @ 2009-12-31 15:20 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Nanako Shiraishi, Sergei Organov, git
In-Reply-To: <7vfx6rzlkg.fsf@alter.siamese.dyndns.org>
On Thu, Dec 31, 2009 at 7:47 AM, Junio C Hamano <gitster@pobox.com> wrote:
> Well, since I don't use cvsserver myself, but this v2 was done with
> improvements based on some review suggestions, I was waiting for a
> response or two from people who know better and care more about cvs server
> emulation than me, which unfortunately didn't happen.
Looks good to me -- good to get it into pu. While I continue to use
git extensively, I don't use cvsserver anymore, nor work with people
that do. Might have reason to revisit cvsserver in the near future
though, to help Moodle transition to git.
That transition will bring a few top-posters and Eclipse lovers to the
list. Looking past such details, they are fine people who may need a
little bit of git-newbie help ;-)
happy new year,
m
--
martin.langhoff@gmail.com
martin@laptop.org -- School Server Architect
- ask interesting questions
- don't get distracted with shiny stuff - working code first
- http://wiki.laptop.org/go/User:Martinlanghoff
^ permalink raw reply
* Re: [Updated PATCH 2/2] Improve transport helper exec failure reporting
From: Johannes Sixt @ 2009-12-31 15:44 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <1262170338-11574-3-git-send-email-ilari.liusvaara@elisanet.fi>
Ilari Liusvaara schrieb:
> @@ -31,13 +31,19 @@ static struct child_process *get_helper(struct transport *transport)
> helper->out = -1;
> helper->err = 0;
> helper->argv = xcalloc(4, sizeof(*helper->argv));
> - strbuf_addf(&buf, "remote-%s", data->name);
> + strbuf_addf(&buf, "git-remote-%s", data->name);
> helper->argv[0] = strbuf_detach(&buf, NULL);
> helper->argv[1] = transport->remote->name;
> helper->argv[2] = transport->url;
> - helper->git_cmd = 1;
> - if (start_command(helper))
> - die("Unable to run helper: git %s", helper->argv[0]);
> + helper->git_cmd = 0;
> + if (start_command(helper)) {
> + if (errno == ENOENT)
> + die("Unable to find remote helper for \"%s\"",
> + data->name);
You should set helper->silent_exec_failure = 1 when you give your own
error message for the ENOENT case.
BTW, which error message do you see without your change in this case? You
only say "pretty much useless", but do not give an example.
> + else
> + die("Unable to run helper %s: %s", helper->argv[0],
> + strerror(errno));
You shouldn't write an error message here because start_command has
already reported the error.
-- Hannes
^ permalink raw reply
* Re: [updated patch v2 1/2] Report exec errors from run-command
From: Johannes Sixt @ 2009-12-31 16:22 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <1262256488-22985-2-git-send-email-ilari.liusvaara@elisanet.fi>
Ilari Liusvaara schrieb:
> +static inline void force_close(int fd)
> +{
> + int err = 0;
> + /*
> + * Retry EINTRs undefinitely, exit on EBADF immediately, other
> + * errors retry only up to three times (even if pipe close
> + * shouldn't cause other errors, but you never know with
> + * what broken systems may return on closed file descriptor).
> + * consequences of failure to close pipe here may include
> + * deadlocking.
> + */
> + while (close(fd) < 0 && errno != EBADF && err < 3)
> + if(errno != EINTR)
> + err++;
What's the point to iterate on all errors except EBADF? If the close()
fails once, it will fail again.
> + /*
> + * Clean up the process that did the failed execution
> + * so no zombies remain.
> + */
> +wait_again:
> + r = waitpid(cmd->pid, &ret, 0);
> + if (r < 0 && errno != ECHILD)
> + goto wait_again;
You really should iterate only on well-known errors. What's wrong with
while (waitpid(pid, &status, 0) < 0 && errno == EINTR)
; /* nothing */
similar to wait_or_whine()'s call to waitpid() and to avoid goto.
> +int main(int argc, char **argv)
> +{
> + char* procs[2];
> + struct child_process proc;
> + memset(&proc, 0, sizeof(proc));
> +
> + if(argc < 2)
> + return 1;
> +
> + if (argv[1][1] == '1')
> + procs[0] = "does-not-exist-62896869286";
> + procs[1] = NULL;
> + proc.argv = (const char **)procs;
> +
> + if (!run_command(&proc))
> + return 1;
> + if (errno != ENOENT)
> + return 1;
> + return 0;
> +}
This test is not specific enough: It would pass even without your change
to start_command(), because finish_command() detects the ENOENT case. You
really want to test that you see ENOENT after start_command() (i.e.,
before finish_command()).
-- Hannes
^ permalink raw reply
* Re: [PATCH 3/6] run-command: optimize out useless shell calls
From: Johannes Sixt @ 2009-12-31 16:54 UTC (permalink / raw)
To: Jeff King; +Cc: Junio C Hamano, Nanako Shiraishi, git
In-Reply-To: <20091230105536.GC22959@coredump.intra.peff.net>
Jeff King schrieb:
> If there are no metacharacters in the program to be run, we
> can just skip running the shell entirely and directly exec
> the program.
>
> The metacharacter test is pulled verbatim from
> launch_editor, which already implements this optimization.
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> Something inside me feels wrong with a catch-known-metacharacter test
> instead of an allow-known-good check. But this is the same test we have
> been using with launch_editor for some time, so I decided not to mess
> with it.
The git version that msysgit ships (and the one that I use on Windows) has
this sequence in pager.c:
static const char *pager_argv[] = { "sh", "-c", NULL, NULL };
...
pager_process.argv = &pager_argv[2];
pager_process.in = -1;
if (start_command(&pager_process)) {
pager_process.argv = pager_argv;
pager_process.in = -1;
if (start_command(&pager_process))
return;
}
to help people set
PAGER=C:\Program Files\cygwin\bin\less
That is, we first try to run the program without the shell, then retry
wrapped in sh -c.
Wouldn't it be possible to do the same here, assuming that we don't have
programs such as "editor -f" in the path?
It does assume that we are able to detect execvp failure due to ENOENT
which is currently proposed elsewhere by Ilari Liusvaara (and which is
already possible on Windows).
-- Hannes
^ permalink raw reply
* Re: [Updated PATCH 2/2] Improve transport helper exec failure reporting
From: Ilari Liusvaara @ 2009-12-31 16:59 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git
In-Reply-To: <4B3CC6E5.7090404@kdbg.org>
On Thu, Dec 31, 2009 at 04:44:37PM +0100, Johannes Sixt wrote:
> Ilari Liusvaara schrieb:
> >@@ -31,13 +31,19 @@ static struct child_process *get_helper(struct transport *transport)
>
> You should set helper->silent_exec_failure = 1 when you give your
> own error message for the ENOENT case.
Ah yeah, might matter for Win32.
> BTW, which error message do you see without your change in this
> case? You only say "pretty much useless", but do not give an
> example.
git: 'remote-foo' is not a git-command. See 'git --help'.
And as first line of output, such thing is utterly confusing.
> >+ else
> >+ die("Unable to run helper %s: %s", helper->argv[0],
> >+ strerror(errno));
>
> You shouldn't write an error message here because start_command has
> already reported the error.
Its not printed on Unix.
-Ilari
^ permalink raw reply
* Re: [Updated PATCH 2/2] Improve transport helper exec failure reporting
From: Johannes Sixt @ 2009-12-31 17:48 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <20091231165904.GA24243@Knoppix>
Ilari Liusvaara schrieb:
> On Thu, Dec 31, 2009 at 04:44:37PM +0100, Johannes Sixt wrote:
>> Ilari Liusvaara schrieb:
>>> @@ -31,13 +31,19 @@ static struct child_process *get_helper(struct transport *transport)
>> You should set helper->silent_exec_failure = 1 when you give your
>> own error message for the ENOENT case.
>
> Ah yeah, might matter for Win32.
Actually, no. I forgot to mention that your modified start_command should
treat ENOENT differently by looking at cmd->silent_exec_failure. But see
below.
>> BTW, which error message do you see without your change in this
>> case? You only say "pretty much useless", but do not give an
>> example.
>
> git: 'remote-foo' is not a git-command. See 'git --help'.
>
> And as first line of output, such thing is utterly confusing.
And you change this by treating the helper command not as a git command,
but as a normal command that happens to start with 'git-'. Whether this
interpretation is suitable for the transport layer, I do not want to
decide and I will certainly not object. :-)
An alternative solution would be to forward the silent_exec_failure flag
to exec_git_cmd() to unify the treatment of the error condition with the
non-git-command error path.
>>> + else
>>> + die("Unable to run helper %s: %s", helper->argv[0],
>>> + strerror(errno));
>> You shouldn't write an error message here because start_command has
>> already reported the error.
>
> Its not printed on Unix.
I see.
Documentation/technical/api-run-command.txt documents the error behavior.
There are three error cases:
1. system call failures
2. exec failure due to ENOENT
3. non-zero exit of the child and death through signal
Your patch makes all exec failures into category 1, but IMO, these are
actually category 3 (except for the ENOENT case).
In case 3, it is expected that the child process prints a suitable error
message. Therefore, you should start with merely replacing the unconditional
exit(127);
by
if (errno == ENOENT)
exit(127);
else
die_errno("Cannot exec %s", cmd->argv[0]);
And then you can think about how you support the ENOENT case better. My
proposal for this was to do the PATH lookup manually before the fork(),
and then the above conditional would melt down to simply:
die_errno("Cannot exec %s", cmd->argv[0]);
-- Hannes
^ permalink raw reply
* Re: [Updated PATCH 2/2] Improve transport helper exec failure reporting
From: Ilari Liusvaara @ 2009-12-31 18:24 UTC (permalink / raw)
To: Johannes Sixt; +Cc: git
In-Reply-To: <4B3CE3D2.5010502@kdbg.org>
On Thu, Dec 31, 2009 at 06:48:02PM +0100, Johannes Sixt wrote:
> Ilari Liusvaara schrieb:
> >On Thu, Dec 31, 2009 at 04:44:37PM +0100, Johannes Sixt wrote:
> >>Ilari Liusvaara schrieb:
> And you change this by treating the helper command not as a git
> command, but as a normal command that happens to start with 'git-'.
> Whether this interpretation is suitable for the transport layer, I
> do not want to decide and I will certainly not object. :-)
The transport helpers are special: they shouldn't be built-in.
> An alternative solution would be to forward the silent_exec_failure
> flag to exec_git_cmd() to unify the treatment of the error condition
> with the non-git-command error path.
Won't work. The error in git command case would be noted in another memory
image. And passing that back would be nasty to say the least.
> In case 3, it is expected that the child process prints a suitable
> error message. Therefore, you should start with merely replacing the
> unconditional
>
> exit(127);
> by
> if (errno == ENOENT)
> exit(127);
> else
> die_errno("Cannot exec %s", cmd->argv[0]);
>
> And then you can think about how you support the ENOENT case better.
> My proposal for this was to do the PATH lookup manually before the
> fork(), and then the above conditional would melt down to simply:
>
> die_errno("Cannot exec %s", cmd->argv[0]);
>
The child process can't sanely print anything. Stderr would go to
who knows where. Parent process should have much better idea what to
do with errors.
-Ilari
^ permalink raw reply
* [updated patch v3 0/2] Imporve remote helpers exec failure reporting
From: Ilari Liusvaara @ 2009-12-31 18:26 UTC (permalink / raw)
To: git
Changes from previous rounds are:
- Don't loop on unknown errors from close.
- Don't loop on unknown errors from waitpid.
- Set silent_exec_failure on remote helper exec.
- Fix the test to actually test what it is supposed to.
Ilari Liusvaara (2):
Report exec errors from run-command
Improve transport helper exec failure reporting
Makefile | 1 +
run-command.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++--
t/t0061-run-command.sh | 13 ++++++
test-run-command.c | 35 +++++++++++++++++
transport-helper.c | 14 +++++--
5 files changed, 152 insertions(+), 8 deletions(-)
create mode 100755 t/t0061-run-command.sh
create mode 100644 test-run-command.c
^ permalink raw reply
* [updated patch v3 1/2] Report exec errors from run-command
From: Ilari Liusvaara @ 2009-12-31 18:26 UTC (permalink / raw)
To: git
In-Reply-To: <1262284003-1417-1-git-send-email-ilari.liusvaara@elisanet.fi>
Previously run-command was unable to report errors happening in exec
call. Change it to pass errno from failed exec to errno value at
return.
The errno value passing can be done by opening close-on-exec pipe and
piping the error code through in case of failure. In case of success,
close-on-exec closes the pipe on successful exec and parent process
gets end of file on read.
Signed-off-by: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
---
Makefile | 1 +
run-command.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++--
t/t0061-run-command.sh | 13 ++++++
test-run-command.c | 35 +++++++++++++++++
4 files changed, 142 insertions(+), 4 deletions(-)
create mode 100755 t/t0061-run-command.sh
create mode 100644 test-run-command.c
diff --git a/Makefile b/Makefile
index 4a1e5bc..452ad50 100644
--- a/Makefile
+++ b/Makefile
@@ -1725,6 +1725,7 @@ TEST_PROGRAMS += test-parse-options$X
TEST_PROGRAMS += test-path-utils$X
TEST_PROGRAMS += test-sha1$X
TEST_PROGRAMS += test-sigchain$X
+TEST_PROGRAMS += test-run-command$X
all:: $(TEST_PROGRAMS)
diff --git a/run-command.c b/run-command.c
index cf2d8f7..1086c6d 100644
--- a/run-command.c
+++ b/run-command.c
@@ -15,6 +15,18 @@ static inline void dup_devnull(int to)
close(fd);
}
+static inline void force_close(int fd)
+{
+ /*
+ * The close is deemed success or failed in non-transient way if
+ * close() suceeds, returns EBADF or error other than EINTR or
+ * EAGAIN.
+ */
+ while (close(fd) < 0 && errno != EBADF)
+ if(errno != EINTR && errno != EAGAIN)
+ break;
+}
+
int start_command(struct child_process *cmd)
{
int need_in, need_out, need_err;
@@ -76,9 +88,62 @@ fail_pipe:
trace_argv_printf(cmd->argv, "trace: run_command:");
#ifndef WIN32
+{
+ int report_pipe[2] = {-1, -1};
+
+ if (pipe(report_pipe) < 0) {
+ report_pipe[0] = -1;
+ report_pipe[1] = -1;
+ warning("Can't open pipe for exec status report: %s\n",
+ strerror(errno));
+ }
+
fflush(NULL);
cmd->pid = fork();
- if (!cmd->pid) {
+ if (cmd->pid > 0) {
+ int r = 0, ret;
+ force_close(report_pipe[1]);
+read_again:
+ if (report_pipe[0] >= 0)
+ r = read(report_pipe[0], &ret, sizeof(ret));
+ if (r < 0 && (errno == EAGAIN || errno == EINTR ||
+ errno == EWOULDBLOCK))
+ goto read_again;
+ else if (r < 0)
+ warning("Can't read exec status report: %s\n",
+ strerror(errno));
+ else if (r == 0)
+ ;
+ else if (r < sizeof(ret)) {
+ warning("Received incomplete exec status report.\n");
+ errno = EBADMSG;
+ } else {
+ failed_errno = ret;
+ /*
+ * Clean up the process that did the failed execution
+ * so no zombies remain.
+ */
+ if(waitpid(cmd->pid, &ret, 0) < 0 && errno == EINTR)
+ /* Nothing. */ ;
+ cmd->pid = -1;
+ }
+ } else if (!cmd->pid) {
+ int r = 0;
+ int flags;
+ force_close(report_pipe[0]);
+
+ flags = fcntl(report_pipe[1], F_GETFD);
+ if (flags < 0)
+ r = -1;
+ flags |= FD_CLOEXEC;
+ r = (r || fcntl(report_pipe[1], F_SETFD, flags));
+ if (r) {
+ warning("Can't FD_CLOEXEC pipe for exec status "
+ "report: %s\n", strerror(errno));
+ force_close(report_pipe[1]);
+ report_pipe[1] = -1;
+ }
+
if (cmd->no_stdin)
dup_devnull(0);
else if (need_in) {
@@ -119,20 +184,44 @@ fail_pipe:
unsetenv(*cmd->env);
}
}
- if (cmd->preexec_cb)
+ if (cmd->preexec_cb) {
+ /*
+ * We don't know what pre-exec callbacks do, and they
+ * may do something that causes deadlock with exec
+ * reporting. The sole user of this hook seems to
+ * be pager, and it is run through shell, so one
+ * wouldn't get useful error from exec reporting
+ * and would get useful error from shell anyway. So
+ * just disable exec reporting for such comamnds.
+ */
+ force_close(report_pipe[1]);
+ report_pipe[1] = -1;
cmd->preexec_cb();
+ }
if (cmd->git_cmd) {
execv_git_cmd(cmd->argv);
} else {
execvp(cmd->argv[0], (char *const*) cmd->argv);
}
+ failed_errno = errno;
+
trace_printf("trace: exec '%s' failed: %s\n", cmd->argv[0],
strerror(errno));
+
+ r = 0;
+write_again:
+ if (report_pipe[1] >= 0)
+ r = write(report_pipe[1], &failed_errno,
+ sizeof(failed_errno));
+ if (r < 0 && (errno == EAGAIN || errno == EINTR ||
+ errno == EWOULDBLOCK))
+ goto write_again;
+
exit(127);
- }
- if (cmd->pid < 0)
+ } else if (cmd->pid < 0)
error("cannot fork() for %s: %s", cmd->argv[0],
strerror(failed_errno = errno));
+}
#else
{
int s0 = -1, s1 = -1, s2 = -1; /* backups of stdin, stdout, stderr */
diff --git a/t/t0061-run-command.sh b/t/t0061-run-command.sh
new file mode 100755
index 0000000..1d9e82a
--- /dev/null
+++ b/t/t0061-run-command.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+#
+# Copyright (c) 2009 Ilari Liusvaara
+#
+
+test_description='Test run command'
+
+. ./test-lib.sh
+
+test_expect_success "reporting ENOENT" \
+"test-run-command 1"
+
+test_done
diff --git a/test-run-command.c b/test-run-command.c
new file mode 100644
index 0000000..4716033
--- /dev/null
+++ b/test-run-command.c
@@ -0,0 +1,35 @@
+/*
+ * test-run-command.c: test run command API.
+ *
+ * (C) 2009 Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
+ *
+ * This code is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include "git-compat-util.h"
+#include "run-command.h"
+#include <string.h>
+#include <errno.h>
+
+int main(int argc, char **argv)
+{
+ char* procs[2];
+ struct child_process proc;
+ memset(&proc, 0, sizeof(proc));
+
+ if(argc < 2)
+ return 1;
+
+ if (argv[1][0] == '1')
+ procs[0] = "does-not-exist-62896869286";
+ procs[1] = NULL;
+ proc.argv = (const char **)procs;
+
+ if (!start_command(&proc))
+ return 1;
+ if (argv[1][0] == '1' && errno == ENOENT)
+ return 0;
+ return 1;
+}
--
1.6.6.3.gaa2e1
^ permalink raw reply related
* [updated patch v3 2/2] Improve transport helper exec failure reporting
From: Ilari Liusvaara @ 2009-12-31 18:26 UTC (permalink / raw)
To: git
In-Reply-To: <1262284003-1417-1-git-send-email-ilari.liusvaara@elisanet.fi>
Previously transport-helper exec failure error reporting was pretty
much useless as it didn't report errors from execve, only from pipe
and fork. Now that run-command passes errno from exec, use the
improved support to actually print useful errors if execution fails.
Signed-off-by: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
---
transport-helper.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/transport-helper.c b/transport-helper.c
index 5078c71..73da339 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -31,13 +31,19 @@ static struct child_process *get_helper(struct transport *transport)
helper->out = -1;
helper->err = 0;
helper->argv = xcalloc(4, sizeof(*helper->argv));
- strbuf_addf(&buf, "remote-%s", data->name);
+ strbuf_addf(&buf, "git-remote-%s", data->name);
helper->argv[0] = strbuf_detach(&buf, NULL);
helper->argv[1] = transport->remote->name;
helper->argv[2] = transport->url;
- helper->git_cmd = 1;
- if (start_command(helper))
- die("Unable to run helper: git %s", helper->argv[0]);
+ helper->git_cmd = 0;
+ helper->silent_exec_failure = 1;
+ if (start_command(helper)) {
+ if (errno == ENOENT)
+ die("Unable to find remote helper for \"%s\"",
+ data->name);
+ else
+ die_errno("Unable to run helper %s", helper->argv[0]);
+ }
data->helper = helper;
write_str_in_full(helper->in, "capabilities\n");
--
1.6.6.3.gaa2e1
^ permalink raw reply related
* Re: [Updated PATCH 2/2] Improve transport helper exec failure reporting
From: Johannes Sixt @ 2009-12-31 18:44 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <20091231182436.GA1326@Knoppix>
Ilari Liusvaara schrieb:
> On Thu, Dec 31, 2009 at 06:48:02PM +0100, Johannes Sixt wrote:
>> In case 3, it is expected that the child process prints a suitable
>> error message. Therefore, you should start with merely replacing the
>> unconditional
>>
>> exit(127);
>> by
>> if (errno == ENOENT)
>> exit(127);
>> else
>> die_errno("Cannot exec %s", cmd->argv[0]);
>>
>> And then you can think about how you support the ENOENT case better.
>> My proposal for this was to do the PATH lookup manually before the
>> fork(), and then the above conditional would melt down to simply:
>>
>> die_errno("Cannot exec %s", cmd->argv[0]);
>>
>
> The child process can't sanely print anything. Stderr would go to
> who knows where.
Wrong - because:
> Parent process should have much better idea what to
> do with errors.
Very correct. For this reason, the parent process assigns a stderr channel
to the child (or does not do so to inherit its own stderr), and the child
is expected to use it. Errors due to execvp failures are no exception, IMO
(except ENOENT, as always).
-- Hannes
^ permalink raw reply
* Re: [updated patch v3 1/2] Report exec errors from run-command
From: Johannes Sixt @ 2009-12-31 19:03 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <1262284003-1417-2-git-send-email-ilari.liusvaara@elisanet.fi>
Ilari Liusvaara schrieb:
> +static inline void force_close(int fd)
> +{
> + /*
> + * The close is deemed success or failed in non-transient way if
> + * close() suceeds, returns EBADF or error other than EINTR or
> + * EAGAIN.
> + */
> + while (close(fd) < 0 && errno != EBADF)
> + if(errno != EINTR && errno != EAGAIN)
> + break;
You are constantly ignoring proposals to iterate only on EINTR and EAGAIN,
but do not make an argument why you do otherwise. Did I miss something?
> cmd->pid = fork();
> - if (!cmd->pid) {
> + if (cmd->pid > 0) {
> + int r = 0, ret;
> + force_close(report_pipe[1]);
> +read_again:
> + if (report_pipe[0] >= 0)
> + r = read(report_pipe[0], &ret, sizeof(ret));
> + if (r < 0 && (errno == EAGAIN || errno == EINTR ||
> + errno == EWOULDBLOCK))
> + goto read_again;
> + else if (r < 0)
> + warning("Can't read exec status report: %s\n",
> + strerror(errno));
> + else if (r == 0)
> + ;
> + else if (r < sizeof(ret)) {
> + warning("Received incomplete exec status report.\n");
> + errno = EBADMSG;
> + } else {
> + failed_errno = ret;
> + /*
> + * Clean up the process that did the failed execution
> + * so no zombies remain.
> + */
> + if(waitpid(cmd->pid, &ret, 0) < 0 && errno == EINTR)
> + /* Nothing. */ ;
> + cmd->pid = -1;
As per Documentation/technical/api-run-command.txt, you should write an
error here, except if (failed_errno==ENOENT && cmd->silent_exec_failure!=0).
> +test_expect_success "reporting ENOENT" \
> +"test-run-command 1"
I wonder what this parameter "1" is good for...
-- Hannes
^ permalink raw reply
* Re: [updated patch v3 2/2] Improve transport helper exec failure reporting
From: Johannes Sixt @ 2009-12-31 19:05 UTC (permalink / raw)
To: Ilari Liusvaara; +Cc: git
In-Reply-To: <1262284003-1417-3-git-send-email-ilari.liusvaara@elisanet.fi>
Ilari Liusvaara schrieb:
> + helper->silent_exec_failure = 1;
> + if (start_command(helper)) {
> + if (errno == ENOENT)
> + die("Unable to find remote helper for \"%s\"",
> + data->name);
> + else
> + die_errno("Unable to run helper %s", helper->argv[0]);
When you fix your implementation of start_command() to follow
Documentation/technical/api-run-command.txt, the error message in the else
branch is not needed anymore (and then you can ask yourself whether you
really want to issue your own error message in the case of ENOENT).
-- Hannes
^ permalink raw reply
* Re: git pull -s subtree doesn't work properly
From: Oliver Kullmann @ 2009-12-31 19:38 UTC (permalink / raw)
To: git
In-Reply-To: <20091105180905.GP17628@cs-wsok.swansea.ac.uk>
Hello,
it seems no reply yet (if I understand that web-email-interface
properly); has nobody any idea here, or is it a Git bug,
or my fault?
To me it seems all pretty normal, so I would be glad to get
some reaction.
The situation didn't improve: It seems "subtree" is completely broken ---
it has no idea that the files to be pulled are to be placed in
a subtree. (The pull via "git pull -s subtree CSM41 master" actually
also manages to ignore the ignore-patterns; don't know how this
could happen.)
So shouldn't one use this option?
Or how can I restart?
I would also need in other situations the ability of Git to have one independent repository (say,
at Github), which is also included in some other bigger repository (where it is
not changed, only included) --- how to do so if the "subtree"-mechanism doesn't work?
Hope for some help.
Oliver
On Thu, Nov 05, 2009 at 06:09:05PM +0000, Oliver Kullmann wrote:
> Hello,
>
> using
>
> IntroductionJava> git remote add -f CSM41 /home/kullmann/csoliver/UofT/Java0910/ProgrammingJava/CS-M41_Programs
> IntroductionJava> git merge -s ours --no-commit CSM41/master
> IntroductionJava> git read-tree --prefix=Artikel/Skripte/IntroductionJava/CS_M41/ -u CSM41/master
> IntroductionJava> git commit -m "Einfuegen des CS-M41-Projektes als Verzeichnis CS_M41"
>
> I have imported repository "CS-M41_Programs" into another repository. Later then
> I replaced in the config-file the old url /home/kullmann/csoliver/UofT/Java0910/ProgrammingJava/CS-M41_Programs
> by the new one
>
> [remote "CSM41"]
> url = git://github.com/OKullmann/CS-M41-Programming-in-Java.git
> fetch = +refs/heads/*:refs/remotes/CSM41/*
>
> But now
>
> IntroductionJava> git pull -s subtree CSM41 master
>
> doesn't work anymore: In the CSM41 repository just one file index.html was changed,
> and apparently the merge strategy recognises that the other files haven't
> been changed, while index.html is placed just as if the relative path would
> start from the root of the repository.
>
> IntroductionJava> git pull -s subtree CSM41 master
> remote: Counting objects: 7, done.
> remote: Compressing objects: 100% (3/3), done.
> remote: Total 4 (delta 1), reused 0 (delta 0)
> Unpacking objects: 100% (4/4), done.
> >From git://github.com/OKullmann/CS-M41-Programming-in-Java
> * branch master -> FETCH_HEAD
> CONFLICT (delete/modify): Artikel/LaTeX/SystemStile/Html/index.html deleted in HEAD a
> nd modified in 38b11a96fa009a5b2c24cfc94c0268ab9ca7ce39. Version 38b11a96fa009a5b2c24
> cfc94c0268ab9ca7ce39 of Artikel/LaTeX/SystemStile/Html/index.html left in tree.
> Automatic merge failed; fix conflicts and then commit the result.
>
> IntroductionJava> git status
> # On branch master
> # Unmerged paths:
> # (use "git reset HEAD <file>..." to unstage)
> # (use "git add <file>..." to mark resolution)
> #
> # deleted by us: ../../LaTeX/SystemStile/Html/index.html
> #
> no changes added to commit (use "git add" and/or "git commit -a")
>
> The path of index.html is Artikel/Skripte/IntroductionJava/CS_M41/Html/index.html.
> Why git thinks that index.html should be placed into another directory Artikel/LaTeX/SystemStile/Html/
> I have no clue (this directory doesn't exist).
>
> Is it possible to tell "git pull" where the subtree really is, or is that
> not really the cause of the problem?
>
> Thanks for your consideration!
>
> Oliver
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH 3/6] run-command: optimize out useless shell calls
From: Junio C Hamano @ 2009-12-31 19:47 UTC (permalink / raw)
To: Johannes Sixt; +Cc: Jeff King, Nanako Shiraishi, git
In-Reply-To: <4B3CD74D.7020605@kdbg.org>
Johannes Sixt <j6t@kdbg.org> writes:
> to help people set
>
> PAGER=C:\Program Files\cygwin\bin\less
>
> That is, we first try to run the program without the shell, then retry
> wrapped in sh -c.
>
> Wouldn't it be possible to do the same here, assuming that we don't
> have programs such as "editor -f" in the path?
It is a cute idea that covers 70-80% of the cases, as you also have to
assume that you don't have to specify your own pager on a path with IFS
(e.g. "Program files" in your example) and give your parameter to the
pager at the same time, e.g.
PAGER="C:\Program Files\cygwin\bin\less -FRSX"
Because it has its own LESS environment to set FRSX and you can get away
with:
PAGER="C:\Program Files\cygwin\bin\less"
LESS=FRSX
"less" is not a representative example for this issue. In real life I
suspect that custom programs that we don't ship with git (or you don't
ship with msysgit) would lack such a workaround, (and that is why I didn't
say "98% of the cases").
^ permalink raw reply
* [PATCH] Provide a window icon on Windows platforms
From: Kirill @ 2009-12-31 19:57 UTC (permalink / raw)
To: git; +Cc: msysgit
Looks like 37871b73 by Giuseppe Bilotta does not work very well on Windows.
Instead of a former tcl/tk icon, the window has a black square as an icon.
This patch is a copy-paste from Git Gui, which uses a separate .ico file
when it runs on Windows platforms.
---
The patch is in line with what Giuseppe Bilotta proposed in
[PATCH] gitk: try to set program icon on 2008-11-15 23:45:45 GMT
Unfortunately, I could not find any particular reason why that
patch was not applied, but without it, Gitk on Windows does
not look as nice as it could.
The changes in the Makefile were only sanity-checked, not tested in the
full-fledged build or install.
CC to msysGit list is because the changes are actually made and
tested on top of git version 1.6.4.msysgit.0.597.gcd48
gitk-git/Makefile | 3 ++
gitk-git/gitk | 50 ++++++++++++++++++++++++++++++------------------
gitk-git/gitk-gui.ico | Bin 0 -> 3638 bytes
3 files changed, 34 insertions(+), 19 deletions(-)
create mode 100644 gitk-git/gitk-gui.ico
diff --git a/gitk-git/Makefile b/gitk-git/Makefile
index e1b6045..dd158bf 100644
--- a/gitk-git/Makefile
+++ b/gitk-git/Makefile
@@ -5,6 +5,7 @@ prefix ?= $(HOME)
bindir ?= $(prefix)/bin
sharedir ?= $(prefix)/share
gitk_libdir ?= $(sharedir)/gitk/lib
+gitk_libdir_SQ = $(subst ','\'',$(gitk_libdir))
msgsdir ?= $(gitk_libdir)/msgs
msgsdir_SQ = $(subst ','\'',$(msgsdir))
@@ -43,10 +44,12 @@ install:: all
$(INSTALL) -m 755 gitk-wish '$(DESTDIR_SQ)$(bindir_SQ)'/gitk
$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(msgsdir_SQ)'
$(foreach p,$(ALL_MSGFILES), $(INSTALL) -m 644 $p '$(DESTDIR_SQ)$(msgsdir_SQ)' &&) true
+ $(INSTALL) -m 644 gitk-gui.ico '$(DESTDIR_SQ)$(gitk_libdir_SQ)'/gitk-gui.ico
uninstall::
$(foreach p,$(ALL_MSGFILES), $(RM) '$(DESTDIR_SQ)$(msgsdir_SQ)'/$(notdir $p) &&) true
$(RM) '$(DESTDIR_SQ)$(bindir_SQ)'/gitk
+ $(RM) '$(DESTDIR_SQ)$(gitk_libdir_SQ)'/gitk-gui.ico
clean::
$(RM) gitk-wish po/*.msg
diff --git a/gitk-git/gitk b/gitk-git/gitk
index b6a0daa..661904f 100644
--- a/gitk-git/gitk
+++ b/gitk-git/gitk
@@ -11248,30 +11248,42 @@ set patchnum 0
set lserial 0
set isworktree [expr {[exec git rev-parse --is-inside-work-tree] == "true"}]
setcoords
-makewindow
-catch {
- image create photo gitlogo -width 16 -height 16
- image create photo gitlogominus -width 4 -height 2
- gitlogominus put #C00000 -to 0 0 4 2
- gitlogo copy gitlogominus -to 1 5
- gitlogo copy gitlogominus -to 6 5
- gitlogo copy gitlogominus -to 11 5
- image delete gitlogominus
+if {$::tcl_platform(platform) eq {windows}} {
+ wm iconbitmap . -default $gitk_libdir/gitk-gui.ico
+ set ::tk::AlwaysShowSelection 1
+
+ # Spoof an X11 display for SSH
+ if {![info exists env(DISPLAY)]} {
+ set env(DISPLAY) :9999
+ }
+} else {
+ catch {
+ image create photo gitlogo -width 16 -height 16
+
+ image create photo gitlogominus -width 4 -height 2
+ gitlogominus put #C00000 -to 0 0 4 2
+ gitlogo copy gitlogominus -to 1 5
+ gitlogo copy gitlogominus -to 6 5
+ gitlogo copy gitlogominus -to 11 5
+ image delete gitlogominus
- image create photo gitlogoplus -width 4 -height 4
- gitlogoplus put #008000 -to 1 0 3 4
- gitlogoplus put #008000 -to 0 1 4 3
- gitlogo copy gitlogoplus -to 1 9
- gitlogo copy gitlogoplus -to 6 9
- gitlogo copy gitlogoplus -to 11 9
- image delete gitlogoplus
+ image create photo gitlogoplus -width 4 -height 4
+ gitlogoplus put #008000 -to 1 0 3 4
+ gitlogoplus put #008000 -to 0 1 4 3
+ gitlogo copy gitlogoplus -to 1 9
+ gitlogo copy gitlogoplus -to 6 9
+ gitlogo copy gitlogoplus -to 11 9
+ image delete gitlogoplus
- image create photo gitlogo32 -width 32 -height 32
- gitlogo32 copy gitlogo -zoom 2 2
+ image create photo gitlogo32 -width 32 -height 32
+ gitlogo32 copy gitlogo -zoom 2 2
- wm iconphoto . -default gitlogo gitlogo32
+ wm iconphoto . -default gitlogo gitlogo32
+ }
}
+
+makewindow
# wait for the window to become visible
tkwait visibility .
wm title . "[file tail $argv0]: [file tail [pwd]]"
diff --git a/gitk-git/gitk-gui.ico b/gitk-git/gitk-gui.ico
new file mode 100644
index 0000000000000000000000000000000000000000..0f7a43d7b544e19581b0be7b6611b8ff9da94434
GIT binary patch
literal 3638
zcmeH~y-S=y5QoR)0>^O>ZLBQRBE&8*l~sa8I>E-;Zb_fQCdC!OIuH=Hvq(Zxr13Af
zDn%SDwTYEQKmyTDNMQ2Jyq=yPs1Vac_ipy%w;%Jovv;?9A|rB7CMSi|mXB?bN7P0~
zoA!$bBAaNBX-;C#uo1>(YBfdXBjjP3dLq1~*J}!Ls?zWGrT?uj`(HmutJRWryDi;r
zSH{N1WPE&FCMG6idU{%BW@cn@aZ%>y=VfkgPG)CkrT5BZVZr6CY>EFc`Lgv>w!VLt
zH=jP^NU?%d%$la6DVm~bXx<Dd=mou?7xaQ2(<*vJuQV!pMW+x$H*`Zc1VeY)PTMU#
zE4kudSxA|r;*##k6b6MsVNe(n2?m8hVNe(phQx$HVNe(p28AKfVNe(p28BUkP)CD9
z;n3i4&j_GU#;an6p~oY`QgB{yR9LjYl3}2;P${q!STZbd6gUbT1&#toh6;`XLxG{d
z5TPq@6c`E&hA$`25aOqK(a!KjbfCg_WmJY5-xa2c(~5%%Q^j|sv$9CVcg1&ZNBTy`
zf5m^re{503e<d~*h6+O^4zX=SC7&LJl03GN7#RKxHiN_Pms=Yg#K7RN;NZb>yP0IL
z7%T>a;V?e}uox4KL55(k@Wxn&Juz4;;*l)zX^34wgTY~N7#s$N!C}ac6AT7}!{9I&
z3@n2&9tMZOVQ?5&8bgP{VQ?560LQ<vm^0BCR9K_XE^v6R9b<}2$$ME^T9W1EWm#ES
zk=4~z+1S{S_4Rex-rkm-ogLZT-Icw)Jvlfyki)}6+5hG8Zf%Y4agXT6cOVMZ%T}x#
zO_xq2wA-6H9e%qOGY;o!5tXa@V|Juw-051(&(43?e-+=={mrvqlsC_RQBR}YME~=n
z)ajhB#ro&flaV*kA8Xv+#Bac*Y5(`rhhhCE-TT8f(9cdD9uxJm{b$>8Pl>C`BzAmH
zIlh;qcy~`ZIvwL=;yA*%OK>LL-BY+X5R1Ee3TOF$eox_-;4c$@P~tE?$*9NK++;)5
v6i*MmhU++{@~mpIp=$PAV}(nHH21Z<!sXp<^QFk^sm7u{=pSf<_MrR&teD_?
literal 0
HcmV?d00001
--
1.6.4.msysgit.0.597.gcd48
^ permalink raw reply related
* Re: [PATCH] Provide a window icon on Windows platforms
From: Jeff Epler @ 2009-12-31 20:02 UTC (permalink / raw)
To: Kirill; +Cc: git, msysgit
In-Reply-To: <1262289470-4208-1-git-send-email-kirillathome@gmail.com>
On Thu, Dec 31, 2009 at 02:57:50PM -0500, Kirill wrote:
> + set ::tk::AlwaysShowSelection 1
> +
> + # Spoof an X11 display for SSH
> + if {![info exists env(DISPLAY)]} {
> + set env(DISPLAY) :9999
> + }
these bits look unrelated and should probably be in a separate
submission.
^ permalink raw reply
* Re: [PATCH] Provide a window icon on Windows platforms
From: Kirill @ 2009-12-31 20:13 UTC (permalink / raw)
To: Jeff Epler; +Cc: git, msysgit
In-Reply-To: <20091231200240.GC13700@unpythonic.net>
On Thu, Dec 31, 2009 at 3:02 PM, Jeff Epler wrote:
> On Thu, Dec 31, 2009 at 02:57:50PM -0500, Kirill wrote:
>> + set ::tk::AlwaysShowSelection 1
>> +
>> + # Spoof an X11 display for SSH
>> + if {![info exists env(DISPLAY)]} {
>> + set env(DISPLAY) :9999
>> + }
>
> these bits look unrelated and should probably be in a separate
> submission.
The only reason this code is here: Git Gui has it in the same section.
Given my total lack of Tcl/Tk skills and deep understanding, I hoped
to fix some other Windows-specific annoyances "by accident".
If Tcl/Tk gurus, for example, Paul Mackerras, say they're wrong, I'll
gladly remove them. If the only objection is the inclusion into the
same patch, I can do that too.
Thanks for your time!
--
Kirill.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox