Branch data Line data Source code
1 : : /*-
2 : : * Copyright (c) 2011-2012 Baptiste Daroussin <bapt@FreeBSD.org>
3 : : * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
4 : : * Copyright (c) 2011-2012 Marin Atanasov Nikolov <dnaeon@gmail.com>
5 : : * Copyright (c) 2014 Matthew Seaman <matthew@FreeBSD.org>
6 : : * All rights reserved.
7 : : *
8 : : * Redistribution and use in source and binary forms, with or without
9 : : * modification, are permitted provided that the following conditions
10 : : * are met:
11 : : * 1. Redistributions of source code must retain the above copyright
12 : : * notice, this list of conditions and the following disclaimer
13 : : * in this position and unchanged.
14 : : * 2. Redistributions in binary form must reproduce the above copyright
15 : : * notice, this list of conditions and the following disclaimer in the
16 : : * documentation and/or other materials provided with the distribution.
17 : : *
18 : : * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
19 : : * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 : : * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 : : * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
22 : : * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 : : * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 : : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 : : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 : : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 : : * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 : : */
29 : :
30 : : #include <sys/stat.h>
31 : : #include <sys/param.h>
32 : :
33 : : #include <err.h>
34 : : #include <getopt.h>
35 : : #include <stdio.h>
36 : : #include <stdlib.h>
37 : : #include <string.h>
38 : : #include <unistd.h>
39 : :
40 : : #include <pkg.h>
41 : :
42 : : #include "pkgcli.h"
43 : :
44 : : /**
45 : : * Fetch repository calalogues.
46 : : */
47 : : int
48 : 377 : pkgcli_update(bool force, bool strict, const char *reponame)
49 : : {
50 : 377 : int retcode = EPKG_FATAL, update_count = 0, total_count = 0;
51 : 377 : struct pkg_repo *r = NULL;
52 : :
53 : : /* Only auto update if the user has write access. */
54 [ - + - + ]: 754 : if (pkgdb_access(PKGDB_MODE_READ|PKGDB_MODE_WRITE|PKGDB_MODE_CREATE,
55 : 377 : PKGDB_DB_REPO) == EPKG_ENOACCESS)
56 : 0 : return (EPKG_OK);
57 : :
58 [ + + ]: 377 : if (pkg_repos_total_count() == 0) {
59 : 4 : fprintf(stderr, "No active remote repositories configured.\n");
60 : 4 : return (EPKG_FATAL);
61 : : }
62 : :
63 [ + + ]: 794 : while (pkg_repos(&r) == EPKG_OK) {
64 [ + + ]: 421 : if (reponame != NULL) {
65 [ + + ]: 18 : if (strcmp(pkg_repo_name(r), reponame) != 0)
66 : 5 : continue;
67 : 13 : } else {
68 [ + - ]: 403 : if (!pkg_repo_enabled(r))
69 : 0 : continue;
70 : : }
71 : :
72 [ + + ]: 416 : if (!quiet)
73 : 333 : printf("Updating %s repository catalogue...\n",
74 : 333 : pkg_repo_name(r));
75 : :
76 : 416 : retcode = pkg_update(r, force);
77 : :
78 [ + + ]: 416 : if (retcode == EPKG_UPTODATE) {
79 : 168 : retcode = EPKG_OK;
80 [ + + ]: 168 : if (!quiet) {
81 : 124 : printf("%s repository is up to date.\n",
82 : 124 : pkg_repo_name(r));
83 : 124 : }
84 : 168 : }
85 [ + + - + ]: 248 : else if (retcode != EPKG_OK && strict)
86 : 4 : retcode = EPKG_FATAL;
87 : :
88 [ + + ]: 416 : if (retcode == EPKG_OK) {
89 : 412 : update_count++;
90 : 412 : }
91 : :
92 : 416 : total_count ++;
93 : : }
94 : :
95 [ + - ]: 373 : if (total_count == 0) {
96 : 0 : retcode = EPKG_FATAL;
97 [ # # ]: 0 : if (!quiet) {
98 : 0 : printf("No repositories are enabled.\n");
99 : 0 : }
100 : 0 : }
101 [ + + ]: 373 : else if (update_count == total_count) {
102 [ + + ]: 369 : if (!quiet) {
103 : 286 : printf("All repositories are up to date.\n");
104 : 286 : }
105 : 369 : }
106 [ + - ]: 4 : else if (total_count == 1) {
107 [ - + ]: 4 : if (!quiet) {
108 : 4 : printf("Error updating repositories!\n");
109 : 4 : }
110 : 4 : }
111 : : else {
112 [ # # ]: 0 : if (!quiet) {
113 : 0 : printf("Error updating repositories!\n");
114 : 0 : }
115 [ # # ]: 0 : if (strict) {
116 : 0 : retcode = EPKG_FATAL;
117 : 0 : }
118 : : }
119 : :
120 : 373 : return (retcode);
121 : 377 : }
122 : :
123 : :
124 : : void
125 : 0 : usage_update(void)
126 : : {
127 : 0 : fprintf(stderr, "Usage: pkg update [-fq] [-r reponame]\n\n");
128 : 0 : fprintf(stderr, "For more information, see 'pkg help update'.\n");
129 : 0 : }
130 : :
131 : : int
132 : 69 : exec_update(int argc, char **argv)
133 : : {
134 : : int ret;
135 : : int ch;
136 : 69 : const char *reponame = NULL;
137 : :
138 : 69 : struct option longopts[] = {
139 : : { "force", no_argument, NULL, 'f' },
140 : : { "quiet", no_argument, NULL, 'q' },
141 : : { "repository", required_argument, NULL, 'r' },
142 : : { NULL, 0, NULL, 0 },
143 : : };
144 : :
145 [ + + ]: 98 : while ((ch = getopt_long(argc, argv, "+fqr:", longopts, NULL)) != -1) {
146 [ + - - - ]: 29 : switch (ch) {
147 : : case 'f':
148 : 29 : force = true;
149 : 29 : break;
150 : : case 'q':
151 : 0 : quiet = true;
152 : 0 : break;
153 : : case 'r':
154 : 0 : reponame = optarg;
155 : 0 : break;
156 : : default:
157 : 0 : usage_update();
158 : 0 : return (EXIT_FAILURE);
159 : : }
160 : : }
161 : 69 : argc -= optind;
162 : :
163 [ - + ]: 69 : if (argc != 0) {
164 : 0 : usage_update();
165 : 0 : return (EXIT_FAILURE);
166 : : }
167 : :
168 : 69 : ret = pkgdb_access(PKGDB_MODE_WRITE|PKGDB_MODE_CREATE,
169 : : PKGDB_DB_REPO);
170 [ - + ]: 69 : if (ret == EPKG_ENOACCESS) {
171 : 0 : warnx("Insufficient privileges to update the repository "
172 : : "catalogue.");
173 : 0 : return (EXIT_FAILURE);
174 [ + - ]: 69 : } else if (ret != EPKG_OK)
175 : 0 : return (EXIT_FAILURE);
176 : :
177 : : /* For pkg-update update op is strict */
178 : 69 : ret = pkgcli_update(force, true, reponame);
179 : :
180 : 69 : return ((ret == EPKG_OK) ? EXIT_SUCCESS : EXIT_FAILURE);
181 : 69 : }
|