Hello community,

here is the log from the commit of package zsh for openSUSE:Factory checked in 
at 2013-12-26 17:42:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/zsh (Old)
 and      /work/SRC/openSUSE:Factory/.zsh.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "zsh"

Changes:
--------
--- /work/SRC/openSUSE:Factory/zsh/zsh.changes  2013-04-22 14:33:20.000000000 
+0200
+++ /work/SRC/openSUSE:Factory/.zsh.new/zsh.changes     2013-12-26 
17:42:45.000000000 +0100
@@ -1,0 +2,10 @@
+Wed Dec 25 12:25:03 UTC 2013 - [email protected]
+
+- Update to version 5.0.4
+  * Small bugfix release
+- Add zsh-pipefix.patch to import pipe fixes from zsh.git
+- Remove upstream patches
+  * zsh-osc-suseversion.patch
+  * zsh-zypper-completion.patch
+
+-------------------------------------------------------------------

Old:
----
  zsh-5.0.2.tar.bz2
  zsh-osc-suseversion.patch
  zsh-zypper-completion.patch

New:
----
  zsh-5.0.4.tar.bz2
  zsh-pipefix.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ zsh.spec ++++++
--- /var/tmp/diff_new_pack.SY2wAX/_old  2013-12-26 17:42:46.000000000 +0100
+++ /var/tmp/diff_new_pack.SY2wAX/_new  2013-12-26 17:42:46.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           zsh
-Version:        5.0.2
+Version:        5.0.4
 Release:        0
 Summary:        Shell with comprehensive completion
 License:        MIT
@@ -36,9 +36,8 @@
 Source16:       dotzshrc.rh
 Source17:       zshprompt.pl
 %endif
-Patch1:         zsh-zypper-completion.patch
-Patch2:         zsh-osc-suseversion.patch
-Patch3:         trim-unneeded-completions.patch
+Patch1:         trim-unneeded-completions.patch
+Patch2:         zsh-pipefix.patch
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 %if 0%{?suse_version}
 Requires(pre):  %{install_info_prereq}
@@ -94,11 +93,10 @@
 
 %prep
 %setup -q -n %{name}-%{version}
-%patch1 -p1
-%patch2 -p1
 %if 0%{?suse_version}
-%patch3 -p1
+%patch1 -p1
 %endif
+%patch2 -p1
 
 # Remove executable bit
 chmod 0644 Etc/changelog2html.pl
@@ -129,15 +127,6 @@
 
 make all info html
 
-# make help text files
-install -d Help
-pushd Help/
-troff -Tlatin1 -t -mandoc ../Doc/zshbuiltins.1 | \
-       grotty -cbou | \
-       sed -e 's/±/{+|-}/' | \
-       ../Util/helpfiles
-popd
-
 # generate intro.ps
 groff -Tps -ms Doc/intro.ms > intro.ps
 
@@ -179,7 +168,7 @@
 
 # install help files
 install -m 0755 -Dd    %{buildroot}%{_datadir}/%{name}/%{version}/help
-install -m 0644 Help/* %{buildroot}%{_datadir}/%{name}/%{version}/help/
+install -m 0644 Doc/help/* %{buildroot}%{_datadir}/%{name}/%{version}/help/
 
 # link zsh binary
 ln -sf %{_bindir}/zsh %{buildroot}/bin/zsh

++++++ zsh-5.0.2.tar.bz2 -> zsh-5.0.4.tar.bz2 ++++++
++++ 22175 lines of diff (skipped)

++++++ zsh-pipefix.patch ++++++
diff --git a/Src/exec.c b/Src/exec.c
index dccdc2b..4480033 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -1691,6 +1691,7 @@ execpline2(Estate state, wordcode pcode,
        execcmd(state, input, output, how, last1 ? 1 : 2);
     else {
        int old_list_pipe = list_pipe;
+       int subsh_close = -1;
        Wordcode next = state->pc + (*state->pc), pc;
        wordcode code;
 
@@ -1738,6 +1739,7 @@ execpline2(Estate state, wordcode pcode,
        } else {
            /* otherwise just do the pipeline normally. */
            addfilelist(NULL, pipes[0]);
+           subsh_close = pipes[0];
            execcmd(state, input, pipes[1], how, 0);
        }
        zclose(pipes[1]);
@@ -1750,6 +1752,8 @@ execpline2(Estate state, wordcode pcode,
        execpline2(state, *state->pc++, how, pipes[0], output, last1);
        list_pipe = old_list_pipe;
        cmdpop();
+       if (subsh_close != pipes[0])
+           zclose(pipes[0]);
     }
 }
 
diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst
index c8320a1..61d24fe 100644
--- a/Test/A05execution.ztst
+++ b/Test/A05execution.ztst
@@ -202,3 +202,15 @@ F:the bug is still there or it reappeared. See 
workers-29973 for details.
 0:Check $pipestatus with a known difficult case
 >1 0 1 0 0
 F:This similar test was triggering a reproducible failure with pipestatus.
+
+  { unsetopt MONITOR } 2>/dev/null
+  coproc { read -Et 5 || kill -INT $$ }
+  print -u $ZTST_fd 'This test takes 5 seconds to fail...'
+  { printf "%d\n" {1..20000} } | ( read -E )
+  print -p done
+  read -Ep
+0:Bug regression: piping a shell construct to an external process may hang
+>1
+>done
+F:This test checks for a file descriptor leak that could cause the left
+F:side of a pipe to block on write after the right side has exited
diff --git a/Src/exec.c b/Src/exec.c
index 4480033..f16cfd3 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -2389,7 +2389,7 @@ static void
 execcmd(Estate state, int input, int output, int how, int last1)
 {
     HashNode hn = NULL;
-    LinkList args;
+    LinkList args, filelist = NULL;
     LinkNode node;
     Redir fn;
     struct multio *mfds[10];
@@ -2911,6 +2911,7 @@ execcmd(Estate state, int input, int output, int how, int 
last1)
            flags |= ESUB_KEEPTRAP;
        if (type == WC_SUBSH && !(how & Z_ASYNC))
            flags |= ESUB_JOB_CONTROL;
+       filelist = jobtab[thisjob].filelist;
        entersubsh(flags);
        close(synch[1]);
        forked = 1;
@@ -3264,6 +3265,7 @@ execcmd(Estate state, int input, int output, int how, int 
last1)
 
            if (is_shfunc) {
                /* It's a shell function */
+               pipecleanfilelist(filelist);
                execshfunc((Shfunc) hn, args);
            } else {
                /* It's a builtin */
@@ -3342,6 +3344,7 @@ execcmd(Estate state, int input, int output, int how, int 
last1)
                DPUTS(varspc,
                      "BUG: assignment before complex command");
                list_pipe = 0;
+               pipecleanfilelist(filelist);
                /* If we're forked (and we should be), no need to return */
                DPUTS(last1 != 1 && !forked, "BUG: not exiting?");
                DPUTS(type != WC_SUBSH, "Not sure what we're doing.");
diff --git a/Src/jobs.c b/Src/jobs.c
index 371b8eb..a321172 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -1173,6 +1173,30 @@ addfilelist(const char *name, int fd)
     zaddlinknode(ll, jf);
 }
 
+/* Clean up pipes no longer needed associated with a job */
+
+/**/
+void
+pipecleanfilelist(LinkList filelist)
+{
+    LinkNode node;
+
+    if (!filelist)
+       return;
+    node = firstnode(filelist);
+    while (node) {
+       Jobfile jf = (Jobfile)getdata(node);
+       if (jf->is_fd) {
+           LinkNode next = nextnode(node);
+           zclose(jf->u.fd);
+           (void)remnode(filelist, node);
+           zfree(jf, sizeof(*jf));
+           node = next;
+       } else
+           incnode(node);
+    }
+}
+
 /* Finished with list of files for a job */
 
 /**/
@@ -1415,19 +1439,7 @@ zwaitjob(int job, int wait_cmd)
             * we can't deadlock on the fact that those still exist, so
             * that's not a problem.
             */
-           LinkNode node = firstnode(jn->filelist);
-           while (node) {
-               Jobfile jf = (Jobfile)getdata(node);
-               if (jf->is_fd) {
-                   LinkNode next = nextnode(node);
-                   (void)remnode(jn->filelist, node);
-                   zclose(jf->u.fd);
-                   zfree(jf, sizeof(*jf));
-                   node = next;
-               } else {
-                   incnode(node);
-               }
-           }
+           pipecleanfilelist(jn->filelist);
        }
        while (!errflag && jn->stat &&
               !(jn->stat & STAT_DONE) &&
diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst
index 61d24fe..6abfd8b 100644
--- a/Test/A05execution.ztst
+++ b/Test/A05execution.ztst
@@ -207,10 +207,12 @@ F:This similar test was triggering a reproducible failure 
with pipestatus.
   coproc { read -Et 5 || kill -INT $$ }
   print -u $ZTST_fd 'This test takes 5 seconds to fail...'
   { printf "%d\n" {1..20000} } | ( read -E )
+  hang(){ printf "%d\n" {2..20000} | cat }; hang | ( read -E )
   print -p done
   read -Ep
 0:Bug regression: piping a shell construct to an external process may hang
 >1
+>2
 >done
 F:This test checks for a file descriptor leak that could cause the left
 F:side of a pipe to block on write after the right side has exited
-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to