\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
} 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 toBeChangedFilePath = Path.Combine(installSrc, changedFile.Path);\r
+ string toBeChangedFilePath = Path.Combine(fakeTargetDir, changedFile.Path);\r
\r
+ // 新規のファイルは退避させる\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
- File.Copy(changedFilePath, toBeChangedFilePath); // installSrcの方に反映させておく\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
}\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
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
//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
- lnk.ToPersistFile().Save(Path.Combine(progGrpPath, lnkFileName+".lnk"), true);\r
+ lnk.ToPersistFile().Save(lnkFilePath, true);\r
}\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
}\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
string targetDir = null;\r
Package package = null;\r
\r
+ // 引数パースおよびヘルプ表示\r
try {\r
parseMainArguments(args, out arcFile, out targetDir, out package);\r
} catch (ArgumentException) {\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
- 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
- install(tempExtractDir, targetDir);\r
+ // STEP3. インストール\r
+ install(installSrc, targetDir);\r
\r
if (package != null) {\r
+ // STEP4. カスタマイズ可能な後処理\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
+ } 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