cmd/clone: add include/exclude via flags and config

This commit is contained in:
Taylor Blau 2016-06-22 15:45:59 -06:00
parent 7d8734c1ce
commit 72b52c5f19
2 changed files with 150 additions and 3 deletions

@ -19,7 +19,9 @@ var (
Run: cloneCommand,
}
cloneFlags git.CloneFlags
cloneFlags git.CloneFlags
cloneIncludeArg string
cloneExcludeArg string
)
func cloneCommand(cmd *cobra.Command, args []string) {
@ -71,11 +73,12 @@ func cloneCommand(cmd *cobra.Command, args []string) {
config.Config.CurrentRemote = "origin"
}
include, exclude := determineIncludeExcludePaths(config.Config, cloneIncludeArg, cloneExcludeArg)
if cloneFlags.NoCheckout || cloneFlags.Bare {
// If --no-checkout or --bare then we shouldn't check out, just fetch instead
fetchRef("HEAD", nil, nil)
fetchRef("HEAD", include, exclude)
} else {
pull(nil, nil)
pull(include, exclude)
}
}
@ -106,5 +109,9 @@ func init() {
cloneCmd.Flags().BoolVarP(&cloneFlags.Verbose, "verbose", "", false, "See 'git clone --help'")
cloneCmd.Flags().BoolVarP(&cloneFlags.Ipv4, "ipv4", "", false, "See 'git clone --help'")
cloneCmd.Flags().BoolVarP(&cloneFlags.Ipv6, "ipv6", "", false, "See 'git clone --help'")
cloneCmd.Flags().StringVarP(&cloneIncludeArg, "include", "I", "", "Include a list of paths")
cloneCmd.Flags().StringVarP(&cloneExcludeArg, "exclude", "X", "", "Exclude a list of paths")
RootCmd.AddCommand(cloneCmd)
}

@ -223,3 +223,143 @@ begin_test "clone with flags"
)
end_test
begin_test "clone (with include/exclude args)"
(
set -e
reponame="clone_include_exclude"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
contents_a="a"
contents_a_oid=$(calc_oid "$contents_a")
printf "$contents_a" > "a.dat"
contents_b="b"
contents_b_oid=$(calc_oid "$contents_b")
printf "$contents_b" > "b.dat"
git add a.dat b.dat .gitattributes
git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log
grep "master (root-commit)" commit.log
grep "3 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 b.dat" commit.log
grep "create mode 100644 .gitattributes" commit.log
git push origin master 2>&1 | tee push.log
grep "master -> master" push.log
grep "Git LFS: (2 of 2 files)" push.log
cd "$TRASHDIR"
local_reponame="clone_with_includes"
git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "a.dat"
pushd "$local_reponame"
assert_local_object "$contents_a_oid" 1
refute_local_object "$contents_b_oid"
popd
local_reponame="clone_with_excludes"
git lfs clone "$GITSERVER/$reponame" "$local_reponame" -I "b.dat" -X "a.dat"
pushd "$local_reponame"
assert_local_object "$contents_b_oid" 1
refute_local_object "$contents_a_oid"
popd
)
end_test
begin_test "clone (with include .lfsconfig)"
(
set -e
reponame="clone_include_lfsconfig"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
contents_a="a"
contents_a_oid=$(calc_oid "$contents_a")
printf "$contents_a" > "a.dat"
contents_b="b"
contents_b_oid=$(calc_oid "$contents_b")
printf "$contents_b" > "b.dat"
git config -f ".lfsconfig" "lfs.fetchinclude" "a*"
git add a.dat b.dat .gitattributes .lfsconfig
git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log
grep "master (root-commit)" commit.log
grep "4 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 b.dat" commit.log
grep "create mode 100644 .lfsconfig" commit.log
grep "create mode 100644 .gitattributes" commit.log
git push origin master 2>&1 | tee push.log
grep "master -> master" push.log
grep "Git LFS: (2 of 2 files)" push.log
cd "$TRASHDIR"
local_reponame="clone_with_config_includes"
git lfs clone "$GITSERVER/$reponame" "$local_reponame"
pushd "$local_reponame"
assert_local_object "$contents_a_oid" 1
refute_local_object "$contents_b_oid"
popd
)
end_test
begin_test "clone (with exclude .lfsconfig)"
(
set -e
reponame="clone_exclude_lfsconfig"
setup_remote_repo "$reponame"
clone_repo "$reponame" "$reponame"
git lfs track "*.dat" 2>&1 | tee track.log
grep "Tracking \*.dat" track.log
contents_a="a"
contents_a_oid=$(calc_oid "$contents_a")
printf "$contents_a" > "a.dat"
contents_b="b"
contents_b_oid=$(calc_oid "$contents_b")
printf "$contents_b" > "b.dat"
git config -f ".lfsconfig" "lfs.fetchinclude" "b*"
git config -f ".lfsconfig" "lfs.fetchexclude" "a*"
git add a.dat b.dat .gitattributes .lfsconfig
git commit -m "add a.dat, b.dat" 2>&1 | tee commit.log
grep "master (root-commit)" commit.log
grep "4 files changed" commit.log
grep "create mode 100644 a.dat" commit.log
grep "create mode 100644 b.dat" commit.log
grep "create mode 100644 .lfsconfig" commit.log
grep "create mode 100644 .gitattributes" commit.log
git push origin master 2>&1 | tee push.log
grep "master -> master" push.log
grep "Git LFS: (2 of 2 files)" push.log
cd "$TRASHDIR"
local_reponame="clone_with_config_excludes"
git lfs clone "$GITSERVER/$reponame" "$local_reponame"
pushd "$local_reponame"
assert_local_object "$contents_b_oid" 1
refute_local_object "$contents_a_oid"
popd
)
end_test