Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
-import sys, os
+import sys, os, re
from optparse import OptionParser, make_option
from stgit.utils import *
pass
-# Global variables
-crt_series = stack.Series()
-
-
# Utility functions
def git_id(string):
"""Return the GIT id
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)
- 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()
- raise CmdException, 'Unknown id: %s' % string
+ # base
+ if patch_name == 'base' and len(string_list) == 1:
+ return read_string(series.get_base_file())
+
+ # anything else failed
+ return git.rev_parse(string)
def check_local_changes():
if git.local_changes():
else:
print 'No patches applied'
-def resolved(filename):
- git.update_cache([filename])
+def resolved(filename, reset = None):
+ if reset:
+ reset_file = filename + '.' + 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 ['.local', '.older', '.remote']:
fn = filename + ext
if os.path.isfile(fn):
os.remove(fn)
-def resolved_all():
+def resolved_all(reset = None):
conflicts = git.get_conflicts()
if conflicts:
for filename in conflicts:
- resolved(filename)
+ resolved(filename, reset)
os.remove(os.path.join(git.base_dir, 'conflicts'))
+
+def name_email(string):
+ """Return a tuple consisting of the name and email parsed from a
+ standard 'name <email>' string
+ """
+ string = re.sub('([^\w\s<>@.])', '\\\\\\1', string)
+ str_list = re.findall('^(.*)\s*<(.*)>\s*$', string)
+ if not str_list:
+ raise CmdException, 'Incorrect "name <email>" string: %s' % string
+
+ return str_list[0]
+
+def name_email_date(string):
+ """Return a tuple consisting of the name, email and date parsed
+ from a 'name <email> date' string
+ """
+ string = re.sub('([^\w\s<>@.])', '\\\\\\1', string)
+ str_list = re.findall('^(.*)\s*<(.*)>\s*(.*)\s*$', string)
+ if not str_list:
+ raise CmdException, 'Incorrect "name <email> date" string: %s' % string
+
+ return str_list[0]