Merge pull request #2558 from git-lfs/migrate-everything

commands: teach '--everything' to 'git lfs migrate'
This commit is contained in:
Taylor Blau 2017-09-07 16:38:10 -04:00 committed by GitHub
commit bec5f340e4
4 changed files with 145 additions and 1 deletions

@ -19,6 +19,10 @@ var (
// migrateExcludeRefs is a set of Git references to explicitly exclude
// in the migration.
migrateExcludeRefs []string
// migrateEverything indicates the presence of the --everything flag,
// and instructs 'git lfs migrate' to migrate all local references.
migrateEverything bool
)
// migrate takes the given command and arguments, *odb.ObjectDatabase, as well
@ -91,7 +95,7 @@ func rewriteOptions(args []string, opts *githistory.RewriteOptions, l *log.Logge
func includeExcludeRefs(l *log.Logger, args []string) (include, exclude []string, err error) {
hardcore := len(migrateIncludeRefs) > 0 || len(migrateExcludeRefs) > 0
if len(args) == 0 && !hardcore {
if len(args) == 0 && !hardcore && !migrateEverything {
// If no branches were given explicitly AND neither
// --include-ref or --exclude-ref flags were given, then add the
// currently checked out reference.
@ -102,6 +106,10 @@ func includeExcludeRefs(l *log.Logger, args []string) (include, exclude []string
args = append(args, current.Name)
}
if migrateEverything && len(args) > 0 {
return nil, nil, errors.New("fatal: cannot use --everything with explicit reference arguments")
}
for _, name := range args {
// Then, loop through each branch given, resolve that reference,
// and include it.
@ -114,11 +122,24 @@ func includeExcludeRefs(l *log.Logger, args []string) (include, exclude []string
}
if hardcore {
if migrateEverything {
return nil, nil, errors.New("fatal: cannot use --everything with --include-ref or --exclude-ref")
}
// If either --include-ref=<ref> or --exclude-ref=<ref> were
// given, append those to the include and excluded reference
// set, respectively.
include = append(include, migrateIncludeRefs...)
exclude = append(exclude, migrateExcludeRefs...)
} else if migrateEverything {
localRefs, err := git.LocalRefs()
if err != nil {
return nil, nil, err
}
for _, ref := range localRefs {
include = append(include, ref.Name)
}
} else {
// Otherwise, if neither --include-ref=<ref> or
// --exclude-ref=<ref> were given, include no additional
@ -236,6 +257,7 @@ func init() {
subcommand.Flags().StringSliceVar(&migrateIncludeRefs, "include-ref", nil, "An explicit list of refs to include")
subcommand.Flags().StringSliceVar(&migrateExcludeRefs, "exclude-ref", nil, "An explicit list of refs to exclude")
subcommand.Flags().BoolVar(&migrateEverything, "everything", false, "Migrate all local references")
cmd.AddCommand(subcommand)
}

@ -24,6 +24,9 @@ git-lfs-migrate(1) - Migrate history to or from git-lfs
* `--exclude-ref`=<refname>:
See [INCLUDE AND EXCLUDE (REFS)].
* `--everything`:
See [INCLUDE AND EXCLUDE (REFS)].
* [branch ...]:
Migrate only the set of branches listed. If not given, `git-lfs-migrate(1)`
will migrate the currently checked out branch.
@ -105,6 +108,9 @@ The following configuration:
Would, therefore, include commits: F, E, D, C, B, but exclude commit A.
The presence of flag --everything indicates that all local references should be
migrated.
## SEE ALSO
Part of the git-lfs(1) suite.

@ -342,3 +342,61 @@ begin_test "migrate import (prefix include(s))"
done
)
end_test
begin_test "migrate import (--everything)"
(
set -e
setup_multiple_local_branches
git checkout master
master_txt_oid="$(calc_oid "$(git cat-file -p :a.txt)")"
master_md_oid="$(calc_oid "$(git cat-file -p :a.md)")"
feature_md_oid="$(calc_oid "$(git cat-file -p my-feature:a.md)")"
master_txt_size="$(git cat-file -p :a.txt | wc -c | awk '{ print $1 }')"
master_md_size="$(git cat-file -p :a.md | wc -c | awk '{ print $1 }')"
feature_md_size="$(git cat-file -p my-feature:a.md | wc -c | awk '{ print $1 }')"
git lfs migrate import --everything
assert_pointer "master" "a.txt" "$master_txt_oid" "$master_txt_size"
assert_pointer "master" "a.md" "$master_md_oid" "$master_md_size"
assert_pointer "my-feature" "a.md" "$feature_md_oid" "$feature_md_size"
)
end_test
begin_test "migrate import (--everything with args)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything master 2>&1)" = \
"fatal: cannot use --everything with explicit reference arguments" ]
)
end_test
begin_test "migrate import (--everything with --include-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything --include-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test
exit 0
begin_test "migrate import (--everything with --exclude-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate import --everything --exclude-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test

@ -265,3 +265,61 @@ begin_test "migrate info (empty set)"
[ "0" -eq "$(echo -n "$migrate" | wc -l | awk '{ print $1 }')" ]
)
end_test
begin_test "migrate info (--everything)"
(
set -e
setup_multiple_local_branches
git checkout master
original_master="$(git rev-parse refs/heads/master)"
original_feature="$(git rev-parse refs/heads/my-feature)"
diff -u <(git lfs migrate info --everything 2>&1 | tail -n 2) <(cat <<-EOF
*.md 170 B 2/2 files(s) 100%
*.txt 120 B 1/1 files(s) 100%
EOF)
migrated_master="$(git rev-parse refs/heads/master)"
migrated_feature="$(git rev-parse refs/heads/my-feature)"
assert_ref_unmoved "refs/heads/master" "$original_master" "$migrated_master"
assert_ref_unmoved "refs/heads/my-feature" "$original_feature" "$migrated_feature"
)
end_test
begin_test "migrate info (--everything with args)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate info --everything master 2>&1)" = \
"fatal: cannot use --everything with explicit reference arguments" ]
)
end_test
begin_test "migrate info (--everything with --include-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate info --everything --include-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test
exit 0
begin_test "migrate info (--everything with --exclude-ref)"
(
set -e
setup_multiple_local_branches
[ "$(git lfs migrate info --everything --exclude-ref=refs/heads/master 2>&1)" = \
"fatal: cannot use --everything with --include-ref or --exclude-ref" ]
)
end_test