summary refs log tree commit diff
diff options
context:
space:
mode:
authorJonathan Nieder <jrnieder@gmail.com>2011-03-10 21:23:11 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2011-03-10 21:23:11 +0800
commit8213431d222b56316e225a1f308b62a72fbb1faa (patch)
tree303808ccc3ab85a23f38a4920228fd35f794d6da
parent[BUILTIN] Fix CTLESC clobbering by read(1) (diff)
downloaddash-8213431d222b56316e225a1f308b62a72fbb1faa.tar.gz
dash-8213431d222b56316e225a1f308b62a72fbb1faa.zip
[BUILTIN] Dotcmd should exit with zero when doing nothing
Tim Allen wrote:

> The POSIX specification for the dot command[1] states:
>
>     EXIT STATUS
>         Returns the value of the last command executed, or a zero exit
>         status if no command is executed.
>
> If an empty file is sourced, then "no command is executed"

I agree.  Looking through "git log --patch src/main.c", though, I find
v0.5.3~42 (Do not clobber exit status in dotcmd., 2005-03-03), which
appears to have been meant to take care of the following case:

        $ cat printstatus.sh
        echo $?
        $ false
        $ . ./printstatus.sh
        1

I wonder if the following on top might help (imitating evalcmd)?

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--ChangeLog4
-rw-r--r--src/main.c7
2 files changed, 8 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 6d02fa9..8a832bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-03-10  Jonathan Nieder <jrnieder@gmail.com>
+
+	* Dotcmd should exit with zero when doing nothing.
+
 2011-03-10  Herbert Xu <herbert@gondor.apana.org.au>
 
 	* Fix CTLESC clobbering by read(1).
diff --git a/src/main.c b/src/main.c
index 1735c67..b38dc27 100644
--- a/src/main.c
+++ b/src/main.c
@@ -202,6 +202,7 @@ cmdloop(int top)
 	union node *n;
 	struct stackmark smark;
 	int inter;
+	int status = 0;
 	int numeof = 0;
 
 	TRACE(("cmdloop(%d) called\n", top));
@@ -235,6 +236,7 @@ cmdloop(int top)
 			job_warning = (job_warning == 2) ? 1 : 0;
 			numeof = 0;
 			evaltree(n, 0);
+			status = exitstatus;
 		}
 		popstackmark(&smark);
 
@@ -245,7 +247,7 @@ cmdloop(int top)
 		}
 	}
 
-	return 0;
+	return status;
 }
 
 
@@ -325,9 +327,8 @@ dotcmd(int argc, char **argv)
 		fullname = find_dot_file(argv[1]);
 		setinputfile(fullname, INPUT_PUSH_FILE);
 		commandname = fullname;
-		cmdloop(0);
+		status = cmdloop(0);
 		popfile();
-		status = exitstatus;
 	}
 	return status;
 }