[pacman-dev] [PATCH 4/4] CLI args: update --help and manpage
Xavier Chantry
chantry.xavier at gmail.com
Sun Oct 10 15:06:20 EDT 2010
The three parts (help, manpage and code) are now organized in the same
way and much easier to compare :
- specific options
- install/upgrade options for -S and -U
- transaction options for -S -R and -U
- global options
After this re-organization, it was easy to update and sync the three
components together. Duplication is also avoided.
Signed-off-by: Xavier Chantry <chantry.xavier at gmail.com>
---
doc/pacman.8.txt | 110 ++++++++++++++++------------------
src/pacman/pacman.c | 164 +++++++++++++++++++++++++--------------------------
2 files changed, 133 insertions(+), 141 deletions(-)
diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 4a936c8..f389dfd 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -104,35 +104,12 @@ to determine which packages need upgrading. This behavior operates as follows:
Options
-------
-*\--asdeps*::
- Install packages non-explicitly; in other words, fake their install reason
- to be installed as a dependency. This is useful for makepkg and other
- build from source tools that need to install dependencies before building
- the package.
-
-*\--asexplicit*::
- Install packages explicitly; in other words, fake their install reason to
- be explicitly installed. This is useful if you want to mark a dependency
- as explicitly installed so it will not be removed by the '\--recursive'
- remove operation.
-
*-b, \--dbpath* <'path'>::
Specify an alternative database location (a typical default is
``/var/lib/pacman''). This should not be used unless you know what you are
doing. *NOTE*: if specified, this is an absolute path and the root path is
not automatically prepended.
-*-d, \--nodeps*::
- Skips all dependency checks. Normally, pacman will always check a
- package's dependency fields to ensure that all dependencies are
- installed and there are no package conflicts in the system.
-
-*-f, \--force*::
- Bypass file conflict checks and overwrite conflicting files. If the
- package that is about to be installed contains files that are already
- installed, this option will cause all those files to be overwritten.
- This option should be used with care, ideally not at all.
-
*-r, \--root* <'path'>::
Specify an alternative installation root (default is ``/''). This should
not be used as a way to install software into ``/usr/local'' instead of
@@ -145,9 +122,8 @@ Options
*-v, \--verbose*::
Output paths such as as the Root, Conf File, DB Path, Cache Dirs, etc.
-*\--debug*::
- Display debug messages. When reporting bugs, this option is recommended
- to be used.
+*\--arch* <'arch'>::
+ Specify an alternate architecture.
*\--cachedir* <'dir'>::
Specify an alternative package cache location (a typical default is
@@ -158,15 +134,9 @@ Options
*\--config* <'file'>::
Specify an alternate configuration file.
-*\--ignore* <'package'>::
- Directs pacman to ignore upgrades of package even if there is one
- available. Multiple packages can be specified by separating them
- with a comma.
-
-*\--ignoregroup* <'group'>::
- Directs pacman to ignore upgrades of all packages in 'group' even if
- there is one available. Multiple groups can be specified by
- separating them with a comma.
+*\--debug*::
+ Display debug messages. When reporting bugs, this option is recommended
+ to be used.
*\--logfile* <'file'>::
Specify an alternate log file. This is an absolute path, regardless of
@@ -176,6 +146,18 @@ Options
Bypass any and all ``Are you sure?'' messages. It's not a good idea to do
this unless you want to run pacman from a script.
+Transaction Options (apply to '-S', '-R' and '-U')
+--------------------------------------------------
+*-d, \--nodeps*::
+ Skips all dependency checks. Normally, pacman will always check a
+ package's dependency fields to ensure that all dependencies are
+ installed and there are no package conflicts in the system.
+
+*-k, \--dbonly*::
+ Adds/Removes the database entry only, leaves all files in place.
+ On an upgrade operation, the existing package and all files
+ will be removed and the database entry for the new package will be added.
+
*\--noprogressbar*::
Do not show a progress bar when downloading files. This can be useful
for scripts that call pacman and capture the output.
@@ -184,19 +166,46 @@ Options
If an install scriptlet exists, do not execute it. Do not use this
unless you know what you are doing.
-*\--arch* <'arch'>::
- Specify an alternate architecture.
-
*-p, \--print*::
Only print the targets instead of performing the actual operation (sync,
- remove or upgrade). Use '\--print-format' to specify how targets are
- displayed. The default format string is "%l", which displays url with '-S',
- filename with '-U' and pkgname-pkgver with '-R'.
+ remove or upgrade). Use '\--print-format' to specify how targets are
+ displayed. The default format string is "%l", which displays url with
+ '-S', filename with '-U' and pkgname-pkgver with '-R'.
*\--print-format* <'format'>::
Specify a printf-like format to control the output of the '\--print'
- operation. The possible are attributes are : %n for pkgname, %v for pkgver, %l
- for location, %r for repo and %s for size.
+ operation. The possible are attributes are : %n for pkgname, %v for pkgver,
+ %l for location, %r for repo and %s for size.
+
+Upgrade Options (apply to 'S' and 'U')[[UO]]
+--------------------------------------------
+*-f, \--force*::
+ Bypass file conflict checks and overwrite conflicting files. If the
+ package that is about to be installed contains files that are already
+ installed, this option will cause all those files to be overwritten.
+ This option should be used with care, ideally not at all.
+
+*\--asdeps*::
+ Install packages non-explicitly; in other words, fake their install reason
+ to be installed as a dependency. This is useful for makepkg and other
+ build from source tools that need to install dependencies before building
+ the package.
+
+*\--asexplicit*::
+ Install packages explicitly; in other words, fake their install reason to
+ be explicitly installed. This is useful if you want to mark a dependency
+ as explicitly installed so it will not be removed by the '\--recursive'
+ remove operation.
+
+*\--ignore* <'package'>::
+ Directs pacman to ignore upgrades of package even if there is one
+ available. Multiple packages can be specified by separating them
+ with a comma.
+
+*\--ignoregroup* <'group'>::
+ Directs pacman to ignore upgrades of all packages in 'group' even if
+ there is one available. Multiple groups can be specified by
+ separating them with a comma.
Query Options[[QO]]
-------------------
@@ -284,9 +293,6 @@ Remove Options[[RO]]
or more target packages. This operation is recursive, and must be used
with care since it can remove many potentially needed packages.
-*-k, \--dbonly*::
- Removes the database entry only. Leaves all files in place.
-
*-n, \--nosave*::
Instructs pacman to ignore file backup designations. Normally, when a
file is removed from the system the database is checked to see if the
@@ -331,10 +337,6 @@ linkman:pacman.conf[5].
or '-i' flags will also display those packages in all repositories that
depend on this package.
-*-k, \--dbonly*::
- Adds the database entries for the specified packages but does not install any
- of the files.
-
*-l, \--list*::
List all packages in the specified repositories. Multiple repositories
can be specified on the command line.
@@ -380,14 +382,6 @@ linkman:pacman.conf[5].
Don't reinstall the targets that are already up-to-date.
-Upgrade Options[[UO]]
---------------------
-*-k, \--dbonly*::
- Adds the database entries for the specified packages but does not install any
- of the files. On an upgrade operation, the existing package and all files
- will be removed and the database entry for the new package will be added.
-
-
Handling Config Files[[HCF]]
----------------------------
Pacman uses the same logic as rpm to determine action against files that are
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 15abecc..933698e 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -90,26 +90,14 @@ static void usage(int op, const char * const myname)
printf("%s: %s {-R --remove} [%s] <%s>\n", str_usg, myname, str_opt, str_pkg);
printf("%s:\n", str_opt);
printf(_(" -c, --cascade remove packages and all packages that depend on them\n"));
- printf(_(" -d, --nodeps skip dependency checks\n"));
printf(_(" -k, --dbonly only remove database entries, do not remove files\n"));
printf(_(" -n, --nosave remove configuration files as well\n"));
printf(_(" -s, --recursive remove dependencies also (that won't break packages)\n"
" (-ss includes explicitly installed dependencies too)\n"));
printf(_(" -u, --unneeded remove unneeded packages (that won't break packages)\n"));
- printf(_(" --print only print the targets instead of performing the operation\n"));
- printf(_(" --print-format <string>\n"
- " specify how the targets should be printed\n"));
} else if(op == PM_OP_UPGRADE) {
printf("%s: %s {-U --upgrade} [%s] <%s>\n", str_usg, myname, str_opt, str_file);
printf("%s:\n", str_opt);
- printf(_(" --asdeps install packages as non-explicitly installed\n"));
- printf(_(" --asexplicit install packages as explicitly installed\n"));
- printf(_(" -d, --nodeps skip dependency checks\n"));
- printf(_(" -f, --force force install, overwrite conflicting files\n"));
- printf(_(" -k, --dbonly add database entries, do not install or keep existing files\n"));
- printf(_(" --print only print the targets instead of performing the operation\n"));
- printf(_(" --print-format <string>\n"
- " specify how the targets should be printed\n"));
} else if(op == PM_OP_QUERY) {
printf("%s: %s {-Q --query} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg);
printf("%s:\n", str_opt);
@@ -123,50 +111,59 @@ static void usage(int op, const char * const myname)
printf(_(" -m, --foreign list installed packages not found in sync db(s) [filter]\n"));
printf(_(" -o, --owns <file> query the package that owns <file>\n"));
printf(_(" -p, --file <package> query a package file instead of the database\n"));
+ printf(_(" -q, --quiet show less information for query and search\n"));
printf(_(" -s, --search <regex> search locally-installed packages for matching strings\n"));
printf(_(" -t, --unrequired list packages not required by any package [filter]\n"));
printf(_(" -u, --upgrades list outdated packages [filter]\n"));
- printf(_(" -q, --quiet show less information for query and search\n"));
} else if(op == PM_OP_SYNC) {
printf("%s: %s {-S --sync} [%s] [%s]\n", str_usg, myname, str_opt, str_pkg);
printf("%s:\n", str_opt);
- printf(_(" --asdeps install packages as non-explicitly installed\n"));
- printf(_(" --asexplicit install packages as explicitly installed\n"));
printf(_(" -c, --clean remove old packages from cache directory (-cc for all)\n"));
- printf(_(" -d, --nodeps skip dependency checks\n"));
- printf(_(" -f, --force force install, overwrite conflicting files\n"));
printf(_(" -g, --groups view all members of a package group\n"));
printf(_(" -i, --info view package information\n"));
printf(_(" -l, --list <repo> view a list of packages in a repo\n"));
+ printf(_(" -q, --quiet show less information for query and search\n"));
printf(_(" -s, --search <regex> search remote repositories for matching strings\n"));
printf(_(" -u, --sysupgrade upgrade installed packages (-uu allows downgrade)\n"));
printf(_(" -w, --downloadonly download packages but do not install/upgrade anything\n"));
printf(_(" -y, --refresh download fresh package databases from the server\n"));
printf(_(" --needed don't reinstall up to date packages\n"));
- printf(_(" --ignore <pkg> ignore a package upgrade (can be used more than once)\n"));
- printf(_(" --ignoregroup <grp>\n"
- " ignore a group upgrade (can be used more than once)\n"));
- printf(_(" --print only print the targets instead of performing the operation\n"));
- printf(_(" --print-format <string>\n"
- " specify how the targets should be printed\n"));
- printf(_(" -q, --quiet show less information for query and search\n"));
} else if (op == PM_OP_DATABASE) {
printf("%s: %s {-D --database} <%s> <%s>\n", str_usg, myname, str_opt, str_pkg);
printf("%s:\n", str_opt);
printf(_(" --asdeps mark packages as non-explicitly installed\n"));
printf(_(" --asexplicit mark packages as explicitly installed\n"));
}
+ switch(op) {
+ case PM_OP_SYNC:
+ case PM_OP_UPGRADE:
+ printf(_(" -f, --force force install, overwrite conflicting files\n"));
+ printf(_(" -k, --dbonly add database entries, do not install or keep existing files\n"));
+ printf(_(" --asdeps install packages as non-explicitly installed\n"));
+ printf(_(" --asexplicit install packages as explicitly installed\n"));
+ printf(_(" --ignore <pkg> ignore a package upgrade (can be used more than once)\n"));
+ printf(_(" --ignoregroup <grp>\n"
+ " ignore a group upgrade (can be used more than once)\n"));
+ /* pass through */
+ case PM_OP_REMOVE:
+ printf(_(" -d, --nodeps skip dependency checks\n"));
+ printf(_(" --noprogressbar do not show a progress bar when downloading files\n"));
+ printf(_(" --noscriptlet do not execute the install scriptlet if one exists\n"));
+ printf(_(" --print only print the targets instead of performing the operation\n"));
+ printf(_(" --print-format <string>\n"
+ " specify how the targets should be printed\n"));
+ break;
+ }
+
+ printf(_(" -b, --dbpath <path> set an alternate database location\n"));
+ printf(_(" -r, --root <path> set an alternate installation root\n"));
+ printf(_(" -v, --verbose be verbose\n"));
+ printf(_(" --arch <arch> set an alternate architecture\n"));
+ printf(_(" --cachedir <dir> set an alternate package cache location\n"));
printf(_(" --config <path> set an alternate configuration file\n"));
+ printf(_(" --debug display debug messages\n"));
printf(_(" --logfile <path> set an alternate log file\n"));
printf(_(" --noconfirm do not ask for any confirmation\n"));
- printf(_(" --noprogressbar do not show a progress bar when downloading files\n"));
- printf(_(" --noscriptlet do not execute the install scriptlet if one exists\n"));
- printf(_(" -v, --verbose be verbose\n"));
- printf(_(" --debug display debug messages\n"));
- printf(_(" -r, --root <path> set an alternate installation root\n"));
- printf(_(" -b, --dbpath <path> set an alternate database location\n"));
- printf(_(" --cachedir <dir> set an alternate package cache location\n"));
- printf(_(" --arch <arch> set an alternate architecture\n"));
}
}
@@ -505,17 +502,31 @@ static int parsearg_query(int opt)
return(0);
}
-static int parsearg_remove(int opt)
+/* options common to -S -R -U */
+static int parsearg_trans(int opt)
{
switch(opt) {
+ case 'd': config->flags |= PM_TRANS_FLAG_NODEPS; break;
+ case 'k': config->flags |= PM_TRANS_FLAG_DBONLY; break;
case OP_NOPROGRESSBAR: config->noprogressbar = 1; break;
case OP_NOSCRIPTLET: config->flags |= PM_TRANS_FLAG_NOSCRIPTLET; break;
- case OP_PRINTFORMAT: check_optarg(); config->print_format = strdup(optarg); break;
+ case 'p': config->print = 1; break;
+ case OP_PRINTFORMAT:
+ check_optarg();
+ config->print_format = strdup(optarg);
+ break;
+ default: return(1);
+ }
+ return(0);
+}
+
+static int parsearg_remove(int opt)
+{
+ if (parsearg_trans(opt) == 0)
+ return(0);
+ switch(opt) {
case 'c': config->flags |= PM_TRANS_FLAG_CASCADE; break;
- case 'd': config->flags |= PM_TRANS_FLAG_NODEPS; break;
- case 'k': config->flags |= PM_TRANS_FLAG_DBONLY; break;
case 'n': config->flags |= PM_TRANS_FLAG_NOSAVE; break;
- case 'p': config->print = 1; break;
case 's':
if(config->flags & PM_TRANS_FLAG_RECURSE) {
config->flags |= PM_TRANS_FLAG_RECURSEALL;
@@ -529,25 +540,36 @@ static int parsearg_remove(int opt)
return(0);
}
-static int parsearg_sync(int opt)
+/* options common to -S -U */
+static int parsearg_upgrade(int opt)
{
+ if (parsearg_trans(opt) == 0)
+ return(0);
switch(opt) {
+ case 'f': config->flags |= PM_TRANS_FLAG_FORCE; break;
case OP_ASDEPS: config->flags |= PM_TRANS_FLAG_ALLDEPS; break;
case OP_ASEXPLICIT: config->flags |= PM_TRANS_FLAG_ALLEXPLICIT; break;
- case OP_IGNORE: parsearg_util_addlist(alpm_option_add_ignorepkg); break;
- case OP_IGNOREGROUP: parsearg_util_addlist(alpm_option_add_ignoregrp); break;
+ case OP_IGNORE:
+ parsearg_util_addlist(alpm_option_add_ignorepkg);
+ break;
+ case OP_IGNOREGROUP:
+ parsearg_util_addlist(alpm_option_add_ignoregrp);
+ break;
+ default: return(1);
+ }
+ return(0);
+}
+
+static int parsearg_sync(int opt)
+{
+ if (parsearg_upgrade(opt) == 0)
+ return(0);
+ switch(opt) {
case OP_NEEDED: config->flags |= PM_TRANS_FLAG_NEEDED; break;
- case OP_NOPROGRESSBAR: config->noprogressbar = 1; break;
- case OP_NOSCRIPTLET: config->flags |= PM_TRANS_FLAG_NOSCRIPTLET; break;
- case OP_PRINTFORMAT: check_optarg(); config->print_format = strdup(optarg); break;
case 'c': (config->op_s_clean)++; break;
- case 'd': config->flags |= PM_TRANS_FLAG_NODEPS; break;
- case 'f': config->flags |= PM_TRANS_FLAG_FORCE; break;
case 'g': (config->group)++; break;
case 'i': (config->op_s_info)++; break;
case 'l': config->op_q_list = 1; break;
- case 'k': config->flags |= PM_TRANS_FLAG_DBONLY; break;
- case 'p': config->print = 1; break;
case 'q': config->quiet = 1; break;
case 's': config->op_s_search = 1; break;
case 'u': (config->op_s_upgrade)++; break;
@@ -562,33 +584,6 @@ static int parsearg_sync(int opt)
return(0);
}
-static int parsearg_deptest(int opt)
-{
- switch(opt) {
- default: return(1);
- }
- return(0);
-}
-
-static int parsearg_upgrade(int opt)
-{
- switch(opt) {
- case OP_ASDEPS: config->flags |= PM_TRANS_FLAG_ALLDEPS; break;
- case OP_ASEXPLICIT: config->flags |= PM_TRANS_FLAG_ALLEXPLICIT; break;
- case OP_IGNORE: parsearg_util_addlist(alpm_option_add_ignorepkg); break;
- case OP_IGNOREGROUP: parsearg_util_addlist(alpm_option_add_ignoregrp); break;
- case OP_NOPROGRESSBAR: config->noprogressbar = 1; break;
- case OP_NOSCRIPTLET: config->flags |= PM_TRANS_FLAG_NOSCRIPTLET; break;
- case OP_PRINTFORMAT: check_optarg(); config->print_format = strdup(optarg); break;
- case 'd': config->flags |= PM_TRANS_FLAG_NODEPS; break;
- case 'f': config->flags |= PM_TRANS_FLAG_FORCE; break;
- case 'k': config->flags |= PM_TRANS_FLAG_DBONLY; break;
- case 'p': config->print = 1; break;
- default: return(1);
- }
- return(0);
-}
-
/** Parse command-line arguments for each operation.
* @param argc argc
* @param argv argv
@@ -664,6 +659,7 @@ static int parseargs(int argc, char *argv[])
} else if(opt == 0) {
continue;
} else if(opt == '?') {
+ /* unknown option, getopt printed an error */
return(1);
}
parsearg_op(opt, 0);
@@ -685,12 +681,12 @@ static int parseargs(int argc, char *argv[])
/* parse all other options */
optind = 1;
while((opt = getopt_long(argc, argv, optstring, opts, &option_index))) {
-
if(opt < 0) {
break;
} else if(opt == 0) {
continue;
} else if(opt == '?') {
+ /* this should have failed during first pass already */
return(1);
} else if(parsearg_op(opt, 1) == 0) { /* opt is an operation */
continue;
@@ -710,22 +706,24 @@ static int parseargs(int argc, char *argv[])
result = parsearg_sync(opt);
break;
case PM_OP_DEPTEST:
- result = parsearg_deptest(opt);
+ result = 1;
break;
case PM_OP_UPGRADE:
result = parsearg_upgrade(opt);
break;
default:
+ pm_printf(PM_LOG_ERROR, _("no operation specified (use -h for help)\n"));
return(1);
}
+ if (result == 0)
+ continue;
+
+ /* fall back to global options */
+ result = parsearg_global(opt);
if(result != 0) {
- /* operation-specific option parsing failed, fall back to global options */
- result = parsearg_global(opt);
- if(result != 0) {
- /* global option parsing failed, abort */
- pm_printf(PM_LOG_ERROR, _("invalid option\n"));
- return(result);
- }
+ /* global option parsing failed, abort */
+ pm_printf(PM_LOG_ERROR, _("invalid option\n"));
+ return(result);
}
}
--
1.7.3.1
More information about the pacman-dev
mailing list