From 2c44bc1768886d9b9693e484db37b971fc9917dd Mon Sep 17 00:00:00 2001
From: Robin McCorkell <rmccorkell@karoshi.org.uk>
Date: Mon, 5 Jan 2015 15:48:04 +0000
Subject: [PATCH] Fix JS asset generation

At some point SeparatorFilter should be included upstream
(kriswallsmith/assetic), then lib/private/assetic/separatorfilter.php can be
removed and the `use` in lib/private/templatelayout.php rewritten.

SeparatorFilter inserts a separator between assets, preventing issues when
files are incorrectly terminated. For JS this is a semicolon.
---
 lib/private/assetic/separatorfilter.php | 57 +++++++++++++++++++++++++
 lib/private/templatelayout.php          |  8 +++-
 2 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 lib/private/assetic/separatorfilter.php

diff --git a/lib/private/assetic/separatorfilter.php b/lib/private/assetic/separatorfilter.php
new file mode 100644
index 0000000000..fb1a4e7f00
--- /dev/null
+++ b/lib/private/assetic/separatorfilter.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * ownCloud
+ *
+ * Copyright (C) 2014 Robin McCorkell <rmccorkell@karoshi.org.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Assetic;
+
+use Assetic\Filter\FilterInterface;
+use Assetic\Asset\AssetInterface;
+
+/**
+ * Inserts a separator between assets to prevent merge failures
+ * e.g. missing semicolon at the end of a JS file
+ */
+class SeparatorFilter implements FilterInterface
+{
+    /**
+     * @var string
+     */
+    private $separator;
+
+    /**
+     * Constructor.
+     *
+     * @param string $separator Separator to use between assets
+     */
+    public function __construct($separator = ';')
+    {
+        $this->separator = $separator;
+    }
+
+    public function filterLoad(AssetInterface $asset)
+    {
+    }
+
+    public function filterDump(AssetInterface $asset)
+    {
+        $asset->setContent($asset->getContent() . $this->separator);
+    }
+}
diff --git a/lib/private/templatelayout.php b/lib/private/templatelayout.php
index fa025721e5..44c997c321 100644
--- a/lib/private/templatelayout.php
+++ b/lib/private/templatelayout.php
@@ -6,6 +6,7 @@ use Assetic\Filter\CssImportFilter;
 use Assetic\Filter\CssMinFilter;
 use Assetic\Filter\CssRewriteFilter;
 use Assetic\Filter\JSMinFilter;
+use OC\Assetic\SeparatorFilter; // waiting on upstream
 
 /**
  * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
@@ -163,10 +164,13 @@ class OC_TemplateLayout extends OC_Template {
 				$file = $item[2];
 				// no need to minifiy minified files
 				if (substr($file, -strlen('.min.js')) === '.min.js') {
-					return new FileAsset($root . '/' . $file, array(), $root, $file);
+					return new FileAsset($root . '/' . $file, array(
+						new SeparatorFilter(';')
+					), $root, $file);
 				}
 				return new FileAsset($root . '/' . $file, array(
-					new JSMinFilter()
+					new JSMinFilter(),
+					new SeparatorFilter(';')
 				), $root, $file);
 			}, $jsFiles);
 			$jsCollection = new AssetCollection($jsFiles);
-- 
GitLab