OSDN Git Service

na-get-lib,1.2.xまでサポートしていたテキストファイル形式の旧式レポジトリリストファイル(provider.list.txt)の対応コードを削除
[applistation/AppliStation.git] / archive-inst / Program.cs
index 1a44c1c..d191f39 100644 (file)
@@ -24,13 +24,6 @@ namespace ArchiveInstall
                \r
                private static void install(string fakeTargetDir, string targetDir)\r
                {\r
                \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
                        // ハッシュ比較\r
                        if (Directory.Exists(targetDir)) {\r
                                InstalledFileList list = null;\r
@@ -39,23 +32,33 @@ namespace ArchiveInstall
                                } catch {\r
                                }\r
                                if (list != null) {\r
                                } catch {\r
                                }\r
                                if (list != null) {\r
-                                       foreach (InstalledFile changedFile in list.Verify(targetDir)) { // 変更されたファイルたちを。。。\r
+                                       // 変更されたファイル(設定ファイル)をキープする処理\r
+                                       foreach (InstalledFile changedFile in list.Verify(targetDir)) {\r
                                                string changedFilePath = Path.Combine(targetDir, changedFile.Path);\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
+                                               // 新規のファイルは退避させる\r
                                                if (File.Exists(toBeChangedFilePath)) {\r
                                                if (File.Exists(toBeChangedFilePath)) {\r
-                                                       File.Move(toBeChangedFilePath, toBeChangedFilePath + ".newfile"); // 新規を退避させて\r
+                                                       File.Move(toBeChangedFilePath, toBeChangedFilePath + ".newfile");\r
+                                               }\r
+                                               \r
+                                               // 変更済みファイルをinstallSrcの方に反映させる\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
                                                }\r
-                                               File.Copy(changedFilePath, toBeChangedFilePath); // installSrcの方に反映させておく\r
                                        }\r
                                }\r
                        } else {\r
                                Directory.CreateDirectory(targetDir);\r
                        }\r
                        \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
                                string targetDirPath = Path.Combine(targetDir, dirPath);\r
                                if (! Directory.Exists(targetDirPath)) {\r
                                        Directory.CreateDirectory(targetDirPath);\r
@@ -63,11 +66,16 @@ namespace ArchiveInstall
                        }\r
                        \r
                        // ファイルをインストール(高速化のため移動)\r
                        }\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
                                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
                                File.Move(file, targetFilePath);\r
                        }\r
@@ -114,9 +122,9 @@ namespace ArchiveInstall
                                engine.BuildProject(proj, "Install");\r
                        }\r
                        \r
                                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
                        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
                                        string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
                                        if (! Directory.Exists(progGrpPath)) Directory.CreateDirectory(progGrpPath);\r
                                        \r
@@ -128,19 +136,13 @@ namespace ArchiveInstall
                                                //lnk.SetIconLocation(path, 0);\r
                                                \r
                                                // .lnk ファイル名\r
                                                //lnk.SetIconLocation(path, 0);\r
                                                \r
                                                // .lnk ファイル名\r
-                                               string lnkFileName;\r
-                                               System.Diagnostics.FileVersionInfo vInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(exeFile);\r
-                                               if (vInfo.ProductName != null && vInfo.ProductName != string.Empty\r
-                                                   && (!File.Exists(Path.Combine(progGrpPath, vInfo.ProductName+".lnk")))) {\r
-                                                       // 原則、lnkファイル名に製品名を採用\r
-                                                       lnkFileName = vInfo.ProductName;\r
-                                               } else {\r
-                                                       // そのほかの場合は、*.exeファイルの名前をそのまま使用\r
-                                                       lnkFileName = Path.GetFileNameWithoutExtension(exeFile);\r
+                                               string lnkFilePath = Path.Combine(progGrpPath, lnk.GetSuitableShellLinkNameFor() + ".lnk");\r
+                                               if (File.Exists(lnkFilePath)) { // ファイル名がかぶってしまったとき\r
+                                                       lnkFilePath = Path.Combine(progGrpPath, Path.GetFileNameWithoutExtension(exeFile) + ".lnk");\r
                                                }\r
                                                \r
                                                // 保存\r
                                                }\r
                                                \r
                                                // 保存\r
-                                               lnk.ToPersistFile().Save(Path.Combine(progGrpPath, lnkFileName+".lnk"), true);\r
+                                               lnk.ToPersistFile().Save(lnkFilePath, true);\r
                                        }\r
                                }\r
                        }\r
                                        }\r
                                }\r
                        }\r
@@ -195,7 +197,7 @@ namespace ArchiveInstall
                                engine.BuildProject(proj, "Uninstall");\r
                        }\r
                        \r
                                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
                        string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
                        if (Directory.Exists(progGrpPath)) {\r
                                NaGet.Utils.SetAttributeRecursive(progGrpPath, FileAttributes.Normal);\r
@@ -222,8 +224,13 @@ namespace ArchiveInstall
                                }\r
                        }\r
                        \r
                                }\r
                        }\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
                }\r
                \r
                private static void parseMainArguments(string[] args, out string arcFile, out string targetDir, out Package package)\r
@@ -289,6 +296,7 @@ namespace ArchiveInstall
                        string targetDir = null;\r
                        Package package = null;\r
                        \r
                        string targetDir = null;\r
                        Package package = null;\r
                        \r
+                       // 引数パースおよびヘルプ表示\r
                        try {\r
                                parseMainArguments(args, out arcFile, out targetDir, out package);\r
                        } catch (ArgumentException) {\r
                        try {\r
                                parseMainArguments(args, out arcFile, out targetDir, out package);\r
                        } catch (ArgumentException) {\r
@@ -299,25 +307,49 @@ namespace ArchiveInstall
                                Console.WriteLine("\t{0} -x PackageName\t\tUninstall", executeFileName);\r
                                Console.WriteLine();\r
                        }\r
                                Console.WriteLine("\t{0} -x PackageName\t\tUninstall", executeFileName);\r
                                Console.WriteLine();\r
                        }\r
-                                               \r
-                       if (arcFile != null) { // install or extract    \r
-                               string tempExtractDir = targetDir + "___temp___"; // HACK \r
+\r
+                       // インストールおよび展開処理\r
+                       if (arcFile != null) {\r
+                               string tempExtractDir = targetDir + "___temp___"; // HACK\r
                                Directory.CreateDirectory(tempExtractDir);\r
                                \r
                                try {\r
                                Directory.CreateDirectory(tempExtractDir);\r
                                \r
                                try {\r
-                                       extract(arcFile, tempExtractDir);\r
+                                       // STEP1. 書庫の展開\r
+                                       if (package != null && package.Type == InstallerType.ITSELF) {\r
+                                               // 書庫でない場合展開せずにそのままコピーする\r
+                                               string destFile = Path.Combine(tempExtractDir, Path.GetFileName(arcFile));\r
+                                               File.Copy(arcFile, destFile);\r
+                                       } else {\r
+                                               extract(arcFile, tempExtractDir);\r
+                                       }\r
+                                       \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
                                        \r
-                                       install(tempExtractDir, targetDir);\r
+                                       // STEP3. インストール\r
+                                       install(installSrc, targetDir);\r
                                        \r
                                        if (package != null) {\r
                                        \r
                                        if (package != null) {\r
+                                               // STEP4. カスタマイズ可能な後処理\r
                                                postInstall(targetDir, package);\r
                                                \r
                                                postInstall(targetDir, package);\r
                                                \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
                                                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
                                } finally {\r
                                        Directory.Delete(tempExtractDir, true);\r
                                }\r