aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/opkg/opkg/add-exclude.patch
blob: c684534efbecd5904d65fd2d6b2438f34054da5f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
From 5d707bbfcafd88b8b5b5821972c8c958fc3b2039 Mon Sep 17 00:00:00 2001
From: Paul Barker <paul@paulbarker.me.uk>
Date: Fri, 28 Mar 2014 15:20:22 +0000
Subject: [PATCH 2/2] opkg-0.2.x: add-exclude

Add a way to exclude specific packages from the install

When an excluded package is required by another package an error
will be generated.  If the excluded package is only recommended,
no error will be generated.

The lifespan of the exclude_list covers the execution of the process,
so there is no need to free the data.

v2: Use xmalloc instead of malloc and xrealloc instead of realloc. In opkg,
these functions are guaranteed not to return NULL.

Upstream-Status: Pending

Signed-off-by: Mark Hatle <mark.hatle@windriver.com>
Signed-off-by: Jonathan Liu <net147@gmail.com>
Signed-off-by: Paul Barker <paul@paulbarker.me.uk>
---
 libopkg/opkg_conf.c   |  1 +
 libopkg/opkg_conf.h   |  2 ++
 libopkg/pkg_depends.c | 16 ++++++++++++++++
 src/opkg-cl.c         | 15 +++++++++++++++
 4 files changed, 34 insertions(+)

diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
index 1e65bad..9c4c854 100644
--- a/libopkg/opkg_conf.c
+++ b/libopkg/opkg_conf.c
@@ -442,6 +442,7 @@ opkg_conf_init(void)
 	pkg_dest_list_init(&conf->pkg_dest_list);
 	pkg_dest_list_init(&conf->tmp_dest_list);
 	nv_pair_list_init(&conf->arch_list);
+	conf->exclude_list = NULL;
 
 	return 0;
 }
diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
index 6045a58..ad58849 100644
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -51,6 +51,8 @@ struct opkg_conf
      pkg_dest_list_t pkg_dest_list;
      pkg_dest_list_t tmp_dest_list;
      nv_pair_list_t arch_list;
+     size_t exclude_count;
+     char ** exclude_list;
 
      int restrict_to_default_dest;
      pkg_dest_t *default_dest;
diff --git a/libopkg/pkg_depends.c b/libopkg/pkg_depends.c
index d2d279e..b572e18 100644
--- a/libopkg/pkg_depends.c
+++ b/libopkg/pkg_depends.c
@@ -212,6 +212,22 @@ pkg_hash_fetch_unsatisfied_dependencies(pkg_t * pkg, pkg_vec_t *unsatisfied,
 			 continue;
 		    }
 
+		    /* Check for excluded packages */
+		    if (satisfying_pkg != NULL && conf->exclude_list) {
+			int i, exclude = 0;
+			for (i = 0; i < conf->exclude_count; i++) {
+			    if (!strcmp(satisfying_pkg->name, conf->exclude_list[i])) {
+				opkg_msg(NOTICE, "%s: exclude required package %s"
+					"at users request\n",
+					pkg->name, satisfying_pkg->name);
+				exclude = 1;
+				break;
+			    }
+			}
+			if (exclude)
+			    continue;
+		    }
+
 		    opkg_msg(DEBUG, "satisfying_pkg=%p\n", satisfying_pkg);
 		    if (satisfying_pkg != NULL) {
 			 satisfier_entry_pkg = satisfying_pkg;
diff --git a/src/opkg-cl.c b/src/opkg-cl.c
index 0315d41..67366b9 100644
--- a/src/opkg-cl.c
+++ b/src/opkg-cl.c
@@ -45,6 +45,7 @@ enum {
 	ARGS_OPT_PREFER_ARCH_TO_VERSION,
 	ARGS_OPT_ADD_ARCH,
 	ARGS_OPT_ADD_DEST,
+	ARGS_OPT_ADD_EXCLUDE,
 	ARGS_OPT_NOACTION,
 	ARGS_OPT_DOWNLOAD_ONLY,
 	ARGS_OPT_NODEPS,
@@ -95,6 +96,7 @@ static struct option long_options[] = {
 	{"offline-root", 1, 0, 'o'},
 	{"add-arch", 1, 0, ARGS_OPT_ADD_ARCH},
 	{"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
+	{"add-exclude", 1, 0, ARGS_OPT_ADD_EXCLUDE},
 	{"test", 0, 0, ARGS_OPT_NOACTION},
 	{"tmp-dir", 1, 0, 't'},
 	{"tmp_dir", 1, 0, 't'},
@@ -198,6 +200,18 @@ args_parse(int argc, char *argv[])
 			}
 			free(tuple);
 			break;
+		case ARGS_OPT_ADD_EXCLUDE:
+			tuple = xstrdup(optarg);
+			if (!conf->exclude_list) {
+				conf->exclude_count = 1;
+				conf->exclude_list = xmalloc(sizeof(char *) * conf->exclude_count);
+				conf->exclude_list[conf->exclude_count - 1] = tuple;
+			} else {
+				conf->exclude_count++;
+				conf->exclude_list = xrealloc(conf->exclude_list, sizeof(char *) * conf->exclude_count);
+				conf->exclude_list[conf->exclude_count - 1] = tuple;
+			}
+			break;
 		case ARGS_OPT_NOACTION:
 			conf->noaction = 1;
 			break;
@@ -282,6 +296,7 @@ usage()
 	printf("\t--offline-root <dir>            offline installation of packages.\n");
 	printf("\t--add-arch <arch>:<prio>        Register architecture with given priority\n");
 	printf("\t--add-dest <name>:<path>        Register destination with given path\n");
+	printf("\t--add-exclude <name>		  Register package to be excluded from install\n");
 	printf("\t--prefer-arch-to-version        Use the architecture priority package rather\n");
 	printf("\t                                than the higher version one if more\n");
 	printf("\t                                than one candidate is found.\n");
-- 
2.0.4