@@ -427,6 +427,133 @@ test_expect_success 'split "sub dir"/ with --branch for an incompatible branch'
427427 )
428428'
429429
430+ #
431+ # Tests for 'git subtree pull'
432+ #
433+
434+ test_expect_success ' pull requires option --prefix' '
435+ subtree_test_create_repo "$test_count" &&
436+ subtree_test_create_repo "$test_count/sub proj" &&
437+ test_create_commit "$test_count" main1 &&
438+ test_create_commit "$test_count/sub proj" sub1 &&
439+ (
440+ cd "$test_count" &&
441+ git fetch ./"sub proj" HEAD &&
442+ git subtree add --prefix="sub dir" FETCH_HEAD
443+ ) &&
444+ test_create_commit "$test_count/sub proj" sub2 &&
445+ (
446+ cd "$test_count" &&
447+ test_must_fail git subtree pull ./"sub proj" HEAD >out 2>err &&
448+
449+ echo "You must provide the --prefix option." >expected &&
450+ test_must_be_empty out &&
451+ test_cmp expected err
452+ )
453+ '
454+
455+ test_expect_success ' pull requires path given by option --prefix must exist' '
456+ subtree_test_create_repo "$test_count" &&
457+ subtree_test_create_repo "$test_count/sub proj" &&
458+ test_create_commit "$test_count" main1 &&
459+ test_create_commit "$test_count/sub proj" sub1 &&
460+ (
461+ test_must_fail git subtree pull --prefix="sub dir" ./"sub proj" HEAD >out 2>err &&
462+
463+ echo "' \' ' sub dir' \' ' does not exist; use ' \' ' git subtree add' \' ' " >expected &&
464+ test_must_be_empty out &&
465+ test_cmp expected err
466+ )
467+ '
468+
469+ test_expect_success ' pull basic operation' '
470+ subtree_test_create_repo "$test_count" &&
471+ subtree_test_create_repo "$test_count/sub proj" &&
472+ test_create_commit "$test_count" main1 &&
473+ test_create_commit "$test_count/sub proj" sub1 &&
474+ (
475+ cd "$test_count" &&
476+ git fetch ./"sub proj" HEAD &&
477+ git subtree add --prefix="sub dir" FETCH_HEAD
478+ ) &&
479+ test_create_commit "$test_count/sub proj" sub2 &&
480+ (
481+ cd "$test_count" &&
482+ exp=$(git -C "sub proj" rev-parse --verify HEAD:) &&
483+ git subtree pull --prefix="sub dir" ./"sub proj" HEAD &&
484+ act=$(git rev-parse --verify HEAD:"sub dir") &&
485+ test "$act" = "$exp"
486+ )
487+ '
488+
489+ #
490+ # Tests for 'git subtree push'
491+ #
492+
493+ test_expect_success ' push requires option --prefix' '
494+ subtree_test_create_repo "$test_count" &&
495+ subtree_test_create_repo "$test_count/sub proj" &&
496+ test_create_commit "$test_count" main1 &&
497+ test_create_commit "$test_count/sub proj" sub1 &&
498+ (
499+ cd "$test_count" &&
500+ git fetch ./"sub proj" HEAD &&
501+ git subtree add --prefix="sub dir" FETCH_HEAD &&
502+ echo "You must provide the --prefix option." >expected &&
503+ test_must_fail git subtree push "./sub proj" from-mainline >actual 2>&1 &&
504+ test_debug "printf ' " expected: " ' " &&
505+ test_debug "cat expected" &&
506+ test_debug "printf ' " actual: " ' " &&
507+ test_debug "cat actual" &&
508+ test_cmp expected actual
509+ )
510+ '
511+
512+ test_expect_success ' push requires path given by option --prefix must exist' '
513+ subtree_test_create_repo "$test_count" &&
514+ subtree_test_create_repo "$test_count/sub proj" &&
515+ test_create_commit "$test_count" main1 &&
516+ test_create_commit "$test_count/sub proj" sub1 &&
517+ (
518+ cd "$test_count" &&
519+ git fetch ./"sub proj" HEAD &&
520+ git subtree add --prefix="sub dir" FETCH_HEAD &&
521+ echo "' \' ' non-existent-directory' \' ' does not exist; use ' \' ' git subtree add' \' ' " >expected &&
522+ test_must_fail git subtree push --prefix=non-existent-directory "./sub proj" from-mainline >actual 2>&1 &&
523+ test_debug "printf ' " expected: " ' " &&
524+ test_debug "cat expected" &&
525+ test_debug "printf ' " actual: " ' " &&
526+ test_debug "cat actual" &&
527+ test_cmp expected actual
528+ )
529+ '
530+
531+ test_expect_success ' push basic operation' '
532+ subtree_test_create_repo "$test_count" &&
533+ subtree_test_create_repo "$test_count/sub proj" &&
534+ test_create_commit "$test_count" main1 &&
535+ test_create_commit "$test_count/sub proj" sub1 &&
536+ (
537+ cd "$test_count" &&
538+ git fetch ./"sub proj" HEAD &&
539+ git subtree add --prefix="sub dir" FETCH_HEAD
540+ ) &&
541+ test_create_commit "$test_count" "sub dir"/main-sub1 &&
542+ test_create_commit "$test_count" main2 &&
543+ test_create_commit "$test_count/sub proj" sub2 &&
544+ test_create_commit "$test_count" "sub dir"/main-sub2 &&
545+ (
546+ cd "$test_count" &&
547+ git fetch ./"sub proj" HEAD &&
548+ git subtree merge --prefix="sub dir" FETCH_HEAD &&
549+ before=$(git rev-parse --verify HEAD) &&
550+ split_hash=$(git subtree split --prefix="sub dir") &&
551+ git subtree push --prefix="sub dir" ./"sub proj" from-mainline &&
552+ test "$before" = "$(git rev-parse --verify HEAD)" &&
553+ test "$split_hash" = "$(git -C "sub proj" rev-parse --verify refs/heads/from-mainline)"
554+ )
555+ '
556+
430557#
431558# Validity checking
432559#
0 commit comments