Skip to content

Commit a76a496

Browse files
committed
subtree: add git subtree use and ignore commands
Tell split to use or ignore larger sections of the history. In most cases split does this automatically based on metadata from subtree add. Signed-off-by: Tom Clarkson <[email protected]>
1 parent a67c256 commit a76a496

File tree

1 file changed

+66
-12
lines changed

1 file changed

+66
-12
lines changed

contrib/subtree/git-subtree.sh

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ then
99
set -- -h
1010
fi
1111
OPTS_SPEC="\
12-
git subtree add --prefix=<prefix> <commit>
13-
git subtree add --prefix=<prefix> <repository> <ref>
14-
git subtree merge --prefix=<prefix> <commit>
15-
git subtree pull --prefix=<prefix> <repository> <ref>
16-
git subtree push --prefix=<prefix> <repository> <ref>
17-
git subtree split --prefix=<prefix> <commit>
18-
git subtree map --prefix=<prefix> <mainline> <subtree>
12+
git subtree add --prefix=<prefix> <commit>
13+
git subtree add --prefix=<prefix> <repository> <ref>
14+
git subtree merge --prefix=<prefix> <commit>
15+
git subtree pull --prefix=<prefix> <repository> <ref>
16+
git subtree push --prefix=<prefix> <repository> <ref>
17+
git subtree split --prefix=<prefix> <commit>
18+
git subtree map --prefix=<prefix> <mainline> <subtree>
19+
git subtree ignore --prefix=<prefix> <commit>
20+
git subtree use --prefix=<prefix> <commit>
1921
--
2022
h,help show the help
2123
q quiet
@@ -162,7 +164,7 @@ command="$1"
162164
shift
163165

164166
case "$command" in
165-
add|merge|pull|map)
167+
add|merge|pull|map|ignore|use)
166168
default=
167169
;;
168170
split|push)
@@ -433,6 +435,18 @@ find_mainline_ref () {
433435
done
434436
}
435437

438+
exclude_processed_refs () {
439+
if test -r "$cachedir/processed"
440+
then
441+
cat "$cachedir/processed" |
442+
while read rev
443+
do
444+
debug "read $rev"
445+
echo "^$rev"
446+
done
447+
fi
448+
}
449+
436450
copy_commit () {
437451
# We're going to set some environment vars here, so
438452
# do it in a subshell to get rid of them safely later
@@ -798,20 +812,60 @@ cmd_add_commit () {
798812
}
799813

800814
cmd_map () {
801-
oldrev="$1"
802-
newrev="$2"
803815

804-
if test -z "$oldrev"
816+
if test -z "$1"
805817
then
806818
die "You must provide a revision to map"
807819
fi
808820

821+
oldrev=$(git rev-parse --revs-only "$1") || exit $?
822+
newrev=
823+
824+
if test -n "$2"
825+
then
826+
newrev=$(git rev-parse --revs-only "$2") || exit $?
827+
fi
828+
809829
cache_setup || exit $?
810830
cache_set "$oldrev" "$newrev"
811831

812832
say "Mapped $oldrev => $newrev"
813833
}
814834

835+
cmd_ignore () {
836+
revs=$(git rev-parse $default --revs-only "$@") || exit $?
837+
ensure_single_rev $revs
838+
839+
say "Ignoring $revs"
840+
841+
cache_setup || exit $?
842+
843+
git rev-list $revs |
844+
while read rev
845+
do
846+
cache_set "$rev" ""
847+
done
848+
849+
echo "$revs" >>"$cachedir/processed"
850+
}
851+
852+
cmd_use () {
853+
revs=$(git rev-parse $default --revs-only "$@") || exit $?
854+
ensure_single_rev $revs
855+
856+
say "Using existing subtree $revs"
857+
858+
cache_setup || exit $?
859+
860+
git rev-list $revs |
861+
while read rev
862+
do
863+
cache_set "$rev" "$rev"
864+
done
865+
866+
echo "$revs" >>"$cachedir/processed"
867+
}
868+
815869
cmd_split () {
816870
debug "Splitting $dir..."
817871
cache_setup || exit $?
@@ -829,7 +883,7 @@ cmd_split () {
829883
done
830884
fi
831885

832-
unrevs="$(find_existing_splits "$dir" "$revs")"
886+
unrevs="$(find_existing_splits "$dir" "$revs") $(exclude_processed_refs)"
833887

834888
mainline="$(find_mainline_ref "$dir" "$revs")"
835889
if test -n "$mainline"

0 commit comments

Comments
 (0)