Esempio n. 1
0
def func(parser, options, args):
    """Show commit log and diff
    """
    if options.applied:
        patches = crt_series.get_applied()
    elif options.unapplied:
        patches = crt_series.get_unapplied()
    elif len(args) == 0:
        patches = ['HEAD']
    elif '..' in ' '.join(args):
        # patch ranges
        applied = crt_series.get_applied()
        unapplied = crt_series.get_unapplied()
        patches = parse_patches(args, applied + unapplied + \
                                crt_series.get_hidden(), len(applied))
    else:
        # individual patches or commit ids
        patches = args

    if not options.stat:
        options.diff_flags.extend(color_diff_flags())
    commit_ids = [git_id(crt_series, patch) for patch in patches]
    commit_bytes = b'\n'.join(
        (Run('git', 'show', *(options.diff_flags +
                              [commit_id])).decoding(None).raw_output())
        for commit_id in commit_ids)
    if options.stat:
        commit_bytes = git.diffstat(commit_bytes).encode('utf-8')
    if commit_bytes:
        pager(commit_bytes)
Esempio n. 2
0
def func(parser, options, args):
    """Show the patches modifying a file."""
    repository = directory.repository
    stack = repository.get_stack(options.branch)

    if not stack.patchorder.applied:
        raise CmdException('No patches applied')

    iw = repository.default_iw

    if not args:
        files = iw.changed_files(stack.head.data.tree)
    else:
        files = iw.ls_files(stack.head.data.tree, args)

    if not files:
        raise CmdException('No files specified or no local changes')

    directory.cd_to_topdir()

    # Find set of revisions that modify the selected files.
    revs = set(
        repository.run(
            ['git', 'rev-list', '--stdin', stack.base.sha1 + '..' + stack.top.sha1]
        )
        .raw_input('--\n' + '\n'.join(files))
        .output_lines()
    )

    diff_lines = []
    for pn in stack.patchorder.applied:
        commit = stack.patches[pn]
        if commit.sha1 not in revs:
            continue
        if options.diff:
            diff_lines.extend(
                [
                    b'-' * 79,
                    pn.encode('utf-8'),
                    b'-' * 79,
                    commit.data.message,
                    b'---',
                    b'',
                    repository.diff_tree(
                        commit.data.parent.data.tree,
                        commit.data.tree,
                        pathlimits=files,
                        diff_opts=options.diff_flags + color_diff_flags(),
                    ),
                ]
            )
        else:
            out.stdout(pn)

    if options.diff:
        pager(b'\n'.join(diff_lines))
Esempio n. 3
0
def func(parser, options, args):
    """Show commit log and diff"""
    if args and (options.applied or options.unapplied):
        parser.error('patches may not be given with --applied or --unapplied')
    elif options.applied and options.unapplied:
        parser.error('cannot use both --applied and --unapplied')

    repository = directory.repository
    stack = repository.get_stack(options.branch)
    patchorder = stack.patchorder

    if options.applied:
        commits = [stack.patches.get(pn).commit for pn in patchorder.applied]
    elif options.unapplied:
        commits = [stack.patches.get(pn).commit for pn in patchorder.unapplied]
    elif not args:
        commits = [stack.top]
    elif '..' in ' '.join(args):
        # patch ranges
        patch_names = parse_patches(
            args,
            patchorder.all,
            len(patchorder.applied),
        )
        commits = [stack.patches.get(pn).commit for pn in patch_names]
    else:
        commits = []
        for name in args:
            if stack.patches.exists(name):
                commits.append(stack.patches.get(name).commit)
            else:
                try:
                    commits.append(
                        repository.rev_parse(
                            name, object_type='commit', discard_stderr=True
                        )
                    )
                except RepositoryException:
                    raise RepositoryException(
                        '%s: Unknown patch or revision name' % name
                    )

    cmd = ['git', 'show']
    if options.stat:
        cmd.extend(['--stat', '--summary'])
    else:
        cmd.append('--patch')
        cmd.extend(options.diff_flags)
    cmd.extend(color_diff_flags())
    cmd.extend(commit.sha1 for commit in commits)
    pager(Run(*cmd).decoding(None).raw_output())
Esempio n. 4
0
def func(parser, options, args):
    """Show the tree diff"""
    repository = directory.repository

    if options.revs:
        rev_list = options.revs.split('..')
        if len(rev_list) not in [1, 2] or not rev_list[0]:
            parser.error('incorrect parameters to -r')
        elif len(rev_list) == 1:
            rev1 = git_commit(rev_list[0], repository)
            rev2 = None
        else:
            rev1 = git_commit(rev_list[0], repository)
            if rev_list[1]:
                rev2 = git_commit(rev_list[1], repository)
            else:
                rev2 = None
    else:
        rev1 = repository.rev_parse('HEAD')
        rev2 = None

    iw = repository.default_iw

    files = iw.ls_files(rev1.data.tree, args)

    diff_opts = color_diff_flags()
    diff_opts.extend(options.diff_flags)

    if rev1 and rev2:
        diff = repository.diff_tree(
            rev1.data.tree,
            rev2.data.tree,
            diff_opts=diff_opts,
            pathlimits=files,
            stat=options.stat,
            binary=False,
        )
    else:
        diff = iw.diff(
            rev1.data.tree,
            diff_opts=diff_opts,
            pathlimits=files,
            stat=options.stat,
            binary=False,
        )

    pager(diff)
Esempio n. 5
0
def func(parser, options, args):
    """Show the patches modifying a file
    """
    if not args:
        files = [path for (stat, path) in git.tree_status(verbose=True)]
        # git.tree_status returns absolute paths
    else:
        files = git.ls_files(args)
    directory.cd_to_topdir()

    if not files:
        raise CmdException('No files specified or no local changes')

    applied = crt_series.get_applied()
    if not applied:
        raise CmdException('No patches applied')

    revs = git.modifying_revs(files, crt_series.get_base(),
                              crt_series.get_head())
    revs.reverse()

    # build the patch/revision mapping
    rev_patch = dict()
    for name in applied:
        patch = crt_series.get_patch(name)
        rev_patch[patch.get_top()] = patch

    # print the patch names
    diff_lines = []
    for rev in revs:
        patch = rev_patch[rev]
        if options.diff:
            diff_lines.extend([
                b'-' * 79,
                patch.get_name().encode('utf-8'),
                b'-' * 79,
                patch.get_description().encode('utf-8'),
                b'---',
                b'',
                git.diff(files, patch.get_bottom(), patch.get_top()),
            ])
        else:
            out.stdout(patch.get_name())

    if options.diff:
        pager(b'\n'.join(diff_lines))
Esempio n. 6
0
def func(parser, options, args):
    """Show the tree diff
    """
    args = git.ls_files(args)
    directory.cd_to_topdir()

    if options.revs:
        rev_list = options.revs.split('..')
        if len(rev_list) not in [1, 2] or not rev_list[0]:
            parser.error('incorrect parameters to -r')
        if len(rev_list) == 1:
            rev1 = rev_list[0]
            rev2 = None
        else:
            rev1 = rev_list[0]
            if rev_list[1]:
                rev2 = rev_list[1]
            else:
                rev2 = None
    else:
        rev1 = 'HEAD'
        rev2 = None

    if not options.stat:
        options.diff_flags.extend(color_diff_flags())
    diff = git.diff(
        args,
        rev1 and git_id(crt_series, rev1),
        rev2 and git_id(crt_series, rev2),
        diff_flags=options.diff_flags,
        binary=False,
    )
    if options.stat:
        out.stdout_raw(gitlib.diffstat(diff) + '\n')
    elif diff:
        pager(diff)
Esempio n. 7
0
def _main():
    """The main function
    """
    global prog

    sys.argv = list(map(fsdecode_utf8, sys.argv))

    prog = os.path.basename(sys.argv[0])

    if len(sys.argv) < 2:
        print('usage: %s <command>' % prog, file=sys.stderr)
        print('  Try "%s --help" for a list of supported commands' % prog,
              file=sys.stderr)
        sys.exit(utils.STGIT_GENERAL_ERROR)

    cmd = sys.argv[1]

    if cmd in ['-h', '--help']:
        if len(sys.argv) >= 3:
            cmd = commands.canonical_cmd(sys.argv[2])
            sys.argv[2] = '--help'
        else:
            print_help()
            sys.exit(utils.STGIT_SUCCESS)
    if cmd == 'help':
        if len(sys.argv) == 3 and not sys.argv[2] in ['-h', '--help']:
            cmd = commands.canonical_cmd(sys.argv[2])
            sys.argv[0] += ' %s' % cmd
            command = commands[cmd]
            parser = argparse.make_option_parser(command)
            if is_cmd_alias(command):
                parser.remove_option('-h')
            pager(parser.format_help().encode())
        else:
            print_help()
        sys.exit(utils.STGIT_SUCCESS)
    if cmd in ['-v', '--version', 'version']:
        from stgit.version import get_version

        print('Stacked GIT %s' % get_version())
        os.system('git --version')
        print('Python version %s' % sys.version)
        sys.exit(utils.STGIT_SUCCESS)
    if cmd in ['copyright']:
        print(__copyright__)
        sys.exit(utils.STGIT_SUCCESS)

    # re-build the command line arguments
    cmd = commands.canonical_cmd(cmd)
    sys.argv[0] += ' %s' % cmd
    del sys.argv[1]

    command = commands[cmd]
    if is_cmd_alias(command):
        sys.exit(command.func(sys.argv[1:]))

    parser = argparse.make_option_parser(command)
    directory = command.directory

    # These modules are only used from this point onwards and do not
    # need to be imported earlier
    try:
        from configparser import ParsingError, NoSectionError
    except ImportError:
        from ConfigParser import ParsingError, NoSectionError
    from stgit.exception import StgException
    from stgit.config import config_setup
    from stgit.stack import Series

    try:
        debug_level = int(environ_get('STGIT_DEBUG_LEVEL', 0))
    except ValueError:
        out.error('Invalid STGIT_DEBUG_LEVEL environment variable')
        sys.exit(utils.STGIT_GENERAL_ERROR)

    try:
        (options, args) = parser.parse_args()
        directory.setup()
        config_setup()

        # Some commands don't (always) need an initialized series.
        if directory.needs_current_series:
            if hasattr(options, 'branch') and options.branch:
                command.crt_series = Series(options.branch)
            else:
                command.crt_series = Series()

        ret = command.func(parser, options, args)
    except (StgException, IOError, ParsingError, NoSectionError) as err:
        directory.write_log(cmd)
        if debug_level > 0:
            traceback.print_exc(file=sys.stderr)
        out.error(str(err), title='%s %s' % (prog, cmd))
        sys.exit(utils.STGIT_COMMAND_ERROR)
    except SystemExit:
        # Triggered by the option parser when it finds bad commandline
        # parameters.
        sys.exit(utils.STGIT_COMMAND_ERROR)
    except KeyboardInterrupt:
        sys.exit(utils.STGIT_GENERAL_ERROR)
    except BaseException:
        out.error('Unhandled exception:')
        traceback.print_exc(file=sys.stderr)
        sys.exit(utils.STGIT_BUG_ERROR)

    directory.write_log(cmd)
    sys.exit(ret or utils.STGIT_SUCCESS)
Esempio n. 8
0
def _main(argv):
    prog = argv[0] = 'stg'

    if len(argv) < 2:
        print('usage: %s <command>' % prog, file=sys.stderr)
        print('  Try "%s --help" for a list of supported commands' % prog,
              file=sys.stderr)
        return utils.STGIT_GENERAL_ERROR

    cmd = argv[1]

    if cmd in ['-h', '--help']:
        if len(argv) >= 3:
            try:
                cmd = commands.canonical_cmd(argv[2])
            except KeyError:
                return utils.STGIT_GENERAL_ERROR

            argv[2] = '--help'
        else:
            print_help(prog)
            return utils.STGIT_SUCCESS
    if cmd == 'help':
        if len(argv) == 3 and not argv[2] in ['-h', '--help']:
            try:
                cmd = commands.canonical_cmd(argv[2])
            except KeyError:
                return utils.STGIT_GENERAL_ERROR
            argv[0] += ' %s' % cmd
            command = commands[cmd]
            parser = argparse.make_option_parser(command)
            if is_cmd_alias(command):
                parser.remove_option('-h')
            pager(parser.format_help().encode())
        else:
            print_help(prog)
        return utils.STGIT_SUCCESS
    if cmd in ['-v', '--version', 'version']:
        print('Stacked Git %s' % get_version())
        os.system('git --version')
        os.system('%s --version' % sys.executable)
        return utils.STGIT_SUCCESS
    if cmd in ['copyright']:
        print(__copyright__)
        return utils.STGIT_SUCCESS

    # re-build the command line arguments
    try:
        cmd = commands.canonical_cmd(cmd)
    except KeyError:
        return utils.STGIT_GENERAL_ERROR
    argv[0] += ' %s' % cmd
    del argv[1]

    command = commands[cmd]
    if is_cmd_alias(command):
        return command.func(argv[1:])

    parser = argparse.make_option_parser(command)

    # These modules are only used from this point onwards and do not
    # need to be imported earlier
    from configparser import NoSectionError, ParsingError

    from stgit.config import config_setup
    from stgit.exception import StgException
    from stgit.lib.git import MergeConflictException

    try:
        debug_level = int(environ_get('STGIT_DEBUG_LEVEL', 0))
    except ValueError:
        out.error('Invalid STGIT_DEBUG_LEVEL environment variable')
        return utils.STGIT_GENERAL_ERROR

    try:
        (options, args) = parser.parse_args(argv[1:])
        command.directory.setup()
        config_setup()
        return command.func(parser, options, args)
    except MergeConflictException as err:
        if debug_level > 1:
            traceback.print_exc(file=sys.stderr)
        for conflict in err.conflicts:
            out.err(conflict)
        return utils.STGIT_CONFLICT
    except (StgException, IOError, ParsingError, NoSectionError) as err:
        if debug_level > 0:
            traceback.print_exc(file=sys.stderr)
        out.error(str(err), title='%s %s' % (prog, cmd))
        return utils.STGIT_COMMAND_ERROR
    except SystemExit:
        # Triggered by the option parser when it finds bad commandline
        # parameters.
        return utils.STGIT_COMMAND_ERROR
    except KeyboardInterrupt:
        return utils.STGIT_GENERAL_ERROR
    except BaseException:
        out.error('Unhandled exception:')
        traceback.print_exc(file=sys.stderr)
        return utils.STGIT_BUG_ERROR