# Utility functions
-def git_id(string, strict = False):
+def git_id(string):
"""Return the GIT id
"""
if not string:
return None
string_list = string.split('/')
+ if len(string_list) == 2:
+ patch_id = string_list[1]
+ if not patch_id:
+ patch_id = 'top'
+ elif len(string_list) == 1:
+ patch_id = 'top'
+ else:
+ patch_id = None
- if len(string_list) == 1:
- patch_name = None
- git_id = string_list[0]
-
- if git_id == 'HEAD':
- return git.get_head()
- if git_id == 'base':
- return read_string(crt_series.get_base_file())
-
- for path in [os.path.join(git.base_dir, 'refs', 'heads'),
- os.path.join(git.base_dir, 'refs', 'tags')]:
- id_file = os.path.join(path, git_id)
- if os.path.isfile(id_file):
- return read_string(id_file)
-
- # maybe GIT knows more about this id
- if not strict:
- return git.rev_parse(git_id)
- elif len(string_list) == 2:
- patch_name = string_list[0]
- if patch_name == '':
- patch_name = crt_series.get_current()
- git_id = string_list[1]
+ patch_branch = string_list[0].split('@')
+ if len(patch_branch) == 1:
+ series = crt_series
+ elif len(patch_branch) == 2:
+ series = stack.Series(patch_branch[1])
+ else:
+ raise CmdException, 'Unknown id: %s' % string
+ patch_name = patch_branch[0]
+ if not patch_name:
+ patch_name = series.get_current()
if not patch_name:
raise CmdException, 'No patches applied'
- elif not (patch_name in crt_series.get_applied()
- + crt_series.get_unapplied()):
- raise CmdException, 'Unknown patch "%s"' % patch_name
- if git_id == 'bottom':
- return crt_series.get_patch(patch_name).get_bottom()
- if git_id == 'top':
- return crt_series.get_patch(patch_name).get_top()
+ # patch
+ if patch_name in series.get_applied() \
+ or patch_name in series.get_unapplied():
+ if patch_id == 'top':
+ return series.get_patch(patch_name).get_top()
+ elif patch_id == 'bottom':
+ return series.get_patch(patch_name).get_bottom()
+
+ # base
+ if patch_name == 'base' and len(string_list) == 1:
+ return read_string(series.get_base_file())
- raise CmdException, 'Unknown id: %s' % string
+ # anything else failed
+ return git.rev_parse(string)
def check_local_changes():
if git.local_changes():
Print the hash value of a GIT id (defaulting to HEAD). In addition to
the standard GIT id's like heads and tags, this command also accepts
-'base' and '[<patch>]/(bottom | top)'."""
+'base[@<branch>]' and '[<patch>[@<branch>]][/(bottom | top)]'. If no
+'top' or 'bottom' are passed and <patch> is a valid patch name, 'top'
+will be used by default."""
options = [make_option('-b', '--branch',
help = 'use BRANCH instead of the default one')]
else:
parser.error('incorrect number of arguments')
- print git_id(id_str, strict = True)
+ print git_id(id_str)
def get_applied(self):
if not os.path.isfile(self.__applied_file):
- raise StackException, \
- 'No StGIT metadata found. Try "stg init" first'
+ raise StackException, 'Branch "%s" not initialised' % self.__name
f = file(self.__applied_file)
names = [line.strip() for line in f.readlines()]
f.close()
def get_unapplied(self):
if not os.path.isfile(self.__unapplied_file):
- raise StackException, \
- 'No StGIT metadata found. Try "stg init" first'
+ raise StackException, 'Branch "%s" not initialised' % self.__name
f = file(self.__unapplied_file)
names = [line.strip() for line in f.readlines()]
f.close()