1/*
2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Ingo Weinhold <ingo_weinhold@gmx.de>
7 */
8
9
10#include <getopt.h>
11#include <stdio.h>
12#include <stdlib.h>
13
14#include "Command.h"
15#include "pkgman.h"
16#include "PackageManager.h"
17
18
19// TODO: internationalization!
20
21
22using namespace BPackageKit;
23using namespace BPackageKit::BPrivate;
24
25
26static const char* const kShortUsage =
27	"  %command% <package> ...\n"
28	"    Uninstalls one or more packages.\n";
29
30static const char* const kLongUsage =
31	"Usage: %program% %command% <package> ...\n"
32	"Uninstalls the specified packages.\n"
33	"\n"
34	"Options:\n"
35	"  --debug <level>\n"
36	"    Print debug output. <level> should be between 0 (no debug output,\n"
37	"    the default) and 10 (most debug output).\n"
38	"  -H, --home\n"
39	"    Uninstall the packages from the user's home directory. Default is to\n"
40	"    uninstall from the system directory.\n"
41	"  -y\n"
42	"    Non-interactive mode. Automatically confirm changes, but fail when\n"
43	"    encountering problems.\n"
44	"\n";
45
46
47DEFINE_COMMAND(UninstallCommand, "uninstall", kShortUsage, kLongUsage,
48	COMMAND_CATEGORY_PACKAGES)
49
50
51int
52UninstallCommand::Execute(int argc, const char* const* argv)
53{
54	BPackageInstallationLocation location
55		= B_PACKAGE_INSTALLATION_LOCATION_SYSTEM;
56	bool interactive = true;
57
58	while (true) {
59		static struct option sLongOptions[] = {
60			{ "debug", required_argument, 0, OPTION_DEBUG },
61			{ "help", no_argument, 0, 'h' },
62			{ "home", no_argument, 0, 'H' },
63			{ 0, 0, 0, 0 }
64		};
65
66		opterr = 0; // don't print errors
67		int c = getopt_long(argc, (char**)argv, "hHy", sLongOptions, NULL);
68		if (c == -1)
69			break;
70
71		if (fCommonOptions.HandleOption(c))
72			continue;
73
74		switch (c) {
75			case 'h':
76				PrintUsageAndExit(false);
77				break;
78
79			case 'H':
80				location = B_PACKAGE_INSTALLATION_LOCATION_HOME;
81				break;
82
83			case 'y':
84				interactive = false;
85				break;
86
87			default:
88				PrintUsageAndExit(true);
89				break;
90		}
91	}
92
93	// The remaining arguments are the packages to be uninstalled.
94	if (argc < optind + 1)
95		PrintUsageAndExit(true);
96
97	int packageCount = argc - optind;
98	const char* const* packages = argv + optind;
99
100	// perform the installation
101	PackageManager packageManager(location, interactive);
102	packageManager.SetDebugLevel(fCommonOptions.DebugLevel());
103	packageManager.Uninstall(packages, packageCount);
104
105	return 0;
106}
107