OSDN Git Service

アセンブリバージョンを 1.3.4 に変更
[applistation/AppliStation.git] / archive-inst / Program.cs
index 0014ba7..934a584 100644 (file)
@@ -24,13 +24,6 @@ namespace ArchiveInstall
                \r
                private static void install(string fakeTargetDir, string targetDir)\r
                {\r
-                       string installSrc = fakeTargetDir;\r
-                       \r
-                       if (Directory.GetFiles(installSrc).Length == 0 &&\r
-                           Directory.GetDirectories(installSrc).Length == 1) {\r
-                               installSrc = Directory.GetDirectories(installSrc)[0];\r
-                       }\r
-                       \r
                        // ハッシュ比較\r
                        if (Directory.Exists(targetDir)) {\r
                                InstalledFileList list = null;\r
@@ -42,7 +35,7 @@ namespace ArchiveInstall
                                        // 変更されたファイル(設定ファイル)をキープする処理\r
                                        foreach (InstalledFile changedFile in list.Verify(targetDir)) {\r
                                                string changedFilePath = Path.Combine(targetDir, changedFile.Path);\r
-                                               string toBeChangedFilePath = Path.Combine(installSrc, changedFile.Path);\r
+                                               string toBeChangedFilePath = Path.Combine(fakeTargetDir, changedFile.Path);\r
                                                \r
                                                // 新規のファイルは退避させる\r
                                                if (File.Exists(toBeChangedFilePath)) {\r
@@ -50,20 +43,22 @@ namespace ArchiveInstall
                                                }\r
                                                \r
                                                // 変更済みファイルをinstallSrcの方に反映させる\r
-                                               if (! Directory.Exists(Path.GetDirectoryName(toBeChangedFilePath))) {\r
-                                                       // フォルダがない場合は作る\r
-                                                       Directory.CreateDirectory(Path.GetDirectoryName(toBeChangedFilePath));\r
+                                               if (File.Exists(changedFilePath)) {\r
+                                                       if (! Directory.Exists(Path.GetDirectoryName(toBeChangedFilePath))) {\r
+                                                               // フォルダーがない場合は作る\r
+                                                               Directory.CreateDirectory(Path.GetDirectoryName(toBeChangedFilePath));\r
+                                                       }\r
+                                                       File.Copy(changedFilePath, toBeChangedFilePath);\r
                                                }\r
-                                               File.Copy(changedFilePath, toBeChangedFilePath);\r
                                        }\r
                                }\r
                        } else {\r
                                Directory.CreateDirectory(targetDir);\r
                        }\r
                        \r
-                       // まずはフォルダツリーを作成\r
-                       foreach (string dir in Directory.GetDirectories(installSrc, "*", SearchOption.AllDirectories)) {\r
-                               string dirPath = NaGet.Utils.GetRelativePath(installSrc, dir);\r
+                       // ã\81¾ã\81\9aã\81¯ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\83\84ã\83ªã\83¼ã\82\92ä½\9cæ\88\90\r
+                       foreach (string dir in Directory.GetDirectories(fakeTargetDir, "*", SearchOption.AllDirectories)) {\r
+                               string dirPath = NaGet.Utils.GetRelativePath(fakeTargetDir, dir);\r
                                string targetDirPath = Path.Combine(targetDir, dirPath);\r
                                if (! Directory.Exists(targetDirPath)) {\r
                                        Directory.CreateDirectory(targetDirPath);\r
@@ -71,34 +66,38 @@ namespace ArchiveInstall
                        }\r
                        \r
                        // ファイルをインストール(高速化のため移動)\r
-                       foreach (string file in Directory.GetFiles(installSrc, "*", SearchOption.AllDirectories)) {\r
-                               string filePath = NaGet.Utils.GetRelativePath(installSrc, file);\r
+                       foreach (string file in Directory.GetFiles(fakeTargetDir, "*", SearchOption.AllDirectories)) {\r
+                               string filePath = NaGet.Utils.GetRelativePath(fakeTargetDir, file);\r
                                string targetFilePath = Path.Combine(targetDir, filePath);\r
                                if (File.Exists(targetFilePath)) {\r
-                                       File.Delete(targetFilePath);\r
+                                       try {\r
+                                               File.SetAttributes(targetFilePath, FileAttributes.Normal);\r
+                                               File.Delete(targetFilePath);\r
+                                       } catch (UnauthorizedAccessException e) {\r
+                                               throw new IOException(string.Format("Access denied '{0}'", targetFilePath), e);\r
+                                       }\r
                                }\r
                                File.Move(file, targetFilePath);\r
                        }\r
                }\r
                \r
-               private static void postInstall(string targetDir, Package package)\r
+               private static void _installDllTo(string sys32path, string srcDir, Package package)\r
                {\r
-                       // SYSTEM32へのコピーの実行\r
                        if (!string.IsNullOrEmpty(package.System32CopyFiles)) {\r
-                               if (! Directory.Exists(NaGet.Env.ArchiveSystem32)) {\r
-                                       Directory.CreateDirectory(NaGet.Env.ArchiveSystem32);\r
+                               if (! Directory.Exists(sys32path)) {\r
+                                       Directory.CreateDirectory(sys32path);\r
                                }\r
                                \r
-                               string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
+                               string logfile = Path.Combine(sys32path, ".applistation.install."+package.Name+".log");\r
                                if (File.Exists(logfile)) {\r
                                        File.SetAttributes(logfile, FileAttributes.Normal);\r
                                }\r
                                using (FileStream fs = new FileStream(logfile, FileMode.Create))\r
                                using (StreamWriter sw = new StreamWriter(fs)){\r
                                        foreach (string pathpat in package.System32CopyFiles.Split(';')) {\r
-                                               foreach (string path in NaGet.Utils.ExtendWildcardFile(targetDir, pathpat)) {\r
+                                               foreach (string path in NaGet.Utils.ExtendWildcardFile(srcDir, pathpat)) {\r
                                                        if ((File.GetAttributes(path) & FileAttributes.Directory) == 0) { // もしファイルならば\r
-                                                               string destPath = Path.Combine(NaGet.Env.ArchiveSystem32, Path.GetFileName(path));\r
+                                                               string destPath = Path.Combine(sys32path, Path.GetFileName(path));\r
                                                                File.Copy(path, destPath, true);\r
                                                                \r
                                                                sw.WriteLine(Path.GetFileName(destPath));\r
@@ -108,6 +107,12 @@ namespace ArchiveInstall
                                }\r
                                File.SetAttributes(logfile, FileAttributes.Hidden);\r
                        }\r
+               }\r
+               \r
+               private static void postInstall(string targetDir, Package package)\r
+               {\r
+                       // SYSTEM32へのコピーの実行\r
+                       _installDllTo(NaGet.Env.ArchiveSystem32, targetDir, package);\r
                        \r
                        // インストールスクリプトの実行\r
                        if (! string.IsNullOrEmpty(package.InstallScript) ) {\r
@@ -122,9 +127,9 @@ namespace ArchiveInstall
                                engine.BuildProject(proj, "Install");\r
                        }\r
                        \r
-                       // 直下のファイルで*.exeがGUIプログラムならプログラムフォルダに登録\r
+                       // ç\9b´ä¸\8bã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81§*.exeã\81\8cGUIã\83\97ã\83­ã\82°ã\83©ã\83 ã\81ªã\82\89ã\83\97ã\83­ã\82°ã\83©ã\83 ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81«ç\99»é\8c²\r
                        foreach (string exeFile in Directory.GetFiles(targetDir, "*.exe")) {\r
-                               if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI) {\r
+                               if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileType.WinGUI) {\r
                                        string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
                                        if (! Directory.Exists(progGrpPath)) Directory.CreateDirectory(progGrpPath);\r
                                        \r
@@ -182,6 +187,28 @@ namespace ArchiveInstall
                        File.SetAttributes(packageXmlFilePath, FileAttributes.Hidden | FileAttributes.ReadOnly);\r
                }\r
                \r
+               private static void _removeDllFrom(string sys32path, InstalledPackage package)\r
+               {\r
+                       if (! string.IsNullOrEmpty(package.System32CopyFiles) ) {\r
+                               string logfile = Path.Combine(sys32path, ".applistation.install."+package.Name+".log");\r
+                               \r
+                               if (File.Exists(logfile)) {\r
+                                       using (FileStream fs = new FileStream(logfile, FileMode.Open))\r
+                                       using (StreamReader sr = new StreamReader(fs)){\r
+                                               string fileName = sr.ReadLine().Trim();\r
+                                               string filePath = Path.Combine(sys32path, fileName);\r
+                                               \r
+                                               if (File.Exists(filePath)) {\r
+                                                       File.SetAttributes(filePath, FileAttributes.Normal);\r
+                                                       File.Delete(filePath);\r
+                                               }\r
+                                       }\r
+                                       File.SetAttributes(logfile, FileAttributes.Normal);\r
+                                       File.Delete(logfile);\r
+                               }\r
+                       }\r
+               }\r
+               \r
                private static void removePackage(InstalledPackage package, string targetDir)\r
                {\r
                        // アンインストールスクリプトの実行\r
@@ -197,7 +224,7 @@ namespace ArchiveInstall
                                engine.BuildProject(proj, "Uninstall");\r
                        }\r
                        \r
-                       // GUIプログラムでプログラムフォルダに登録しているのを解除\r
+                       // GUIã\83\97ã\83­ã\82°ã\83©ã\83 ã\81§ã\83\97ã\83­ã\82°ã\83©ã\83 ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81«ç\99»é\8c²ã\81\97ã\81¦ã\81\84ã\82\8bã\81®ã\82\92解é\99¤\r
                        string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
                        if (Directory.Exists(progGrpPath)) {\r
                                NaGet.Utils.SetAttributeRecursive(progGrpPath, FileAttributes.Normal);\r
@@ -205,27 +232,15 @@ namespace ArchiveInstall
                        }\r
                        \r
                        // SYSTEM32からの削除の実行\r
-                       if (! string.IsNullOrEmpty(package.System32CopyFiles) ) {\r
-                               string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
-                               \r
-                               if (File.Exists(logfile)) {\r
-                                       using (FileStream fs = new FileStream(logfile, FileMode.Open))\r
-                                       using (StreamReader sr = new StreamReader(fs)){\r
-                                               string fileName = sr.ReadLine().Trim();\r
-                                               string filePath = Path.Combine(NaGet.Env.ArchiveSystem32, fileName);\r
-                                               \r
-                                               if (File.Exists(filePath)) {\r
-                                                       File.SetAttributes(filePath, FileAttributes.Normal);\r
-                                                       File.Delete(filePath);\r
-                                               }\r
-                                       }\r
-                                       File.SetAttributes(logfile, FileAttributes.Normal);\r
-                                       File.Delete(logfile);\r
-                               }\r
-                       }\r
+                       _removeDllFrom(NaGet.Env.ArchiveSystem32, package);\r
                        \r
-                       NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);\r
-                       Directory.Delete(targetDir, true);\r
+                       try {\r
+                               NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);\r
+                               Directory.Delete(targetDir, true);\r
+                       } catch (UnauthorizedAccessException) {\r
+                               Console.Error.WriteLine("W: could not complete to delete '{0}': Permission denied", targetDir);\r
+                               Environment.Exit(1);\r
+                       }\r
                }\r
                \r
                private static void parseMainArguments(string[] args, out string arcFile, out string targetDir, out Package package)\r
@@ -318,20 +333,33 @@ namespace ArchiveInstall
                                                extract(arcFile, tempExtractDir);\r
                                        }\r
                                        \r
-                                       // STEP2. インストール\r
-                                       install(tempExtractDir, targetDir);\r
+                                       // インストールの元となるフォルダを決定する\r
+                                       string installSrc = tempExtractDir;\r
+                                       // 展開先のトップに唯一のフォルダーしかないのであれば、そのフォルダー内を基準とする\r
+                                       if (Directory.GetFiles(tempExtractDir).Length == 0 &&\r
+                                           Directory.GetDirectories(tempExtractDir).Length == 1) {\r
+                                               installSrc = Directory.GetDirectories(tempExtractDir)[0];\r
+                                       }\r
+                                       \r
+                                       // STEP2. インストール元フォルダでインストールファイルリストの作成\r
+                                       storeInstalledFileList(installSrc);\r
+                                       \r
+                                       // STEP3. インストール\r
+                                       install(installSrc, targetDir);\r
                                        \r
                                        if (package != null) {\r
-                                               // STEP3. カスタマイズ可能な後処理\r
+                                               // STEP4. カスタマイズ可能な後処理\r
                                                postInstall(targetDir, package);\r
                                                \r
-                                               // STEP4. パッケージ情報をインストール先(targetDir)に置く\r
-                                               storeInstalledFileList(targetDir);\r
+                                               // STEP5. パッケージ情報をインストール先(targetDir)に置く\r
                                                storePackageXml(package, targetDir);\r
                                        }\r
                                } catch (DllNotFoundException) {\r
                                        Console.Error.WriteLine("E: Does not exist archive dll for {0}", arcFile); // TODO\r
                                        Environment.Exit(10);\r
+                               } catch (IOException e) {\r
+                                       Console.Error.WriteLine("E: File I/O Error : {0}", e.Message);\r
+                                       Environment.Exit(1);\r
                                } finally {\r
                                        Directory.Delete(tempExtractDir, true);\r
                                }\r