Example #1
0
def wstool_main(argv=None, usage=None):
    """
    Calls the function corresponding to the first argument.

    :param argv: sys.argv by default
    :param usage: function printing usage string, multiproject_cli.list_usage by default
    """
    if argv is None:
        argv = sys.argv
    if (sys.argv[0] == '-c'):
        sys.argv = [_PROGNAME] + sys.argv[1:]
    if '--version' in argv:
        print("%s: \t%s\n%s" % (_PROGNAME,
                                wstool.__version__.version,
                                multiproject_cmd.cmd_version()))
        sys.exit(0)

    if not usage:
        usage = lambda: print(list_usage(progname=_PROGNAME,
                                         description=__doc__,
                                         command_keys=__MULTIPRO_CMD_HELP_LIST__,
                                         command_helps=__MULTIPRO_CMD_DICT__,
                                         command_aliases=__MULTIPRO_CMD_ALIASES__))
    workspace = None
    if len(argv) < 2:
        try:
            workspace = get_workspace(argv,
                                      os.getcwd(),
                                      config_filename=ROSINSTALL_FILENAME)
            argv.append('info')
        except MultiProjectException as e:
            print(str(e))
            usage()
            return 0

    if argv[1] in ['--help', '-h']:
        usage()
        return 0

    try:
        command = argv[1]
        args = argv[2:]

        if command == 'help':
            if len(argv) < 3:
                usage()
                return 0

            else:
                command = argv[2]
                args = argv[3:]
                args.insert(0, "--help")
                # help help
                if command == 'help':
                    usage()
                    return 0
        cli = WstoolCLI(progname=_PROGNAME)

        # commands for which we do not infer target workspace
        commands = {'init': cli.cmd_init}
        # commands which work on a workspace
        ws_commands = {
            'info': cli.cmd_info,
            'remove': cli.cmd_remove,
            'set': cli.cmd_set,
            'merge': cli.cmd_merge,
            'diff': cli.cmd_diff,
            'status': cli.cmd_status,
            'update': cli.cmd_update}
        for label in list(ws_commands.keys()):
            if label in __MULTIPRO_CMD_ALIASES__:
                ws_commands[__MULTIPRO_CMD_ALIASES__[label]] = ws_commands[label]

        if command not in commands and command not in ws_commands:
            if os.path.exists(command):
                args = ['-t', command] + args
                command = 'info'
            else:
                if command.startswith('-'):
                    print("First argument must be name of a command: %s" % command)
                else:
                    print("Error: unknown command: %s" % command)
                usage()
                return 1

        if command in commands:
            return commands[command](args)
        else:
            if workspace is None and not '--help' in args and not '-h' in args:
                workspace = get_workspace(args,
                                          os.getcwd(),
                                          config_filename=ROSINSTALL_FILENAME)
            return ws_commands[command](workspace, args)

    except KeyboardInterrupt:
        return 1
Example #2
0
def wstool_main(argv=None, usage=None):
    """
    Calls the function corresponding to the first argument.

    :param argv: sys.argv by default
    :param usage: function printing usage string, multiproject_cli.list_usage by default
    """
    if argv is None:
        argv = sys.argv
    if (sys.argv[0] == '-c'):
        sys.argv = [_PROGNAME] + sys.argv[1:]
    if '--version' in argv:
        print("%s: \t%s\n%s" % (_PROGNAME, wstool.__version__.version,
                                multiproject_cmd.cmd_version()))
        sys.exit(0)

    if not usage:
        usage = lambda: print(
            list_usage(progname=_PROGNAME,
                       description=__doc__,
                       command_keys=__MULTIPRO_CMD_HELP_LIST__,
                       command_helps=__MULTIPRO_CMD_DICT__,
                       command_aliases=__MULTIPRO_CMD_ALIASES__))
    workspace = None
    if len(argv) < 2:
        try:
            workspace = get_workspace(argv,
                                      os.getcwd(),
                                      config_filename=ROSINSTALL_FILENAME)
            argv.append('info')
        except MultiProjectException as e:
            print(str(e))
            usage()
            return 0

    if argv[1] in ['--help', '-h']:
        usage()
        return 0

    try:
        command = argv[1]
        args = argv[2:]

        if command == 'help':
            if len(argv) < 3:
                usage()
                return 0

            else:
                command = argv[2]
                args = argv[3:]
                args.insert(0, "--help")
                # help help
                if command == 'help':
                    usage()
                    return 0
        cli = WstoolCLI(progname=_PROGNAME)

        # commands for which we do not infer target workspace
        commands = {'init': cli.cmd_init}
        # commands which work on a workspace
        ws_commands = {
            'info': cli.cmd_info,
            'remove': cli.cmd_remove,
            'set': cli.cmd_set,
            'merge': cli.cmd_merge,
            'export': cli.cmd_export,
            'diff': cli.cmd_diff,
            'foreach': cli.cmd_foreach,
            'scrape': cli.cmd_scrape,
            'status': cli.cmd_status,
            'update': cli.cmd_update
        }
        for label in list(ws_commands.keys()):
            if label in __MULTIPRO_CMD_ALIASES__:
                ws_commands[
                    __MULTIPRO_CMD_ALIASES__[label]] = ws_commands[label]

        if command not in commands and command not in ws_commands:
            if os.path.exists(command):
                args = ['-t', command] + args
                command = 'info'
            else:
                if command.startswith('-'):
                    print("First argument must be name of a command: %s" %
                          command)
                else:
                    print("Error: unknown command: %s" % command)
                usage()
                return 1

        if command in commands:
            return commands[command](args)
        else:
            if workspace is None and not '--help' in args and not '-h' in args:
                workspace = get_workspace(args,
                                          os.getcwd(),
                                          config_filename=ROSINSTALL_FILENAME)
            return ws_commands[command](workspace, args)

    except KeyboardInterrupt:
        return 1
Example #3
0
def rosinstall_main(argv):
    if len(argv) < 2:
        usage()
    args = argv[1:]
    parser = OptionParser(
        usage=
        "usage: rosinstall [OPTIONS] INSTALL_PATH [ROSINSTALL FILES OR DIRECTORIES]\n\n\
rosinstall does the following:\n\
  1. Merges all URIs into new or existing .rosinstall file at PATH\n\
  2. Checks out or updates all version controlled URIs\n\
  3. If ros stack is installed from source, calls rosmake after checkout or updates.\n\
  4. Generates/overwrites updated setup files\n\n\
If running with --catkin mode:\
  1. Merges all URIs into new or existing .rosinstall file at PATH\n\
  2. Checks out or updates all version controlled URIs\n\
  4. Generates/overwrites updated setup files and creates CMakeLists.txt at the root.\n\n\
URIs can be web urls to remote .rosinstall files, local .rosinstall files,\n\
git, svn, bzr, hg URIs, or other (local directories)\n\
Later URIs will shadow packages of earlier URIs.\n",
        epilog="See: http://www.ros.org/wiki/rosinstall for details\n")
    parser.add_option("-c",
                      "--catkin",
                      dest="catkin",
                      default=False,
                      help="Declare this is a catkin build.",
                      action="store_true")
    parser.add_option(
        "--cmake-prefix-path",
        dest="catkinpp",
        default=None,
        help="Where to set the CMAKE_PREFIX_PATH, implies --catkin",
        action="store")
    parser.add_option("--version",
                      dest="version",
                      default=False,
                      help="display version information",
                      action="store_true")
    parser.add_option("--verbose",
                      dest="verbose",
                      default=False,
                      help="display more information",
                      action="store_true")
    parser.add_option("-n",
                      "--nobuild",
                      dest="nobuild",
                      default=False,
                      help="skip the build step for the ROS stack",
                      action="store_true")
    parser.add_option("--rosdep-yes",
                      dest="rosdep_yes",
                      default=False,
                      help="Pass through --rosdep-yes to rosmake",
                      action="store_true")
    parser.add_option("--continue-on-error",
                      dest="robust",
                      default=False,
                      help="Continue despite checkout errors",
                      action="store_true")
    parser.add_option(
        "--delete-changed-uris",
        dest="delete_changed",
        default=False,
        help="Delete the local copy of a directory before changing uri.",
        action="store_true")
    parser.add_option("--abort-changed-uris",
                      dest="abort_changed",
                      default=False,
                      help="Abort if changed uri detected",
                      action="store_true")
    parser.add_option(
        "--backup-changed-uris",
        dest="backup_changed",
        default='',
        help=
        "backup the local copy of a directory before changing uri to this directory.",
        action="store")
    parser.add_option("--diff",
                      dest="vcs_diff",
                      default=False,
                      help="shows a combined diff over all SCM entries",
                      action="store_true")
    parser.add_option(
        "--status",
        dest="vcs_status",
        default=False,
        help="shows a combined status command over all SCM entries",
        action="store_true")
    parser.add_option(
        "--status-untracked",
        dest="vcs_status_untracked",
        default=False,
        help=
        "shows a combined status command over all SCM entries, also showing untracked files",
        action="store_true")
    parser.add_option("-j",
                      "--parallel",
                      dest="jobs",
                      default=1,
                      help="How many parallel threads to use for installing",
                      action="store")
    parser.add_option("--generate-versioned-rosinstall",
                      dest="generate_versioned",
                      default=None,
                      help="generate a versioned rosinstall file",
                      action="store")
    (options, args) = parser.parse_args(args)

    if options.version:
        print("rosinstall %s\n%s" %
              (rosinstall.__version__.version, multiproject_cmd.cmd_version()))
        sys.exit(0)

    if len(args) < 1:
        parser.error("rosinstall requires at least 1 argument")

    mode = 'prompt'
    if options.delete_changed:
        mode = 'delete'
    if options.abort_changed:
        if mode == 'delete':
            parser.error(
                "delete-changed-uris is mutually exclusive with abort-changed-uris"
            )
        mode = 'abort'
    if options.backup_changed != '':
        if mode == 'delete':
            parser.error(
                "delete-changed-uris is mutually exclusive with backup-changed-uris"
            )
        if mode == 'abort':
            parser.error(
                "abort-changed-uris is mutually exclusive with backup-changed-uris"
            )
        mode = 'backup'

    # Catkin must be enabled if catkinpp is set
    if options.catkinpp:
        options.catkin = True

    # Get the path to the rosinstall
    options.path = os.path.abspath(args[0])

    config_uris = args[1:]

    config = multiproject_cmd.get_config(basepath=options.path,
                                         additional_uris=config_uris,
                                         config_filename=ROSINSTALL_FILENAME)

    if options.generate_versioned:
        filename = os.path.abspath(options.generate_versioned)
        source_aggregate = multiproject_cmd.cmd_snapshot(config)
        with open(filename, 'w') as fhand:
            fhand.write(yaml.safe_dump(source_aggregate))
        print("Saved versioned rosinstall of current directory %s to %s" %
              (options.path, filename))
        return True

    if options.vcs_diff:
        difflist = multiproject_cmd.cmd_diff(config)
        alldiff = []
        for entrydiff in difflist:
            if entrydiff['diff'] is not None and entrydiff['diff'] != '':
                alldiff.append(entrydiff['diff'])
        print('\n'.join(alldiff))
        return True

    if options.vcs_status or options.vcs_status_untracked:
        statuslist = multiproject_cmd.cmd_status(
            config, untracked=options.vcs_status_untracked)
        allstatus = ""
        for entrystatus in statuslist:
            if entrystatus['status'] is not None:
                allstatus += entrystatus['status']
        print(allstatus, end='')
        return True

    print("rosinstall operating on", options.path,
          "from specifications in rosinstall files ", ", ".join(config_uris))

    # includes ROS specific files
    print("(Over-)Writing %s" %
          os.path.join(options.path, ROSINSTALL_FILENAME))
    if (os.path.isfile(os.path.join(options.path, ROSINSTALL_FILENAME))):
        shutil.move(os.path.join(options.path, ROSINSTALL_FILENAME),
                    "%s.bak" % os.path.join(options.path, ROSINSTALL_FILENAME))
    rosinstall_cmd.cmd_persist_config(config)

    ## install or update each element
    install_success = multiproject_cmd.cmd_install_or_update(
        config,
        backup_path=options.backup_changed,
        mode=mode,
        robust=options.robust,
        num_threads=int(options.jobs),
        verbose=options.verbose)

    rosinstall_cmd.cmd_generate_ros_files(config, options.path,
                                          options.nobuild, options.rosdep_yes,
                                          options.catkin, options.catkinpp)

    if not install_success:
        print(
            "Warning: installation encountered errors, but --continue-on-error was requested.    Look above for warnings."
        )

    print("\nrosinstall update complete.")
    if (options.catkin is False and options.catkinpp is None):

        print(
            "\n\nNow, type 'source %s/setup.bash' to set up your environment.\nAdd that to the bottom of your ~/.bashrc to set it up every time.\n\nIf you are not using bash please see http://www.ros.org/wiki/rosinstall/NonBashShells "
            % os.path.abspath(options.path))
    return True
Example #4
0
def rosinstall_main(argv):
    if len(argv) < 2:
        usage()
    args = argv[1:]
    parser = OptionParser(
        usage="usage: rosinstall [OPTIONS] INSTALL_PATH [ROSINSTALL FILES OR DIRECTORIES]\n\n\
rosinstall does the following:\n\
  1. Merges all URIs into new or existing .rosinstall file at PATH\n\
  2. Checks out or updates all version controlled URIs\n\
  3. If ros stack is installed from source, calls rosmake after checkout or updates.\n\
  4. Generates/overwrites updated setup files\n\n\
If running with --catkin mode:\
  1. Merges all URIs into new or existing .rosinstall file at PATH\n\
  2. Checks out or updates all version controlled URIs\n\
  4. Generates/overwrites updated setup files and creates CMakeLists.txt at the root.\n\n\
URIs can be web urls to remote .rosinstall files, local .rosinstall files,\n\
git, svn, bzr, hg URIs, or other (local directories)\n\
Later URIs will shadow packages of earlier URIs.\n",
        epilog="See: http://www.ros.org/wiki/rosinstall for details\n",
    )
    parser.add_option(
        "-c", "--catkin", dest="catkin", default=False, help="Declare this is a catkin build.", action="store_true"
    )
    parser.add_option(
        "--cmake-prefix-path",
        dest="catkinpp",
        default=None,
        help="Where to set the CMAKE_PREFIX_PATH, implies --catkin",
        action="store",
    )
    parser.add_option(
        "--version", dest="version", default=False, help="display version information", action="store_true"
    )
    parser.add_option("--verbose", dest="verbose", default=False, help="display more information", action="store_true")
    parser.add_option(
        "-n",
        "--nobuild",
        dest="nobuild",
        default=False,
        help="skip the build step for the ROS stack",
        action="store_true",
    )
    parser.add_option(
        "--rosdep-yes",
        dest="rosdep_yes",
        default=False,
        help="Pass through --rosdep-yes to rosmake",
        action="store_true",
    )
    parser.add_option(
        "--continue-on-error",
        dest="robust",
        default=False,
        help="Continue despite checkout errors",
        action="store_true",
    )
    parser.add_option(
        "--delete-changed-uris",
        dest="delete_changed",
        default=False,
        help="Delete the local copy of a directory before changing uri.",
        action="store_true",
    )
    parser.add_option(
        "--abort-changed-uris",
        dest="abort_changed",
        default=False,
        help="Abort if changed uri detected",
        action="store_true",
    )
    parser.add_option(
        "--backup-changed-uris",
        dest="backup_changed",
        default="",
        help="backup the local copy of a directory before changing uri to this directory.",
        action="store",
    )
    parser.add_option(
        "--diff", dest="vcs_diff", default=False, help="shows a combined diff over all SCM entries", action="store_true"
    )
    parser.add_option(
        "--status",
        dest="vcs_status",
        default=False,
        help="shows a combined status command over all SCM entries",
        action="store_true",
    )
    parser.add_option(
        "--status-untracked",
        dest="vcs_status_untracked",
        default=False,
        help="shows a combined status command over all SCM entries, also showing untracked files",
        action="store_true",
    )
    parser.add_option(
        "-j",
        "--parallel",
        dest="jobs",
        default=1,
        help="How many parallel threads to use for installing",
        action="store",
    )
    parser.add_option(
        "--generate-versioned-rosinstall",
        dest="generate_versioned",
        default=None,
        help="generate a versioned rosinstall file",
        action="store",
    )
    (options, args) = parser.parse_args(args)

    if options.version:
        print("rosinstall %s\n%s" % (rosinstall.__version__.version, multiproject_cmd.cmd_version()))
        sys.exit(0)

    if len(args) < 1:
        parser.error("rosinstall requires at least 1 argument")

    mode = "prompt"
    if options.delete_changed:
        mode = "delete"
    if options.abort_changed:
        if mode == "delete":
            parser.error("delete-changed-uris is mutually exclusive with abort-changed-uris")
        mode = "abort"
    if options.backup_changed != "":
        if mode == "delete":
            parser.error("delete-changed-uris is mutually exclusive with backup-changed-uris")
        if mode == "abort":
            parser.error("abort-changed-uris is mutually exclusive with backup-changed-uris")
        mode = "backup"

    # Catkin must be enabled if catkinpp is set
    if options.catkinpp:
        options.catkin = True

    # Get the path to the rosinstall
    options.path = os.path.abspath(args[0])

    config_uris = args[1:]

    config = multiproject_cmd.get_config(
        basepath=options.path, additional_uris=config_uris, config_filename=ROSINSTALL_FILENAME
    )

    if options.generate_versioned:
        filename = os.path.abspath(options.generate_versioned)
        source_aggregate = multiproject_cmd.cmd_snapshot(config)
        with open(filename, "w") as fhand:
            fhand.write(yaml.safe_dump(source_aggregate))
        print("Saved versioned rosinstall of current directory %s to %s" % (options.path, filename))
        return True

    if options.vcs_diff:
        difflist = multiproject_cmd.cmd_diff(config)
        alldiff = []
        for entrydiff in difflist:
            if entrydiff["diff"] is not None and entrydiff["diff"] != "":
                alldiff.append(entrydiff["diff"])
        print("\n".join(alldiff))
        return True

    if options.vcs_status or options.vcs_status_untracked:
        statuslist = multiproject_cmd.cmd_status(config, untracked=options.vcs_status_untracked)
        allstatus = ""
        for entrystatus in statuslist:
            if entrystatus["status"] is not None:
                allstatus += entrystatus["status"]
        print(allstatus, end="")
        return True

    print("rosinstall operating on", options.path, "from specifications in rosinstall files ", ", ".join(config_uris))

    # includes ROS specific files
    print("(Over-)Writing %s" % os.path.join(options.path, ROSINSTALL_FILENAME))
    if os.path.isfile(os.path.join(options.path, ROSINSTALL_FILENAME)):
        shutil.move(
            os.path.join(options.path, ROSINSTALL_FILENAME), "%s.bak" % os.path.join(options.path, ROSINSTALL_FILENAME)
        )
    rosinstall_cmd.cmd_persist_config(config)

    ## install or update each element
    install_success = multiproject_cmd.cmd_install_or_update(
        config,
        backup_path=options.backup_changed,
        mode=mode,
        robust=options.robust,
        num_threads=int(options.jobs),
        verbose=options.verbose,
    )

    rosinstall_cmd.cmd_generate_ros_files(
        config, options.path, options.nobuild, options.rosdep_yes, options.catkin, options.catkinpp
    )

    if not install_success:
        print(
            "Warning: installation encountered errors, but --continue-on-error was requested.    Look above for warnings."
        )

    print("\nrosinstall update complete.")
    if options.catkin is False and options.catkinpp is None:

        print(
            "\n\nNow, type 'source %s/setup.bash' to set up your environment.\nAdd that to the bottom of your ~/.bashrc to set it up every time.\n\nIf you are not using bash please see http://www.ros.org/wiki/rosinstall/NonBashShells "
            % os.path.abspath(options.path)
        )
    return True