from stgit import basedir
from stgit.utils import *
from stgit.config import config
+from sets import Set
# git exception class
class GitException(Exception):
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
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
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
# 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