1 // project created on 2007/09/08 at 20:20
\r
4 using System.Collections.Generic;
\r
6 using NaGet.Packages;
\r
7 using NaGet.Packages.Install;
\r
8 using NaGet.SubCommands;
\r
13 class DownloadListener
\r
15 private string line = null;
\r
18 /// lineのコンソール上における長さ
\r
20 private int lineWidth = 0;
\r
22 public void OnDownload(object sender, DownloadEventArgs a) {
\r
25 int newpos = (lineWidth <= 0)? 0 : Console.CursorLeft - lineWidth;
\r
26 if (newpos < 0) newpos = 0;
\r
29 Console.CursorLeft = newpos;
\r
30 for (int i = 0; i < lineWidth && Console.CursorLeft < Console.BufferWidth; i++) {
\r
33 Console.CursorLeft = newpos;
\r
35 line = null; lineWidth = 0;
\r
40 case DownloadEventType.INITED:
\r
41 line = "starting...";
\r
43 case DownloadEventType.CONNECTED:
\r
44 case DownloadEventType.DOWNLOADING:
\r
45 line = a.TaskMessage;
\r
47 case DownloadEventType.COMPLETED:
\r
51 case DownloadEventType.ERROR:
\r
52 Console.Write("interrupted! ERROR!");
\r
58 int posOld = Console.CursorLeft;
\r
59 Console.Write(line);
\r
60 lineWidth = Console.CursorLeft - posOld;
\r
67 private Downloader downloader;
\r
69 private PackageListsManager pkgListMan;
\r
73 downloader = new Downloader();
\r
74 DownloadListener dl = new DownloadListener();
\r
75 downloader.DownloadEventRaised += new EventHandler<DownloadEventArgs>(dl.OnDownload);
\r
77 pkgListMan = new PackageListsManager();
\r
80 public void Update()
\r
85 public void LocalUpdate()
\r
90 public void update(bool downloadPackageListFlag)
\r
92 NaGet.SubCommands.NaGetUpdate tasks = new NaGet.SubCommands.NaGetUpdate(pkgListMan, downloadPackageListFlag);
\r
93 tasks.Downloader = this.downloader;
\r
94 tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {
\r
96 // case NaGetTaskSetEventType.COMPLETED_TASKSET
\r
98 case NaGetTaskSetEventType.COMPLETED:
\r
99 Console.WriteLine("Done.");
\r
101 case NaGetTaskSetEventType.STARTED_TASKSET:
\r
102 Console.Write(" " + e.TaskMessage);
\r
104 case NaGetTaskSetEventType.COMPLETED_TASKSET:
\r
105 Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);
\r
107 case NaGetTaskSetEventType.INFO:
\r
108 Console.WriteLine(" " + e.TaskMessage);
\r
110 case NaGetTaskSetEventType.ERROR:
\r
111 case NaGetTaskSetEventType.WARNING:
\r
112 Console.WriteLine(" [Error]" + e.TaskMessage);
\r
120 public void CheckUpgrade()
\r
122 PackageList<Package> packageList = pkgListMan.AvailablePkgList;
\r
124 VersionComparetor verComp = new VersionComparetor();
\r
126 foreach (InstalledPackage pkg in pkgListMan.InstalledPkgList.Packages) {
\r
127 Package avaiablePkg = packageList.GetPackageForName(pkg.Name);
\r
129 if (avaiablePkg != null) {
\r
130 if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&
\r
131 pkgListMan.InstalledPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {
\r
132 Console.ForegroundColor = ConsoleColor.Green;
\r
135 Console.WriteLine("{0} ({1}) => ({2})", pkg.Name, pkg.Version, avaiablePkg.Version);
\r
136 Console.ResetColor();
\r
139 foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {
\r
140 Package avaiablePkg = packageList.GetPackageForName(pkg.Name);
\r
142 if (avaiablePkg != null) {
\r
143 if (verComp.Compare(pkg.Version, avaiablePkg.Version) < 0 &&
\r
144 pkgListMan.SystemInstalledPkgList.GetPackageForPackage(pkg.Name, avaiablePkg.Version) == null) {
\r
145 Console.ForegroundColor = ConsoleColor.Green;
\r
148 Console.WriteLine("{0} ({1})@sys => ({2})", pkg.Name, pkg.Version, avaiablePkg.Version);
\r
149 Console.ResetColor();
\r
154 public void Search(string keys)
\r
156 foreach(Package package in pkgListMan.AvailablePkgList.Search(keys)) {
\r
157 Console.WriteLine("{0} ({1}) - {2}", package.Name, package.Version, package.Summary);
\r
160 foreach(InstalledPackage package in pkgListMan.InstalledPkgList.Search(keys)) {
\r
161 Console.WriteLine("{0} ({1})[@install] - {2}", package.Name, package.Version, package.Summary);
\r
164 foreach(InstalledPackage package in pkgListMan.SystemInstalledPkgList.Search(keys)) {
\r
165 Console.WriteLine("{0} ({1})[@sys] - {2}", package.Name, package.Version, package.Summary);
\r
169 public void Show(string packagename)
\r
171 PackageList<Package> allPkgs = new PackageList<Package>();
\r
172 allPkgs.AddPackages(pkgListMan.GetAllPackages());
\r
174 foreach (Package pkg in allPkgs.GetPackagesForName(packagename)) {
\r
175 Console.WriteLine("Package: {0}", pkg.Name);
\r
176 Console.WriteLine("Version: {0}", pkg.Version);
\r
177 if (pkg.Url != null) Console.WriteLine("Website: {0}", pkg.Url.Href);
\r
178 if (pkg.Tags != null) Console.WriteLine("Tag: {0}", pkg.Tags.ToLower());
\r
179 Console.WriteLine("Type: {0}", pkg.Type);
\r
180 if (pkg.License != null) Console.WriteLine("License: {0}", pkg.License);
\r
181 if (pkg is InstalledPackage) Console.WriteLine("State: Installed");
\r
183 if (pkg.Description != null) {
\r
184 Console.WriteLine("Description:");
\r
185 Console.WriteLine(pkg.Description);
\r
187 Console.WriteLine();
\r
191 public void Download(string[] packagenames)
\r
193 Installation[] installations = null;
\r
195 List<Package> downloadList = new List<Package>();
\r
197 foreach(string packagename in packagenames) {
\r
198 Package foundPackage = pkgListMan.AvailablePkgList.GetPackageForName(packagename);
\r
199 if (foundPackage == null) {
\r
200 Console.WriteLine("E: Couldn't find package "+packagename);
\r
201 Environment.Exit(1);
\r
203 if (! downloadList.Contains(foundPackage)) {
\r
204 downloadList.Add(foundPackage);
\r
208 installations = new Installation[downloadList.Count];
\r
209 for (int i = 0; i < installations.Length; i++) {
\r
210 installations[i] = new Installation((Package) downloadList[i]);
\r
214 Console.WriteLine("The following packages will be downloaded:");
\r
215 Console.WriteLine(" {0}", Installation.ToString(installations));
\r
216 if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {
\r
217 Console.WriteLine("Abort.");
\r
218 Environment.Exit(0);
\r
223 foreach (Installation inst in installations) {
\r
226 if (! inst.IsInstallablePackage()) {
\r
227 Console.WriteLine("E:{0} {1} can not be installed.", i, inst.ToString());
\r
232 Console.Write("Get:{0} {1}", i, inst.ToString());
\r
233 inst.Download(downloader);
\r
234 Console.WriteLine(" ...Done");
\r
235 } catch (Exception e) {
\r
236 Console.WriteLine("E: "+e.Message);
\r
237 throw new ApplicationException(string.Format("Failed to download {0}", inst.ToString()), e);
\r
242 foreach (Installation inst in installations) {
\r
245 if (inst.IsInstallablePackage() && inst.VerifyHashValues() == false) {
\r
246 Console.WriteLine("Verify:{0} {1} does not match hash value!", i, inst.ToString());
\r
252 public void Install(string[] packagenames)
\r
254 if (! NaGet.Utils.IsAdministrators()) {
\r
255 Console.WriteLine("W: you are not administrators!");
\r
258 Installation[] installations = null;
\r
260 List<Package> downloadList = new List<Package>();
\r
262 foreach(string packagename in packagenames) {
\r
263 Package foundPackage = pkgListMan.AvailablePkgList.GetPackageForName(packagename);
\r
264 if (foundPackage == null) {
\r
265 Console.WriteLine("E: Couldn't find package "+packagename);
\r
266 Environment.Exit(1);
\r
268 if (! downloadList.Contains(foundPackage)) {
\r
269 downloadList.Add(foundPackage);
\r
273 installations = new Installation[downloadList.Count];
\r
274 for (int i = 0; i < installations.Length; i++) {
\r
275 installations[i] = new Installation((Package) downloadList[i]);
\r
277 if (! installations[i].IsInstallablePackage()) {
\r
278 Console.WriteLine("E: Can not install package {0} to your PC.", installations[i].ToString());
\r
279 Environment.Exit(1);
\r
284 Console.WriteLine("The following packages will be downloaded:");
\r
285 Console.WriteLine(" {0}", Installation.ToString(installations));
\r
286 if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {
\r
287 Console.WriteLine("Abort.");
\r
288 Environment.Exit(0);
\r
291 NaGet.SubCommands.NaGetInstall tasks = new NaGet.SubCommands.NaGetInstall(pkgListMan, installations);
\r
292 tasks.Downloader = this.downloader;
\r
293 tasks.TaskQueryRaised += delegate(object sender, NaGetTaskSetEventArgs e) {
\r
294 return AllGet.Util.Confirm(e.TaskMessage + " [yN]? ", false)?
\r
295 NaGetTaskQueryResult.CONTINUE : NaGetTaskQueryResult.CANCEL;
\r
297 tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {
\r
299 // case NaGetTaskSetEventType.COMPLETED_TASKSET
\r
301 case NaGetTaskSetEventType.COMPLETED:
\r
302 Console.WriteLine("Done.");
\r
304 case NaGetTaskSetEventType.STARTED_TASKSET:
\r
305 Console.Write(" " + e.TaskMessage);
\r
307 case NaGetTaskSetEventType.COMPLETED_TASKSET:
\r
308 Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);
\r
310 case NaGetTaskSetEventType.INFO:
\r
311 Console.WriteLine(" " + e.TaskMessage);
\r
313 case NaGetTaskSetEventType.ERROR:
\r
314 case NaGetTaskSetEventType.WARNING:
\r
315 Console.WriteLine(" [Error] " + e.TaskMessage);
\r
323 public void Remove(string[] packagenames)
\r
325 if (! NaGet.Utils.IsAdministrators()) {
\r
326 Console.WriteLine("W: you are not administrators!");
\r
329 this.LocalUpdate();
\r
331 PackageList<InstalledPackage> installedPkgList = new PackageList<InstalledPackage>();
\r
332 installedPkgList.AddPackages(pkgListMan.GetAllInstalledPackages());
\r
334 Uninstallation[] uninstallations = new Uninstallation[packagenames.Length];
\r
335 for (int i = 0; i < packagenames.Length; i++) {
\r
336 InstalledPackage pkg = installedPkgList.GetPackageForName(packagenames[i]);
\r
339 Console.WriteLine("E: could not found package " + packagenames[i]);
\r
340 Environment.Exit(1);
\r
343 uninstallations[i] = new Uninstallation(pkg);
\r
346 // if (AllGet.Util.Confirm("Do you want to continue [Y/n]?", true) == false) {
\r
347 // Console.WriteLine("Abort.");
\r
348 // Environment.Exit(0);
\r
351 NaGet.SubCommands.NaGetUninstall tasks = new NaGet.SubCommands.NaGetUninstall(pkgListMan, uninstallations);
\r
352 tasks.TaskSetRaised += delegate(object sender, NaGetTaskSetEventArgs e) {
\r
354 // case NaGetTaskSetEventType.COMPLETED_TASKSET
\r
356 case NaGetTaskSetEventType.COMPLETED:
\r
357 Console.WriteLine("Done.");
\r
359 case NaGetTaskSetEventType.STARTED_TASKSET:
\r
360 Console.Write(" " + e.TaskMessage);
\r
362 case NaGetTaskSetEventType.COMPLETED_TASKSET:
\r
363 Console.WriteLine(" ... Done. [{0}%]", (int) e.TaskProgressPercent);
\r
365 case NaGetTaskSetEventType.INFO:
\r
366 Console.WriteLine(" " + e.TaskMessage);
\r
368 case NaGetTaskSetEventType.ERROR:
\r
369 case NaGetTaskSetEventType.WARNING:
\r
370 Console.WriteLine(" [Error] " + e.TaskMessage);
\r
378 public void CleanCache(string[] packages)
\r
380 if (! Directory.Exists(NaGet.Env.ArchiveFolderPath)) {
\r
385 if (packages.Length == 0) {
\r
386 foreach (string folder in Directory.GetDirectories(NaGet.Env.ArchiveFolderPath)) {
\r
387 Directory.Delete(folder, true);
\r
391 foreach (string package in packages) {
\r
392 foreach (string folder in Directory.GetDirectories(NaGet.Env.ArchiveFolderPath, package+"*", SearchOption.TopDirectoryOnly)) {
\r
393 Directory.Delete(folder, true);
\r
399 Console.WriteLine("... Done.");
\r
405 string executeFileName = System.AppDomain.CurrentDomain.FriendlyName;
\r
406 Console.Write("Usage:");
\r
408 Console.WriteLine("\t{0} update|localupdate", executeFileName);
\r
409 Console.WriteLine("\t{0} search|show pkg1 [pkg2 ...]", executeFileName);
\r
410 Console.WriteLine("\t{0} cleancache [pkg ...]", executeFileName);
\r
411 Console.WriteLine("\t{0} download pkg1 [pkg2 ...]", executeFileName);
\r
412 Console.WriteLine("\t{0} install|uninstall pkg1 [pkg2 ...]", executeFileName);
\r
413 Console.WriteLine();
\r
414 Console.WriteLine("{0} is a simple command line interface for downloading and "+
\r
415 "installing packages. The most frequently used commands are update "+
\r
416 "and install.", executeFileName);
\r
417 Console.WriteLine();
\r
418 Console.WriteLine("Commands:");
\r
419 Console.WriteLine(" update - Retrieve new lists of packages");
\r
420 Console.WriteLine(" localupdate - Update installed-soft-list only");
\r
421 Console.WriteLine(" checkupgrade - Show upgraded-soft list");
\r
422 Console.WriteLine(" search - Search the package list for not a regex pattern");
\r
423 Console.WriteLine(" show - Show package detail");
\r
424 Console.WriteLine(" cleancache - Clear cached archived file(s)");
\r
425 Console.WriteLine(" download - Download only - do NOT install or unpack archives");
\r
426 Console.WriteLine(" install - Install new packages");
\r
427 Console.WriteLine(" remove - Uninstall packages");
\r
428 Console.WriteLine();
\r
431 public void FooBar()
\r
433 foreach (InstalledPackage pkg in pkgListMan.SystemInstalledPkgList.Packages) {
\r
434 Console.WriteLine("{0} : {1}", pkg.Name, pkg.UninstallInfo.UninstallString);
\r
440 foreach (UninstallInformation uInfo in RegistriedUninstallers.Uninstallers) {
\r
441 if (! uInfo.IsOSPatch && ! uInfo.IsSystemComponent) {
\r
442 Console.WriteLine("{0}", uInfo.DisplayName);
\r
449 // TODO スーパー牛さんパワー化
\r
451 string executeFileName = System.AppDomain.CurrentDomain.FriendlyName;
\r
452 Console.WriteLine("誰か {0} をスーパー牛さんパワー化してくれ", executeFileName);
\r
455 public static void Main(string[] args)
\r
457 // アーカイブSYSTEM32をパスに足す
\r
458 NaGet.Utils.AddDirectoryToPath(NaGet.Env.ArchiveSystem32);
\r
460 MainClass mc = new MainClass();
\r
462 if (args.Length == 0) {
\r
464 } else if (args[0] == "update") {
\r
465 if (args.Length != 1) {
\r
466 Console.WriteLine("E: The update command takes no arguments");
\r
467 Environment.Exit(1);
\r
470 } else if (args[0] == "localupdate") {
\r
471 if (args.Length != 1) {
\r
472 Console.WriteLine("E: The update command takes no arguments");
\r
473 Environment.Exit(1);
\r
476 } else if (args[0] == "search") {
\r
477 if (args.Length <= 1) {
\r
478 Console.WriteLine("E: You must give exactly one pattern");
\r
479 Environment.Exit(1);
\r
482 mc.Search(string.Join(" ", args, 1, args.Length - 1));
\r
483 } else if (args[0] == "show") {
\r
484 if (args.Length <= 1) {
\r
485 Console.WriteLine("E: You must give exactly one pattern");
\r
486 Environment.Exit(1);
\r
489 for (int i = 1; i < args.Length; i++) {
\r
492 } else if (args[0] == "download") {
\r
493 if (args.Length <= 1) {
\r
494 Console.WriteLine("E: Invalid operation download");
\r
495 Environment.Exit(1);
\r
498 string[] packages = new string[args.Length - 1];
\r
499 Array.Copy(args, 1, packages, 0, packages.Length);
\r
501 mc.Download(packages);
\r
502 } else if (args[0] == "install") {
\r
503 if (args.Length <= 1) {
\r
504 Console.WriteLine("E: Invalid operation install");
\r
505 Environment.Exit(1);
\r
508 string[] packages = new string[args.Length - 1];
\r
509 Array.Copy(args, 1, packages, 0, packages.Length);
\r
511 mc.Install(packages);
\r
512 } else if (args[0] == "checkupgrade") {
\r
514 } else if (args[0] == "remove") {
\r
515 if (args.Length <= 1) {
\r
516 Console.WriteLine("E: Invalid operation remove");
\r
517 Environment.Exit(1);
\r
520 string[] packages = new string[args.Length - 1];
\r
521 Array.Copy(args, 1, packages, 0, packages.Length);
\r
523 mc.Remove(packages);
\r
524 } else if (args[0] == "cleancache") {
\r
525 string[] packages = new string[args.Length - 1];
\r
526 Array.Copy(args, 1, packages, 0, packages.Length);
\r
528 mc.CleanCache(packages);
\r
529 } else if (args[0] == "foobar") {
\r
531 } else if (args[0] == "hoge") {
\r
533 } else if (args[0] == "moo") {
\r
538 Environment.Exit(1);
\r