Skip to content

Commit 83e66e2

Browse files
classabbyampDuncaen
authored andcommitted
bin/xbps-uhelper: allow multiple arguments for many actions
1 parent 06fbbba commit 83e66e2

1 file changed

Lines changed: 109 additions & 78 deletions

File tree

bin/xbps-uhelper/main.c

Lines changed: 109 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,17 @@ usage(void)
4949
" real-version, arch, getsystemdir\n"
5050
"\n"
5151
" Action arguments:\n"
52-
" binpkgarch\t<binpkg>\n"
53-
" binpkgver\t<binpkg>\n"
52+
" binpkgarch\t<binpkg> ...\n"
53+
" binpkgver\t<binpkg> ...\n"
5454
" cmpver\t\t<instver> <reqver>\n"
55-
" getpkgdepname\t<string>\n"
56-
" getpkgdepversion\t<string>\n"
57-
" getpkgname\t\t<string>\n"
58-
" getpkgrevision\t<string>\n"
59-
" getpkgversion\t<string>\n"
55+
" getpkgdepname\t<string> ...\n"
56+
" getpkgdepversion\t<string> ...\n"
57+
" getpkgname\t\t<string> ...\n"
58+
" getpkgrevision\t<string> ...\n"
59+
" getpkgversion\t<string> ...\n"
6060
" pkgmatch\t\t<pkg-version> <pkg-pattern>\n"
61-
" version\t\t<pkgname>\n"
62-
" real-version\t<pkgname>\n"
61+
" version\t\t<pkgname> ...\n"
62+
" real-version\t<pkgname> ...\n"
6363
"\n"
6464
" Options shared by all actions:\n"
6565
" -C\t\tPath to xbps.conf file.\n"
@@ -103,7 +103,7 @@ main(int argc, char **argv)
103103
struct xferstat xfer;
104104
const char *version, *rootdir = NULL, *confdir = NULL;
105105
char pkgname[XBPS_NAME_SIZE], *filename;
106-
int flags = 0, c, rv = 0;
106+
int flags = 0, c, rv = 0, i = 0;
107107
const struct option longopts[] = {
108108
{ NULL, 0, NULL, 0 }
109109
};
@@ -160,102 +160,133 @@ main(int argc, char **argv)
160160
}
161161

162162
if (strcmp(argv[0], "version") == 0) {
163-
/* Prints version of an installed package */
164-
if (argc != 2)
163+
/* Prints version of installed packages */
164+
if (argc < 2)
165165
usage();
166166

167-
if ((((dict = xbps_pkgdb_get_pkg(&xh, argv[1])) == NULL)) &&
168-
(((dict = xbps_pkgdb_get_virtualpkg(&xh, argv[1])) == NULL)))
169-
exit(EXIT_FAILURE);
170-
171-
xbps_dictionary_get_cstring_nocopy(dict, "pkgver", &version);
172-
printf("%s\n", xbps_pkg_version(version));
167+
for (i = 1; i < argc; i++) {
168+
if ((((dict = xbps_pkgdb_get_pkg(&xh, argv[i])) == NULL)) &&
169+
(((dict = xbps_pkgdb_get_virtualpkg(&xh, argv[i])) == NULL))) {
170+
xbps_error_printf("Could not find package '%s'\n", argv[i]);
171+
rv = 1;
172+
} else {
173+
xbps_dictionary_get_cstring_nocopy(dict, "pkgver", &version);
174+
printf("%s\n", xbps_pkg_version(version));
175+
}
176+
}
173177
} else if (strcmp(argv[0], "real-version") == 0) {
174-
/* Prints version of an installed real package, not virtual */
175-
if (argc != 2)
178+
/* Prints version of installed real packages, not virtual */
179+
if (argc < 2)
176180
usage();
177181

178-
if ((dict = xbps_pkgdb_get_pkg(&xh, argv[1])) == NULL)
179-
exit(EXIT_FAILURE);
180-
181-
xbps_dictionary_get_cstring_nocopy(dict, "pkgver", &version);
182-
printf("%s\n", xbps_pkg_version(version));
182+
for (i = 1; i < argc; i++) {
183+
if ((dict = xbps_pkgdb_get_pkg(&xh, argv[i])) == NULL) {
184+
xbps_error_printf("Could not find package '%s'\n", argv[i]);
185+
rv = 1;
186+
} else {
187+
xbps_dictionary_get_cstring_nocopy(dict, "pkgver", &version);
188+
printf("%s\n", xbps_pkg_version(version));
189+
}
190+
}
183191
} else if (strcmp(argv[0], "getpkgversion") == 0) {
184-
/* Returns the version of a pkg string */
185-
if (argc != 2)
192+
/* Returns the version of pkg strings */
193+
if (argc < 2)
186194
usage();
187195

188-
version = xbps_pkg_version(argv[1]);
189-
if (version == NULL) {
190-
fprintf(stderr,
191-
"Invalid string, expected <string>-<version>_<revision>\n");
192-
exit(EXIT_FAILURE);
196+
for (i = 1; i < argc; i++) {
197+
version = xbps_pkg_version(argv[i]);
198+
if (version == NULL) {
199+
xbps_error_printf(
200+
"Invalid string '%s', expected <string>-<version>_<revision>\n", argv[i]);
201+
rv = 1;
202+
} else {
203+
printf("%s\n", version);
204+
}
193205
}
194-
printf("%s\n", version);
195206
} else if (strcmp(argv[0], "getpkgname") == 0) {
196-
/* Returns the name of a pkg string */
197-
if (argc != 2)
207+
/* Returns the name of pkg strings */
208+
if (argc < 2)
198209
usage();
199210

200-
if (!xbps_pkg_name(pkgname, sizeof(pkgname), argv[1])) {
201-
fprintf(stderr,
202-
"Invalid string, expected <string>-<version>_<revision>\n");
203-
exit(EXIT_FAILURE);
211+
for (i = 1; i < argc; i++) {
212+
if (!xbps_pkg_name(pkgname, sizeof(pkgname), argv[i])) {
213+
xbps_error_printf(
214+
"Invalid string '%s', expected <string>-<version>_<revision>\n", argv[i]);
215+
rv = 1;
216+
} else {
217+
printf("%s\n", pkgname);
218+
}
204219
}
205-
printf("%s\n", pkgname);
206220
} else if (strcmp(argv[0], "getpkgrevision") == 0) {
207-
/* Returns the revision of a pkg string */
208-
if (argc != 2)
221+
/* Returns the revision of pkg strings */
222+
if (argc < 2)
209223
usage();
210224

211-
version = xbps_pkg_revision(argv[1]);
212-
if (version == NULL)
213-
exit(EXIT_SUCCESS);
214-
215-
printf("%s\n", version);
225+
for (i = 1; i < argc; i++) {
226+
version = xbps_pkg_revision(argv[1]);
227+
if (version == NULL) {
228+
rv = 1;
229+
} else {
230+
printf("%s\n", version);
231+
}
232+
}
216233
} else if (strcmp(argv[0], "getpkgdepname") == 0) {
217-
/* Returns the pkgname of a dependency */
218-
if (argc != 2)
234+
/* Returns the pkgname of dependencies */
235+
if (argc < 2)
219236
usage();
220237

221-
if (!xbps_pkgpattern_name(pkgname, sizeof(pkgname), argv[1]))
222-
exit(EXIT_FAILURE);
223-
224-
printf("%s\n", pkgname);
238+
for (i = 1; i < argc; i++) {
239+
if (!xbps_pkgpattern_name(pkgname, sizeof(pkgname), argv[i])) {
240+
xbps_error_printf("Invalid string '%s', expected <string><comparator><version>\n", argv[i]);
241+
rv = 1;
242+
} else {
243+
printf("%s\n", pkgname);
244+
}
245+
}
225246
} else if (strcmp(argv[0], "getpkgdepversion") == 0) {
226-
/* returns the version of a package pattern dependency */
227-
if (argc != 2)
247+
/* returns the version of package pattern dependencies */
248+
if (argc < 2)
228249
usage();
229250

230-
version = xbps_pkgpattern_version(argv[1]);
231-
if (version == NULL)
232-
exit(EXIT_FAILURE);
233-
234-
printf("%s\n", version);
251+
for (i = 1; i < argc; i++) {
252+
version = xbps_pkgpattern_version(argv[i]);
253+
if (version == NULL) {
254+
xbps_error_printf("Invalid string '%s', expected <string><comparator><version>\n", argv[i]);
255+
rv = 1;
256+
} else {
257+
printf("%s\n", version);
258+
}
259+
}
235260
} else if (strcmp(argv[0], "binpkgver") == 0) {
236-
/* Returns the pkgver of a binpkg string */
237-
if (argc != 2)
261+
/* Returns the pkgver of binpkg strings */
262+
if (argc < 2)
238263
usage();
239264

240-
version = xbps_binpkg_pkgver(argv[1]);
241-
if (version == NULL) {
242-
fprintf(stderr,
243-
"Invalid string, expected <pkgname>-<version>_<revision>.<arch>.xbps\n");
244-
exit(EXIT_FAILURE);
265+
for (i = 1; i < argc; i++) {
266+
version = xbps_binpkg_pkgver(argv[i]);
267+
if (version == NULL) {
268+
xbps_error_printf(
269+
"Invalid string '%s', expected <pkgname>-<version>_<revision>.<arch>.xbps\n", argv[i]);
270+
rv = 1;
271+
} else {
272+
printf("%s\n", version);
273+
}
245274
}
246-
printf("%s\n", version);
247275
} else if (strcmp(argv[0], "binpkgarch") == 0) {
248-
/* Returns the arch of a binpkg string */
249-
if (argc != 2)
276+
/* Returns the arch of binpkg strings */
277+
if (argc < 2)
250278
usage();
251279

252-
version = xbps_binpkg_arch(argv[1]);
253-
if (version == NULL) {
254-
fprintf(stderr,
255-
"Invalid string, expected <pkgname>-<version>_<revision>.<arch>.xbps\n");
256-
exit(EXIT_FAILURE);
280+
for (i = 1; i < argc; i++) {
281+
version = xbps_binpkg_arch(argv[i]);
282+
if (version == NULL) {
283+
xbps_error_printf(
284+
"Invalid string '%s', expected <pkgname>-<version>_<revision>.<arch>.xbps\n", argv[i]);
285+
rv = 1;
286+
} else {
287+
printf("%s\n", version);
288+
}
257289
}
258-
printf("%s\n", version);
259290
} else if (strcmp(argv[0], "pkgmatch") == 0) {
260291
/* Matches a pkg with a pattern */
261292
if (argc != 3)
@@ -291,7 +322,7 @@ main(int argc, char **argv)
291322
if (argc < 2)
292323
usage();
293324

294-
for (int i = 1; i < argc; i++) {
325+
for (i = 1; i < argc; i++) {
295326
if (!xbps_file_sha256(sha256, sizeof sha256, argv[i])) {
296327
fprintf(stderr,
297328
"E: couldn't get hash for %s (%s)\n",
@@ -305,7 +336,7 @@ main(int argc, char **argv)
305336
if (argc < 2)
306337
usage();
307338

308-
for (int i = 1; i < argc; i++) {
339+
for (i = 1; i < argc; i++) {
309340
filename = fname(argv[i]);
310341
rv = xbps_fetch_file_dest(&xh, argv[i], filename, "v");
311342

0 commit comments

Comments
 (0)