<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <font face="Helvetica, Arial, sans-serif">diff --git
      a/src/virtBootstrap/virt_bootstrap.py
      b/src/virtBootstrap/virt_bootstrap.py<br>
      index dc7f9d7..0f733aa 100755<br>
      --- a/src/virtBootstrap/virt_bootstrap.py<br>
      +++ b/src/virtBootstrap/virt_bootstrap.py<br>
      @@ -317,8 +317,8 @@ def main():<br>
                   gid_map += parse_idmap(args.gidmap)<br>
       <br>
               # do the job here!<br>
      -        bootstrap(uri=args.uri,<br>
      -                  dest=args.dest,<br>
      +        bootstrap(uri=args.URI,<br>
      +                  dest=args.DEST,<br>
                         fmt=args.format,<br>
                         username=args.username,<br>
                         password=args.password,<br>
    </font><br>
    <br>
    <div class="moz-cite-prefix">On 17/08/17 10:39, Radostin Stoyanov
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:20170817094004.20791-20-rstoyanov1@gmail.com">
      <pre wrap="">---
 src/virtBootstrap/virt_bootstrap.py | 151 +++++++++++++++++++++++++++---------
 1 file changed, 114 insertions(+), 37 deletions(-)

diff --git a/src/virtBootstrap/virt_bootstrap.py b/src/virtBootstrap/virt_bootstrap.py
index 50fb604..dc7f9d7 100755
--- a/src/virtBootstrap/virt_bootstrap.py
+++ b/src/virtBootstrap/virt_bootstrap.py
@@ -174,6 +174,7 @@ def set_logging_conf(loglevel=None):
 def main():
     parser = argparse.ArgumentParser(
         description=_("Container bootstrapping tool"),
+        conflict_handler='resolve',
         formatter_class=argparse.RawDescriptionHelpFormatter,
         epilog=dedent(_('''
                             Example supported URI formats:
@@ -187,43 +188,119 @@ def main():
                             ----------------------------------------
 
                         ''')))
-    parser.add_argument("uri",
-                        help=_("URI of container image"))
-    parser.add_argument("dest",
-                        help=_("Destination folder"))
-    parser.add_argument("--not-secure", action='store_true',
-                        help=_("Ignore HTTPS errors"))
-    parser.add_argument("-u", "--username", default=None,
-                        help=_("Username for accessing the source registry"))
-    parser.add_argument("-p", "--password", default=None,
-                        help=_("Password for accessing the source registry"))
-    parser.add_argument("--root-password", default=None,
-                        help=_("Set root password"))
-    parser.add_argument("--uidmap", default=None, action='append',
-                        metavar="<start>:<target>:<count>",
-                        help=_("Map UIDs"))
-    parser.add_argument("--gidmap", default=None, action='append',
-                        metavar="<start>:<target>:<count>",
-                        help=_("Map GIDs"))
-    parser.add_argument("--idmap", default=None, action='append',
-                        metavar="<start>:<target>:<count>",
-                        help=_("Map both UIDs/GIDs"))
-    parser.add_argument("--no-cache", action="store_true",
-                        help=_("Do not store downloaded Docker images"))
-    parser.add_argument("-f", "--format", default=utils.DEFAULT_OUTPUT_FORMAT,
-                        choices=['dir', 'qcow2'],
-                        help=_("Format to be used for the root filesystem"))
-    parser.add_argument("-d", "--debug", action="store_const", dest="loglevel",
-                        const=logging.DEBUG, help=_("Show debug messages"))
-    parser.add_argument("-q", "--quiet", action="store_const", dest="loglevel",
-                        const=logging.WARNING,
-                        help=_("Don't print progress messages"))
-    parser.add_argument("--status-only", action="store_const",
-                        const=utils.write_progress,
-                        help=_("Show only progress information"))
-    parser.add_argument('--version', action='version',
-                        version='%(prog)s ' + __version__,
-                        help=_("Print the version"))
+
+    # pylint: disable=protected-access
+    parser._positionals.title = 'ARGUMENTS'
+    parser._optionals.title = 'OPTIONS'
+
+    parser.add_argument(
+        "URI", help=_("URI of container image")
+    )
+    parser.add_argument(
+        "DEST", help=_("Destination folder")
+    )
+    parser.add_argument(
+        '--version',
+        help=_("Print the version"),
+        action='version',
+        version='%(prog)s ' + __version__
+    )
+    parser.add_argument(
+        "-f", "--format",
+        help=_('Output format of the root filesystem. '
+               'Allowed values are "dir" (default) and "qcow2".'),
+        default=utils.DEFAULT_OUTPUT_FORMAT,
+        choices=['dir', 'qcow2'],
+        metavar=''
+    )
+    parser.add_argument(
+        "--root-password",
+        help=_("Set root password"),
+        default=None,
+        metavar=''
+    )
+    parser.add_argument(
+        "--no-cache",
+        help=_("Do not store downloaded Docker images"),
+        action="store_true"
+    )
+    parser.add_argument(
+        "-d", "--debug",
+        help=_("Show debug messages"),
+        action="store_const",
+        dest="loglevel",
+        const=logging.DEBUG
+    )
+    parser.add_argument(
+        "-q", "--quiet",
+        help=_("Don't print progress messages"),
+        action="store_const",
+        dest="loglevel",
+        const=logging.WARNING
+    )
+    parser.add_argument(
+        "--status-only",
+        help=_("Show only progress information"),
+        action="store_const",
+        const=utils.write_progress
+    )
+
+    # Authentication arguments
+    auth_group = parser.add_argument_group(
+        title='AUTHENTICATION',
+        description='Credentials used to authenticte to '
+                    'Docker source registry.'
+    )
+    auth_group.add_argument(
+        "-u", "--username",
+        help=_("Use USERNAME to access source registry"),
+        default=None,
+        metavar='USERNAME'
+    )
+    auth_group.add_argument("-u", help="", default=None, metavar='USERNAME')
+    auth_group.add_argument(
+        "-p", "--password",
+        help=_("Use PASSWORD to access source registry"),
+        default=None,
+        metavar='PASSWORD'
+    )
+    auth_group.add_argument("-p", help="", default=None, metavar='PASSWORD')
+    auth_group.add_argument(
+        "--not-secure",
+        help=_("Ignore HTTPS errors"),
+        action='store_true'
+    )
+
+    # Ownership mapping arguments
+    idmap_group = parser.add_argument_group(
+        title='UID/GID mapping',
+        description='Remapping ownership of all files inside rootfs.\n'
+        'These arguments can be specified multiple times.\n'
+        'Format:\t<start>:<target>:<count>\n'
+        'Example:\t--idmap 500:1500:10 --idmap 0:1000:10'
+    )
+    idmap_group.add_argument(
+        "--uidmap",
+        help=_("Map UIDs"),
+        default=None,
+        action='append',
+        metavar=''
+    )
+    idmap_group.add_argument(
+        "--gidmap",
+        help=_("Map GIDs"),
+        default=None,
+        action='append',
+        metavar=''
+    )
+    idmap_group.add_argument(
+        "--idmap",
+        help=_("Map both UIDs/GIDs"),
+        default=None,
+        action='append',
+        metavar=''
+    )
+
 
     try:
         args = parser.parse_args()
</pre>
    </blockquote>
    <br>
  </body>
</html>