On Wed, 21 Mar 2018 14:18:39 -0400 Cedric Bail <ced...@ddlm.me> said:
> On March 20, 2018 6:14 PM, Carsten Haitzler <ras...@rasterman.com> wrote: > > On Tue, 20 Mar 2018 12:06:08 -0400 Cedric Bail ced...@ddlm.me said: > > > On March 20, 2018 7:38 AM, Carsten Haitzler ras...@rasterman.com wrote: > > > > On Tue, 20 Mar 2018 10:06:43 -0300 Gustavo Sverzut Barbieri > > > > barbi...@gmail.com said: > > > > > > <snip> > > > > > > > > I said I'd give up... but seeing this makes me sad. > > > > > in two lines you: misused the Eina_Error AND missed the purpose of > > > > > resolve. > > > > > > > > > > I hoped when you looked at it, written as code, you'd realize the > > > > > mistake... but seems not... so I'm pointing here. > > > > > > > > > > eina_error conversion to string (which will be helpful to high level > > > > > languages) is missed, "+ 1000000" is an error that is not > > > > > registered... > > > > > > > > > > OTOH success is always ZERO, so there is no value... IF that would be > > > > > right, then it should be a void promise (carries no value). > > > > > > > > > > but my hope is that you'll simply move this to > > > > > eina_promise_resolve(pd->promise, eina_value_int_init(exit_code)) > > > > > > > > > > and listen to my advice that is to move the "!= 0" OUTSIDE of this > > > > > function, you're mixing roles :-/ > > > > > > > > eh? we only have 1 value to know of success or failure. an int. 0 == > > > > success. anything else is failure. that's precisely what i did right > > > > there. > > > > > > No. Think about what Eina_Error mean for binding. It will trigger an > > > exception in some language. Now the user as to catch exception and > > > instead of doing a switch on expected real error, it has to work around > > > this hack to get the real exit status. Additionnaly, there is no > > > requirement/guarantee in Eina_Error that this error code will never be > > > used for something else. > > > > i'm not the one coming up with raising exceptions or not, BUT i mentioned > > this before. shell: > > > > cmd1 && cmd2 && cmd3 > > > > is a chain of promises. they are the same thing. if cmd1 succeedsm then run > > cmd2, if that succeeds run cmd3. if the "it doesnt succeed" is done via an > > exception - then promises are going to SUCK. > > Great example. This is not a chain of error/success, but a logical and > operator, the same way you would do in C : > > if (f1() && f2() && f3()) which is a chain of success only. fo f1, if that is true then f2, if that is true then f3. if the promises don't fail when the error code is non-zero then you can't chain like the above. > A chain of future is not designed to just implement the above line, but you > should be able to do also : > > do || fallback and that is a different kind of chain which actually does both things irrespective, but logically or's the result. so if do AND fallback both errors your result will be "false" (promises just extend this logic over time async rather than in-line in a blocking kind of way like if's etc.) > or even : > > [$? -ne 5] > > In all of this case, it is using $? value explicitely or implicitely. It in this case you are checking the error code to see what kind of error. an exit code of 5 never should imply success. not in the world of the command line shell. i didn't make those rules. i'm just following the pattern. > would be the same in C, a value. So during a future resolution is when you > take a decision on what to do with the value, should it be a &&, ||, -ne, -eq > or whatever. future/promise are a generic construct, they are not supposed to > just handle the shell && command. see eio. this does exactly the stuff that eio does. it decides when it's a fail or success. with eio for example with stat the eina error value is the syscalls errno value. in this case since its a system error ECANCEL will be distinctly "not reported" because stat won't say that. there is no conflict. with exe exit codes there is a conflict as it can report ANYTHING (actually exit codes are basically masked with 0xff so they only report 0->255 even thought it's a full int in the C ABI). > > if a file download failed to fully complete - exception. if a file_set > > failed because file doesn't exist - exception. you do know that there is > > tonnes of code in e and efl that does a file_set to just determine if the > > file exists AND is an image or not? (well file_set then size_get for non 0 > > size). if exceptions are the way to do this then there are going to be a > > LOT of them and people have to handle them in that language. > > Some language implementation of future and asynchronous primitive, like for > example Javascript, do not have a failure case. To generate a failure, you > throw an execption and you catch it at the end of the future pipeline. That's > how it work. So yes, in some language, you have to deal with exception. And > the interface should document the expected exception at some point. so if the language means you must handle exceptions then that's how it works. you must handle them. > > if exe's can never fail - they always succeed unless there is a total > > catastrophic failure (fork or something before fork fails - highly unlikely) > > then you can never use promise chains to run a series of commands one after > > the other. > > If you actually return a value, you can actually make series of commands with > all the behavior you want more easily. How about doing something when the > exit code is 5 ? future are a generic construct, not their to do only the > equivalent of &&. you get an eina error with a value of 1000005. i just used the +100000 to push the exit code value well outside any normal range of error codes so its distinguishable fro ECANCEL. you get the information. it's there. an exit code of 5 is an error. by definition. i didn't make he definition. that was done long ago. just like when stat fails in eio and the promise is rejected with the errno. the stat failing is an error. even if all i want to do is check if the file exists (a very common use of stat - i don't want the data. i just want to know if it's there or not). if i need exceptions to deal with "it's not there" result... then i have to do that. > > something has to make a decision on failure and promises make that decision > > when it's rejected, and the point of rejection is exit code. the shell > > already decided on this. cmd1 && cmd2. > > Yes, your code in the future or as Gustavo proposed, we can have helper that > check for this value and provide operator logic that you can insert in the > pipeline. I hope that help you understand why a process exit code is a value. it's not a "success value". it's an "error value". i've been saying that clearly and pointing to how the shell determines it is an error too (a && b && c, /bin/sh -e, state nonexistentfile etc.). the convention is that anything non-ero is an error and it's just reporting the kind of error value. that is reporting as an eina error in a promise reject, just like eio does. if simplecerrors like "file not found" for stat is a promise reject + eina error, then execing stat nonexistent file MUST produce the same kind of result - an error if the file does not exist (which the stat command will do), otherwise it's not consistent. same with any other command. Makefiles are another great example. any non-zero exit code from a compile command results in the entire compile breaking at that point. any shell commands using non-zero exit codes as success of any sort are just simply broken commands as they would fail in the above sh -e, makefile, a && b && c, etc. etc. cases as they do not follow the shell convention. the default "out of the box' must absolutely be anything non-zero is a failure because that is the default "out of the box" convention on the cmdline. a failure is a promise reject. you clearly did just that in eio. if you want tov have some mapping capability to turn some errors into success, then that is out of scope for the code in question right now as it is implementing a sane default that follows conventions laid down decades ago. if by default it succeeded with non-zero exit codes then it'd be broken code as it would not be following any conventions within efl (see my comparisons to eio), nor from the outside world (command line + exit codes). if you want to argue that a non-zero exit code is not an error on the command-line (exit codes of processes), then point me to a shell/cmdline convention that follows this. for example: ccache returns 0 if the cached file is not found or valid and it has to run gcc to do a full compile, or it returns 5 if the cache is a hit and can avoid the compile. just an example. point me to a NON-BROKEN real usage of non-zero exit codes for success. then point me to how they are the majority of cases so that the convention in efl should interpret non-zero exit codes as success. then you will convince me that non-zero exit codes are successes. i know of no such examples (of non-broken cmds that won't break all of the above conventions on the cmdline/shell scrips/Makefiles or basically anything that is EXECUTING things and needing to base decisions on what to do next by exit codes), thus i'm not even trying to find a solution to this at this point because it's not worth doing unless there is a good reason to. -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- Carsten Haitzler - ras...@rasterman.com ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel