[cvsnt] Exec failed: No such file or directory
Greg Lee
glee-list at swspec.com
Thu Mar 23 00:10:57 GMT 2006
I did some more digging. The command line that is causing the error is not in the code,
it is actually in my CVSROOT/loginfo file:
# The "loginfo" file controls where "cvs commit" log information
# is sent. The first entry on a line is a regular expression which must match
# the directory that the change is being made to, relative to the
# $CVSROOT. If a match is found, then the remainder of the line is a filter
# program that should expect log information on its standard input.
#
# If the repository name does not match any of the regular expressions in this
# file, the "DEFAULT" line is used, if it is specified.
#
# If the name ALL appears as a regular expression it is always used
# in addition to the first matching regex or DEFAULT.
#
# You may specify a format string as part of the
# filter. The string is composed of a `%' followed
# by a single format character, or followed by a set of format
# characters surrounded by `{' and `}' as separators. The format
# characters are:
#
# s = file name
# V = old version number (pre-checkin)
# v = new version number (post-checkin)
#
# For example:
#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
# or
DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
So, it looks like loginfo is broken on Linux builds right now. Whatever executes this
line needs to specify a shell for the command to be executed in. Is there a configuration
option to specify the shell? If not, then this looks like a bug to me.
Greg
I'm leaving this in the email as my trail of cookies...
> I determined that the error is coming from the server side so
> I added some code on the
> server side to see what is being executed:
>
> [glee at dev1 zzz]$ cvs -tttt commit -m "testing"
> -> main loop with CVSROOT=glee at 192.168.0.94:/home/cvsroot
> -> Starting server: /usr/bin/ssh -l glee 192.168.0.94 cvs server
> glee at 192.168.0.94's password:
> -> Sending file `z.c' to server
> Checking in z.c;
> /home/cvsroot/zzz/z.c,v <-- z.c
> new revision: 1.17; previous revision: 1.16
> done
> -> unlink_file(CVS/Base/z.c)
> -> Register(z.c, 1.17, Wed Mar 22 15:35:14 2006, , )
> -> rename(CVS/Entries.Backup,CVS/Entries)
> -> unlink_file(CVS/Entries.Log)
> Exec failed ("(echo ; id; echo zzz z.c,1.16,1.17; date; cat) >>
> /home/cvsroot/CVSROOT/commitlog "): No such file or directory
> -> Lock_Cleanup()
> [glee at dev1 zzz]$
>
>
> This is what I did to get this information:
>
> --- cvsnt-2.5.03.2260/cvsapi/unix/RunFile.cpp 2006-03-22
> 10:34:54.000000000 -0500
> +++ cvsnt-2.5.03.2260.orig/cvsapi/unix/RunFile.cpp
> 2006-01-11 13:00:35.000000000
> -0500
> @@ -184,18 +184,8 @@
>
> char **myargv = (char**)m_args->toArgv();
> execvp (myargv[0], myargv);
> -{
> - char buf[2000] = "Exec failed (\"";
> - int i;
> - for(i=0; myargv[i] != NULL && i < 20; i++)
> - {
> - strcat(buf, myargv[i]);
> - strcat(buf, " ");
> - }
> - strcat(buf, "\")");
> - perror(buf);
> + perror("Exec failed");
> exit(-1);
> -}
> }
>
> if(m_inFd>=0)
>
> So it looks like something in "(echo ; id; echo zzz
> z.c,1.16,1.17; date; cat)" is not
> executing. In fact, isn't execvp trying to execute the first
> argument in the list, i.e.
> "(echo"? "(echo" is not valid, the "(" is wrong. "echo" is
> valid assuming it is in the
> path. Maybe the intent was to pass this string to a shell
> (sh, bash, etc)?
>
More information about the cvsnt
mailing list