When fixing another bug I found out the exit code lftp returned to
shellscripts wasn't what I was expecting it to be.
The following code is in CMD(set) (commands.cc):
if(a==0)
{
xstring_ca s(ResMgr::Format(with_defaults,only_defaults));
OutputJob *out=new OutputJob(output.borrow(), args->a0());
Job *j=new echoJob(s,out);
return j;
}
You would think that if a set fails, the exit code wouldn't be 0.
However, that code spawns a new job, and that job ends the last. It
ends successfully and lftp returns a happy ending.
It makes sense, the exit code is supposed to be the exit code of the
last job executed. But I wouldn't say it is too intuitive, or useful.
You have the same problem when running several jobs in parallel,
because even if one fails, the others will probably return 0. However
I see CMD(set) as a whole, it doesn't matter if it makes a new job, if
it fails I would like to see an error there.
There are 2 scenarios:
-cmd:fail-exit=true:
You want lftp to stop when it finds an error, and chances are you want
that because the exit code is being checked in a shellscript that has
to do something when it fails. For example, download 10 files, 3 in
parallel, but if one fails, don't waste your time and stop, and don't
try to unzip them.
-cmd:fail-exit=false
You don't care if there is an error. In this case it may make sense to
leave the behavior as it is. I don't see how this could be useful
though, because unless the very last command gives you an error, you
won't know. 99% of the time you are going to get a 0.
Regardless of the value of fail-exit, you have the above scenario
where a failed set still returns a 0, and that's wrong, in my opinion.
The patch attached sets a variable with the last error code, and
CmdExec::ExitCode() returns that code if it's not 0. It only works
when fail-exit=true. So if there are any errors, that will be the
returned code, even if it wasn't the last job.
I'm not sure making the behavior between true and false inconsistent
is a good idea. Adding it to both cases of fail-exit is as simple as
moving it out of the fail-exit if (but notice that would need the
patch I included in other mail where exit_code is not 1 every time
exec_parsed_command() is called unless there is an actual error)
Perhaps adding an option to control this would be better (I prefer to
hardcode it).
return_error.patch
Description: Binary data