X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/4cd6405eb66123eac7bc45f465900056243839c8..HEAD:/stgit/git.py diff --git a/stgit/git.py b/stgit/git.py index e30b959..6769a9f 100644 --- a/stgit/git.py +++ b/stgit/git.py @@ -23,6 +23,7 @@ import sys, os, popen2, re, gitmergeonefile from stgit import basedir from stgit.utils import * from stgit.config import config +from sets import Set # git exception class class GitException(Exception): @@ -807,9 +808,9 @@ def reset(files = None, tree_id = None, check_out = True): if not files: __set_head(tree_id) -def pull(repository = 'origin', refspec = None): - """Pull changes from the remote repository. Uses 'git-fetch' - and moves the stack base. +def fetch(repository = 'origin', refspec = None): + """Fetches changes from the remote repository, using 'git-fetch' + by default. """ # we update the HEAD __clear_head_cache() @@ -822,10 +823,6 @@ def pull(repository = 'origin', refspec = None): if __run(command, args) != 0: raise GitException, 'Failed "%s %s"' % (command, repository) - if (config.get('stgit.pull-does-rebase')): - # FIXME! - reset(tree_id = rev_parse(repository)) - def repack(): """Repack all objects into a single pack """ @@ -907,15 +904,19 @@ def __remotes_from_config(): return config.sections_matching(r'remote\.(.*)\.url') def __remotes_from_dir(dir): - return os.listdir(os.path.join(basedir.get(), dir)) + d = os.path.join(basedir.get(), dir) + if os.path.exists(d): + return os.listdir(d) + else: + return None def remotes_list(): """Return the list of remotes in the repository """ - return set(__remotes_from_config()) | \ - set(__remotes_from_dir('remotes')) | \ - set(__remotes_from_dir('branches')) + return Set(__remotes_from_config()) | \ + Set(__remotes_from_dir('remotes')) | \ + Set(__remotes_from_dir('branches')) def remotes_local_branches(remote): """Returns the list of local branches fetched from given remote @@ -930,7 +931,8 @@ def remotes_local_branches(remote): for line in stream: # Only consider Pull lines m = re.match('^Pull: (.*)\n$', line) - branches.append(refspec_localpart(m.group(1))) + if m: + branches.append(refspec_localpart(m.group(1))) stream.close() elif remote in __remotes_from_dir('branches'): # old-style branches only declare one branch @@ -954,3 +956,23 @@ def identify_remote(branchname): # if we get here we've found nothing return None + +def fetch_head(): + """Return the git id for the tip of the parent branch as left by + 'git fetch'. + """ + + fetch_head=None + stream = open(os.path.join(basedir.get(), 'FETCH_HEAD'), "r") + for line in stream: + # Only consider lines not tagged not-for-merge + m = re.match('^([^\t]*)\t\t', line) + if m: + if fetch_head: + raise GitException, "StGit does not support multiple FETCH_HEAD" + else: + fetch_head=m.group(1) + stream.close() + + # here we are sure to have a single fetch_head + return fetch_head