예제 #1
0
    def _branch(self):
        """Clowder branch command private implementation"""
        local = True
        remote = False
        if self.app.pargs.all:
            local = True
            remote = True
        elif self.app.pargs.remote:
            remote = True

        if self.app.pargs.projects is None:
            groups = filter_groups(CLOWDER_CONTROLLER.groups,
                                   self.app.pargs.groups)
            for group in groups:
                run_group_command(group,
                                  self.app.pargs.skip,
                                  'branch',
                                  local=local,
                                  remote=remote)
            return

        projects = filter_projects(CLOWDER_CONTROLLER.groups,
                                   project_names=self.app.pargs.projects)
        for project in projects:
            run_project_command(project,
                                self.app.pargs.skip,
                                'branch',
                                local=local,
                                remote=remote)
예제 #2
0
def _clean(clowder, group_names, **kwargs):
    """Discard changes

    .. py:function:: clean(group_names, args='', recursive=False, project_names=None, skip=[])

    :param ClowderController clowder: ClowderController instance
    :param list[str] group_names: Group names to clean

    Keyword Args:
        args (str): Git clean options
            - ``d`` Remove untracked directories in addition to untracked files
            - ``f`` Delete directories with .git sub directory or file
            - ``X`` Remove only files ignored by git
            - ``x`` Remove all untracked files
        recursive (bool): Clean submodules recursively
        project_names (list[str]): Project names to clean
        skip (list[str]): Project names to skip
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])
    args = kwargs.get('args', '')
    recursive = kwargs.get('recursive', False)

    if project_names is None:
        groups = filter_groups(clowder.groups, group_names)
        for group in groups:
            run_group_command(group, skip, 'clean', args=args, recursive=recursive)
        return

    projects = filter_projects(clowder.groups, project_names=project_names)
    for project in projects:
        run_project_command(project, skip, 'clean', args=args, recursive=recursive)
예제 #3
0
def forall(clowder, command, ignore_errors, group_names, **kwargs):
    """Runs script in project directories specified

    .. py:function:: forall_script(clowder, command, ignore_errors, group_names, project_names=None, skip=[], parallel=False)

    :param ClowderController clowder: ClowderController instance
    :param list[str] command: Command or script and optional arguments
    :param bool ignore_errors: Whether to exit if command returns a non-zero exit code
    :param list[str] group_names: Group names to run command for

    Keyword Args:
        project_names (list[str]): Project names to clean
        skip list[str]: Project names to skip
        parallel bool: Whether command is being run in parallel, affects output
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])
    parallel = kwargs.get('parallel', False)

    projects = filter_projects(clowder.groups,
                               group_names=group_names,
                               project_names=project_names)

    if parallel:
        forall_parallel([" ".join(command)], skip, ignore_errors, projects)
        if os.name == "posix":
            return

    for project in projects:
        run_project_command(project, skip, 'run', [" ".join(command)],
                            ignore_errors)
예제 #4
0
    def reset_parallel(clowder, group_names, **kwargs):
        """Reset project branches to upstream or checkout tag/sha as detached HEAD in parallel

        .. py:function:: reset_parallel(clowder, group_names, timestamp_project=None, project_names=None, skip=[])

        :param ClowderController clowder: ClowderController instance
        :param list[str] group_names: Group names to reset

        Keyword Args:
            timestamp_project (str): Reference project to checkout commit timestamps of other projects relative to
            project_names (list[str]): Project names to reset
            skip (list[str]): Project names to skip
        """

        project_names = kwargs.get('project_names', None)
        skip = kwargs.get('skip', [])
        timestamp_project = kwargs.get('timestamp_project', None)

        print(' - Reset projects in parallel\n')
        timestamp = None
        if timestamp_project:
            timestamp = clowder.get_timestamp(timestamp_project)

        validate_print_output(clowder, group_names, project_names=project_names, skip=skip)

        projects = filter_projects(clowder.groups, group_names=group_names, project_names=project_names)

        for project in projects:
            if project.name in skip:
                continue
            result = __clowder_pool__.apply_async(reset_project, args=(project, timestamp), callback=async_callback)
            __clowder_results__.append(result)
        pool_handler(len(projects))
예제 #5
0
def _clean_all(clowder, group_names, **kwargs):
    """Discard all changes

    .. py:function:: clean_all(group_names, project_names=None, skip=[])

    :param ClowderController clowder: ClowderController instance
    :param list[str] group_names: Group names to clean

    Keyword Args:
        project_names (list[str]): Project names to clean
        skip (list[str]): Project names to skip
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])

    if project_names is None:
        groups = filter_groups(clowder.groups, group_names)
        for group in groups:
            run_group_command(group, skip, 'clean_all')
        return

    projects = filter_projects(clowder.groups, project_names=project_names)
    for project in projects:
        run_project_command(project, skip, 'clean_all')
예제 #6
0
    def _diff(self):
        """Clowder diff command private implementation"""

        if self.app.pargs.projects is None:
            groups = filter_groups(CLOWDER_CONTROLLER.groups, self.app.pargs.groups)
            for group in groups:
                run_group_command(group, self.app.pargs.skip, 'diff')
            return

        projects = filter_projects(CLOWDER_CONTROLLER.groups, project_names=self.app.pargs.projects)
        for project in projects:
            run_project_command(project, self.app.pargs.skip, 'diff')
예제 #7
0
def herd(clowder, group_names, **kwargs):
    """Clone projects or update latest from upstream

    .. py:function:: herd(clowder, group_names, branch=None, tag=None, depth=0, rebase=False, project_names=None, skip=[], protocol=None)

    :param ClowderController clowder: ClowderController instance
    :param list[str] group_names: Group names to herd

    Keyword Args:
        branch (str): Branch to attempt to herd
        tag (str): Tag to attempt to herd
        depth (int): Git clone depth. 0 indicates full clone, otherwise must be a positive integer
        protocol (str): Git protocol ('ssh' or 'https')
        rebase (bool): Whether to use rebase instead of pulling latest changes
        project_names (list[str]) project_names: Project names to herd
        skip (list[str]): Project names to skip
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])
    branch = kwargs.get('branch', None)
    tag = kwargs.get('tag', None)
    depth = kwargs.get('depth', None)
    rebase = kwargs.get('rebase', False)
    protocol = kwargs.get('protocol', None)

    if project_names is None:
        groups = filter_groups(clowder.groups, group_names)
        validate_groups(groups)
        for group in groups:
            run_group_command(group,
                              skip,
                              'herd',
                              branch=branch,
                              tag=tag,
                              depth=depth,
                              rebase=rebase,
                              protocol=protocol)
        return

    projects = filter_projects(clowder.groups, project_names=project_names)
    validate_projects(projects)
    for project in projects:
        run_project_command(project,
                            skip,
                            'herd',
                            branch=branch,
                            tag=tag,
                            depth=depth,
                            rebase=rebase,
                            protocol=protocol)
예제 #8
0
    def _start_branches(self, tracking):
        """clowder start branches command"""

        if self.app.pargs.projects is None:
            groups = filter_groups(CLOWDER_CONTROLLER.groups, self.app.pargs.groups)
            validate_groups(groups)
            for group in groups:
                run_group_command(group, self.app.pargs.skip, 'start', self.app.pargs.branch, tracking)
            return

        projects = filter_projects(CLOWDER_CONTROLLER.groups, project_names=self.app.pargs.projects)
        validate_projects(projects)
        for project in projects:
            run_project_command(project, self.app.pargs.skip, 'start', self.app.pargs.branch, tracking)
예제 #9
0
    def _stash(self):
        """Clowder stash command private implementation"""

        if not any([g.is_dirty() for g in CLOWDER_CONTROLLER.groups]):
            print('No changes to stash')
            return

        if self.app.pargs.projects is None:
            groups = filter_groups(CLOWDER_CONTROLLER.groups,
                                   self.app.pargs.groups)
            for group in groups:
                run_group_command(group, self.app.pargs.skip, 'stash')
            return

        projects = filter_projects(CLOWDER_CONTROLLER.groups,
                                   project_names=self.app.pargs.projects)
        for project in projects:
            run_project_command(project, self.app.pargs.skip, 'stash')
예제 #10
0
def _prune(clowder, group_names, branch, **kwargs):
    """Prune branches

    .. py:function:: prune(group_names, local=False, remote=False, force=False, project_names=None, skip=[])

    :param ClowderController clowder: ClowderController instance
    :param list[str] group_names: Group names to prune branches for
    :param str branch: Branch to prune

    Keyword Args:
        force (bool): Force delete branch
        local (bool): Delete local branch
        remote (bool): Delete remote branch
        project_names (list[str]): Project names to prune
        skip (list[str]): Project names to skip
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])
    force = kwargs.get('force', False)
    local = kwargs.get('local', False)
    remote = kwargs.get('remote', False)

    if project_names is None:
        groups = filter_groups(clowder.groups, group_names)
        validate_groups(groups)
        _prune_groups(groups,
                      branch,
                      skip=skip,
                      force=force,
                      local=local,
                      remote=remote)
        return

    projects = filter_projects(clowder.groups, project_names=project_names)
    validate_projects(projects)
    _prune_projects(projects,
                    branch,
                    skip=skip,
                    force=force,
                    local=local,
                    remote=remote)
예제 #11
0
def reset(clowder, group_names, **kwargs):
    """Reset project branches to upstream or checkout tag/sha as detached HEAD

    .. py:function:: reset(clowder, group_names, timestamp_project=None, parallel=False, project_names=None, skip=[])

    :param ClowderController clowder: ClowderController instance
    :param list[str] group_names: Group names to reset

    Keyword Args:
        timestamp_project (str): Reference project to checkout commit timestamps of other projects relative to
        parallel (bool): Whether command is being run in parallel, affects output
        project_names (list[str]): Project names to reset
        skip (list[str]): Project names to skip
    """

    project_names = kwargs.get('project_names', None)
    skip = kwargs.get('skip', [])
    timestamp_project = kwargs.get('timestamp_project', None)
    parallel = kwargs.get('parallel', False)

    if parallel:
        reset_parallel(clowder,
                       group_names,
                       skip=skip,
                       timestamp_project=timestamp_project)
        if os.name == "posix":
            return

    timestamp = None
    if timestamp_project:
        timestamp = clowder.get_timestamp(timestamp_project)
    if project_names is None:
        groups = filter_groups(clowder.groups, group_names)
        validate_groups(groups)
        for group in groups:
            run_group_command(group, skip, 'reset', timestamp=timestamp)
        return

    projects = filter_projects(clowder.groups, project_names=project_names)
    validate_projects(projects)
    for project in projects:
        run_project_command(project, skip, 'reset', timestamp=timestamp)
예제 #12
0
def sync(clowder, project_names, protocol, rebase=False, parallel=False):
    """Sync projects

    .. py:function:: sync(clowder, project_names, protocol, rebase=False, parallel=False)

    :param ClowderController clowder: ClowderController instance
    :param list[str] project_names: Project names to sync
    :param str protocol: Git protocol, 'ssh' or 'https'
    :param Optional[bool] rebase: Whether to use rebase instead of pulling latest changes
    :param Optional[bool] parallel: Whether command is being run in parallel, affects output
    """

    projects = filter_projects(clowder.groups, project_names=project_names)
    if parallel:
        sync_parallel(projects, protocol, rebase=rebase)
        if os.name == "posix":
            return

    for project in projects:
        project.sync(protocol, rebase=rebase)
예제 #13
0
    def herd_parallel(clowder, group_names, **kwargs):
        """Clone projects or update latest from upstream in parallel

        .. py:function:: herd_parallel(clowder, group_names, branch=None, tag=None, depth=0, rebase=False, project_names=None, skip=[], protocol=None)

        :param ClowderController clowder: ClowderController instance
        :param list[str] group_names: Group names to herd

        Keyword Args:
            branch (str): Branch to attempt to herd
            tag (str): Tag to attempt to herd
            depth (int): Git clone depth. 0 indicates full clone, otherwise must be a positive integer
            protocol (str): Git protocol ('ssh' or 'https')
            rebase (bool): Whether to use rebase instead of pulling latest changes
            project_names (list[str]): Project names to herd
            skip (list[str]): Project names to skip
        """

        project_names = kwargs.get('project_names', None)
        skip = kwargs.get('skip', [])
        branch = kwargs.get('branch', None)
        tag = kwargs.get('tag', None)
        depth = kwargs.get('depth', None)
        rebase = kwargs.get('rebase', False)
        protocol = kwargs.get('protocol', None)

        print(' - Herd projects in parallel\n')
        validate_print_output(clowder, group_names, project_names=project_names, skip=skip)

        projects = filter_projects(clowder.groups, group_names=group_names, project_names=project_names)

        for project in projects:
            if project.name in skip:
                continue
            result = __clowder_pool__.apply_async(herd_project,
                                                  args=(project, branch, tag, depth, rebase, protocol),
                                                  callback=async_callback)
            __clowder_results__.append(result)

        pool_handler(len(projects))