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 <[email protected]>
---
 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


Reply via email to