Add formatVersion attribute to configuration.xml so as to detect the format change...
authorHiroshi Inoue <inoue@tpf.co.jp>
Thu, 21 Nov 2013 00:08:47 +0000 (09:08 +0900)
committerHiroshi Inoue <inoue@tpf.co.jp>
Fri, 22 Nov 2013 07:03:31 +0000 (16:03 +0900)
winbuild/configuration.ps1
winbuild/configuration_template.xml

index 48efd9305222dd0c86f8d92efa03f640936fc0e3..be8c5946837920b88223a131676844f2f016e3ec 100755 (executable)
@@ -1,6 +1,6 @@
 function InitConfiguration
 {
-   $configInfo = [xml](Get-Content "$scriptPath\configuration_template.xml")
+   $configInfo = [xml](Get-Content "$configTempPath")
    if ($env:PROCESSOR_ARCHITECTURE -eq "x86")
    {
        $x64info = $configInfo.Configuration.x64
@@ -13,7 +13,20 @@ function InitConfiguration
 
 function global:GetConfiguration
 {
-   Return  [xml] (Get-Content "$configPath")
+   $configInfo =  [xml] (Get-Content "$configPath")
+   set-variable -name xmlFormatVersion -value "0.1" -option constant
+   if ($configInfo.Configuration.formatVersion -ne $xmlFormatVersion)
+   {
+           $xmlDoc2 = [xml](Get-Content "$configTempPath")
+           $root2 = $XmlDoc2.get_DocumentElement() 
+           $root1 = $configInfo.get_DocumentElement() 
+           unifyNodes $root1 $root2
+
+       $root1.formatVersion = $xmlFormatVersion
+               $configInfo.save("$configPath")
+   }
+
+   return $configInfo
 }
 
 function global:SaveConfiguration
@@ -21,9 +34,48 @@ function global:SaveConfiguration
    $configInfo.save("$configPath")
 }
 
+function unifyNodes($node1, $node2)
+{
+    $attributes2 = $node2.get_Attributes()
+    if ($attributes2.Count -gt 0)
+    {
+        $attributes1 = $node1.get_Attributes()
+        foreach ($attrib in $attributes2)
+        {
+            $attribname = $attrib.name
+            if (($attributes1.Count -eq 0) -or ($attributes1.GetNamedItem($attribname) -eq $null))
+            {
+                Write-Debug " Adding attribute=$attribname"
+                $addattr = $node1.OwnerDocument.ImportNode($attrib, $true)
+                $added = $attributes1.Append($addattr)
+            }
+        }
+    }
+    if (!$node2.get_HasChildNodes()) {
+        return;
+    }
+    foreach ($child2 in $node2.get_ChildNodes())
+    {
+        $nodename = $child2.get_Name()
+        if ($nodename -eq "#text"){
+            continue
+        }
+        $matchnode = $node1.SelectSingleNode($nodename)
+        if ($matchnode -eq $null)
+        {
+                Write-Debug "Adding node=$nodename"
+                $addnode = $node1.OwnerDocument.ImportNode($child2, $true)
+                $added = $node1.AppendChild($addnode)
+                continue
+        }
+        unifyNodes $matchnode $child2
+    }
+}
+
 $LIBPQ_VERSION="9.3"
 $scriptPath = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)
 $configPath = "$scriptPath\configuration.xml"
+$configTempPath = "$scriptPath\configuration_template.xml"
 if (!(Test-Path -path $configPath))
 {
    InitConfiguration
index 4cc59b1008872597d0a5ae96ea220b8ae98c044e..924779e7a0a2bbfd36f3ce05ee41a33e9117663f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<Configuration version="09.03.0100">
+<Configuration version="09.03.0100" formatVersion="0.1">
   <x86 disabled="no" use_libpq="yes" use_sspi="no" use_gss="no">
     <libpq version="">
       <include>default</include>