X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/c40c3500e2475859f051c750ae9ff5cba2f54000..6dd8fafabb5b8e266a85f13c8851ca8a66a1a405:/stgit/commands/refresh.py diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py index 610d18a..b283892 100644 --- a/stgit/commands/refresh.py +++ b/stgit/commands/refresh.py @@ -21,6 +21,7 @@ from optparse import OptionParser, make_option from stgit.commands.common import * from stgit.utils import * +from stgit.out import * from stgit import stack, git from stgit.config import config @@ -36,96 +37,87 @@ options. The '--force' option is useful when a commit object was created with a different tool but the changes need to be included in the current patch.""" +directory = DirectoryHasRepository() options = [make_option('-f', '--force', help = 'force the refresh even if HEAD and '\ 'top differ', action = 'store_true'), - make_option('-e', '--edit', - help = 'invoke an editor for the patch '\ - 'description', - action = 'store_true'), - make_option('-s', '--showpatch', - help = 'show the patch content in the editor buffer', + make_option('--update', + help = 'only update the current patch files', action = 'store_true'), make_option('--undo', help = 'revert the commit generated by the last refresh', action = 'store_true'), - make_option('-m', '--message', - help = 'use MESSAGE as the patch ' \ - 'description'), - make_option('-a', '--author', metavar = '"NAME "', - help = 'use "NAME " as the author details'), - make_option('--authname', - help = 'use AUTHNAME as the author name'), - make_option('--authemail', - help = 'use AUTHEMAIL as the author e-mail'), - make_option('--authdate', - help = 'use AUTHDATE as the author date'), - make_option('--commname', - help = 'use COMMNAME as the committer name'), - make_option('--commemail', - help = 'use COMMEMAIL as the committer ' \ - 'e-mail'), - make_option('--sign', - help = 'add Signed-off-by line', - action = 'store_true'), - make_option('--ack', - help = 'add Acked-by line', - action = 'store_true')] - + make_option('-a', '--annotate', metavar = 'NOTE', + help = 'annotate the patch log entry'), + make_option('-p', '--patch', + help = 'refresh (applied) PATCH instead of the top one') + ] def func(parser, options, args): - autoresolved = config.get('stgit', 'autoresolved') + autoresolved = config.get('stgit.autoresolved') if autoresolved != 'yes': check_conflicts() - patch = crt_series.get_current() - if not patch: - raise CmdException, 'No patches applied' + 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: - print 'Undoing the "%s" refresh...' % patch, - sys.stdout.flush() + out.start('Undoing the refresh of "%s"' % patch) crt_series.undo_refresh() - print 'done' + out.done() return - if options.author: - options.authname, options.authemail = name_email(options.author) - - if options.sign: - sign_str = 'Signed-off-by' - elif options.ack: - sign_str = 'Acked-by' - else: - sign_str = None - - if git.local_changes() \ - 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: - print 'Refreshing patch "%s"...' % patch, - sys.stdout.flush() + files = [path for (stat,path) 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(): + 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 = args, - 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) - - print 'done' + crt_series.refresh_patch(files = files, + backup = True, 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: - print 'Patch "%s" is already up to date' % patch + out.info('Patch "%s" is already up to date' % patch)