mirror of
https://github.com/dolthub/dolt.git
synced 2026-01-31 20:38:55 -06:00
440 lines
11 KiB
Bash
Executable File
440 lines
11 KiB
Bash
Executable File
#!/usr/bin/env bats
|
|
load $BATS_TEST_DIRNAME/helper/common.bash
|
|
|
|
setup() {
|
|
# See pull.bats. Can't use common remote server setup since we have multiple databases.
|
|
setup_no_dolt_init
|
|
|
|
TESTDIRS=$(pwd)/testdirs
|
|
mkdir -p $TESTDIRS/{rem1,repo1}
|
|
|
|
# repo1 -> rem1 -> repo2
|
|
cd $TESTDIRS/repo1
|
|
dolt init
|
|
dolt remote add origin file://../rem1
|
|
dolt remote add test-remote file://../rem1
|
|
dolt push origin main
|
|
|
|
cd $TESTDIRS
|
|
dolt clone file://rem1 repo2
|
|
cd $TESTDIRS/repo2
|
|
dolt branch feature
|
|
dolt remote add test-remote file://../rem1
|
|
|
|
# table and commits only present on repo1, rem1 at start
|
|
cd $TESTDIRS/repo1
|
|
dolt sql -q "create table t1 (a int primary key, b int)"
|
|
dolt add .
|
|
dolt commit -am "First commit"
|
|
dolt sql -q "insert into t1 values (0,0)"
|
|
dolt commit -am "Second commit"
|
|
dolt branch feature
|
|
dolt push origin main
|
|
cd $TESTDIRS
|
|
}
|
|
|
|
teardown() {
|
|
teardown_common
|
|
rm -rf $TESTDIRS
|
|
}
|
|
|
|
@test "fetch: basic fetch" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch
|
|
|
|
run dolt diff main origin/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of hashof('origin/main')" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch origin" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch origin
|
|
|
|
run dolt diff main origin/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'origin/main'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch main" {
|
|
cd repo1
|
|
dolt checkout feature
|
|
dolt sql -q "create table t2 (a int primary key, b int)"
|
|
dolt add .
|
|
dolt commit -am "Third commit"
|
|
dolt push origin feature
|
|
cd ..
|
|
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch origin main
|
|
|
|
run dolt diff main origin/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'origin/main'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
[[ ! "$output" =~ "t2" ]] || false
|
|
|
|
run dolt branch -r
|
|
[ "$status" -eq 0 ]
|
|
[[ ! "$output" =~ "feature" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch custom remote" {
|
|
cd repo1
|
|
dolt sql -q "create table t2 (a int primary key, b int)"
|
|
dolt add .
|
|
dolt commit -am "Third commit"
|
|
dolt push test-remote main
|
|
|
|
cd ../repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch test-remote
|
|
|
|
run dolt diff main test-remote/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'test-remote/main'" -r csv
|
|
[ "${#lines[@]}" -eq 3 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
[[ "$output" =~ "t2" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch specific ref" {
|
|
cd repo1
|
|
dolt sql -q "create table t2 (a int primary key, b int)"
|
|
dolt add .
|
|
dolt commit -am "Third commit"
|
|
dolt push test-remote main
|
|
|
|
cd ../repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch test-remote refs/heads/main:refs/remotes/test-remote/main
|
|
|
|
run dolt diff main test-remote/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'test-remote/main'" -r csv
|
|
[ "${#lines[@]}" -eq 3 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
[[ "$output" =~ "t2" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch feature branch" {
|
|
cd repo1
|
|
dolt checkout feature
|
|
dolt sql -q "create table t2 (a int primary key, b int)"
|
|
dolt add .
|
|
dolt commit -am "Third commit"
|
|
dolt push origin feature
|
|
|
|
cd ../repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch origin feature
|
|
|
|
run dolt diff main origin/feature
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'origin/feature'" -r csv
|
|
[ "${#lines[@]}" -eq 3 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
[[ "$output" =~ "t2" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch tag" {
|
|
cd repo1
|
|
dolt tag v1
|
|
dolt push origin v1
|
|
|
|
cd ../repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch origin main
|
|
|
|
run dolt diff main v1
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'v1'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch only tag" {
|
|
skip "todo tag refspec support, and/or --tags option"
|
|
cd repo1
|
|
dolt tag v1
|
|
dolt push origin v1
|
|
|
|
cd ../repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch origin refs/tags/v1:refs/tags/v1
|
|
|
|
run dolt diff main origin/v1
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'v1'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch rename ref" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch test-remote refs/heads/main:refs/remotes/test-remote/other
|
|
|
|
run dolt diff main test-remote/other
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "added table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'test-remote/other'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch override local branch" {
|
|
skip "todo more flexible refspec support"
|
|
cd repo2
|
|
setup_remote_server
|
|
|
|
dolt fetch origin main:refs/heads/main
|
|
|
|
dolt diff main origin/main
|
|
[ "$status" -eq 0 ]
|
|
[[ ! "$output" =~ "removed table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'main'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t1" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch with forced commit" {
|
|
# reverse information flow for force fetch repo1->rem1->repo2
|
|
cd repo2
|
|
dolt sql -q "create table t2 (a int)"
|
|
dolt add .
|
|
dolt commit -am "forced commit"
|
|
dolt push --force origin main
|
|
cd ../repo1
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch origin main
|
|
[ "$status" -eq 0 ]
|
|
|
|
run dolt diff main origin/main
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "deleted table" ]] || false
|
|
|
|
run dolt sql -q "show tables as of 'origin/main'" -r csv
|
|
[ "${#lines[@]}" -eq 2 ]
|
|
[[ "$output" =~ "Table" ]] || false
|
|
[[ "$output" =~ "t2" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch --prune deletes remote refs not on remote" {
|
|
if [ "$SQL_ENGINE" = "remote-engine" ]; then
|
|
skip "https://github.com/dolthub/dolt/issues/7657"
|
|
fi
|
|
|
|
mkdir firstRepo
|
|
mkdir secondRepo
|
|
|
|
cd firstRepo
|
|
dolt init
|
|
dolt remote add origin file://../remote1
|
|
dolt remote add remote2 file://../remote2
|
|
dolt branch b1
|
|
dolt branch b2
|
|
dolt push origin main
|
|
dolt push remote2 main
|
|
dolt push origin b1
|
|
dolt push remote2 b2
|
|
|
|
cd ..
|
|
dolt clone file://./remote1 secondRepo
|
|
|
|
cd secondRepo
|
|
run dolt branch -va
|
|
[[ "$output" =~ "main" ]] || false
|
|
|
|
dolt remote add remote2 file://../remote2
|
|
dolt fetch
|
|
dolt fetch remote2
|
|
|
|
run dolt branch -r
|
|
[ "$status" -eq 0 ]
|
|
[[ "$output" =~ "origin/b1" ]] || false
|
|
[[ "$output" =~ "remote2/b2" ]] || false
|
|
|
|
# delete the branches on the remote
|
|
cd ../firstRepo
|
|
dolt push origin :b1
|
|
dolt push remote2 :b2
|
|
|
|
cd ../secondRepo
|
|
dolt fetch --prune
|
|
|
|
# prune should have deleted the origin/b1 branch, but not the one on the other remote
|
|
run dolt branch -r
|
|
[ "$status" -eq 0 ]
|
|
[[ ! "$output" =~ "origin/b1" ]] || false
|
|
[[ "$output" =~ "remote2/b2" ]] || false
|
|
|
|
# now the other remote
|
|
dolt fetch --prune remote2
|
|
|
|
run dolt branch -r
|
|
[ "$status" -eq 0 ]
|
|
[[ ! "$output" =~ "origin/b1" ]] || false
|
|
[[ ! "$output" =~ "remote2/b2" ]] || false
|
|
|
|
run dolt fetch --prune remote2 refs/heads/main:refs/remotes/remote2/othermain
|
|
[ "$status" -ne 0 ]
|
|
[[ "$output" =~ "--prune option cannot be provided with a ref spec" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch unknown remote fails" {
|
|
cd repo2
|
|
dolt remote remove origin
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch unknown
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "unknown remote" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch unknown remote with fetchspec fails" {
|
|
cd repo2
|
|
dolt remote remove origin
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch unknown main
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "unknown remote" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch unknown ref fails" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch origin unknown
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "invalid ref spec: 'unknown'" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch empty remote fails" {
|
|
cd repo2
|
|
dolt remote remove origin
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "unknown remote" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch empty ref fails" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch origin ""
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "invalid fetch spec: ''" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetching from empty remote" {
|
|
cd repo2
|
|
dolt remote add empty file://../empty
|
|
|
|
setup_remote_server
|
|
|
|
dolt fetch empty
|
|
|
|
run dolt fetch empty main
|
|
[ "$status" -eq 1 ]
|
|
[[ "$output" =~ "no branches found in remote 'empty'" ]] || false
|
|
}
|
|
|
|
@test "fetch: fetch from remote host fails" {
|
|
run dolt --host hostedHost --port 3306 --user root --password password fetch origin
|
|
[ "$status" -eq 1 ]
|
|
[[ "${lines[0]}" =~ "The fetch command is not supported against a remote host yet." ]] || false
|
|
[[ "${lines[1]}" =~ "If you're interested in running this command against a remote host, hit us up on discord (https://discord.gg/gqr7K4VNKe)." ]] || false
|
|
|
|
dolt profile add --host hostedHost --port 3306 --user root --password password hostedProfile
|
|
run dolt --profile hostedProfile fetch origin
|
|
[ "$status" -eq 1 ]
|
|
[[ "${lines[0]}" =~ "The fetch command is not supported against a remote host yet." ]] || false
|
|
[[ "${lines[1]}" =~ "If you're interested in running this command against a remote host, hit us up on discord (https://discord.gg/gqr7K4VNKe)." ]] || false
|
|
}
|
|
|
|
@test "fetch: output" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch
|
|
[ "$status" -eq 0 ]
|
|
# fetch should print some kind of status message
|
|
[[ "$output" =~ "Fetching..." ]] || false
|
|
}
|
|
|
|
@test "fetch: --silent suppresses progress message" {
|
|
cd repo2
|
|
|
|
setup_remote_server
|
|
|
|
run dolt fetch --silent
|
|
[ "$status" -eq 0 ]
|
|
! [[ "$output" =~ "Fetching..." ]] || false
|
|
}
|