aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoi@chromium.org <joi@chromium.org@7262f16d-afe8-6277-6482-052fa10e57b1>2013-02-01 16:09:46 +0000
committerjoi@chromium.org <joi@chromium.org@7262f16d-afe8-6277-6482-052fa10e57b1>2013-02-01 16:09:46 +0000
commit0fae8b05cb6f7d1995040d75313205d86945871e (patch)
tree8a649d167259c2c586e14d8b8540da61c98b158e
parent834f421e536722c36c18a89469f367eb28868068 (diff)
downloadgrit-0fae8b05cb6f7d1995040d75313205d86945871e.tar.gz
Make grit support my scenario of dynamic generation of an included file.
This makes it possible to pass an input file path using an environment (-E) variable that contains variables expanded at build time - e.g. $(out). This is made more complex by the fact the path looks like $(out)/something at the time we produce input file list, but is expanded to an absolute path at build time. To reliably support both scenarios, just add option to ignore the base dir. BUG=160424 Landing for phajdan@chromium.org, original patch https://codereview.chromium.org/12095081/ Review URL: https://codereview.chromium.org/12090119 git-svn-id: http://grit-i18n.googlecode.com/svn/trunk@107 7262f16d-afe8-6277-6482-052fa10e57b1
-rw-r--r--grit/node/include.py13
-rw-r--r--grit/node/include_unittest.py74
-rw-r--r--grit/test_suite_all.py2
3 files changed, 89 insertions, 0 deletions
diff --git a/grit/node/include.py b/grit/node/include.py
index 9d07aff..9c3685f 100644
--- a/grit/node/include.py
+++ b/grit/node/include.py
@@ -49,8 +49,21 @@ class IncludeNode(base.Node):
'flattenhtml': 'false',
'allowexternalscript': 'false',
'relativepath': 'false',
+ 'use_base_dir': 'true',
}
+ def GetInputPath(self):
+ # Do not mess with absolute paths, that would make them invalid.
+ if os.path.isabs(os.path.expandvars(self.attrs['file'])):
+ return self.attrs['file']
+
+ # We have no control over code that calles ToRealPath later, so convert
+ # the path to be relative against our basedir.
+ if self.attrs.get('use_base_dir', 'true') != 'true':
+ return os.path.relpath(self.attrs['file'], self.GetRoot().GetBaseDir())
+
+ return self.attrs['file']
+
def FileForLanguage(self, lang, output_dir):
"""Returns the file for the specified language. This allows us to return
different files for different language variants of the include file.
diff --git a/grit/node/include_unittest.py b/grit/node/include_unittest.py
new file mode 100644
index 0000000..e554428
--- /dev/null
+++ b/grit/node/include_unittest.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python
+# Copyright (c) 2013 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+'''Unit tests for include.IncludeNode'''
+
+import os
+import sys
+if __name__ == '__main__':
+ sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
+
+import os
+import StringIO
+import unittest
+
+from grit.node import misc
+from grit.node import include
+from grit.node import empty
+from grit import grd_reader
+from grit import util
+
+
+class IncludeNodeUnittest(unittest.TestCase):
+ def testGetPath(self):
+ root = misc.GritNode()
+ root.StartParsing(u'grit', None)
+ root.HandleAttribute(u'latest_public_release', u'0')
+ root.HandleAttribute(u'current_release', u'1')
+ root.HandleAttribute(u'base_dir', ur'..\resource')
+ release = misc.ReleaseNode()
+ release.StartParsing(u'release', root)
+ release.HandleAttribute(u'seq', u'1')
+ root.AddChild(release)
+ includes = empty.IncludesNode()
+ includes.StartParsing(u'includes', release)
+ release.AddChild(includes)
+ include_node = include.IncludeNode()
+ include_node.StartParsing(u'include', includes)
+ include_node.HandleAttribute(u'file', ur'flugel\kugel.pdf')
+ includes.AddChild(include_node)
+ root.EndParsing()
+
+ self.assertEqual(root.ToRealPath(include_node.GetInputPath()),
+ util.normpath(
+ os.path.join(ur'../resource', ur'flugel/kugel.pdf')))
+
+ def testGetPathNoBasedir(self):
+ root = misc.GritNode()
+ root.StartParsing(u'grit', None)
+ root.HandleAttribute(u'latest_public_release', u'0')
+ root.HandleAttribute(u'current_release', u'1')
+ root.HandleAttribute(u'base_dir', ur'..\resource')
+ release = misc.ReleaseNode()
+ release.StartParsing(u'release', root)
+ release.HandleAttribute(u'seq', u'1')
+ root.AddChild(release)
+ includes = empty.IncludesNode()
+ includes.StartParsing(u'includes', release)
+ release.AddChild(includes)
+ include_node = include.IncludeNode()
+ include_node.StartParsing(u'include', includes)
+ include_node.HandleAttribute(u'file', ur'flugel\kugel.pdf')
+ include_node.HandleAttribute(u'use_base_dir', u'false')
+ includes.AddChild(include_node)
+ root.EndParsing()
+
+ self.assertEqual(root.ToRealPath(include_node.GetInputPath()),
+ util.normpath(
+ os.path.join(ur'../', ur'flugel/kugel.pdf')))
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/grit/test_suite_all.py b/grit/test_suite_all.py
index 0234c42..3f5c978 100644
--- a/grit/test_suite_all.py
+++ b/grit/test_suite_all.py
@@ -60,6 +60,7 @@ class TestSuiteAll(unittest.TestSuite):
import grit.gather.txt_unittest
import grit.node.base_unittest
import grit.node.io_unittest
+ import grit.node.include_unittest
import grit.node.message_unittest
import grit.node.misc_unittest
import grit.node.structure_unittest #
@@ -122,6 +123,7 @@ class TestSuiteAll(unittest.TestSuite):
grit.gather.txt_unittest.TxtUnittest,
grit.node.base_unittest.NodeUnittest,
grit.node.io_unittest.FileNodeUnittest,
+ grit.node.include_unittest.IncludeNodeUnittest,
grit.node.message_unittest.MessageUnittest,
grit.node.misc_unittest.GritNodeUnittest,
grit.node.misc_unittest.IfNodeUnittest,