def func(parser, options, args): """Show the files modified by a patch (or the current patch) """ if options.bare and options.stat: raise CmdException('Cannot specify both --bare and --stat') if len(args) == 0: patch = 'HEAD' elif len(args) == 1: patch = args[0] else: parser.error('incorrect number of arguments') rev1 = git_id(crt_series, '%s^' % patch) rev2 = git_id(crt_series, '%s' % patch) if options.stat: output = gitlib.diffstat( git.diff(rev1=rev1, rev2=rev2, diff_flags=options.diff_flags)) elif options.bare: output = git.barefiles(rev1, rev2) else: output = git.files(rev1, rev2, diff_flags=options.diff_flags) if output: if not output.endswith('\n'): output += '\n' out.stdout_raw(output)
def func(parser, options, args): """Show the files modified by a patch (or the current patch) """ if len(args) == 0: patch = 'HEAD' elif len(args) == 1: patch = args[0] else: parser.error('incorrect number of arguments') rev1 = git_id(crt_series, '%s^' % patch) rev2 = git_id(crt_series, '%s' % patch) if options.stat: output = gitlib.diffstat(git.diff(rev1 = rev1, rev2 = rev2, diff_flags = options.diff_flags)) elif options.bare: output = git.barefiles(rev1, rev2) else: output = git.files(rev1, rev2, diff_flags = options.diff_flags) if output: if not output.endswith('\n'): output += '\n' out.stdout_raw(output)
def func(parser, options, args): """Show the files modified by a patch (or the current patch) """ if len(args) == 0: patch = '' elif len(args) == 1: patch = args[0] else: parser.error('incorrect number of arguments') rev1 = git_id('%s//bottom' % patch) rev2 = git_id('%s//top' % patch) if options.stat: out.stdout_raw(git.diffstat(rev1=rev1, rev2=rev2) + '\n') elif options.bare: out.stdout_raw(git.barefiles(rev1, rev2) + '\n') else: if options.diff_opts: diff_flags = options.diff_opts.split() else: diff_flags = [] out.stdout_raw(git.files(rev1, rev2, diff_flags=diff_flags) + '\n')
def func(parser, options, args): """Show the files modified by a patch (or the current patch) """ if len(args) == 0: patch = '' elif len(args) == 1: patch = args[0] else: parser.error('incorrect number of arguments') rev1 = git_id('%s//bottom' % patch) rev2 = git_id('%s//top' % patch) if options.stat: out.stdout_raw(git.diffstat(rev1 = rev1, rev2 = rev2) + '\n') elif options.bare: out.stdout_raw(git.barefiles(rev1, rev2) + '\n') else: if options.diff_opts: diff_flags = options.diff_opts.split() else: diff_flags = [] out.stdout_raw(git.files(rev1, rev2, diff_flags = diff_flags) + '\n')
def func(parser, options, args): autoresolved = config.get('stgit.autoresolved') if autoresolved != 'yes': check_conflicts() if options.patch: if args or options.update: raise CmdException, \ 'Only full refresh is available with the --patch option' patch = options.patch if not crt_series.patch_applied(patch): raise CmdException, 'Patches "%s" not applied' % patch else: patch = crt_series.get_current() if not patch: raise CmdException, 'No patches applied' if not options.force: check_head_top_equal() if options.undo: out.start('Undoing the refresh of "%s"' % patch) crt_series.undo_refresh() out.done() return if options.author: options.authname, options.authemail = name_email(options.author) if options.sign: sign_str = 'Signed-off-by' if options.ack: raise CmdException, '--ack and --sign were both specified' elif options.ack: sign_str = 'Acked-by' else: sign_str = None files = [x[1] for x in git.tree_status(verbose=True)] if args: files = [f for f in files if f in args] if files or not crt_series.head_top_equal() \ or options.edit or options.message \ or options.authname or options.authemail or options.authdate \ or options.commname or options.commemail \ or options.sign or options.ack: if options.patch: applied = crt_series.get_applied() between = applied[:applied.index(patch):-1] pop_patches(between, keep=True) elif options.update: rev1 = git_id('//bottom') rev2 = git_id('//top') patch_files = git.barefiles(rev1, rev2).split('\n') files = [f for f in files if f in patch_files] if not files: out.info('No modified files for updating patch "%s"' % patch) return out.start('Refreshing patch "%s"' % patch) if autoresolved == 'yes': resolved_all() crt_series.refresh_patch(files=files, message=options.message, edit=options.edit, show_patch=options.showpatch, author_name=options.authname, author_email=options.authemail, author_date=options.authdate, committer_name=options.commname, committer_email=options.commemail, backup=True, sign_str=sign_str, notes=options.annotate) if crt_series.empty_patch(patch): out.done('empty patch') else: out.done() if options.patch: between.reverse() push_patches(between) elif options.annotate: # only annotate the top log entry as there is no need to # refresh the patch and generate a full commit crt_series.log_patch(crt_series.get_patch(patch), None, notes=options.annotate) else: out.info('Patch "%s" is already up to date' % patch)
def __pick_commit(commit_id, patchname, options): """Pick a commit id. """ commit = git.Commit(commit_id) if options.name: patchname = options.name elif patchname and options.revert: patchname = 'revert-' + patchname if patchname: patchname = find_patch_name(patchname, crt_series.patch_exists) if options.parent: parent = git_id(crt_series, options.parent) else: parent = commit.get_parent() if not options.revert: bottom = parent top = commit_id else: bottom = commit_id top = parent if options.fold: out.start('Folding commit %s' % commit_id) # try a direct git apply first if not git.apply_diff(bottom, top, files = options.file): if options.file: raise CmdException('Patch folding failed') else: git.merge_recursive(bottom, git.get_head(), top) out.done() elif options.update: rev1 = git_id(crt_series, 'HEAD^') rev2 = git_id(crt_series, 'HEAD') files = git.barefiles(rev1, rev2).split('\n') out.start('Updating with commit %s' % commit_id) if not git.apply_diff(bottom, top, files = files): raise CmdException, 'Patch updating failed' out.done() else: message = commit.get_log() if options.revert: if message: lines = message.splitlines() subject = lines[0] body = '\n'.join(lines[2:]) else: subject = commit.get_id_hash() body = '' message = 'Revert "%s"\n\nThis reverts commit %s.\n\n%s\n' \ % (subject, commit.get_id_hash(), body) elif options.expose: message += '(imported from commit %s)\n' % commit.get_id_hash() author_name, author_email, author_date = \ name_email_date(commit.get_author()) if options.revert: author_name = author_email = None out.start('Importing commit %s' % commit_id) newpatch = crt_series.new_patch(patchname, message = message, can_edit = False, unapplied = True, bottom = bottom, top = top, author_name = author_name, author_email = author_email, author_date = author_date) # in case the patch name was automatically generated patchname = newpatch.get_name() # find a patchlog to fork from refbranchname, refpatchname = parse_rev(patchname) if refpatchname: if refbranchname: # assume the refseries is OK, since we already resolved # commit_str to a git_id refseries = Series(refbranchname) else: refseries = crt_series patch = refseries.get_patch(refpatchname) if patch.get_log(): out.info("Log was %s" % newpatch.get_log()) out.info("Setting log to %s\n" % patch.get_log()) newpatch.set_log(patch.get_log()) out.info("Log is now %s" % newpatch.get_log()) else: out.info("No log for %s\n" % patchname) if not options.unapplied: modified = crt_series.push_patch(patchname) else: modified = False if crt_series.empty_patch(patchname): out.done('empty patch') elif modified: out.done('modified') else: out.done()
def __pick_commit(commit_id, patchname, options): """Pick a commit id. """ commit = git.Commit(commit_id) if options.name: patchname = options.name elif patchname and options.revert: patchname = 'revert-' + patchname if patchname: patchname = find_patch_name(patchname, crt_series.patch_exists) if options.parent: parent = git_id(crt_series, options.parent) else: parent = commit.get_parent() if not options.revert: bottom = parent top = commit_id else: bottom = commit_id top = parent if options.fold: out.start('Folding commit %s' % commit_id) # try a direct git apply first if not git.apply_diff(bottom, top, files=options.file): if options.file: raise CmdException('Patch folding failed') else: git.merge_recursive(bottom, git.get_head(), top) out.done() elif options.update: rev1 = git_id(crt_series, 'HEAD^') rev2 = git_id(crt_series, 'HEAD') files = git.barefiles(rev1, rev2).split('\n') out.start('Updating with commit %s' % commit_id) if not git.apply_diff(bottom, top, files=files): raise CmdException('Patch updating failed') out.done() else: message = commit.get_log() if options.revert: if message: lines = message.splitlines() subject = lines[0] body = '\n'.join(lines[2:]) else: subject = commit.get_id_hash() body = '' message = 'Revert "%s"\n\nThis reverts commit %s.\n\n%s\n' % ( subject, commit.get_id_hash(), body) elif options.expose: if not message.endswith('\n'): message += '\n' message += '(imported from commit %s)\n' % commit.get_id_hash() (author_name, author_email, author_date) = name_email_date(commit.get_author()) if options.revert: author_name = author_email = None out.start('Importing commit %s' % commit_id) newpatch = crt_series.new_patch( patchname, message=message, can_edit=False, unapplied=True, bottom=bottom, top=top, author_name=author_name, author_email=author_email, author_date=author_date, ) # in case the patch name was automatically generated patchname = newpatch.get_name() # find a patchlog to fork from refbranchname, refpatchname = parse_rev(patchname) if refpatchname: if refbranchname: # assume the refseries is OK, since we already resolved # commit_str to a git_id refseries = Series(refbranchname) else: refseries = crt_series patch = refseries.get_patch(refpatchname) if patch.get_log(): out.info("Log was %s" % newpatch.get_log()) out.info("Setting log to %s\n" % patch.get_log()) newpatch.set_log(patch.get_log()) out.info("Log is now %s" % newpatch.get_log()) else: out.info("No log for %s\n" % patchname) if not options.unapplied: modified = crt_series.push_patch(patchname) else: modified = False if crt_series.empty_patch(patchname): out.done('empty patch') elif modified: out.done('modified') else: out.done()
def func(parser, options, args): autoresolved = config.get('stgit.autoresolved') if autoresolved != 'yes': check_conflicts() if options.patch: if args or options.update: raise CmdException, \ 'Only full refresh is available with the --patch option' patch = options.patch if not crt_series.patch_applied(patch): raise CmdException, 'Patches "%s" not applied' % patch else: patch = crt_series.get_current() if not patch: raise CmdException, 'No patches applied' if not options.force: check_head_top_equal() if options.undo: out.start('Undoing the refresh of "%s"' % patch) crt_series.undo_refresh() out.done() return if options.author: options.authname, options.authemail = name_email(options.author) if options.sign: sign_str = 'Signed-off-by' if options.ack: raise CmdException, '--ack and --sign were both specified' elif options.ack: sign_str = 'Acked-by' else: sign_str = None files = [x[1] for x in git.tree_status(verbose = True)] if args: files = [f for f in files if f in args] if files or not crt_series.head_top_equal() \ or options.edit or options.message \ or options.authname or options.authemail or options.authdate \ or options.commname or options.commemail \ or options.sign or options.ack: if options.patch: applied = crt_series.get_applied() between = applied[:applied.index(patch):-1] pop_patches(between, keep = True) elif options.update: rev1 = git_id('//bottom') rev2 = git_id('//top') patch_files = git.barefiles(rev1, rev2).split('\n') files = [f for f in files if f in patch_files] if not files: out.info('No modified files for updating patch "%s"' % patch) return out.start('Refreshing patch "%s"' % patch) if autoresolved == 'yes': resolved_all() crt_series.refresh_patch(files = files, message = options.message, edit = options.edit, show_patch = options.showpatch, author_name = options.authname, author_email = options.authemail, author_date = options.authdate, committer_name = options.commname, committer_email = options.commemail, backup = True, sign_str = sign_str, notes = options.annotate) if crt_series.empty_patch(patch): out.done('empty patch') else: out.done() if options.patch: between.reverse() push_patches(between) elif options.annotate: # only annotate the top log entry as there is no need to # refresh the patch and generate a full commit crt_series.log_patch(crt_series.get_patch(patch), None, notes = options.annotate) else: out.info('Patch "%s" is already up to date' % patch)
def func(parser, options, args): """Import a commit object as a new patch """ if len(args) != 1: parser.error('incorrect number of arguments') if not options.unapplied: check_local_changes() check_conflicts() check_head_top_equal() commit_str = args[0] commit_id = git_id(commit_str) commit = git.Commit(commit_id) if options.fold or options.update: if not crt_series.get_current(): raise CmdException, 'No patches applied' else: patch_branch = commit_str.split('@') if options.name: patchname = options.name elif len(patch_branch) == 2: patchname = patch_branch[0] else: patchname = None if options.parent: parent = git_id(options.parent) else: parent = commit.get_parent() if not options.reverse: bottom = parent top = commit_id else: bottom = commit_id top = parent if options.fold: out.start('Folding commit %s' % commit_id) # try a direct git-apply first if not git.apply_diff(bottom, top): git.merge(bottom, git.get_head(), top, recursive = True) out.done() elif options.update: rev1 = git_id('//bottom') rev2 = git_id('//top') files = git.barefiles(rev1, rev2).split('\n') out.start('Updating with commit %s' % commit_id) if not git.apply_diff(bottom, top, files = files): raise CmdException, 'Patch updating failed' out.done() else: message = commit.get_log() if options.expose: message += '(imported from commit %s)\n' % commit.get_id_hash() author_name, author_email, author_date = \ name_email_date(commit.get_author()) out.start('Importing commit %s' % commit_id) newpatch = crt_series.new_patch(patchname, message = message, can_edit = False, unapplied = True, bottom = bottom, top = top, author_name = author_name, author_email = author_email, author_date = author_date) # in case the patch name was automatically generated patchname = newpatch.get_name() # find a patchlog to fork from (refpatchname, refbranchname, refpatchid) = parse_rev(commit_str) if refpatchname and not refpatchid and \ (not refpatchid or refpatchid == 'top'): # FIXME: should also support picking //top.old if refbranchname: # assume the refseries is OK, since we already resolved # commit_str to a git_id refseries = Series(refbranchname) else: refseries = crt_series patch = refseries.get_patch(refpatchname) if patch.get_log(): out.info("Log was %s" % newpatch.get_log()) out.info("Setting log to %s\n" % patch.get_log()) newpatch.set_log(patch.get_log()) out.info("Log is now %s" % newpatch.get_log()) else: out.info("No log for %s\n" % patchname) if not options.unapplied: modified = crt_series.push_patch(patchname) else: modified = False if crt_series.empty_patch(patchname): out.done('empty patch') elif modified: out.done('modified') else: out.done() print_crt_patch()
def func(parser, options, args): """Import a commit object as a new patch """ if len(args) != 1: parser.error('incorrect number of arguments') if not options.unapplied: check_local_changes() check_conflicts() check_head_top_equal() commit_str = args[0] commit_id = git_id(commit_str) commit = git.Commit(commit_id) if options.fold or options.update: if not crt_series.get_current(): raise CmdException, 'No patches applied' else: patch_branch = commit_str.split('@') if options.name: patchname = options.name elif len(patch_branch) == 2: patchname = patch_branch[0] else: patchname = None if options.parent: parent = git_id(options.parent) else: parent = commit.get_parent() if not options.reverse: bottom = parent top = commit_id else: bottom = commit_id top = parent if options.fold: out.start('Folding commit %s' % commit_id) # try a direct git-apply first if not git.apply_diff(bottom, top): git.merge(bottom, git.get_head(), top, recursive=True) out.done() elif options.update: rev1 = git_id('//bottom') rev2 = git_id('//top') files = git.barefiles(rev1, rev2).split('\n') out.start('Updating with commit %s' % commit_id) if not git.apply_diff(bottom, top, files=files): raise CmdException, 'Patch updating failed' out.done() else: message = commit.get_log() if options.expose: message += '(imported from commit %s)\n' % commit.get_id_hash() author_name, author_email, author_date = \ name_email_date(commit.get_author()) out.start('Importing commit %s' % commit_id) newpatch = crt_series.new_patch(patchname, message=message, can_edit=False, unapplied=True, bottom=bottom, top=top, author_name=author_name, author_email=author_email, author_date=author_date) # in case the patch name was automatically generated patchname = newpatch.get_name() # find a patchlog to fork from (refpatchname, refbranchname, refpatchid) = parse_rev(commit_str) if refpatchname and not refpatchid and \ (not refpatchid or refpatchid == 'top'): # FIXME: should also support picking //top.old if refbranchname: # assume the refseries is OK, since we already resolved # commit_str to a git_id refseries = Series(refbranchname) else: refseries = crt_series patch = refseries.get_patch(refpatchname) if patch.get_log(): out.info("Log was %s" % newpatch.get_log()) out.info("Setting log to %s\n" % patch.get_log()) newpatch.set_log(patch.get_log()) out.info("Log is now %s" % newpatch.get_log()) else: out.info("No log for %s\n" % patchname) if not options.unapplied: modified = crt_series.push_patch(patchname) else: modified = False if crt_series.empty_patch(patchname): out.done('empty patch') elif modified: out.done('modified') else: out.done() print_crt_patch()