repository = libstack.Repository.default()
return git_commit(rev, repository, crt_series.get_name()).sha1
+def get_public_ref(branch_name):
+ """Return the public ref of the branch."""
+ public_ref = config.get('branch.%s.public' % branch_name)
+ if not public_ref:
+ public_ref = 'refs/heads/%s.public' % branch_name
+ return public_ref
+
def git_commit(name, repository, branch_name = None):
"""Return the a Commit object if 'name' is a patch name or Git commit.
The patch names allowed are in the form '<branch>:<patch>' and can
be followed by standard symbols used by git rev-parse. If <patch>
- is '{base}', it represents the bottom of the stack.
+ is '{base}', it represents the bottom of the stack. If <patch> is
+ {public}, it represents the public branch corresponding to the stack as
+ described in the 'publish' command.
"""
# Try a [branch:]patch name first
branch, patch = parse_rev(name)
base_id = repository.get_stack(branch).base.sha1
return repository.rev_parse(base_id +
strip_prefix('{base}', patch))
+ elif patch.startswith('{public}'):
+ public_ref = get_public_ref(branch)
+ return repository.rev_parse(public_ref +
+ strip_prefix('{public}', patch),
+ discard_stderr = True)
# Other combination of branch and patch
try:
except libgit.RepositoryException:
raise CmdException('%s: Unknown patch or revision name' % name)
+def color_diff_flags():
+ """Return the git flags for coloured diff output if the configuration and
+ stdout allows."""
+ stdout_is_tty = (sys.stdout.isatty() and 'true') or 'false'
+ if config.get_colorbool('color.diff', stdout_is_tty) == 'true':
+ return ['--color']
+ else:
+ return []
+
def check_local_changes():
if git.local_changes():
raise CmdException('local changes in the tree. Use "refresh" or'
def check_conflicts():
if git.get_conflicts():
- raise CmdException('Unsolved conflicts. Please resolve them first'
- ' or revert the changes with "status --reset"')
+ raise CmdException('Unsolved conflicts. Please fix the conflicts'
+ ' then use "git add --update <files>" or revert the'
+ ' changes with "status --reset".')
def print_crt_patch(crt_series, branch = None):
if not branch:
return getattr(self, n)
return property(new_f)
+def update_commit_data(cd, options, allow_edit = False):
+ """Return a new CommitData object updated according to the command line
+ options."""
+ # Set the commit message from commandline.
+ if options.message != None:
+ cd = cd.set_message(options.message)
+
+ # Modify author data.
+ cd = cd.set_author(options.author(cd.author))
+
+ # Add Signed-off-by: or similar.
+ if options.sign_str != None:
+ sign_str = options.sign_str
+ else:
+ sign_str = config.get("stgit.autosign")
+ if sign_str != None:
+ cd = cd.set_message(
+ add_sign_line(cd.message, sign_str,
+ cd.committer.name, cd.committer.email))
+
+ # Let user edit the commit message manually.
+ if allow_edit and not options.message:
+ cd = cd.set_message(edit_string(cd.message, '.stgit-new.txt'))
+
+ return cd
+
class DirectoryException(StgException):
pass