04_test_submodules.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. # vim: set fileencoding=utf-8 :
  2. """Test submodule L{GitRepository} submodule methods"""
  3. from . import context
  4. import os
  5. import shutil
  6. import tarfile
  7. from nose.tools import eq_, ok_
  8. import gbp.log
  9. import gbp.git
  10. import gbp.command_wrappers
  11. from gbp.scripts import buildpackage
  12. from gbp.scripts.common.buildpackage import (git_archive_submodules,
  13. git_archive_single)
  14. from tests.testutils import ls_zip
  15. REPO = None
  16. REPODIR = None
  17. SUBMODULES = []
  18. SUBMODULE_NAMES = ["test_submodule", "sub module"]
  19. TMPDIR = None
  20. TESTFILE_NAME = "testfile"
  21. TESTDIR_NAME = "testdir"
  22. class Submodule(object):
  23. """Class representing remote repo for Git submodule"""
  24. def __init__(self, name, tmpdir):
  25. self.name = name
  26. self.dir = os.path.join(tmpdir, name)
  27. self.repo = gbp.git.GitRepository.create(self.dir)
  28. def setup():
  29. """Test module setup"""
  30. global REPO, REPODIR, SUBMODULES, TMPDIR
  31. TMPDIR = context.new_tmpdir(__name__)
  32. REPODIR = TMPDIR.join('test_repo')
  33. REPO = gbp.git.GitRepository.create(REPODIR)
  34. for name in SUBMODULE_NAMES:
  35. SUBMODULES.append(Submodule(name, str(TMPDIR)))
  36. context.chdir(REPODIR)
  37. def teardown():
  38. """Test module teardown"""
  39. context.teardown()
  40. def test_empty_has_submodules():
  41. """Test empty repo for submodules"""
  42. ok_(not REPO.has_submodules())
  43. def _add_dummy_data(repo, msg):
  44. """Commit dummy data to a Git repository"""
  45. shutil.copy(".git/HEAD", TESTFILE_NAME)
  46. os.mkdir(TESTDIR_NAME)
  47. shutil.copy(TESTFILE_NAME, os.path.join(TESTDIR_NAME, TESTFILE_NAME))
  48. repo.add_files('.', force=True)
  49. repo.commit_all(msg)
  50. def test_add_files():
  51. """Add some dummy data"""
  52. _add_dummy_data(REPO, "initial commit")
  53. ok_(True)
  54. def test_add_submodule_files():
  55. """Add some dummy data"""
  56. for submodule in SUBMODULES:
  57. os.chdir(submodule.dir)
  58. _add_dummy_data(submodule.repo, "initial commit in submodule")
  59. os.chdir(REPODIR)
  60. ok_(True)
  61. def test_add_submodule():
  62. """Add a submodule"""
  63. REPO.add_submodule(SUBMODULES[0].dir)
  64. REPO.commit_all(msg='Added submodule %s' % SUBMODULES[0].dir)
  65. def test_has_submodules():
  66. """Check for submodules"""
  67. ok_(REPO.has_submodules())
  68. ok_(REPO.has_submodules('HEAD'))
  69. ok_(not REPO.has_submodules('HEAD^'))
  70. def test_get_submodules():
  71. """Check for submodules list of (name, hash)"""
  72. modules = REPO.get_submodules("master")[0]
  73. eq_(modules[0], 'test_submodule')
  74. eq_(len(modules[1]), 40)
  75. def test_dump_tree():
  76. """Dump the repository and check if files exist"""
  77. dumpdir = TMPDIR.join("dump")
  78. os.mkdir(dumpdir)
  79. ok_(buildpackage.dump_tree(REPO, dumpdir, "master", True))
  80. ok_(os.path.exists(os.path.join(dumpdir, TESTFILE_NAME)))
  81. ok_(os.path.exists(os.path.join(dumpdir, TESTDIR_NAME, TESTFILE_NAME)))
  82. ok_(os.path.exists(os.path.join(dumpdir, SUBMODULES[0].name,
  83. TESTFILE_NAME)))
  84. # No submodules or subdirs if recursive is False
  85. dumpdir = TMPDIR.join("dump2")
  86. os.mkdir(dumpdir)
  87. ok_(buildpackage.dump_tree(REPO, dumpdir, "master", True, False))
  88. ok_(os.path.exists(os.path.join(dumpdir, TESTFILE_NAME)))
  89. ok_(not os.path.exists(os.path.join(dumpdir, TESTDIR_NAME)))
  90. ok_(not os.path.exists(os.path.join(dumpdir, SUBMODULES[0].name)))
  91. def test_create_tarballs():
  92. """Create an upstream tarball"""
  93. # Tarball with submodules
  94. changelog = {"Source": "test", "Upstream-Version": "0.1"}
  95. ok_(buildpackage.git_archive(REPO, changelog, str(TMPDIR), "HEAD", "bzip2",
  96. 9, True))
  97. # Tarball without submodules
  98. changelog = {"Source": "test", "Upstream-Version": "0.2"}
  99. ok_(buildpackage.git_archive(REPO, changelog, str(TMPDIR), "HEAD", "bzip2",
  100. 9, False))
  101. def test_create_zip_archives():
  102. """Create an upstream zip archive"""
  103. git_archive_submodules(REPO, 'HEAD', 'with-submodules.zip', 'test',
  104. '', '', '', 'zip')
  105. # Check that submodules were included
  106. contents = ls_zip('with-submodules.zip')
  107. ok_('test/test_submodule/testfile' in contents)
  108. git_archive_single('HEAD', 'without-submodules.zip', 'test',
  109. '', None, '', 'zip')
  110. contents = ls_zip('without-submodules.zip')
  111. ok_('test/test_submodule/testfile' not in contents)
  112. def test_check_tarfiles():
  113. """Check the contents of the created tarfile"""
  114. # Check tarball with submodules
  115. tarobj = tarfile.open(TMPDIR.join("test_0.1.orig.tar.bz2"), 'r:*')
  116. files = tarobj.getmembers()
  117. ok_("test-0.1/.gitmodules" in [f.name for f in files])
  118. eq_(len(files), 10)
  119. # Check tarball without submodules
  120. tarobj = tarfile.open(TMPDIR.join("test_0.2.orig.tar.bz2"), 'r:*')
  121. files = tarobj.getmembers()
  122. ok_(("test-0.2/%s" % TESTFILE_NAME) in [f.name for f in files])
  123. eq_(len(files), 6)
  124. def test_add_whitespace_submodule():
  125. """Add a second submodule with name containing whitespace"""
  126. REPO.add_submodule(SUBMODULES[1].dir)
  127. REPO.commit_all(msg='Added submodule %s' % SUBMODULES[0].dir)
  128. def test_get_more_submodules():
  129. """Check for submodules list of (name, hash)"""
  130. module = REPO.get_submodules("master")
  131. eq_(len(module), len(SUBMODULE_NAMES))
  132. for module in REPO.get_submodules("master"):
  133. eq_(len(module[1]), 40)
  134. ok_(os.path.basename(module[0]) in SUBMODULE_NAMES)
  135. # vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: