def test_GitRepo_ssh_pull(remote_path, repo_path): from datalad import ssh_manager remote_repo = GitRepo(remote_path, create=True) url = "ssh://localhost" + op.abspath(remote_path) socket_path = op.join(ssh_manager.socket_dir, get_connection_hash('localhost')) repo = GitRepo(repo_path, create=True) repo.add_remote("ssh-remote", url) # modify remote: remote_repo.checkout("ssh-test", ['-b']) with open(op.join(remote_repo.path, "ssh_testfile.dat"), "w") as f: f.write("whatever") remote_repo.add("ssh_testfile.dat") remote_repo.commit("ssh_testfile.dat added.") # file is not locally known yet: assert_not_in("ssh_testfile.dat", repo.get_indexed_files()) # pull changes: repo.pull(remote="ssh-remote", refspec=remote_repo.get_active_branch()) ok_clean_git(repo.path, annex=False) # the connection is known to the SSH manager, since fetch() requested it: assert_in(socket_path, ssh_manager._connections) # and socket was created: ok_(op.exists(socket_path)) # we actually pulled the changes assert_in("ssh_testfile.dat", repo.get_indexed_files())
def test_GitRepo_ssh_pull(remote_path, repo_path): from datalad import ssh_manager remote_repo = GitRepo(remote_path, create=True) url = "ssh://localhost" + op.abspath(remote_path) socket_path = op.join(ssh_manager.socket_dir, get_connection_hash('localhost')) repo = GitRepo(repo_path, create=True) repo.add_remote("ssh-remote", url) # modify remote: remote_repo.checkout("ssh-test", ['-b']) with open(op.join(remote_repo.path, "ssh_testfile.dat"), "w") as f: f.write("whatever") remote_repo.add("ssh_testfile.dat") remote_repo.commit("ssh_testfile.dat added.") # file is not locally known yet: assert_not_in("ssh_testfile.dat", repo.get_indexed_files()) # pull changes: repo.pull(remote="ssh-remote", refspec=remote_repo.get_active_branch()) ok_clean_git(repo.path, annex=False) # the connection is known to the SSH manager, since fetch() requested it: assert_in(socket_path, ssh_manager._connections) # and socket was created: ok_(op.exists(socket_path)) # we actually pulled the changes assert_in("ssh_testfile.dat", repo.get_indexed_files())
def test_GitRepo_get_merge_base(src): repo = GitRepo(src, create=True) with open(op.join(src, 'file.txt'), 'w') as f: f.write('load') repo.add('*') repo.commit('committing') assert_raises(ValueError, repo.get_merge_base, []) branch1 = repo.get_active_branch() branch1_hexsha = repo.get_hexsha() eq_(len(branch1_hexsha), 40) eq_(repo.get_merge_base(branch1), branch1_hexsha) # Let's create a detached branch branch2 = "_detach_" repo.checkout(branch2, options=["--orphan"]) # it will have all the files # Must not do: https://github.com/gitpython-developers/GitPython/issues/375 # repo.git_add('.') repo.add('*') # NOTE: fun part is that we should have at least a different commit message # so it results in a different checksum ;) repo.commit("committing again") assert (repo.get_indexed_files()) # we did commit assert (repo.get_merge_base(branch1) is None) assert (repo.get_merge_base([branch2, branch1]) is None) # Let's merge them up -- then merge base should match the master repo.merge(branch1, allow_unrelated=True) eq_(repo.get_merge_base(branch1), branch1_hexsha) # if points to some empty/non-existing branch - should also be None assert (repo.get_merge_base(['nonexistent', branch2]) is None)
def test_GitRepo_get_merge_base(src): repo = GitRepo(src, create=True) with open(op.join(src, 'file.txt'), 'w') as f: f.write('load') repo.add('*') repo.commit('committing') assert_raises(ValueError, repo.get_merge_base, []) branch1 = repo.get_active_branch() branch1_hexsha = repo.get_hexsha() eq_(len(branch1_hexsha), 40) eq_(repo.get_merge_base(branch1), branch1_hexsha) # Let's create a detached branch branch2 = "_detach_" repo.checkout(branch2, options=["--orphan"]) # it will have all the files # Must not do: https://github.com/gitpython-developers/GitPython/issues/375 # repo.git_add('.') repo.add('*') # NOTE: fun part is that we should have at least a different commit message # so it results in a different checksum ;) repo.commit("committing again") assert(repo.get_indexed_files()) # we did commit assert(repo.get_merge_base(branch1) is None) assert(repo.get_merge_base([branch2, branch1]) is None) # Let's merge them up -- then merge base should match the master repo.merge(branch1, allow_unrelated=True) eq_(repo.get_merge_base(branch1), branch1_hexsha) # if points to some empty/non-existing branch - should also be None assert(repo.get_merge_base(['nonexistent', branch2]) is None)
def test_GitRepo_add(src, path): gr = GitRepo(path, src) filename = "test_git_add.dat" with open(os.path.join(path, filename), 'w') as f: f.write("File to add to git") gr.git_add(filename) assert_in(filename, gr.get_indexed_files(), "%s not successfully added to %s" % (filename, path))
def test_GitRepo_add(src, path): gr = GitRepo(path, src) filename = "test_git_add.dat" with open(os.path.join(path, filename), 'w') as f: f.write("File to add to git") gr.git_add(filename) assert_in(filename, gr.get_indexed_files(), "%s not successfully added to %s" % (filename, path))
def test_GitRepo_get_indexed_files(src, path): gr = GitRepo(path, src) idx_list = gr.get_indexed_files() runner = Runner() out = runner(['git', 'ls-files'], cwd=path) out_list = out[0].split() for item in idx_list: assert_in(item, out_list, "%s not found in output of git ls-files in %s" % (item, path)) for item in out_list: assert_in(item, idx_list, "%s not found in output of get_indexed_files in %s" % (item, path))
def test_GitRepo_get_indexed_files(src, path): gr = GitRepo(path, src) idx_list = gr.get_indexed_files() runner = Runner() out = runner(['git', 'ls-files'], cwd=path) out_list = out[0].split() for item in idx_list: assert_in( item, out_list, "%s not found in output of git ls-files in %s" % (item, path)) for item in out_list: assert_in( item, idx_list, "%s not found in output of get_indexed_files in %s" % (item, path))
def test_GitRepo_ssh_push(repo_path, remote_path): from datalad import ssh_manager remote_repo = GitRepo(remote_path, create=True) url = "ssh://localhost" + op.abspath(remote_path) socket_path = op.join(ssh_manager.socket_dir, get_connection_hash('localhost')) repo = GitRepo(repo_path, create=True) repo.add_remote("ssh-remote", url) # modify local repo: repo.checkout("ssh-test", ['-b']) with open(op.join(repo.path, "ssh_testfile.dat"), "w") as f: f.write("whatever") repo.add("ssh_testfile.dat") repo.commit("ssh_testfile.dat added.") # file is not known to the remote yet: assert_not_in("ssh_testfile.dat", remote_repo.get_indexed_files()) # push changes: pushed = repo.push(remote="ssh-remote", refspec="ssh-test") # test PushInfo object for assert_in("ssh-remote/ssh-test", [commit.remote_ref.name for commit in pushed]) # the connection is known to the SSH manager, since fetch() requested it: assert_in(socket_path, ssh_manager._connections) # and socket was created: ok_(op.exists(socket_path)) # remote now knows the changes: assert_in("ssh-test", remote_repo.get_branches()) assert_in("ssh_testfile.dat", remote_repo.get_files("ssh-test")) # amend to make it require "--force": repo.commit("amended", options=['--amend']) # push without --force should yield an error: pushed = repo.push(remote="ssh-remote", refspec="ssh-test") assert_in("[rejected] (non-fast-forward)", pushed[0].summary) # now push using force: repo.push(remote="ssh-remote", refspec="ssh-test", force=True) # correct commit message in remote: assert_in("amended", list(remote_repo.get_branch_commits('ssh-test'))[-1].summary)
def test_GitRepo_ssh_push(repo_path, remote_path): from datalad import ssh_manager remote_repo = GitRepo(remote_path, create=True) url = "ssh://localhost" + op.abspath(remote_path) socket_path = op.join(ssh_manager.socket_dir, get_connection_hash('localhost')) repo = GitRepo(repo_path, create=True) repo.add_remote("ssh-remote", url) # modify local repo: repo.checkout("ssh-test", ['-b']) with open(op.join(repo.path, "ssh_testfile.dat"), "w") as f: f.write("whatever") repo.add("ssh_testfile.dat") repo.commit("ssh_testfile.dat added.") # file is not known to the remote yet: assert_not_in("ssh_testfile.dat", remote_repo.get_indexed_files()) # push changes: pushed = repo.push(remote="ssh-remote", refspec="ssh-test") # test PushInfo object for assert_in("ssh-remote/ssh-test", [commit.remote_ref.name for commit in pushed]) # the connection is known to the SSH manager, since fetch() requested it: assert_in(socket_path, ssh_manager._connections) # and socket was created: ok_(op.exists(socket_path)) # remote now knows the changes: assert_in("ssh-test", remote_repo.get_branches()) assert_in("ssh_testfile.dat", remote_repo.get_files("ssh-test")) # amend to make it require "--force": repo.commit("amended", options=['--amend']) # push without --force should yield an error: pushed = repo.push(remote="ssh-remote", refspec="ssh-test") assert_in("[rejected] (non-fast-forward)", pushed[0].summary) # now push using force: repo.push(remote="ssh-remote", refspec="ssh-test", force=True) # correct commit message in remote: assert_in("amended", list(remote_repo.get_branch_commits('ssh-test'))[-1].summary)
def test_git_custom_calls(path, path2): # we need a GitRepo instance repo = GitRepo(path, create=True) with open(op.join(path, "cc_test.dat"), 'w') as f: f.write("test_git_custom_calls") out, err = repo._gitpy_custom_call('add', 'cc_test.dat') # actually executed: assert_in("cc_test.dat", repo.get_indexed_files()) ok_(repo.dirty) # call using cmd_options: out, err = repo._gitpy_custom_call('commit', cmd_options={'m': 'added file'}) ok_clean_git(path, annex=False) # check output: assert_in("1 file changed", out) assert_in("cc_test.dat", out) eq_('', err) # impossible 'add' call should raise ... assert_raises(GitCommandError, repo._gitpy_custom_call, 'add', 'not_existing', expect_fail=False) # .. except we expect it to fail: repo._gitpy_custom_call('add', 'not_existing', expect_fail=True) # log outputs: with swallow_logs(new_level=logging.DEBUG) as cm: out, err = repo._gitpy_custom_call('status', log_stdout=True, log_stderr=True) assert_in("On branch master", out) assert_in("nothing to commit", out) eq_("", err) for line in out.splitlines(): assert_in("stdout| " + line, cm.out) # don't log outputs: with swallow_logs(new_level=logging.DEBUG) as cm: out, err = repo._gitpy_custom_call('status', log_stdout=False, log_stderr=False) assert_in("On branch master", out) assert_in("nothing to commit", out) eq_("", err) eq_("", cm.out) # use git_options: # Note: 'path2' doesn't contain a git repository with assert_raises(GitCommandError) as cm: repo._gitpy_custom_call('status', git_options={'C': path2}) assert_in("-C %s status" % path2, str(cm.exception)) assert_re_in("fatal: [Nn]ot a git repository", str(cm.exception), match=False)