1/*
2 * Copyright 2011, Oliver Tappe <zooey@hirschkaefere.de>
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <getopt.h>
8#include <stdio.h>
9#include <stdlib.h>
10
11#include <Errors.h>
12#include <SupportDefs.h>
13
14#include <package/DropRepositoryRequest.h>
15#include <package/Context.h>
16
17#include "DecisionProvider.h"
18#include "JobStateListener.h"
19#include "pkgman.h"
20
21
22using namespace BPackageKit;
23
24
25// TODO: internationalization!
26
27
28static const char* kCommandUsage =
29	"Usage: %s drop-repo <repo-name>\n"
30	"Drops (i.e. removes) the repository with the given name.\n"
31	"\n"
32;
33
34
35static void
36print_command_usage_and_exit(bool error)
37{
38    fprintf(error ? stderr : stdout, kCommandUsage, kProgramName);
39    exit(error ? 1 : 0);
40}
41
42
43int
44command_drop_repo(int argc, const char* const* argv)
45{
46	bool yesMode = false;
47
48	while (true) {
49		static struct option sLongOptions[] = {
50			{ "help", no_argument, 0, 'h' },
51			{ "yes", no_argument, 0, 'y' },
52			{ 0, 0, 0, 0 }
53		};
54
55		opterr = 0; // don't print errors
56		int c = getopt_long(argc, (char**)argv, "hu", sLongOptions, NULL);
57		if (c == -1)
58			break;
59
60		switch (c) {
61			case 'h':
62				print_command_usage_and_exit(false);
63				break;
64
65			case 'y':
66				yesMode = true;
67				break;
68
69			default:
70				print_command_usage_and_exit(true);
71				break;
72		}
73	}
74
75	// The remaining argument is a repo name, i. e. one more argument.
76	if (argc != optind + 1)
77		print_command_usage_and_exit(true);
78
79	const char* repoName = argv[optind];
80
81	DecisionProvider decisionProvider;
82//	if (yesMode)
83//		decisionProvider.SetAcceptEverything(true);
84	JobStateListener listener;
85	BContext context(decisionProvider, listener);
86
87	status_t result;
88	DropRepositoryRequest dropRequest(context, repoName);
89	result = dropRequest.InitCheck();
90	if (result != B_OK)
91		DIE(result, "unable to create request for dropping repository");
92	result = dropRequest.CreateInitialJobs();
93	if (result != B_OK)
94		DIE(result, "unable to create necessary jobs");
95
96	while (BJob* job = dropRequest.PopRunnableJob()) {
97		result = job->Run();
98		delete job;
99		if (result == B_CANCELED)
100			return 1;
101	}
102
103	return 0;
104}
105