def __check_base_dir():
return os.path.isdir(base_dir)
-def __tree_status(files = [], tree_id = 'HEAD', unknown = False):
+def __tree_status(files = [], tree_id = 'HEAD', unknown = False, noexclude = True):
"""Returns a list of pairs - [status, filename]
"""
os.system('git-update-cache --refresh > /dev/null')
# unknown files
if unknown:
exclude_file = os.path.join(base_dir, 'exclude')
+ base_exclude = [ '--exclude=*.[ao]', '--exclude=.*' '--exclude=TAGS',
+ '--exclude=tags', '--exclude=*~', '--exclude=#*',
+ '--exclude-per-directory=.gitignore' ]
extra_exclude = []
if os.path.exists(exclude_file):
extra_exclude.append('--exclude-from=%s' % exclude_file)
- lines = _output_lines(['git-ls-files', '--others',
- '--exclude=*.[ao]', '--exclude=.*'
- '--exclude=TAGS', '--exclude=tags', '--exclude=*~',
- '--exclude=#*'] + extra_exclude)
+ if noexclude:
+ extra_exclude = base_exclude = []
+ lines = _output_lines(['git-ls-files', '--others' ] + base_exclude
+ + extra_exclude)
cache_files += [('?', line.strip()) for line in lines]
# conflicted files
# get the commit message
f = file('.commitmsg', 'w+')
- if message[-1] == '\n':
+ if message[-1:] == '\n':
f.write(message)
else:
print >> f, message
raise GitException, 'git-merge-cache failed (possible conflicts)'
def status(files = [], modified = False, new = False, deleted = False,
- conflict = False, unknown = False):
+ conflict = False, unknown = False, noexclude = False):
"""Show the tree status
"""
- cache_files = __tree_status(files, unknown = True)
+ cache_files = __tree_status(files, unknown = True, noexclude = noexclude)
all = not (modified or new or deleted or conflict or unknown)
if not all:
__set_head(tree_id)
+def reset(tree_id = None):
+ """Revert the tree changes relative to the given tree_id. It removes
+ any local changes
+ """
+ if not tree_id:
+ tree_id = get_head()
+
+ cache_files = __tree_status(tree_id = tree_id)
+ rm_files = [x[1] for x in cache_files if x[0] in ['D']]
+
+ checkout(tree_id = tree_id, force = True)
+ __set_head(tree_id)
+
+ # checkout doesn't remove files
+ map(os.remove, rm_files)
+
def pull(location, head = None, tag = None):
"""Fetch changes from the remote repository. At the moment, just
use the 'git fetch' scripts