def edit_file(series, line, comment, show_patch = True):
fname = '.stgit.msg'
- tmpl = os.path.join(git.base_dir, 'patchdescr.tmpl')
+ tmpl = os.path.join(git.get_base_dir(), 'patchdescr.tmpl')
f = file(fname, 'w+')
if line:
self.__name = git.get_head_file()
if self.__name:
- self.__patch_dir = os.path.join(git.base_dir, 'patches',
+ base_dir = git.get_base_dir()
+ self.__patch_dir = os.path.join(base_dir, 'patches',
self.__name)
- self.__base_file = os.path.join(git.base_dir, 'refs', 'bases',
+ self.__base_file = os.path.join(base_dir, 'refs', 'bases',
self.__name)
self.__applied_file = os.path.join(self.__patch_dir, 'applied')
self.__unapplied_file = os.path.join(self.__patch_dir, 'unapplied')
return True
return git.get_head() == Patch(crt, self.__patch_dir).get_top()
+ def is_initialised(self):
+ """Checks if series is already initialised
+ """
+ return os.path.isdir(self.__patch_dir)
+
def init(self):
"""Initialises the stgit series
"""
- bases_dir = os.path.join(git.base_dir, 'refs', 'bases')
+ bases_dir = os.path.join(git.get_base_dir(), 'refs', 'bases')
- if os.path.isdir(self.__patch_dir):
+ if self.is_initialised():
raise StackException, self.__patch_dir + ' already exists'
os.makedirs(self.__patch_dir)
create_empty_file(self.__descr_file)
self.__begin_stack_check()
+ def rename(self, to_name):
+ """Renames a series
+ """
+ to_stack = Series(to_name)
+
+ if to_stack.is_initialised():
+ raise StackException, '"%s" already exists' % to_stack.get_branch()
+ if os.path.exists(to_stack.__base_file):
+ os.remove(to_stack.__base_file)
+
+ git.rename_branch(self.__name, to_name)
+
+ if os.path.isdir(self.__patch_dir):
+ os.rename(self.__patch_dir, to_stack.__patch_dir)
+ if os.path.exists(self.__base_file):
+ os.rename(self.__base_file, to_stack.__base_file)
+
+ self.__init__(to_name)
+
+ def clone(self, target_series):
+ """Clones a series
+ """
+ base = read_string(self.get_base_file())
+ git.create_branch(target_series, tree_id = base)
+ Series(target_series).init()
+ new_series = Series(target_series)
+
+ # generate an artificial description file
+ write_string(new_series.__descr_file, 'clone of "%s"' % self.__name)
+
+ # clone self's entire series as unapplied patches
+ patches = self.get_applied() + self.get_unapplied()
+ patches.reverse()
+ for p in patches:
+ patch = self.get_patch(p)
+ new_series.new_patch(p, message = patch.get_description(),
+ can_edit = False, unapplied = True,
+ bottom = patch.get_bottom(),
+ top = patch.get_top(),
+ author_name = patch.get_authname(),
+ author_email = patch.get_authemail(),
+ author_date = patch.get_authdate())
+
+ # fast forward the cloned series to self's top
+ new_series.forward_patches(self.get_applied())
+
def delete(self, force = False):
"""Deletes an stgit series
"""
- if os.path.isdir(self.__patch_dir):
+ if self.is_initialised():
patches = self.get_unapplied() + self.get_applied()
if not force and patches:
raise StackException, \
'Cannot delete: the series still contains patches'
- patches.reverse()
for p in patches:
- self.delete_patch(p)
+ Patch(p, self.__patch_dir).delete()
- if os.path.isfile(self.__applied_file):
+ if os.path.exists(self.__applied_file):
os.remove(self.__applied_file)
- if os.path.isfile(self.__unapplied_file):
+ if os.path.exists(self.__unapplied_file):
os.remove(self.__unapplied_file)
- if os.path.isfile(self.__current_file):
+ if os.path.exists(self.__current_file):
os.remove(self.__current_file)
- if os.path.isfile(self.__descr_file):
+ if os.path.exists(self.__descr_file):
os.remove(self.__descr_file)
if not os.listdir(self.__patch_dir):
os.rmdir(self.__patch_dir)
else:
print 'Series directory %s is not empty.' % self.__name
- if os.path.isfile(self.__base_file):
+ if os.path.exists(self.__base_file):
os.remove(self.__base_file)
def refresh_patch(self, message = None, edit = False, show_patch = False,
forwarded+=1
unapplied.remove(name)
+ if forwarded == 0:
+ return 0
+
git.switch(top)
append_strings(self.__applied_file, names[0:forwarded])
applied = self.get_applied()
unapplied = self.get_unapplied()
+ if oldname == newname:
+ raise StackException, '"To" name and "from" name are the same'
+
if newname in applied or newname in unapplied:
raise StackException, 'Patch "%s" already exists' % newname