Merge branch 'js/cvsexportcommit'
* js/cvsexportcommit: cvsexportcommit: introduce -W for shared working trees (between Git and CVS) cvsexportcommit: chomp only removes trailing whitespace Conflicts: git-cvsexportcommit.perlmaint
						commit
						6c99f18660
					
				|  | @ -8,7 +8,7 @@ git-cvsexportcommit - Export a single commit to a CVS checkout | |||
|  | ||||
| SYNOPSIS | ||||
| -------- | ||||
| 'git-cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] [-w cvsworkdir] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID | ||||
| 'git-cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] [-w cvsworkdir] [-W] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID | ||||
|  | ||||
|  | ||||
| DESCRIPTION | ||||
|  | @ -68,6 +68,11 @@ OPTIONS | |||
| 	current directory is within a git repository.  The default is the | ||||
| 	value of 'cvsexportcommit.cvsdir'. | ||||
|  | ||||
| -W:: | ||||
| 	Tell cvsexportcommit that the current working directory is not only | ||||
| 	a Git checkout, but also the CVS checkout.  Therefore, Git will | ||||
| 	reset the working directory to the parent commit before proceeding. | ||||
|  | ||||
| -v:: | ||||
| 	Verbose. | ||||
|  | ||||
|  |  | |||
|  | @ -8,9 +8,9 @@ use File::Basename qw(basename dirname); | |||
| use File::Spec; | ||||
| use Git; | ||||
|  | ||||
| our ($opt_h, $opt_P, $opt_p, $opt_v, $opt_c, $opt_f, $opt_a, $opt_m, $opt_d, $opt_u, $opt_w); | ||||
| our ($opt_h, $opt_P, $opt_p, $opt_v, $opt_c, $opt_f, $opt_a, $opt_m, $opt_d, $opt_u, $opt_w, $opt_W); | ||||
|  | ||||
| getopts('uhPpvcfam:d:w:'); | ||||
| getopts('uhPpvcfam:d:w:W'); | ||||
|  | ||||
| $opt_h && usage(); | ||||
|  | ||||
|  | @ -20,7 +20,7 @@ die "Need at least one commit identifier!" unless @ARGV; | |||
| my $repo = Git->repository(); | ||||
| $opt_w = $repo->config('cvsexportcommit.cvsdir') unless defined $opt_w; | ||||
|  | ||||
| if ($opt_w) { | ||||
| if ($opt_w || $opt_W) { | ||||
| 	# Remember where GIT_DIR is before changing to CVS checkout | ||||
| 	unless ($ENV{GIT_DIR}) { | ||||
| 		# No GIT_DIR set. Figure it out for ourselves | ||||
|  | @ -30,7 +30,9 @@ if ($opt_w) { | |||
| 	} | ||||
| 	# Make sure GIT_DIR is absolute | ||||
| 	$ENV{GIT_DIR} = File::Spec->rel2abs($ENV{GIT_DIR}); | ||||
| } | ||||
|  | ||||
| if ($opt_w) { | ||||
| 	if (! -d $opt_w."/CVS" ) { | ||||
| 		die "$opt_w is not a CVS checkout"; | ||||
| 	} | ||||
|  | @ -121,6 +123,15 @@ if ($parent) { | |||
|     } | ||||
| } | ||||
|  | ||||
| my $go_back_to = 0; | ||||
|  | ||||
| if ($opt_W) { | ||||
|     $opt_v && print "Resetting to $parent\n"; | ||||
|     $go_back_to = `git symbolic-ref HEAD 2> /dev/null || | ||||
| 	git rev-parse HEAD` || die "Could not determine current branch"; | ||||
|     system("git checkout -q $parent^0") && die "Could not check out $parent^0"; | ||||
| } | ||||
|  | ||||
| $opt_v && print "Applying to CVS commit $commit from parent $parent\n"; | ||||
|  | ||||
| # grab the commit message | ||||
|  | @ -215,7 +226,8 @@ if (@canstatusfiles) { | |||
| 	my $basename = basename($name); | ||||
|  | ||||
| 	$basename = "no file " . $basename if (exists($added{$basename})); | ||||
| 	chomp($basename); | ||||
| 	$basename =~ s/^\s+//; | ||||
| 	$basename =~ s/\s+$//; | ||||
|  | ||||
| 	if (!exists($fullname{$basename})) { | ||||
| 	  $fullname{$basename} = $name; | ||||
|  | @ -264,7 +276,11 @@ if ($dirty) { | |||
| } | ||||
|  | ||||
| print "Applying\n"; | ||||
| if ($opt_W) { | ||||
|     system("git checkout -q $commit^0") && die "cannot patch"; | ||||
| } else { | ||||
|     `GIT_DIR= git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch"; | ||||
| } | ||||
|  | ||||
| print "Patch applied successfully. Adding new files and directories to CVS\n"; | ||||
| my $dirtypatch = 0; | ||||
|  | @ -317,7 +333,9 @@ if ($dirtypatch) { | |||
|     print "using a patch program. After applying the patch and resolving the\n"; | ||||
|     print "problems you may commit using:"; | ||||
|     print "\n    cd \"$opt_w\"" if $opt_w; | ||||
|     print "\n    $cmd\n\n"; | ||||
|     print "\n    $cmd\n"; | ||||
|     print "\n    git checkout $go_back_to\n" if $go_back_to; | ||||
|     print "\n"; | ||||
|     exit(1); | ||||
| } | ||||
|  | ||||
|  | @ -337,6 +355,14 @@ if ($opt_c) { | |||
| # clean up | ||||
| unlink(".cvsexportcommit.diff"); | ||||
|  | ||||
| if ($opt_W) { | ||||
|     system("git checkout $go_back_to") && die "cannot move back to $go_back_to"; | ||||
|     if (!($go_back_to =~ /^[0-9a-fA-F]{40}$/)) { | ||||
| 	system("git symbolic-ref HEAD $go_back_to") && | ||||
| 	    die "cannot move back to $go_back_to"; | ||||
|     } | ||||
| } | ||||
|  | ||||
| # CVS version 1.11.x and 1.12.x sleeps the wrong way to ensure the timestamp | ||||
| # used by CVS and the one set by subsequence file modifications are different. | ||||
| # If they are not different CVS will not detect changes. | ||||
|  |  | |||
|  | @ -297,4 +297,21 @@ test_expect_success 'commit a file with leading spaces in the name' ' | |||
|  | ||||
| ' | ||||
|  | ||||
| test_expect_success 'use the same checkout for Git and CVS' ' | ||||
|  | ||||
| 	(mkdir shared && | ||||
| 	 cd shared && | ||||
| 	 unset GIT_DIR && | ||||
| 	 cvs co . && | ||||
| 	 git init && | ||||
| 	 git add " space" && | ||||
| 	 git commit -m "fake initial commit" && | ||||
| 	 echo Hello >> " space" && | ||||
| 	 git commit -m "Another change" " space" && | ||||
| 	 git cvsexportcommit -W -p -u -c HEAD && | ||||
| 	 grep Hello " space" && | ||||
| 	 git diff-files) | ||||
|  | ||||
| ' | ||||
|  | ||||
| test_done | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano