+
+class Patch(StgitObject):
+ """Basic patch implementation
+ """
+ def __init_refs(self):
+ self.__top_ref = self.__refs_base + '/' + self.__name
+ self.__log_ref = self.__top_ref + '.log'
+
+ def __init__(self, name, series_dir, refs_base):
+ self.__series_dir = series_dir
+ self.__name = name
+ self._set_dir(os.path.join(self.__series_dir, self.__name))
+ self.__refs_base = refs_base
+ self.__init_refs()
+
+ def create(self):
+ os.mkdir(self._dir())
+
+ 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):
+ return self.__name
+
+ def rename(self, newname):
+ olddir = self._dir()
+ old_top_ref = self.__top_ref
+ old_log_ref = self.__log_ref
+ self.__name = newname
+ self._set_dir(os.path.join(self.__series_dir, self.__name))
+ self.__init_refs()
+
+ git.rename_ref(old_top_ref, self.__top_ref)
+ if git.ref_exists(old_log_ref):
+ git.rename_ref(old_log_ref, self.__log_ref)
+ os.rename(olddir, self._dir())
+
+ def __update_top_ref(self, ref):
+ git.set_ref(self.__top_ref, ref)
+ self._set_field('top', ref)
+ self._set_field('bottom', git.get_commit(ref).get_parent())
+
+ def __update_log_ref(self, ref):
+ git.set_ref(self.__log_ref, ref)
+