From f80bef4918840e4290f03f291d8b4dbb98b12d80 Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Fri, 31 Mar 2006 18:42:34 +0100 Subject: [PATCH] Add the '--undo' option to 'refresh' This option is useful when adding the changes to the wrong patch (usually instead of creating a new one). Signed-off-by: Catalin Marinas --- stgit/commands/refresh.py | 13 ++++++++++++- stgit/git.py | 5 +++-- stgit/stack.py | 49 ++++++++++++++++++++++++++++++++++++----------- 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/stgit/commands/refresh.py b/stgit/commands/refresh.py index c5f390f..306e7b3 100644 --- a/stgit/commands/refresh.py +++ b/stgit/commands/refresh.py @@ -47,6 +47,9 @@ options = [make_option('-f', '--force', make_option('-s', '--showpatch', help = 'show the patch content in the editor buffer', 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'), @@ -78,6 +81,13 @@ def func(parser, options, args): if not options.force: check_head_top_equal() + if options.undo: + print 'Undoing the "%s" refresh...' % patch, + sys.stdout.flush() + crt_series.undo_refresh() + print 'done' + return + if options.author: options.authname, options.authemail = name_email(options.author) @@ -99,7 +109,8 @@ def func(parser, options, args): author_email = options.authemail, author_date = options.authdate, committer_name = options.commname, - committer_email = options.commemail) + committer_email = options.commemail, + backup = True) print 'done' else: diff --git a/stgit/git.py b/stgit/git.py index d898d85..71bddca 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -627,14 +627,15 @@ def switch(tree_id): __set_head(tree_id) -def reset(files = None, tree_id = None): +def reset(files = None, tree_id = None, check_out = True): """Revert the tree changes relative to the given tree_id. It removes any local changes """ if not tree_id: tree_id = get_head() - checkout(files, tree_id, True) + if check_out: + checkout(files, tree_id, True) # if the reset refers to the whole tree, switch the HEAD as well if not files: diff --git a/stgit/stack.py b/stgit/stack.py index c9d29b7..f4d7490 100644 --- a/stgit/stack.py +++ b/stgit/stack.py @@ -188,10 +188,7 @@ class Patch: def set_bottom(self, value, backup = False): if backup: curr = self.__get_field('bottom') - if curr != value: - self.__set_field('bottom.old', curr) - else: - self.__set_field('bottom.old', None) + self.__set_field('bottom.old', curr) self.__set_field('bottom', value) def get_old_top(self): @@ -203,10 +200,7 @@ class Patch: def set_top(self, value, backup = False): if backup: curr = self.__get_field('top') - if curr != value: - self.__set_field('top.old', curr) - else: - self.__set_field('top.old', None) + self.__set_field('top.old', curr) self.__set_field('top', value) self.__update_top_ref(value) @@ -573,7 +567,8 @@ class Series: cache_update = True, author_name = None, author_email = None, author_date = None, - committer_name = None, committer_email = None): + committer_name = None, committer_email = None, + backup = False): """Generates a new commit for the given patch """ name = self.get_current() @@ -605,8 +600,10 @@ class Series: if not committer_email: committer_email = patch.get_commemail() + bottom = patch.get_bottom() + commit_id = git.commit(files = files, - message = descr, parents = [patch.get_bottom()], + message = descr, parents = [bottom], cache_update = cache_update, allowempty = True, author_name = author_name, @@ -615,7 +612,8 @@ class Series: committer_name = committer_name, committer_email = committer_email) - patch.set_top(commit_id) + patch.set_bottom(bottom, backup = backup) + patch.set_top(commit_id, backup = backup) patch.set_description(descr) patch.set_authname(author_name) patch.set_authemail(author_email) @@ -625,6 +623,25 @@ class Series: return commit_id + def undo_refresh(self): + """Undo the patch boundaries changes caused by 'refresh' + """ + name = self.get_current() + assert(name) + + patch = Patch(name, self.__patch_dir, self.__refs_dir) + old_bottom = patch.get_old_bottom() + old_top = patch.get_old_top() + + # the bottom of the patch is not changed by refresh. If the + # old_bottom is different, there wasn't any previous 'refresh' + # command (probably only a 'push') + if old_bottom != patch.get_bottom() or old_top == patch.get_top(): + raise StackException, 'No refresh undo information available' + + git.reset(tree_id = old_top, check_out = False) + patch.restore_old_boundaries() + def new_patch(self, name, message = None, can_edit = True, unapplied = False, show_patch = False, top = None, bottom = None, @@ -878,6 +895,16 @@ class Series: assert(name) patch = Patch(name, self.__patch_dir, self.__refs_dir) + old_bottom = patch.get_old_bottom() + old_top = patch.get_old_top() + + # the top of the patch is changed by a push operation only + # together with the bottom (otherwise the top was probably + # modified by 'refresh'). If they are both unchanged, there + # was a fast forward + if old_bottom == patch.get_bottom() and old_top != patch.get_top(): + raise StackException, 'No push undo information available' + git.reset() self.pop_patch(name) return patch.restore_old_boundaries() -- 2.11.0