Found 754662 3.3.3+dfsg-2
Thanks

The -2 upload made the build-depends satisfiable on all of the current release architectures However there still build problems that need to be addessed.

Firstly there have been build-failures on many architectures in the official archive including a couple that built -1 successfully.

The armel failure looks like it was caused by the introduction of paralell builds combined with with inadequate dependencies in the build system leading to race conditions. In particular we see a symlink is created after it is needed.

CMake Error in src/CMakeLists.txt:
 Cannot find source file:

   /«BUILDDIR»/witty-3.3.3+dfsg/src/web/skeleton/jquery.min.js

 Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
 .hxx .in .txx
<--snip-->
make: *** [build-static/Makefile] Error 1
make: *** Waiting for unfinished jobs....
<--snip-->
ln -s /usr/share/javascript/jquery/jquery.min.js src/web/skeleton/

The kfreebsd-i386 failure seems to be a hang in documentation generation, I would guess this was just a random failure.

mipsel looks like the same issue as armel.

powerpc and s390x failed with

(cd src/js; for I in *.js; do  -c --no-seqs -nc $I > `basename $I .js`.min.js; 
done)
/bin/sh: 1: -c: not found

Some investigation showed that the block of code in debian/rules to select the minifier is broken. In particular ifdef only tests if a variable is defined, not if it's value is non-empty.

mips hasn't attempted a build yet.

Secondly the packages build-depends are still unsatisfiable on all the debian-ports.org architectures (alpha, arm64, hppa, m68k, powerpcspe, ppc64, sh4 sparc64 and x32) and one architecture that has lost it's release status but is still in the offiical archive at present (sparc)

Given that nodejs is only available on a relatively small number of architectures it probablly makes more sense to use a list of architectures where it is available than a list of architectures where it is not available.

The attatched debdiff changes the lists of architectures in debian/control to specify a list of architectures where nodejs is known to be available rather than an incomplete list of architectures where it is not available, Fixes the minifier selection code in debian/rules and disables paralell builds. It has been build-tested on powerpc.

I do not have any immediate intent to NMU.

P.S. a little note on the version number in the debdiff. I was inititally testing in an arm64 qemu chroot but ran into the issue that qemu-aarch64 and openjdk don't get along (real arm64 hardware is fine afaict) so I moved to testing on the powerpc porterbox.


diff -u witty-3.3.3+dfsg/debian/changelog witty-3.3.3+dfsg/debian/changelog
--- witty-3.3.3+dfsg/debian/changelog
+++ witty-3.3.3+dfsg/debian/changelog
@@ -1,3 +1,14 @@
+witty (3.3.3+dfsg-2+arm64) unreleased; urgency=medium
+
+  * Fix minifier detection logic in debian/rules Closes: #754662
+  * Disable paralell builds again. They don't seem to work reliablly.
+    Reopens: 739436
+  * Change dependencies in debian/rules to use list of architectures where
+    nodejs is available rathe than incomplete list of architectures where
+    it is available.
+
+ -- Peter Michael Green <plugw...@debian.org>  Sat, 16 Aug 2014 05:05:31 +0000
+
 witty (3.3.3+dfsg-2) unstable; urgency=medium
 
   * Use yui-compressor where uglifyjs is not available. Closes: #754662
diff -u witty-3.3.3+dfsg/debian/control witty-3.3.3+dfsg/debian/control
--- witty-3.3.3+dfsg/debian/control
+++ witty-3.3.3+dfsg/debian/control
@@ -11,8 +11,9 @@
  mtasc, libgraphicsmagick1-dev, lsb-release, hardening-wrapper, libjs-jquery,
  libpango1.0-dev, python-pygments, firebird2.5-dev, libjs-jquery-jplayer, 
  jquery-jplayer-bluemonday, libmysqlclient-dev, fonts-font-awesome,
- libglew-dev (>= 1.10), libqt4-dev, yui-compressor [mips powerpc s390x],
- node-uglify [!mips !powerpc !s390x]
+ libglew-dev (>= 1.10), libqt4-dev, 
+ yui-compressor [!amd64 !armel !armhf !i386 !kfreebsd-amd64 !kfreebsd-i386 
!mipsel],
+ node-uglify [amd64 armel armhf i386 kfreebsd-amd64 kfreebsd-i386 mipsel]
 Standards-Version: 3.9.5.0
 Section: libdevel
 Homepage: http://www.webtoolkit.eu/
diff -u witty-3.3.3+dfsg/debian/rules witty-3.3.3+dfsg/debian/rules
--- witty-3.3.3+dfsg/debian/rules
+++ witty-3.3.3+dfsg/debian/rules
@@ -48,7 +48,7 @@
 # yui-compressor (what upstream used in the past) where there is no UglifyJS
 
 MINIFIER=$(shell which uglifyjs)
-ifdef MINIFIER
+ifneq ($(MINIFIER),)
   MINIFIER_FLAGS=-c --no-seqs -nc
 else
   MINIFIER=/usr/bin/yui-compressor
@@ -65,10 +65,12 @@
   CFLAGS += -O2
 endif
 
-ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
-  NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
-  MAKEFLAGS += -j$(NUMJOBS)
-endif
+# Paralell build failed on armel and mipsel, presumablly due to inadequate
+# target dependencies. Disable it for now.
+#ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+#  NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+#  MAKEFLAGS += -j$(NUMJOBS)
+#endif
 ### End parallel build
 
 CMAKEVERSION:=$(shell cmake --version | grep -o -P \(\\d\\.\\d\) | tr -d '\n')
only in patch2:
unchanged:
--- witty-3.3.3+dfsg.orig/doc/tutorial/asciidoc.js
+++ witty-3.3.3+dfsg/doc/tutorial/asciidoc.js
@@ -0,0 +1,189 @@
+var asciidoc = {  // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+  function getText(el) {
+    var text = "";
+    for (var i = el.firstChild; i != null; i = i.nextSibling) {
+      if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+        text += i.data;
+      else if (i.firstChild != null)
+        text += getText(i);
+    }
+    return text;
+  }
+
+  function TocEntry(el, text, toclevel) {
+    this.element = el;
+    this.text = text;
+    this.toclevel = toclevel;
+  }
+
+  function tocEntries(el, toclevels) {
+    var result = new Array;
+    var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+    // Function that scans the DOM tree for header elements (the DOM2
+    // nodeIterator API would be a better technique but not supported by all
+    // browsers).
+    var iterate = function (el) {
+      for (var i = el.firstChild; i != null; i = i.nextSibling) {
+        if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+          var mo = re.exec(i.tagName);
+          if (mo && (i.getAttribute("class") || i.getAttribute("className")) 
!= "float") {
+            result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+          }
+          iterate(i);
+        }
+      }
+    }
+    iterate(el);
+    return result;
+  }
+
+  var toc = document.getElementById("toc");
+  if (!toc) {
+    return;
+  }
+
+  // Delete existing TOC entries in case we're reloading the TOC.
+  var tocEntriesToRemove = [];
+  var i;
+  for (i = 0; i < toc.childNodes.length; i++) {
+    var entry = toc.childNodes[i];
+    if (entry.nodeName.toLowerCase() == 'div'
+     && entry.getAttribute("class")
+     && entry.getAttribute("class").match(/^toclevel/))
+      tocEntriesToRemove.push(entry);
+  }
+  for (i = 0; i < tocEntriesToRemove.length; i++) {
+    toc.removeChild(tocEntriesToRemove[i]);
+  }
+  
+  // Rebuild TOC entries.
+  var entries = tocEntries(document.getElementById("content"), toclevels);
+  for (var i = 0; i < entries.length; ++i) {
+    var entry = entries[i];
+    if (entry.element.id == "")
+      entry.element.id = "_toc_" + i;
+    var a = document.createElement("a");
+    a.href = "#" + entry.element.id;
+    a.appendChild(document.createTextNode(entry.text));
+    var div = document.createElement("div");
+    div.appendChild(a);
+    div.className = "toclevel" + entry.toclevel;
+    toc.appendChild(div);
+  }
+  if (entries.length == 0)
+    toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+  // Delete existing footnote entries in case we're reloading the footnodes.
+  var i;
+  var noteholder = document.getElementById("footnotes");
+  if (!noteholder) {
+    return;
+  }
+  var entriesToRemove = [];
+  for (i = 0; i < noteholder.childNodes.length; i++) {
+    var entry = noteholder.childNodes[i];
+    if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") 
== "footnote")
+      entriesToRemove.push(entry);
+  }
+  for (i = 0; i < entriesToRemove.length; i++) {
+    noteholder.removeChild(entriesToRemove[i]);
+  }
+
+  // Rebuild footnote entries.
+  var cont = document.getElementById("content");
+  var spans = cont.getElementsByTagName("span");
+  var refs = {};
+  var n = 0;
+  for (i=0; i<spans.length; i++) {
+    if (spans[i].className == "footnote") {
+      n++;
+      var note = spans[i].getAttribute("data-note");
+      if (!note) {
+        // Use [\s\S] in place of . so multi-line matches work.
+        // Because JavaScript has no s (dotall) regex flag.
+        note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+        spans[i].innerHTML =
+          "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+          "' title='View footnote' class='footnote'>" + n + "</a>]";
+        spans[i].setAttribute("data-note", note);
+      }
+      noteholder.innerHTML +=
+        "<div class='footnote' id='_footnote_" + n + "'>" +
+        "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+        n + "</a>. " + note + "</div>";
+      var id =spans[i].getAttribute("id");
+      if (id != null) refs["#"+id] = n;
+    }
+  }
+  if (n == 0)
+    noteholder.parentNode.removeChild(noteholder);
+  else {
+    // Process footnoterefs.
+    for (i=0; i<spans.length; i++) {
+      if (spans[i].className == "footnoteref") {
+        var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+        href = href.match(/#.*/)[0];  // Because IE return full URL.
+        n = refs[href];
+        spans[i].innerHTML =
+          "[<a href='#_footnote_" + n +
+          "' title='View footnote' class='footnote'>" + n + "</a>]";
+      }
+    }
+  }
+},
+
+install: function(toclevels) {
+  var timerId;
+
+  function reinstall() {
+    asciidoc.footnotes();
+    if (toclevels) {
+      asciidoc.toc(toclevels);
+    }
+  }
+
+  function reinstallAndRemoveTimer() {
+    clearInterval(timerId);
+    reinstall();
+  }
+
+  timerId = setInterval(reinstall, 500);
+  if (document.addEventListener)
+    document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, 
false);
+  else
+    window.onload = reinstallAndRemoveTimer;
+}
+
+}

Reply via email to