X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/950b10954ad97b7827e6284be3f279b6ef802ccf..896afcc92d6dc5772b090e0e299d82e2c80a577d:/stgit/stack.py diff --git a/stgit/stack.py b/stgit/stack.py index bd08b35..c2eb2de 100644 --- a/stgit/stack.py +++ b/stgit/stack.py @@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys, os, re from email.Utils import formatdate +from stgit.exception import * from stgit.utils import * from stgit.out import * from stgit.run import * @@ -30,7 +31,7 @@ from shutil import copyfile # stack exception class -class StackException(Exception): +class StackException(StgException): pass class FilterUntil: @@ -144,7 +145,7 @@ class StgitObject: elif os.path.isfile(fname): os.remove(fname) - + class Patch(StgitObject): """Basic patch implementation """ @@ -164,12 +165,19 @@ class Patch(StgitObject): self.create_empty_field('bottom') self.create_empty_field('top') - def delete(self): - for f in os.listdir(self._dir()): - os.remove(os.path.join(self._dir(), f)) - os.rmdir(self._dir()) - git.delete_ref(self.__top_ref) - if git.ref_exists(self.__log_ref): + def delete(self, keep_log = False): + if os.path.isdir(self._dir()): + for f in os.listdir(self._dir()): + os.remove(os.path.join(self._dir(), f)) + os.rmdir(self._dir()) + else: + out.warn('Patch directory "%s" does not exist' % self._dir()) + try: + # the reference might not exist if the repository was corrupted + git.delete_ref(self.__top_ref) + except git.GitException, e: + out.warn(str(e)) + if not keep_log and git.ref_exists(self.__log_ref): git.delete_ref(self.__log_ref) def get_name(self): @@ -362,10 +370,10 @@ class PatchSet(StgitObject): def shortlog(patches): - log = ''.join(Run('git-log', '--pretty=short', + log = ''.join(Run('git', 'log', '--pretty=short', p.get_top(), '^%s' % p.get_bottom()).raw_output() for p in patches) - return Run('git-shortlog').raw_input(log).raw_output() + return Run('git', 'shortlog').raw_input(log).raw_output() class Series(PatchSet): """Class including the operations on series @@ -509,11 +517,17 @@ class Series(PatchSet): raise StackException, 'Branch "%s" not initialised' % self.get_name() return read_strings(self.__applied_file) + def set_applied(self, applied): + write_strings(self.__applied_file, applied) + def get_unapplied(self): if not os.path.isfile(self.__unapplied_file): raise StackException, 'Branch "%s" not initialised' % self.get_name() return read_strings(self.__unapplied_file) + def set_unapplied(self, unapplied): + write_strings(self.__unapplied_file, unapplied) + def get_hidden(self): if not os.path.isfile(self.__hidden_file): return [] @@ -616,7 +630,6 @@ class Series(PatchSet): self.create_empty_field('applied') self.create_empty_field('unapplied') - self._set_field('orig-base', git.get_head()) config.set(self.format_version_key(), str(FORMAT_VERSION)) @@ -740,10 +753,10 @@ class Series(PatchSet): raise StackException('Series directory %s is not empty' % self._dir()) - try: - git.delete_branch(self.get_name()) - except GitException: - out.warn('Could not delete branch "%s"' % self.get_name()) + try: + git.delete_branch(self.get_name()) + except GitException: + out.warn('Could not delete branch "%s"' % self.get_name()) config.remove_section('branch.%s' % self.get_name()) config.remove_section('branch.%s.stgit' % self.get_name()) @@ -754,7 +767,7 @@ class Series(PatchSet): author_name = None, author_email = None, author_date = None, committer_name = None, committer_email = None, - backup = False, sign_str = None, log = 'refresh', + backup = True, sign_str = None, log = 'refresh', notes = None, bottom = None): """Generates a new commit for the topmost patch """ @@ -780,8 +793,6 @@ class Series(PatchSet): author_name = patch.get_authname() if not author_email: author_email = patch.get_authemail() - if not author_date: - author_date = patch.get_authdate() if not committer_name: committer_name = patch.get_commname() if not committer_email: @@ -841,7 +852,7 @@ class Series(PatchSet): top = None, bottom = None, commit = True, author_name = None, author_email = None, author_date = None, committer_name = None, committer_email = None, - before_existing = False): + before_existing = False, sign_str = None): """Creates a new patch, either pointing to an existing commit object, or by creating a new commit object. """ @@ -850,7 +861,7 @@ class Series(PatchSet): assert not before_existing or (top and bottom) assert not (commit and before_existing) assert (top and bottom) or (not top and not bottom) - assert not top or (bottom == git.get_commit(top).get_parent()) + assert commit or (not top or (bottom == git.get_commit(top).get_parent())) if name != None: self.__patch_name_valid(name) @@ -859,13 +870,17 @@ class Series(PatchSet): # TODO: move this out of the stgit.stack module, it is really # for higher level commands to handle the user interaction + def sign(msg): + return add_sign_line(msg, sign_str, + committer_name or git.committer().name, + committer_email or git.committer().email) if not message and can_edit: descr = edit_file( - self, None, + self, sign(''), 'Please enter the description for the patch above.', show_patch) else: - descr = message + descr = sign(message) head = git.get_head() @@ -923,7 +938,7 @@ class Series(PatchSet): return patch - def delete_patch(self, name): + def delete_patch(self, name, keep_log = False): """Deletes a patch """ self.__patch_name_valid(name) @@ -940,7 +955,7 @@ class Series(PatchSet): # save the commit id to a trash file write_string(os.path.join(self.__trash_dir, name), patch.get_top()) - patch.delete() + patch.delete(keep_log = keep_log) unapplied = self.get_unapplied() unapplied.remove(name) @@ -1157,7 +1172,8 @@ class Series(PatchSet): patch = self.get_patch(name) if git.get_head_file() == self.get_name(): - if keep and not git.apply_diff(git.get_head(), patch.get_bottom()): + if keep and not git.apply_diff(git.get_head(), patch.get_bottom(), + check_index = False): raise StackException( 'Failed to pop patches while preserving the local changes') git.switch(patch.get_bottom(), keep)