# The current StGIT metadata format version.
FORMAT_VERSION = 2
-def format_version_key(branch):
- return 'branch.%s.stgitformatversion' % branch
-
-def update_to_current_format_version(branch, git_dir):
- """Update a potentially older StGIT directory structure to the
- latest version. Note: This function should depend as little as
- possible on external functions that may change during a format
- version bump, since it must remain able to process older formats."""
-
- branch_dir = os.path.join(git_dir, 'patches', branch)
- def get_format_version():
- """Return the integer format version number, or None if the
- branch doesn't have any StGIT metadata at all, of any version."""
- fv = config.get(format_version_key(branch))
- if fv:
- # Great, there's an explicitly recorded format version
- # number, which means that the branch is initialized and
- # of that exact version.
- return int(fv)
- elif os.path.isdir(os.path.join(branch_dir, 'patches')):
- # There's a .git/patches/<branch>/patches dirctory, which
- # means this is an initialized version 1 branch.
- return 1
- elif os.path.isdir(branch_dir):
- # There's a .git/patches/<branch> directory, which means
- # this is an initialized version 0 branch.
- return 0
- else:
- # The branch doesn't seem to be initialized at all.
- return None
- def set_format_version(v):
- out.info('Upgraded branch %s to format version %d' % (branch, v))
- config.set(format_version_key(branch), '%d' % v)
- def mkdir(d):
- if not os.path.isdir(d):
- os.makedirs(d)
- def rm(f):
- if os.path.exists(f):
- os.remove(f)
-
- # Update 0 -> 1.
- if get_format_version() == 0:
- mkdir(os.path.join(branch_dir, 'trash'))
- patch_dir = os.path.join(branch_dir, 'patches')
- mkdir(patch_dir)
- refs_dir = os.path.join(git_dir, 'refs', 'patches', branch)
- mkdir(refs_dir)
- for patch in (file(os.path.join(branch_dir, 'unapplied')).readlines()
- + file(os.path.join(branch_dir, 'applied')).readlines()):
- patch = patch.strip()
- os.rename(os.path.join(branch_dir, patch),
- os.path.join(patch_dir, patch))
- Patch(patch, patch_dir, refs_dir).update_top_ref()
- set_format_version(1)
-
- # Update 1 -> 2.
- if get_format_version() == 1:
- desc_file = os.path.join(branch_dir, 'description')
- if os.path.isfile(desc_file):
- desc = read_string(desc_file)
- if desc:
- config.set('branch.%s.description' % branch, desc)
- rm(desc_file)
- rm(os.path.join(branch_dir, 'current'))
- rm(os.path.join(git_dir, 'refs', 'bases', branch))
- set_format_version(2)
-
- # Make sure we're at the latest version.
- if not get_format_version() in [None, FORMAT_VERSION]:
- raise StackException('Branch %s is at format version %d, expected %d'
- % (branch, get_format_version(), FORMAT_VERSION))
-
class PatchSet(StgitObject):
+ def __init__(self, name = None):
+ try:
+ if name:
+ self.set_name (name)
+ else:
+ self.set_name (git.get_head_file())
+ self.__base_dir = basedir.get()
+ except git.GitException, ex:
+ raise StackException, 'GIT tree not initialised: %s' % ex
+
+ self._set_dir(os.path.join(self.__base_dir, 'patches', self.get_name()))
+
def get_name(self):
return self.__name
def set_name(self, name):
self.__name = name
+ def _basedir(self):
+ return self.__base_dir
+
def get_head(self):
"""Return the head of the branch
"""
def is_initialised(self):
"""Checks if series is already initialised
"""
- return bool(config.get(format_version_key(self.get_name())))
+ return bool(config.get(self.format_version_key()))
class Series(PatchSet):
def __init__(self, name = None):
"""Takes a series name as the parameter.
"""
- try:
- if name:
- self.set_name (name)
- else:
- self.set_name (git.get_head_file())
- self.__base_dir = basedir.get()
- except git.GitException, ex:
- raise StackException, 'GIT tree not initialised: %s' % ex
-
- self._set_dir(os.path.join(self.__base_dir, 'patches', self.get_name()))
+ PatchSet.__init__(self, name)
# Update the branch to the latest format version if it is
# initialized, but don't touch it if it isn't.
- update_to_current_format_version(self.get_name(), self.__base_dir)
+ self.update_to_current_format_version()
- self.__refs_dir = os.path.join(self.__base_dir, 'refs', 'patches',
+ self.__refs_dir = os.path.join(self._basedir(), 'refs', 'patches',
self.get_name())
self.__applied_file = os.path.join(self._dir(), 'applied')
# trash directory
self.__trash_dir = os.path.join(self._dir(), 'trash')
+ def format_version_key(self):
+ return 'branch.%s.stgit.stackformatversion' % self.get_name()
+
+ def update_to_current_format_version(self):
+ """Update a potentially older StGIT directory structure to the
+ latest version. Note: This function should depend as little as
+ possible on external functions that may change during a format
+ version bump, since it must remain able to process older formats."""
+
+ branch_dir = os.path.join(self._basedir(), 'patches', self.get_name())
+ def get_format_version():
+ """Return the integer format version number, or None if the
+ branch doesn't have any StGIT metadata at all, of any version."""
+ fv = config.get(self.format_version_key())
+ ofv = config.get('branch.%s.stgitformatversion' % self.get_name())
+ if fv:
+ # Great, there's an explicitly recorded format version
+ # number, which means that the branch is initialized and
+ # of that exact version.
+ return int(fv)
+ elif ofv:
+ # Old name for the version info, upgrade it
+ config.set(self.format_version_key(), ofv)
+ config.unset('branch.%s.stgitformatversion' % self.get_name())
+ return int(ofv)
+ elif os.path.isdir(os.path.join(branch_dir, 'patches')):
+ # There's a .git/patches/<branch>/patches dirctory, which
+ # means this is an initialized version 1 branch.
+ return 1
+ elif os.path.isdir(branch_dir):
+ # There's a .git/patches/<branch> directory, which means
+ # this is an initialized version 0 branch.
+ return 0
+ else:
+ # The branch doesn't seem to be initialized at all.
+ return None
+ def set_format_version(v):
+ out.info('Upgraded branch %s to format version %d' % (self.get_name(), v))
+ config.set(self.format_version_key(), '%d' % v)
+ def mkdir(d):
+ if not os.path.isdir(d):
+ os.makedirs(d)
+ def rm(f):
+ if os.path.exists(f):
+ os.remove(f)
+
+ # Update 0 -> 1.
+ if get_format_version() == 0:
+ mkdir(os.path.join(branch_dir, 'trash'))
+ patch_dir = os.path.join(branch_dir, 'patches')
+ mkdir(patch_dir)
+ refs_dir = os.path.join(self._basedir(), 'refs', 'patches', self.get_name())
+ mkdir(refs_dir)
+ for patch in (file(os.path.join(branch_dir, 'unapplied')).readlines()
+ + file(os.path.join(branch_dir, 'applied')).readlines()):
+ patch = patch.strip()
+ os.rename(os.path.join(branch_dir, patch),
+ os.path.join(patch_dir, patch))
+ Patch(patch, patch_dir, refs_dir).update_top_ref()
+ set_format_version(1)
+
+ # Update 1 -> 2.
+ if get_format_version() == 1:
+ desc_file = os.path.join(branch_dir, 'description')
+ if os.path.isfile(desc_file):
+ desc = read_string(desc_file)
+ if desc:
+ config.set('branch.%s.description' % self.get_name(), desc)
+ rm(desc_file)
+ rm(os.path.join(branch_dir, 'current'))
+ rm(os.path.join(self._basedir(), 'refs', 'bases', self.get_name()))
+ set_format_version(2)
+
+ # Make sure we're at the latest version.
+ if not get_format_version() in [None, FORMAT_VERSION]:
+ raise StackException('Branch %s is at format version %d, expected %d'
+ % (self.get_name(), get_format_version(), FORMAT_VERSION))
+
def __patch_name_valid(self, name):
"""Raise an exception if the patch name is not valid.
"""
self.create_empty_field('applied')
self.create_empty_field('unapplied')
os.makedirs(self.__refs_dir)
+ self._set_field('orig-base', git.get_head())
- config.set(format_version_key(self.get_name()), str(FORMAT_VERSION))
+ config.set(self.format_version_key(), str(FORMAT_VERSION))
def rename(self, to_name):
"""Renames a series
git.rename_branch(self.get_name(), to_name)
if os.path.isdir(self._dir()):
- rename(os.path.join(self.__base_dir, 'patches'),
+ rename(os.path.join(self._basedir(), 'patches'),
self.get_name(), to_stack.get_name())
if os.path.exists(self.__refs_dir):
- rename(os.path.join(self.__base_dir, 'refs', 'patches'),
+ rename(os.path.join(self._basedir(), 'refs', 'patches'),
self.get_name(), to_stack.get_name())
# Rename the config section
config.unset('branch.%s.remote' % self.get_name())
config.unset('branch.%s.merge' % self.get_name())
config.unset('branch.%s.stgit.parentbranch' % self.get_name())
- config.unset('branch.%s.stgitformatversion' % self.get_name())
+ config.unset(self.format_version_key())
def refresh_patch(self, files = None, message = None, edit = False,
show_patch = False,
author_name = None, author_email = None,
author_date = None,
committer_name = None, committer_email = None,
- backup = False, sign_str = None, log = 'refresh'):
+ backup = False, sign_str = None, log = 'refresh',
+ notes = None):
"""Generates a new commit for the given patch
"""
name = self.get_current()
patch.set_commemail(committer_email)
if log:
- self.log_patch(patch, log)
+ self.log_patch(patch, log, notes)
return commit_id
else:
raise StackException, 'Unknown patch "%s"' % oldname
- def log_patch(self, patch, message):
+ def log_patch(self, patch, message, notes = None):
"""Generate a log commit for a patch
"""
top = git.get_commit(patch.get_top())
msg = '%s\t%s' % (message, top.get_id_hash())
+ if notes:
+ msg += '\n\n' + notes
old_log = patch.get_log()
if old_log: