@@ -86,7 +86,7 @@ USAGE="[--setup <command>] [--env-filter <command>]
8686 [--parent-filter <command>] [--msg-filter <command>]
8787 [--commit-filter <command>] [--tag-name-filter <command>]
8888 [--subdirectory-filter <directory>] [--original <namespace>]
89- [-d <directory>] [-f | --force]
89+ [-d <directory>] [-f | --force] [--state-branch <branch>]
9090 [--] [<rev-list options>...]"
9191
9292OPTIONS_SPEC=
@@ -106,6 +106,7 @@ filter_msg=cat
106106filter_commit=
107107filter_tag_name=
108108filter_subdir=
109+ state_branch=
109110orig_namespace=refs/original/
110111force=
111112prune_empty=
181182 --original)
182183 orig_namespace=$( expr " $OPTARG /" : ' \(.*[^/]\)/*$' ) /
183184 ;;
185+ --state-branch)
186+ state_branch=" $OPTARG "
187+ ;;
184188 * )
185189 usage
186190 ;;
@@ -259,6 +263,26 @@ export GIT_INDEX_FILE
259263# map old->new commit ids for rewriting parents
260264mkdir ../map || die " Could not create map/ directory"
261265
266+ if test -n " $state_branch "
267+ then
268+ state_commit=$( git rev-parse --no-flags --revs-only " $state_branch " )
269+ if test -n " $state_commit "
270+ then
271+ echo " Populating map from $state_branch ($state_commit )" 1>&2
272+ perl -e' open(MAP, "-|", "git show $ARGV[0]:filter.map") or die;
273+ while (<MAP>) {
274+ m/(.*):(.*)/ or die;
275+ open F, ">../map/$1" or die;
276+ print F "$2" or die;
277+ close(F) or die;
278+ }
279+ close(MAP) or die;' " $state_commit " \
280+ || die " Unable to load state from $state_branch :filter.map"
281+ else
282+ echo " Branch $state_branch does not exist. Will create" 1>&2
283+ fi
284+ fi
285+
262286# we need "--" only if there are no path arguments in $@
263287nonrevs=$( git rev-parse --no-revs " $@ " ) || exit
264288if test -z " $nonrevs "
@@ -590,6 +614,29 @@ test -z "$ORIG_GIT_COMMITTER_DATE" || {
590614 export GIT_COMMITTER_DATE
591615}
592616
617+ if test -n " $state_branch "
618+ then
619+ echo " Saving rewrite state to $state_branch " 1>&2
620+ state_blob=$(
621+ perl -e' opendir D, "../map" or die;
622+ open H, "|-", "git hash-object -w --stdin" or die;
623+ foreach (sort readdir(D)) {
624+ next if m/^\.\.?$/;
625+ open F, "<../map/$_" or die;
626+ chomp($f = <F>);
627+ print H "$_:$f\n" or die;
628+ }
629+ close(H) or die;' || die " Unable to save state" )
630+ state_tree=$( /bin/echo -e " 100644 blob $state_blob \tfilter.map" | git mktree)
631+ if test -n " $state_commit "
632+ then
633+ state_commit=$( /bin/echo " Sync" | git commit-tree " $state_tree " -p " $state_commit " )
634+ else
635+ state_commit=$( /bin/echo " Sync" | git commit-tree " $state_tree " )
636+ fi
637+ git update-ref " $state_branch " " $state_commit "
638+ fi
639+
593640cd " $orig_dir "
594641rm -rf " $tempdir "
595642
0 commit comments