X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/681f805ef4688c7ea450f5e72a15dad818809734..57f3e325b9f45dc2c7fd0415bb646179bc37b3bf:/stgit/git.py diff --git a/stgit/git.py b/stgit/git.py index 038aaac..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,19 +808,20 @@ 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. At the moment, just - use the 'git-pull' command +def fetch(repository = 'origin', refspec = None): + """Fetches changes from the remote repository, using 'git-fetch' + by default. """ - # 'git-pull' updates the HEAD + # we update the HEAD __clear_head_cache() args = [repository] if refspec: args.append(refspec) - if __run(config.get('stgit.pullcmd'), args) != 0: - raise GitException, 'Failed "git-pull %s"' % repository + command = config.get('stgit.pullcmd') + if __run(command, args) != 0: + raise GitException, 'Failed "%s %s"' % (command, repository) def repack(): """Repack all objects into a single pack @@ -902,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 @@ -925,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 @@ -949,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