Example #1
0
 def edit_fun(cd):
     cd, failed_diff = edit.auto_edit_patch(
         stack.repository, cd, msg = options.message, contains_diff = False,
         author = options.author, committer = lambda p: p,
         sign_str = options.sign_str)
     assert not failed_diff
     if options.edit:
         cd, failed_diff = edit.interactive_edit_patch(
             stack.repository, cd, edit_diff = False,
             diff_flags = [], replacement_diff = None)
         assert not failed_diff
     return cd
Example #2
0
 def edit_fun(cd):
     orig_msg = cd.message
     cd, failed_diff = edit.auto_edit_patch(
         stack.repository, cd, msg = options.message, contains_diff = False,
         author = options.author, committer = lambda p: p,
         sign_str = options.sign_str)
     assert not failed_diff
     if options.edit:
         cd, failed_diff = edit.interactive_edit_patch(
             stack.repository, cd, edit_diff = False,
             diff_flags = [], replacement_diff = None)
         assert not failed_diff
     if not options.no_verify and (options.edit or cd.message != orig_msg):
         cd = common.run_commit_msg_hook(stack.repository, cd, options.edit)
     return cd
Example #3
0
 def edit_fun(cd):
     orig_msg = cd.message
     cd = auto_edit_patch(
         stack.repository,
         cd,
         msg=(None if options.message is None else options.message.encode(
             config.get('i18n.commitencoding'))),
         author=options.author,
         sign_str=options.sign_str,
     )
     if options.edit:
         cd, failed_diff = interactive_edit_patch(stack.repository,
                                                  cd,
                                                  edit_diff=False,
                                                  diff_flags=[])
         assert not failed_diff
     if not options.no_verify and (options.edit or cd.message != orig_msg):
         cd = run_commit_msg_hook(stack.repository, cd, options.edit)
     # Refresh the committer information
     return cd.set_committer(None)
Example #4
0
 def edit_fun(cd):
     orig_msg = cd.message
     new_msg = None
     if message is not None:
         new_msg = message.encode(config.get('i18n.commitencoding'))
     cd = auto_edit_patch(
         stack.repository,
         cd,
         msg=new_msg,
         author=author,
         sign_str=sign_str,
     )
     if invoke_editor:
         cd, failed_diff = interactive_edit_patch(stack.repository, cd,
                                                  edit_diff, diff_flags)
         assert not failed_diff
     if not no_verify and (invoke_editor or cd.message != orig_msg):
         cd = run_commit_msg_hook(stack.repository, cd, invoke_editor)
     # Refresh the committer information
     return cd.set_committer(None)
Example #5
0
def func(parser, options, args):
    """Edit the given patch or the current one.
    """
    stack = directory.repository.current_stack

    if len(args) == 0:
        if not stack.patchorder.applied:
            raise CmdException(
                'Cannot edit top patch, because no patches are applied')
        patchname = stack.patchorder.applied[-1]
    elif len(args) == 1:
        [patchname] = args
        if not stack.patches.exists(patchname):
            raise CmdException('%s: no such patch' % patchname)
    else:
        parser.error('Cannot edit more than one patch')

    cd = orig_cd = stack.patches.get(patchname).commit.data

    if options.set_tree:
        cd = cd.set_tree(
            stack.repository.rev_parse(options.set_tree,
                                       discard_stderr=True,
                                       object_type='tree'))

    cd = edit.auto_edit_patch(
        stack.repository,
        cd,
        msg=(None if options.message is None else options.message.encode(
            config.get('i18n.commitencoding'))),
        author=options.author,
        sign_str=options.sign_str,
    )

    if options.save_template:
        options.save_template(
            edit.patch_desc(
                stack.repository,
                cd,
                options.diff,
                options.diff_flags,
                replacement_diff=None,
            ))
        return utils.STGIT_SUCCESS

    use_editor = cd == orig_cd or options.edit or options.diff
    if use_editor:
        cd, failed_diff = edit.interactive_edit_patch(stack.repository, cd,
                                                      options.diff,
                                                      options.diff_flags)
    else:
        failed_diff = None

    def failed(reason='Edited patch did not apply.'):
        fn = '.stgit-failed.patch'
        with io.open(fn, 'wb') as f:
            f.write(
                edit.patch_desc(
                    stack.repository,
                    cd,
                    options.diff,
                    options.diff_flags,
                    replacement_diff=failed_diff,
                ))
        out.error(reason, 'The patch has been saved to "%s".' % fn)
        return utils.STGIT_COMMAND_ERROR

    # If we couldn't apply the patch, fail without even trying to
    # effect any of the changes.
    if failed_diff:
        return failed()

    if not options.no_verify and (use_editor or cd.message != orig_cd.message):
        try:
            cd = run_commit_msg_hook(stack.repository, cd, use_editor)
        except Exception:
            if options.diff:
                failed('The commit-msg hook failed.')
            raise

    # Refresh the committer information
    cd = cd.set_committer(None)

    # The patch applied, so now we have to rewrite the StGit patch
    # (and any patches on top of it).
    iw = stack.repository.default_iw
    trans = transaction.StackTransaction(stack, 'edit', allow_conflicts=True)
    if patchname in trans.applied:
        popped = trans.applied[trans.applied.index(patchname) + 1:]
        popped_extra = trans.pop_patches(lambda pn: pn in popped)
        assert not popped_extra
    else:
        popped = []
    trans.patches[patchname] = stack.repository.commit(cd)
    try:
        for pn in popped:
            if options.set_tree:
                trans.push_tree(pn)
            else:
                trans.push_patch(pn, iw, allow_interactive=True)
    except transaction.TransactionHalted:
        pass
    try:
        # Either a complete success, or a conflict during push. But in
        # either case, we've successfully effected the edits the user
        # asked us for.
        return trans.run(iw)
    except transaction.TransactionException:
        # Transaction aborted -- we couldn't check out files due to
        # dirty index/worktree. The edits were not carried out.
        return failed()
def func(parser, options, args):
    """Edit the given patch or the current one."""
    stack = directory.repository.current_stack

    if len(args) == 0:
        if not stack.patchorder.applied:
            raise CmdException(
                'Cannot edit top patch because no patches are applied')
        patchname = stack.patchorder.applied[-1]
    elif len(args) == 1:
        [patchname] = args
        if patchname not in stack.patches:
            raise CmdException('%s: no such patch' % patchname)
    else:
        parser.error('Cannot edit more than one patch')

    cd = orig_cd = stack.patches[patchname].data

    if options.set_tree:
        cd = cd.set_tree(
            stack.repository.rev_parse(options.set_tree,
                                       discard_stderr=True,
                                       object_type='tree'))

    cd = edit.auto_edit_patch(
        stack.repository,
        cd,
        msg=(None if options.message is None else options.message.encode(
            config.get('i18n.commitencoding'))),
        author=options.author,
        trailers=options.trailers,
    )

    if options.save_template:
        options.save_template(
            edit.get_patch_description(stack.repository, cd, patchname,
                                       options.diff, options.diff_flags))
        return utils.STGIT_SUCCESS

    use_editor = cd == orig_cd or options.edit or options.diff
    if use_editor:
        cd, new_patchname, failed_diff = edit.interactive_edit_patch(
            stack.repository, cd, patchname, options.diff, options.diff_flags)
        # If we couldn't apply the patch, fail without even trying to
        # affect any of the changes.
        if failed_diff is not None:
            return utils.STGIT_COMMAND_ERROR
    else:
        new_patchname = None

    if not options.no_verify and (use_editor or cd.message != orig_cd.message):
        try:
            cd = run_commit_msg_hook(stack.repository, cd, use_editor)
        except Exception:
            if options.diff:
                patch_desc = edit.get_patch_description(
                    stack.repository, cd, patchname, options.diff,
                    options.diff_flags)
                edit.note_patch_application_failure(
                    patch_desc, 'The commit-msg hook failed.')
            raise

    retval, _ = edit.perform_edit(
        stack,
        cd,
        patchname,
        new_patchname,
        options.diff,
        options.diff_flags,
        options.set_tree,
    )
    return retval
Example #7
0
File: edit.py Project: snits/stgit
def func(parser, options, args):
    """Edit the given patch or the current one.
    """
    stack = directory.repository.current_stack

    if len(args) == 0:
        if not stack.patchorder.applied:
            raise common.CmdException(
                'Cannot edit top patch, because no patches are applied')
        patchname = stack.patchorder.applied[-1]
    elif len(args) == 1:
        [patchname] = args
        if not stack.patches.exists(patchname):
            raise common.CmdException('%s: no such patch' % patchname)
    else:
        parser.error('Cannot edit more than one patch')

    cd = orig_cd = stack.patches.get(patchname).commit.data

    if options.set_tree:
        cd = cd.set_tree(stack.repository.rev_parse(
                options.set_tree, discard_stderr = True, object_type = 'tree'))

    cd, failed_diff = edit.auto_edit_patch(
        stack.repository, cd, msg = options.message, contains_diff = True,
        author = options.author, committer = lambda p: p,
        sign_str = options.sign_str)

    if options.save_template:
        options.save_template(
            edit.patch_desc(stack.repository, cd,
                            options.diff, options.diff_flags, failed_diff))
        return utils.STGIT_SUCCESS

    use_editor = cd == orig_cd or options.edit
    if use_editor:
        cd, failed_diff = edit.interactive_edit_patch(
            stack.repository, cd, options.diff, options.diff_flags, failed_diff)

    def failed(reason='Edited patch did not apply.'):
        fn = '.stgit-failed.patch'
        with open(fn, 'w') as f:
            f.write(edit.patch_desc(stack.repository, cd,
                                    options.diff, options.diff_flags,
                                    failed_diff))
        out.error(reason,
                  'The patch has been saved to "%s".' % fn)
        return utils.STGIT_COMMAND_ERROR

    # If we couldn't apply the patch, fail without even trying to
    # effect any of the changes.
    if failed_diff:
        return failed()

    if not options.no_verify and (use_editor or cd.message != orig_cd.message):
        try:
            cd = common.run_commit_msg_hook(stack.repository, cd, use_editor)
        except Exception:
            if options.diff:
                failed('The commit-msg hook failed.')
            raise

    # The patch applied, so now we have to rewrite the StGit patch
    # (and any patches on top of it).
    iw = stack.repository.default_iw
    trans = transaction.StackTransaction(stack, 'edit', allow_conflicts = True)
    if patchname in trans.applied:
        popped = trans.applied[trans.applied.index(patchname)+1:]
        assert not trans.pop_patches(lambda pn: pn in popped)
    else:
        popped = []
    trans.patches[patchname] = stack.repository.commit(cd)
    try:
        for pn in popped:
            if options.set_tree:
                trans.push_tree(pn)
            else:
                trans.push_patch(pn, iw, allow_interactive = True)
    except transaction.TransactionHalted:
        pass
    try:
        # Either a complete success, or a conflict during push. But in
        # either case, we've successfully effected the edits the user
        # asked us for.
        return trans.run(iw)
    except transaction.TransactionException:
        # Transaction aborted -- we couldn't check out files due to
        # dirty index/worktree. The edits were not carried out.
        return failed()