def force_fetch(self):
"""Fetch with specific arguments"""
+ # Set HEAD temporarily as fetch with an invalid non-symbolic HEAD fails
+ orig_head = self.get_ref('HEAD')
+ self.set_ref('HEAD', 'refs/heads/non-existent-tmp-for-fetching')
+
# Update all refs
- self._git_command('fetch', ['-q', '-u', '-p', 'origin'])
try:
- # Fetch remote HEAD separately
- self._git_command('fetch', ['-q', '-u', 'origin', 'HEAD'])
- except GitRepositoryError:
- # If remote HEAD is invalid, invalidate FETCH_HEAD, too
- self.set_ref('FETCH_HEAD',
- '0000000000000000000000000000000000000000')
+ self._git_command('fetch', ['-q', '-u', '-p', 'origin'])
+ try:
+ # Fetch remote HEAD separately
+ self._git_command('fetch', ['-q', '-u', 'origin', 'HEAD'])
+ except GitRepositoryError:
+ # If remote HEAD is invalid, invalidate FETCH_HEAD, too
+ self.set_ref('FETCH_HEAD',
+ '0000000000000000000000000000000000000000')
+ finally:
+ self.set_ref('HEAD', orig_head)
def force_checkout(self, commitish):
"""Checkout commitish"""
repo.set_ref('MY_REF', sha1)
eq_(repo.get_ref('MY_REF'), sha1)
+ def test_force_fetch(self):
+ """Test fetching"""
+ repo = MirrorGitRepository.clone('testrepo', self.orig_repo.path)
+
+ # Make remote HEAD invalid
+ orig_branch = self.orig_repo.get_branch()
+ with open(os.path.join(self.orig_repo.git_dir, 'HEAD'), 'w') as head:
+ head.write('ref: refs/heads/non-existent-branch\n')
+
+ # Local HEAD should be invalid after fetch
+ repo.force_fetch()
+ eq_(repo.get_ref('FETCH_HEAD'),
+ '0000000000000000000000000000000000000000')
+
+ # Fetch should succeed even if local head is invalid
+ repo.set_ref('HEAD', '1234567890123456789012345678901234567890')
+ repo.force_fetch()
+ eq_(repo.get_ref('HEAD'), '1234567890123456789012345678901234567890')
+
+ # Restore orig repo HEAD
+ self.orig_repo.set_branch(orig_branch)
+
class TestCachedRepo(UnitTestsBase):
"""Test CachedRepo class"""
# Local HEAD should be invalid, now
with assert_raises(CachedRepoError):
repo.update_working_copy('HEAD')
+ repo.close()
+
+ # Init/fetch with invalid local HEAD should succeed
+ repo = self.MockCachedRepo(self.orig_repo.path)
+
# Test valid refs, too
ok_(repo.update_working_copy('master'))