From 637df6b19709fca1a47d54b6b861f71b753ef4e2 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Tue, 16 Jun 2015 23:21:11 +0200
Subject: [PATCH] gluon-announce, ...: don't output empty lists where not
 appropriate

Always output empty objects or nothing at all where objects are expected, but
no elements exist.

Also remove a few unneeded "requires", a few basic modules are provided by
announce.lua by default.
---
 .../files/usr/lib/lua/gluon/announce.lua      |  3 +-
 .../lib/gluon/announce/neighbours.d/batadv    | 10 +++---
 .../lib/gluon/announce/neighbours.d/wifi      | 11 +++---
 .../nodeinfo.d/network/mesh/bat0/interfaces   |  3 +-
 ...keys-to-allow-encoding-empty-objects.patch | 36 +++++++++++++++++++
 5 files changed, 50 insertions(+), 13 deletions(-)
 create mode 100644 patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch

diff --git a/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua b/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
index 7f3f62e28..3c9b86010 100644
--- a/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
+++ b/package/gluon-announce/files/usr/lib/lua/gluon/announce.lua
@@ -3,6 +3,7 @@
 module('gluon.announce', package.seeall)
 
 fs = require 'luci.fs'
+json = require 'luci.json'
 uci = require('luci.model.uci').cursor()
 util = require 'luci.util'
 
@@ -15,7 +16,7 @@ local function collect_entry(entry)
 end
 
 function collect_dir(dir)
-	local ret = {}
+	local ret = { [json.null] = true }
 
 	for _, entry in ipairs(fs.dir(dir)) do
 		if entry:sub(1, 1) ~= '.' then
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
index f93a11f9c..cfdd72dc6 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/batadv
@@ -1,7 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
-
 local ifname_address_cache = {}
 
 function ifname2address(ifname)
@@ -26,7 +22,7 @@ function batadv()
     if mac1 ~= nil and mac1 == mac2 then
       ifaddress = ifname2address(ifname)
       if interfaces[ifaddress] == nil then
-        interfaces[ifaddress] = { neighbours = {} }
+        interfaces[ifaddress] = { neighbours = { [json.null] = true } }
       end
 
       interfaces[ifaddress].neighbours[mac1] = { tq = tonumber(tq)
@@ -35,7 +31,9 @@ function batadv()
     end
   end
 
-  return interfaces
+  if next(interfaces) then
+    return interfaces
+  end
 end
 
 return batadv()
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
index d37542223..26168003a 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/neighbours.d/wifi
@@ -1,6 +1,3 @@
-local json = require 'luci.json'
-local util = require 'luci.util'
-local fs = require 'nixio.fs'
 local iwinfo = require 'iwinfo'
 
 function neighbours(iface)
@@ -12,7 +9,9 @@ function neighbours(iface)
                           }
   end
 
-  return stations
+  if next(stations) then
+    return stations
+  end
 end
 
 function interfaces()
@@ -38,4 +37,6 @@ for address, iface in pairs(interfaces()) do
   wifi[address] = { neighbours = neighbours(iface) }
 end
 
-return wifi
+if next(wifi) then
+  return wifi
+end
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
index 97180b81b..e0c3c9acd 100644
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/announce/nodeinfo.d/network/mesh/bat0/interfaces
@@ -48,5 +48,6 @@ end
 return {
   wireless = nil_table(wireless),
   tunnel = nil_table(tunnel),
-  other = nil_table(other)
+  other = nil_table(other),
+  [json.null] = true
 }
diff --git a/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch b/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch
new file mode 100644
index 000000000..0f0a2cffe
--- /dev/null
+++ b/patches/packages/luci/0003-luci-lib-json-ignore-null-keys-to-allow-encoding-empty-objects.patch
@@ -0,0 +1,36 @@
+From: Matthias Schiffer <mschiffer@universe-factory.net>
+Date: Thu, 4 Jun 2015 21:03:24 +0200
+Subject: luci-lib-json: ignore null keys to allow encoding empty objects
+
+There is currently no way to encode an empty object {}, as empty tables are
+encoded as empty lists [].
+
+With this patch, encode() will ignore table fields with the key json.null (which
+doesn't make sense anyways). This allows adding a field with key json.null to
+force encoding it as an object.
+
+Signed-off-by: Matthias Schiffer <mschiffer@universe-factory.net>
+
+diff --git a/libs/json/luasrc/json.lua b/libs/json/luasrc/json.lua
+index 8dbaf91..11a5608 100644
+--- a/libs/json/luasrc/json.lua
++++ b/libs/json/luasrc/json.lua
+@@ -205,11 +205,13 @@ function Encoder.parse_iter(self, obj)
+ 		local first = true
+ 
+ 		for key, entry in pairs(obj) do
+-			first = first or self:put(",")
+-			first = first and false
+-			self:parse_string(tostring(key))
+-			self:put(":")
+-			self:dispatch(entry)
++			if key ~= null then
++				first = first or self:put(",")
++				first = first and false
++				self:parse_string(tostring(key))
++				self:put(":")
++				self:dispatch(entry)
++			end
+ 		end
+ 
+ 		self:put("}")
-- 
GitLab