from stgit import stack, git, basedir
from stgit.config import config, file_extensions
-crt_series = None
-
# Command exception class
class CmdException(StgException):
# No, we can't parse that.
raise RevParseException
-def git_id(rev):
+def git_id(crt_series, rev):
"""Return the GIT id
"""
if not rev:
return None
+
+ # try a GIT revision first
+ try:
+ return git.rev_parse(rev + '^{commit}')
+ except git.GitException:
+ pass
+
+ # try an StGIT patch name
try:
patch, branch, patch_id = parse_rev(rev)
if branch == None:
return series.get_base()
except RevParseException:
pass
- return git.rev_parse(rev + '^{commit}')
+ except stack.StackException:
+ pass
+
+ raise CmdException, 'Unknown patch or revision: %s' % rev
def check_local_changes():
if git.local_changes():
raise CmdException, \
'local changes in the tree. Use "refresh" or "status --reset"'
-def check_head_top_equal():
+def check_head_top_equal(crt_series):
if not crt_series.head_top_equal():
raise CmdException(
"""HEAD and top are not the same. This can happen if you
- modify a branch with git. The "assimilate" command can
- fix this situation.""")
+ modify a branch with git. "stg repair --help" explains
+ more about what to do next.""")
def check_conflicts():
- if os.path.exists(os.path.join(basedir.get(), 'conflicts')):
+ if git.get_conflicts():
raise CmdException, \
'Unsolved conflicts. Please resolve them first or\n' \
' revert the changes with "status --reset"'
-def print_crt_patch(branch = None):
+def print_crt_patch(crt_series, branch = None):
if not branch:
patch = crt_series.get_current()
else:
else:
out.info('No patches applied')
-def resolved(filename, reset = None):
+def resolved(filenames, reset = None):
if reset:
- reset_file = filename + file_extensions()[reset]
- if os.path.isfile(reset_file):
- if os.path.isfile(filename):
- os.remove(filename)
- os.rename(reset_file, filename)
-
- git.update_cache([filename], force = True)
-
- for ext in file_extensions().values():
- fn = filename + ext
- if os.path.isfile(fn):
- os.remove(fn)
+ stage = {'ancestor': 1, 'current': 2, 'patched': 3}[reset]
+ Run('git', 'checkout-index', '--no-create', '--stage=%d' % stage,
+ '--stdin', '-z').input_nulterm(filenames).no_output()
+ git.add(filenames)
+ for filename in filenames:
+ os.utime(filename, None) # update the access and modificatied times
def resolved_all(reset = None):
conflicts = git.get_conflicts()
- if conflicts:
- for filename in conflicts:
- resolved(filename, reset)
- os.remove(os.path.join(basedir.get(), 'conflicts'))
+ resolved(conflicts, reset)
-def push_patches(patches, check_merged = False):
+def push_patches(crt_series, patches, check_merged = False):
"""Push multiple patches onto the stack. This function is shared
between the push and pull commands
"""
else:
out.done()
-def pop_patches(patches, keep = False):
+def pop_patches(crt_series, patches, keep = False):
"""Pop the patches in the list from the stack. It is assumed that
the patches are listed in the stack reverse order.
"""
for addr in addr_str.split(',')]
return ', '.join([addr for addr in addr_list if addr])
-def prepare_rebase():
+def prepare_rebase(crt_series):
# pop all patches
applied = crt_series.get_applied()
if len(applied) > 0:
out.done()
return applied
-def rebase(target):
+def rebase(crt_series, target):
try:
- tree_id = git_id(target)
+ tree_id = git_id(crt_series, target)
except:
# it might be that we use a custom rebase command with its own
# target type
git.rebase(tree_id = tree_id)
out.done()
-def post_rebase(applied, nopush, merged):
+def post_rebase(crt_series, applied, nopush, merged):
# memorize that we rebased to here
crt_series._set_field('orig-base', git.get_head())
# push the patches back
if not nopush:
- push_patches(applied, merged)
+ push_patches(crt_series, applied, merged)
#
# Patch description/e-mail/diff parsing
return (descr, authname, authemail, authdate, diff)
-def parse_patch(fobj):
- """Parse the input file and return (description, authname,
+def parse_patch(text):
+ """Parse the input text and return (description, authname,
authemail, authdate, diff)
"""
- descr, diff = __split_descr_diff(fobj.read())
+ descr, diff = __split_descr_diff(text)
descr, authname, authemail, authdate = __parse_description(descr)
# we don't yet have an agreed place for the creation date.
@readonly_constant_property
def git_dir(self):
try:
- return Run('git-rev-parse', '--git-dir'
+ return Run('git', 'rev-parse', '--git-dir'
).discard_stderr().output_one_line()
except RunException:
raise DirectoryException('No git repository found')
@readonly_constant_property
def __topdir_path(self):
try:
- lines = Run('git-rev-parse', '--show-cdup'
+ lines = Run('git', 'rev-parse', '--show-cdup'
).discard_stderr().output_lines()
if len(lines) == 0:
return '.'
@readonly_constant_property
def is_inside_git_dir(self):
return { 'true': True, 'false': False
- }[Run('git-rev-parse', '--is-inside-git-dir'
+ }[Run('git', 'rev-parse', '--is-inside-git-dir'
).output_one_line()]
@readonly_constant_property
def is_inside_worktree(self):
return { 'true': True, 'false': False
- }[Run('git-rev-parse', '--is-inside-work-tree'
+ }[Run('git', 'rev-parse', '--is-inside-work-tree'
).output_one_line()]
def cd_to_topdir(self):
os.chdir(self.__topdir_path)