OSDN Git Service

na-get-lib,アンインストール処理の中途終了に対応。
[applistation/AppliStation.git] / na-get-lib / NaGet.SubCommands / NaGetUpdate.cs
index 0524292..3a6644a 100644 (file)
@@ -4,12 +4,13 @@ using NaGet.Packages;
 using NaGet.Packages.Install;\r
 using NaGet.Net;\r
 using NaGet.SubCommands;\r
+using NaGet.Tasks;\r
 \r
 namespace NaGet.SubCommands\r
 {\r
        public class NaGetUpdate : NaGetTaskSet\r
        {\r
-               private ProviderList providerList;\r
+               private RepositoriesList repoList;\r
                \r
                private PackageListsManager pkgListMan;\r
                \r
@@ -17,7 +18,25 @@ namespace NaGet.SubCommands
                \r
                private bool packageListsDownloaded = true;\r
                \r
-               public Downloader Downloader; // TODO 参照をしてセットするように\r
+               \r
+               /// <summary>\r
+               /// ダウンロードに使うダウンローダオブジェクト\r
+               /// </summary>\r
+               public Downloader Downloader {\r
+                       get {\r
+                               if (downloader == null) {\r
+                                       downloader = new Downloader();\r
+                                       downloader.DownloadEventRaised += delegate(object sender, DownloadEventArgs e) {\r
+                                               if (e.DownloadTaskType == DownloadEventType.DOWNLOADING && e.ProgressPercent > 0) {\r
+                                                       RaiseTaskSetEvent(TaskEventType.PING, string.Empty, GetProgressPercent(TaskEventType.PING, e.ProgressPercent));\r
+                                               }\r
+                                       };\r
+                               }\r
+                               return downloader;\r
+                       }\r
+               }\r
+               \r
+               private Downloader downloader;\r
                \r
                private int currentTaskSetIndex = -1;\r
                \r
@@ -41,43 +60,45 @@ namespace NaGet.SubCommands
                        pkgListMan = pkgMan;\r
                        downloadPackageLists = downloadPackageListsFlag;\r
                        \r
-                       System.Collections.Generic.List<string> taskSetNames = new System.Collections.Generic.List<string>();\r
+                       taskSetNames = new System.Collections.Generic.List<string>();\r
                        if (downloadPackageLists) {\r
-                               providerList = new ProviderList(NaGet.Env.ProviderListFile);\r
+                               // repos.list.xmlがあるとき、そこからよみとる。\r
+                               repoList = NaGet.Utils.GetDeserializedObject<RepositoriesList>(NaGet.Env.RepositoriesListFile);\r
                                \r
-                               foreach (string url in providerList.Urls) {\r
-                                       taskSetNames.Add(string.Format("リスト取得: {0}", url));\r
+                               foreach (RepositoryInfo repo in repoList.EnabledRepositories) {\r
+                                       taskSetNames.Add(string.Format("リスト取得: {0}", repo.Url.Href));\r
                                }\r
                                taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.PackageListFile));\r
                        }\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.ArchiveInstalledPackageListFile));\r
                        taskSetNames.Add(string.Format("リスト更新: {0}", NaGet.Env.SystemInstalledPackageListFile));\r
-                       \r
-                       TaskSetNames = taskSetNames.ToArray();\r
                }\r
 \r
                public override void Run()\r
                {\r
                        currentTaskSetIndex ++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED, "リスト更新処理開始");\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED, "リスト更新処理開始");\r
                        \r
                        try {\r
                                // リストのダウンロード\r
                                if (downloadPackageLists) {\r
                                        packageListsDownloaded = false;\r
                                        try {\r
-                                               runDownloadPackages();\r
-                                       } catch (NaGetTaskCanceledException) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
+                                               runDownloadPackageLists();\r
+                                       } catch (TaskCanceledException) {\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, "リストのダウンロード処理がキャンセルされました");\r
+                                               pkgListMan.LoadPackageLists();\r
                                        } catch (System.Net.WebException e) {\r
-                                               RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, e.Message);\r
+                                               RaiseTaskSetEvent(TaskEventType.WARNING, e.Message);\r
                                                if (System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続されていません。");\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続されていません。");\r
                                                } else {\r
-                                                       RaiseTaskSetEvent(NaGetTaskSetEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, "ネットワークに接続できませんでした。ネットワークが切断されているか、ファイアウォールによって遮断された可能性があります。");\r
                                                }\r
+                                               pkgListMan.LoadPackageLists();\r
                                        } finally {\r
-                                               currentTaskSetIndex = providerList.Urls.Length + 1;\r
+                                               int numOfEnabledRepos = NaGet.Utils.IEnumerable2Array(repoList.EnabledRepositories).Length;\r
+                                               currentTaskSetIndex = numOfEnabledRepos + 1;\r
                                        }\r
                                        packageListsDownloaded = true;\r
                                }\r
@@ -87,52 +108,74 @@ namespace NaGet.SubCommands
                                done = true;\r
                        }\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED, "終了", 100);\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED, "終了", 100);\r
                }\r
                \r
-               private void runDownloadPackages()\r
+               private void runDownloadPackageLists()\r
                {\r
                        PackageList<Package> avaiablePackageList = new PackageList<Package>();\r
-                       foreach(string provider in providerList.Urls) {\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       foreach(RepositoryInfo repo in repoList.EnabledRepositories) {\r
+                               RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                \r
-                               string tmpfileName = Path.GetTempFileName();\r
-                               try {\r
-                                       Downloader.Download(provider, tmpfileName);\r
-                                       \r
-                                       avaiablePackageList.AddPackages(NaGet.Utils.GetDeserializedObject<PackageList<Package>>(tmpfileName).Packages);\r
-                               } finally {\r
-                                       if (File.Exists(tmpfileName)) {\r
-                                               File.Delete(tmpfileName);\r
+                               if (Uri.IsWellFormedUriString(repo.Url.Href, UriKind.Absolute)) {\r
+                                       string tmpfileName = Path.GetTempFileName();\r
+                                       try {\r
+                                               Downloader.Download(repo.Url.Href, tmpfileName);\r
+                                               if (repo.Type == RepositoryType.APPLISTATION_NATIVE_XML_1_0) {\r
+                                                       try {\r
+                                                               PackageList<Package> pkgList = NaGet.Utils.GetDeserializedObject<PackageList<Package>>(tmpfileName);\r
+                                                               pkgList.FixPackageListName(); // PackageListNameとの紐付けを行う\r
+                                                               \r
+                                                               // RepositoryReferenceの名前を読み込む // TODO RepositoryReferenceの名前を読み込む処理はここでいいのか?\r
+                                                               repo.Name = (string.IsNullOrEmpty(pkgList.Name))? repo.Name : pkgList.Name;\r
+                                                               \r
+                                                               avaiablePackageList.AddPackages(pkgList);\r
+                                                       } catch (InvalidOperationException) {\r
+                                                               RaiseTaskSetEvent(TaskEventType.ERROR, string.Format("レポジトリ'{0}'はAppliStation Native XML softlist形式ではありません。", repo.Name ?? repo.Url.Href));\r
+                                                       }\r
+                                               } else {\r
+                                                       RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'の設定が不正です。", repo.Name ?? repo.Url.Href));\r
+                                               }\r
+                                       } finally {\r
+                                               if (File.Exists(tmpfileName)) {\r
+                                                       File.Delete(tmpfileName);\r
+                                               }\r
                                        }\r
+                               } else {\r
+                                       RaiseTaskSetEvent(TaskEventType.WARNING, string.Format("レポジトリ'{0}'のURLが不正なため、ソフトリストは取得できませんでした。", repo.Name ?? repo.Url.Href));\r
                                }\r
                                \r
+                               RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                                currentTaskSetIndex ++;\r
-                               RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
                        }\r
                        \r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       // TODO 暫定的にかならず常にrepositoryリストに書き込む。\r
+                       if ( true ) {\r
+                               NaGet.Utils.PutSerializeObject(NaGet.Env.RepositoriesListFile, repoList);\r
+                       }\r
+                       \r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.availablePkgList = avaiablePackageList; // Mediatorのリストを更新\r
                        pkgListMan.SaveAvailablePackageList();\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex ++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
                }\r
                \r
                private void runLocalUpdate()\r
                {\r
                        // インストールトリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, taskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectInstalledPkgs();\r
                        pkgListMan.SaveInstalledPackageList();\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
                \r
                        // システムにインストールされているリストの更新\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.STARTED_TASKSET, TaskSetNames[currentTaskSetIndex]);\r
+                       RaiseTaskSetEvent(TaskEventType.STARTED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        pkgListMan.DetectSystemInstalledPkgs();\r
                        pkgListMan.SaveSystemInstalledPackageList();\r
+                       RaiseTaskSetEvent(TaskEventType.COMPLETED_SUBTASK, TaskSetNames[currentTaskSetIndex]);\r
                        currentTaskSetIndex++;\r
-                       RaiseTaskSetEvent(NaGetTaskSetEventType.COMPLETED_TASKSET, TaskSetNames[currentTaskSetIndex-1]);\r
                }\r
                \r
                public override bool Cancel()\r