ソースを参照

Merge branch 'candidate-5.0.4' into candidate-5.2.0

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>

Conflicts:
	version.cmake
Richard Chapman 10 年 前
コミット
372053038e

+ 2 - 2
docs/ECLLanguageReference/ECLR_mods/Recrd-DICTIONARY.xml

@@ -98,8 +98,8 @@ CodeColorDCT  := DICTIONARY(ColorCodes,{Code =&gt; Color});
 MapCode2Color(UNSIGNED1 code) := CodeColorDCT[code].color;
 MapColor2Code(STRING color)   := ColorCodeDCT[color].code;
 
-OUTPUT(MapColor2Code('Red'));     //true
-OUTPUT(MapCode2Color(4));         //true
+OUTPUT(MapColor2Code('Red'));     //2
+OUTPUT(MapCode2Color(4));         //'Yellow'
 
 //Search term examples
 OUTPUT('Green' IN ColorCodeDCT);  //true

+ 2 - 2
docs/Installing_and_RunningTheHPCCPlatform/Inst-Mods/hpcc_ldap.xml

@@ -60,7 +60,7 @@
 
         <listitem>
           <para>Verify that they are stopped. You can use a single command,
-          such as : <programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init status</programlisting></para>
+          such as : <programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init status</programlisting></para>
         </listitem>
 
         <listitem>
@@ -223,7 +223,7 @@
 
         <listitem>
           <para>Verify that they are stopped. You can use a single command,
-          such as : <programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init status</programlisting></para>
+          such as : <programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init status</programlisting></para>
         </listitem>
 
         <listitem>

+ 2 - 2
docs/Installing_and_RunningTheHPCCPlatform/Inst-Mods/ssl-esp.xml

@@ -343,7 +343,7 @@ sudo cp server.key /var/lib/HPCCSystems/myesp/privatekey.cer
         <para>Back up the original environment.xml file</para>
 
         <programlisting># for example
-sudo -u hpcc cp /etc/HPCCSystems/environment.xml /etc/HPCCSystems/environment.bak
+sudo cp /etc/HPCCSystems/environment.xml /etc/HPCCSystems/environment.bak
 </programlisting>
 
         <para>Note: the "live" environment.xml file is located in your
@@ -359,7 +359,7 @@ sudo -u hpcc cp /etc/HPCCSystems/environment.xml /etc/HPCCSystems/environment.ba
         the /etc/HPCCSystems and rename the file to environment.xml</para>
 
         <programlisting># for example
-sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml
+sudo cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml
 </programlisting>
       </listitem>
 

+ 13 - 15
docs/Installing_and_RunningTheHPCCPlatform/Installing_and_RunningTheHPCCPlatform.xml

@@ -27,7 +27,7 @@
       message.</para>
 
       <para>LexisNexis and the Knowledge Burst logo are registered trademarks
-      of Reed Elsevier Properties Inc., used under license. </para>
+      of Reed Elsevier Properties Inc., used under license.</para>
 
       <para>HPCC Systems is a registered trademark of LexisNexis Risk Data
       Management Inc.</para>
@@ -1562,7 +1562,7 @@
             environment.xml</para>
 
             <programlisting># for example
-sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml</programlisting>
+sudo cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/environment.xml</programlisting>
 
             <para><informaltable colsep="1" frame="all" rowsep="1">
                 <?dbfo keep-together="always"?>
@@ -1581,9 +1581,7 @@ sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/envi
                       write file(s) to the destination directory before
                       attempting to copy. If prompted to overwrite the
                       destination file, you should answer <emphasis
-                      role="bold">yes</emphasis>. The environment.xml file
-                      MUST be owned by the <emphasis
-                      role="bold">hpcc</emphasis> user.</entry>
+                      role="bold">yes</emphasis>. </entry>
                     </row>
                   </tbody>
                 </tgroup>
@@ -1617,7 +1615,7 @@ sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/envi
             all nodes. A sample script is provided with HPCC. The following
             command copies the XML files out to all nodes as required:</para>
 
-            <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-push.sh &lt;sourcefile&gt; &lt;destinationfile&gt;
+            <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-push.sh &lt;sourcefile&gt; &lt;destinationfile&gt;
 </programlisting>See the appendix for more information on using this
             script.</para>
           </listitem>
@@ -1660,7 +1658,7 @@ sudo -u hpcc cp /etc/HPCCSystems/source/NewEnvironment.xml /etc/HPCCSystems/envi
                     <entry><para>You may want to create a script to push this
                     command out to every node. A sample script is provided
                     with HPCC. Use the following command to start HPCC on all
-                    nodes:</para><para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start</programlisting></para></entry>
+                    nodes:</para><para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start</programlisting></para></entry>
                   </row>
                 </tbody>
               </tgroup>
@@ -2883,11 +2881,11 @@ OUTPUT(ValidWords)
         <para>The IP addresses were defined when editing the environment in
         ConfigMgr.</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-push.sh &lt;sourcefile&gt; &lt;destinationfile&gt;
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-push.sh &lt;sourcefile&gt; &lt;destinationfile&gt;
 </programlisting>For example:</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-push.sh \
-             /etc/HPCCSystems/environment.xml /etc/HPCCSystems/environment.xml
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-push.sh \
+     /etc/HPCCSystems/environment.xml /etc/HPCCSystems/environment.xml
 </programlisting></para>
       </sect2>
 
@@ -2958,24 +2956,24 @@ OUTPUT(ValidWords)
 
         <para>This example starts all components on the nodes</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start
 </programlisting></para>
 
         <para>This example starts all components on all the nodes, using 8
         concurrent executions</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start -n 8
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a hpcc-init start -n 8
 </programlisting>This example starts all components of the esp type on the
         nodes</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -c esp -a hpcc-init start 
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -c esp -a hpcc-init start 
 </programlisting>This example starts all components with a component name
         myesp on the nodes</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -c myesp -a hpcc-init start 
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -c myesp -a hpcc-init start 
 </programlisting>This example starts the dafilesrv helper application</para>
 
-        <para><programlisting>sudo -u hpcc /opt/HPCCSystems/sbin/hpcc-run.sh -a dafilesrv start
+        <para><programlisting>sudo /opt/HPCCSystems/sbin/hpcc-run.sh -a dafilesrv start
 </programlisting></para>
       </sect2>
     </sect1>

+ 11 - 4
ecl/eclccserver/vchooks/git.sh

@@ -19,7 +19,7 @@
 # Hook to use a git repository for eclcc compilation
 # Files will be fetched from the remote repo before each compile
 #
-# This hook expecte environment variables to be set as follows:
+# This hook expects environment variables to be set as follows:
 # GIT_URL       - The remote repository location
 # GIT_BRANCH    - The branch/commit/tag to use  (if ommitted, master is assumed)
 # GIT_DIRECTORY - can be set to allow the dir to be maintained separately - it is
@@ -143,7 +143,14 @@ for repo in ${repositories[@]} ; do
 done
 
 cd $originalDir
-if [ -n "$GIT_VERBOSE" ]; then
+if [ -n "$IS_ECLSERVER" ]; then
+  if [ -n "$GIT_VERBOSE" ]; then
+    echo GIT: returning settings $GIT_INCLUDE_PATH 1>&2
+  fi
+  echo $GIT_INCLUDE_PATH
+else
+  if [ -n "$GIT_VERBOSE" ]; then
     echo GIT: calling eclcc $GIT_INCLUDE_PATH "$@"  1>&2
-fi
-eclcc $GIT_INCLUDE_PATH "$@"
+  fi
+  eclcc $GIT_INCLUDE_PATH "$@"
+fi

+ 1 - 0
ecl/hql/hqlgram.hpp

@@ -646,6 +646,7 @@ public:
     void addDatasetField(const attribute &errpos, IIdAtom * name, ITypeInfo * type, IHqlExpression *value, IHqlExpression * attrs);
     void addDictionaryField(const attribute &errpos, IIdAtom * name, ITypeInfo * type, IHqlExpression *value, IHqlExpression * attrs);
     void addField(const attribute &errpos, IIdAtom * name, ITypeInfo *type, IHqlExpression *value, IHqlExpression *attrs);
+    void addFieldFromValue(const attribute &errpos, attribute & valueAttr);
     void addFields(const attribute &errpos, IHqlExpression *record, IHqlExpression * dataset, bool clone);
     void addIfBlockToActive(const attribute &errpos, IHqlExpression * ifblock);
     void addToActiveRecord(IHqlExpression * newField);

+ 23 - 35
ecl/hql/hqlgram.y

@@ -4241,15 +4241,11 @@ fieldDefs
 
 fieldDef
     : expression        {
-                            parser->normalizeExpression($1);
-                            IHqlExpression *value = $1.getExpr();
-
-                            IIdAtom * name = parser->createFieldNameFromExpr(value);
-
-                            IHqlExpression * attrs = extractAttrsFromExpr(value);
-
-                            ITypeInfo * type = value->queryType();
-                            parser->addField($1, name, LINK(type), value, attrs);
+                            parser->addFieldFromValue($1, $1);
+                            $$.clear();
+                        }
+    | DATASET '(' dataSet ')' {
+                            parser->addFieldFromValue($1, $3);
                             $$.clear();
                         }
     | VALUE_ID_REF      {
@@ -4313,7 +4309,7 @@ fieldDef
                             parser->addField($1, $1.getId(), makeRowType(LINK(value->queryRecordType())), value, attrs);
                             $$.clear();
                         }
-    | typeDef knownOrUnknownId optFieldAttrs defaultValue
+    | typeDef knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             IHqlExpression *value = $4.getExpr();
@@ -4324,7 +4320,7 @@ fieldDef
                                 type.setown(makeRowType(type.getClear()));
                             parser->addField($2, $2.getId(), type.getClear(), value, $3.getExpr());
                         }
-    | ANY knownOrUnknownId optFieldAttrs defaultValue
+    | ANY knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             IHqlExpression *value = $4.getExpr();
@@ -4333,7 +4329,7 @@ fieldDef
                             OwnedITypeInfo type = makeAnyType();
                             parser->addField($2, $2.getId(), type.getClear(), value, $3.getExpr());
                         }
-    | typeDef knownOrUnknownId '[' expression ']' optFieldAttrs defaultValue
+    | typeDef knownOrUnknownId '[' expression ']' optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             parser->normalizeExpression($4, type_int, false);
@@ -4353,7 +4349,7 @@ fieldDef
                             Owned<ITypeInfo> datasetType = makeTableType(makeRowType(createRecordType(record)));
                             parser->addDatasetField($2, $2.getId(), datasetType, value, attrs.getClear());
                         }
-    | setType knownOrUnknownId optFieldAttrs defaultValue
+    | setType knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             IHqlExpression *value = $4.getExpr();
@@ -4361,7 +4357,7 @@ fieldDef
                             ITypeInfo *type = $1.getType();
                             parser->addField($2, $2.getId(), type, value, $3.getExpr());
                         }
-    | explicitDatasetType knownOrUnknownId optFieldAttrs defaultValue
+    | explicitDatasetType knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             Owned<ITypeInfo> type = $1.getType();
@@ -4373,7 +4369,7 @@ fieldDef
                             parser->addDatasetField($1, $1.getId(), NULL, value, $2.getExpr());
                             $$.clear();
                         }
-    | explicitDictionaryType knownOrUnknownId optFieldAttrs defaultValue
+    | explicitDictionaryType knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             Owned<ITypeInfo> type = $1.getType();
@@ -4385,7 +4381,7 @@ fieldDef
                             parser->addDictionaryField($1, $1.getId(), value->queryType(), value, $2.getExpr());
                             $$.clear();
                         }
-    | alienTypeInstance knownOrUnknownId optFieldAttrs defaultValue
+    | alienTypeInstance knownOrUnknownId optFieldAttrs optDefaultValue
                         {
                             $$.clear($1);
                             parser->addField($2, $2.getId(), $1.getType(), $4.getExpr(), $3.getExpr());
@@ -4398,15 +4394,7 @@ fieldDef
                             $$.clear();
                         }
     | dictionary        {
-                            parser->normalizeExpression($1);
-                            IHqlExpression *value = $1.getExpr();
-
-                            IIdAtom * name = parser->createFieldNameFromExpr(value);
-
-                            IHqlExpression * attrs = extractAttrsFromExpr(value);
-
-                            ITypeInfo * type = value->queryType();
-                            parser->addField($1, name, LINK(type), value, attrs);
+                            parser->addFieldFromValue($1, $1);
                             $$.clear();
                         }
     | dataSet               {
@@ -4414,12 +4402,8 @@ fieldDef
                             parser->addFields($1, e->queryRecord(), e, true);
                             $$.clear();
                         }
-    | dataRow               {
-                            IHqlExpression *e = $1.getExpr();
-                            IHqlExpression * attrs = extractAttrsFromExpr(e);
-                            IIdAtom * name = parser->createFieldNameFromExpr(e);
-                            parser->addField($1, name, makeRowType(LINK(e->queryRecordType())), e, attrs);
-                            //e->Release();
+    | dataRow           {
+                            parser->addFieldFromValue($1, $1);
                             $$.clear();
                         }
     | ifblock
@@ -4611,6 +4595,14 @@ optParams
     |                   {   $$.setNullExpr();   }
     ;
 
+optDefaultValue
+    : defaultValue
+    |                       
+                        {
+                            $$.setNullExpr();
+                        }
+    ;
+    
 defaultValue
     : ASSIGN expression 
                         {
@@ -4633,10 +4625,6 @@ defaultValue
                         {
                             $$.inherit($2);
                         }
-    |                       
-                        {
-                            $$.setNullExpr();
-                        }
     ;
 
 setType

+ 14 - 0
ecl/hql/hqlgram2.cpp

@@ -2586,6 +2586,20 @@ void HqlGram::addDictionaryField(const attribute &errpos, IIdAtom * name, ITypeI
     addToActiveRecord(newField);
 }
 
+void HqlGram::addFieldFromValue(const attribute &errpos, attribute & valueAttr)
+{
+    normalizeExpression(valueAttr);
+    IHqlExpression *value = valueAttr.getExpr();
+
+    IIdAtom * name = createFieldNameFromExpr(value);
+    IHqlExpression * attrs = extractAttrsFromExpr(value);
+
+    if (value->isDataset())
+        addDatasetField(errpos, name, NULL, value, attrs);
+    else
+        addField(errpos, name, value->getType(), value, attrs);
+}
+
 void HqlGram::addIfBlockToActive(const attribute &errpos, IHqlExpression * ifblock)
 {
     activeRecords.tos().addOperand(LINK(ifblock));

+ 3 - 3
ecl/regress/indexcrc.ecl

@@ -61,9 +61,9 @@ ds1 := DATASET('crcbug1.d00', {prec, UNSIGNED8 fp{virtual(fileposition)}}, FLAT)
 ds2 := DATASET('crcbug2.d00', {prec_combined, UNSIGNED8 fp{virtual(fileposition)}}, FLAT);
 ds3 := DATASET('crcbug3.d00', {prec_mod, UNSIGNED8 fp{virtual(fileposition)}}, FLAT);
 
-idx1 := INDEX(ds1, {i}, {DATASET chld := chld, fp}, 'crcbug1.idx');
-idx2 := INDEX(ds2, {i}, {DATASET chld := chld, fp}, 'crcbug2.idx');
-idx3 := INDEX(ds3, {i}, {DATASET chld := chld, fp}, 'crcbug3.idx');
+idx1 := INDEX(ds1, {i}, { DATASET(chld), fp}, 'crcbug1.idx');
+idx2 := INDEX(ds2, {i}, { DATASET(chld), fp}, 'crcbug2.idx');
+idx3 := INDEX(ds3, {i}, { DATASET chld := chld, fp}, 'crcbug3.idx');
 
 SEQUENTIAL(
     OUTPUT(baseds, , 'crcbug1.d00', OVERWRITE),

+ 59 - 0
esp/src/eclwatch/FileBelongsToWidget.js

@@ -0,0 +1,59 @@
+/*##############################################################################
+#    HPCC SYSTEMS software Copyright (C) 2012 HPCC Systems.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+############################################################################## */
+define([
+    "dojo/_base/declare",
+    "dojo/i18n",
+    "dojo/i18n!./nls/hpcc",
+
+    "hpcc/GridDetailsWidget",
+    "hpcc/ESPLogicalFile",
+    "hpcc/ESPUtil"
+
+], function (declare, i18n, nlsHPCC,
+                GridDetailsWidget, ESPLogicalFile, ESPUtil) {
+    return declare("FileBelongsToWidget", [GridDetailsWidget], {
+        i18n: nlsHPCC,
+        logicalFile: null,
+
+        gridTitle: nlsHPCC.SuperFilesBelongsTo,
+        idProperty: "Name",
+
+        init: function (params) {
+            if (this.inherited(arguments))
+                return;
+            this.logicalFile = ESPLogicalFile.Get(params.NodeGroup, params.Name);
+            this.refreshGrid();
+        },
+
+        createGrid: function (domID) {
+            var retVal = new declare([ESPUtil.Grid(false, true)])({
+                store: this.store,
+                columns: {
+                    Name: { label: this.i18n.Name }
+                }
+            }, domID);
+            return retVal;
+        },
+
+        refreshGrid: function (args) {
+            var context = this;
+            if (this.logicalFile.Superfiles.DFULogicalFile) {
+                context.store.setData(this.logicalFile.Superfiles.DFULogicalFile);
+                context.grid.refresh();
+            }
+        }
+    });
+});

+ 12 - 2
esp/src/eclwatch/LFDetailsWidget.js

@@ -44,6 +44,7 @@ define([
     "hpcc/TargetSelectWidget",
     "hpcc/ESPLogicalFile",
     "hpcc/ESPDFUWorkunit",
+    "hpcc/FileBelongsToWidget",
 
     "dojo/text!../templates/LFDetailsWidget.html",
 
@@ -57,7 +58,7 @@ define([
 
 ], function (exports, declare, lang, i18n, nlsHPCC, arrayUtil, dom, domAttr, domClass, domForm, query,
                 BorderContainer, TabContainer, ContentPane, Toolbar, TooltipDialog, Form, SimpleTextarea, TextBox, Button, DropDownButton, TitlePane, registry,
-                _TabContainerWidget, DelayLoadWidget, TargetSelectWidget, ESPLogicalFile, ESPDFUWorkunit,
+                _TabContainerWidget, DelayLoadWidget, TargetSelectWidget, ESPLogicalFile, ESPDFUWorkunit, FileBelongsToWidget,
                 template) {
     exports.fixCircularDependency = declare("LFDetailsWidget", [_TabContainerWidget], {
         templateString: template,
@@ -77,6 +78,7 @@ define([
         filePartsWidget: null,
         workunitWidget: null,
         dfuWorkunitWidget: null,
+        fileBelongsTo: null,
 
         logicalFile: null,
         prevState: "",
@@ -96,6 +98,7 @@ define([
             this.dfuWorkunitWidget = registry.byId(this.id + "_DFUWorkunit");
             this.copyTargetSelect = registry.byId(this.id + "CopyTargetSelect");
             this.desprayTargetSelect = registry.byId(this.id + "DesprayTargetSelect");
+            this.fileBelongsToWidget = registry.byId(this.id + "_FileBelongs");
         },
 
         //  Hitched actions  ---
@@ -241,7 +244,12 @@ define([
                     this.dfuWorkunitWidget.init({
                         Wuid: this.logicalFile.Wuid
                     });
-                } else {
+                } else if (currSel.id == this.fileBelongsToWidget.id) {
+                    this.fileBelongsToWidget.init({
+                        NodeGroup: this.logicalFile.NodeGroup,
+                        Name: this.logicalFile.Name
+                    });
+                 } else {
                     currSel.init(currSel.params);
                 }
             }
@@ -299,6 +307,8 @@ define([
                 domClass.remove(this.id + "StateIdImage");
                 domClass.add(this.id + "StateIdImage", this.logicalFile.getStateIconClass());
                 this.refreshActionState();
+            } else if (name === "Superfiles") {
+                this.setDisabled(this.id + "_FileBelongs", false);
             }
         },
 

+ 2 - 0
esp/src/eclwatch/nls/hpcc.js

@@ -441,8 +441,10 @@ define({root:
     Summary: "Summary",
     SummaryMessage: "Summary Message",
     Superfile: "Superfile",
+    Superfiles: "Superfiles",
     SuperFile: "Super File",
     SuperFiles: "Super Files",
+    SuperFilesBelongsTo: "Member of Superfile(s)",
     SuperfilesOnly: "Superfiles Only",
     Suspend: "Suspend",
     Suspended: "Suspended",

+ 2 - 0
esp/src/eclwatch/templates/LFDetailsWidget.html

@@ -158,6 +158,8 @@
             </div>
             <div id="${id}_XML" title="${i18n.XML}" data-dojo-props="delayProps: {WUXml: true}, delayWidget: 'ECLSourceWidget', disabled: true" data-dojo-type="DelayLoadWidget">
             </div>
+            <div id="${id}_FileBelongs" title="${i18n.Superfiles}" data-dojo-props="delayWidget: 'FileBelongsToWidget', disabled: true" data-dojo-type="DelayLoadWidget">
+            </div>
             <div id="${id}_FileParts" title="${i18n.FileParts}" data-dojo-props="delayWidget: 'FilePartsWidget'" data-dojo-type="DelayLoadWidget">
             </div>
             <div id="${id}_Queries" title="${i18n.Queries}" data-dojo-props="delayWidget: 'QuerySetQueryWidget', iconClass:'iconFind'" data-dojo-type="DelayLoadWidget">

+ 1 - 0
plugins/pyembed/pyembed.cpp

@@ -381,6 +381,7 @@ PyObject *PythonThreadContext::compileEmbeddedScript(size32_t lenChars, const ch
     if (!prevtext || strcmp(text, prevtext) != 0)
     {
         prevtext.clear();
+        text.stripChar('\r');
         script.setown(globalState.compileScript(text));
         prevtext.set(utf, bytes);
     }