* [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace @ 2008-05-14 14:27 Johannes Schindelin 2008-05-14 14:29 ` [PATCH 2/2] cvsexportcommit: introduce -W for shared working trees (between Git and CVS) Johannes Schindelin 2008-05-14 17:58 ` [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Junio C Hamano 0 siblings, 2 replies; 9+ messages in thread From: Johannes Schindelin @ 2008-05-14 14:27 UTC (permalink / raw) To: Robin Rosenberg, git In commit fef3a7cc(cvsexportcommit: be graceful when "cvs status" reorders the arguments), caution was taken to get the status even for files with leading or trailing whitespace. However, the author of that commit missed that chomp() removes only trailing whitespace. But the author realized his mistake. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- Really my fault. git-cvsexportcommit.perl | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index b6036bd..3b20bd1 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -211,6 +211,7 @@ if (@canstatusfiles) { $basename = "no file " . $basename if (exists($added{$basename})); chomp($basename); + $basename =~ s/^\s+//; if (!exists($fullname{$basename})) { $fullname{$basename} = $name; -- 1.5.5.1.375.g1becb ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/2] cvsexportcommit: introduce -W for shared working trees (between Git and CVS) 2008-05-14 14:27 [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Johannes Schindelin @ 2008-05-14 14:29 ` Johannes Schindelin 2008-05-14 17:58 ` [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Junio C Hamano 1 sibling, 0 replies; 9+ messages in thread From: Johannes Schindelin @ 2008-05-14 14:29 UTC (permalink / raw) To: Robin Rosenberg, git If you have a CVS checkout, it is easy to import the CVS history by calling "git cvsimport". However, interacting with the CVS repository using "git cvsexportcommit" was cumbersome, since that script assumes separate working directories for Git and CVS. Now, you can call cvsexportcommit with the -W option. This will automatically discover the GIT_DIR, and it will check out the parent commit before exporting the commit. The intended workflow is this: $ CVSROOT=$URL cvs co module $ cd module $ git cvsimport hack, hack, hack, making two commits, cleaning them up using rebase -i. $ git cvsexportcommit -W -c -p -u HEAD^ $ git cvsexportcommit -W -c -p -u HEAD Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- This makes cvsexportcommit slightly more usable for me. It is not (yet) a "git cvs dcommit", because it does not perform the test what to commit (and possibly commit more than one patch), and it does not rebase either. Documentation/git-cvsexportcommit.txt | 7 +++++- git-cvsexportcommit.perl | 35 ++++++++++++++++++++++++++++---- t/t9200-git-cvsexportcommit.sh | 17 ++++++++++++++++ 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.txt index 9a47b4c..b78c9f3 100644 --- a/Documentation/git-cvsexportcommit.txt +++ b/Documentation/git-cvsexportcommit.txt @@ -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 @@ -67,6 +67,11 @@ OPTIONS option does not require GIT_DIR to be set before execution if the current directory is within a git repository. +-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. diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index 3b20bd1..7105825 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -7,15 +7,15 @@ use Data::Dumper; use File::Basename qw(basename dirname); use File::Spec; -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(); die "Need at least one commit identifier!" unless @ARGV; -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 @@ -25,7 +25,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"; } @@ -116,6 +118,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 @@ -260,7 +271,11 @@ if ($dirty) { } print "Applying\n"; -`GIT_DIR= git-apply $context --summary --numstat --apply <.cvsexportcommit.diff` || die "cannot patch"; +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; @@ -313,7 +328,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); } @@ -333,6 +350,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. diff --git a/t/t9200-git-cvsexportcommit.sh b/t/t9200-git-cvsexportcommit.sh index 42b144b..b1dc32d 100755 --- a/t/t9200-git-cvsexportcommit.sh +++ b/t/t9200-git-cvsexportcommit.sh @@ -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 -- 1.5.5.1.375.g1becb ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 14:27 [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Johannes Schindelin 2008-05-14 14:29 ` [PATCH 2/2] cvsexportcommit: introduce -W for shared working trees (between Git and CVS) Johannes Schindelin @ 2008-05-14 17:58 ` Junio C Hamano 2008-05-14 18:38 ` Johannes Schindelin 1 sibling, 1 reply; 9+ messages in thread From: Junio C Hamano @ 2008-05-14 17:58 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Robin Rosenberg, git Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > In commit fef3a7cc(cvsexportcommit: be graceful when "cvs status" > reorders the arguments), caution was taken to get the status even > for files with leading or trailing whitespace. > > However, the author of that commit missed that chomp() removes only > trailing whitespace. But the author realized his mistake. > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > > Really my fault. I am not quite sure if I understand what is going on correctly. Is this about a filename that has leading or trailing whitespace, or lazily not parsing a protocol message but attempting to match with possible whitespaces around the place where a filename should be? If you are saying that the output from cvs status is so unreliable that we can only strip all whitespaces from both ends and hope for the best (e.g. files " a" (two leading spaces in the name), "a " (two trailing spaces in the name), and "a" (no such funny spaces) cannot be distinguished from cvs status output), then perhaps you would also need to remove as many trailing whitespaces as you can? "chomp()" chomps only a single line terminator, and only if one exists. sub foo { my ($a) = @_; chomp($a); print join(" ", map { sprintf "%02x", ord($_) } split(//, $a)), "\n"; } foo("abc"); # 61 62 63 foo("def\n"); # 64 65 66 foo("gh \n"); # 67 68 20 foo("ij\n\n"); # 69 6a 0a > git-cvsexportcommit.perl | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl > index b6036bd..3b20bd1 100755 > --- a/git-cvsexportcommit.perl > +++ b/git-cvsexportcommit.perl > @@ -211,6 +211,7 @@ if (@canstatusfiles) { > > $basename = "no file " . $basename if (exists($added{$basename})); > chomp($basename); > + $basename =~ s/^\s+//; > > if (!exists($fullname{$basename})) { > $fullname{$basename} = $name; > -- > 1.5.5.1.375.g1becb ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 17:58 ` [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Junio C Hamano @ 2008-05-14 18:38 ` Johannes Schindelin 2008-05-14 20:06 ` Robin Rosenberg 2008-05-14 22:30 ` [PATCH 1/2 v2] " Johannes Schindelin 0 siblings, 2 replies; 9+ messages in thread From: Johannes Schindelin @ 2008-05-14 18:38 UTC (permalink / raw) To: Junio C Hamano; +Cc: Robin Rosenberg, git Hi, On Wed, 14 May 2008, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > > > In commit fef3a7cc(cvsexportcommit: be graceful when "cvs status" > > reorders the arguments), caution was taken to get the status even for > > files with leading or trailing whitespace. > > > > However, the author of that commit missed that chomp() removes only > > trailing whitespace. But the author realized his mistake. > > > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > > --- > > > > Really my fault. > > I am not quite sure if I understand what is going on correctly. > > Is this about a filename that has leading or trailing whitespace, or > lazily not parsing a protocol message but attempting to match with > possible whitespaces around the place where a filename should be? > > If you are saying that the output from cvs status is so unreliable that > we can only strip all whitespaces from both ends and hope for the best > (e.g. files " a" (two leading spaces in the name), "a " (two trailing > spaces in the name), and "a" (no such funny spaces) cannot be > distinguished from cvs status output), then perhaps you would also need > to remove as many trailing whitespaces as you can? Yes, that is the idea. The point is: there are at least two different implementations of cvs, and I do not want to rely on a particular one. To prevent bad things from happening, the status is checked on a set of files which have unique names with regard to the chomp()ed name (well, whatever we do to the name, really). So yes, this patch needs an update. Will do so in a couple of hours, Dscho ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 18:38 ` Johannes Schindelin @ 2008-05-14 20:06 ` Robin Rosenberg 2008-05-14 22:15 ` Johannes Schindelin 2008-05-14 22:30 ` [PATCH 1/2 v2] " Johannes Schindelin 1 sibling, 1 reply; 9+ messages in thread From: Robin Rosenberg @ 2008-05-14 20:06 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git > Yes, that is the idea. The point is: there are at least two different > implementations of cvs, and I do not want to rely on a particular one. Does CVSNT add extra spaces? A question arises. Can we use cvs update instead? It can be used to retrieve the latest version (as the -u flag to cvsexportcommit does) and it will tell you what status each affected file has. cvs update -n will just give us the status with unambigous file names. -- robin ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 20:06 ` Robin Rosenberg @ 2008-05-14 22:15 ` Johannes Schindelin 0 siblings, 0 replies; 9+ messages in thread From: Johannes Schindelin @ 2008-05-14 22:15 UTC (permalink / raw) To: Robin Rosenberg; +Cc: Junio C Hamano, git Hi, On Wed, 14 May 2008, Robin Rosenberg wrote: > > Yes, that is the idea. The point is: there are at least two different > > implementations of cvs, and I do not want to rely on a particular one. > > Does CVSNT add extra spaces? Probably. At least a CR I would expect. > A question arises. Can we use cvs update instead? It can be used to > retrieve the latest version (as the -u flag to cvsexportcommit does) and > it will tell you what status each affected file has. cvs update -n will > just give us the status with unambigous file names. Will it? The thing is: as far as I can see, cvs is only "porcelain", i.e. the output is meant for users' consumption, not scripts'. So I wanted to be safe, and strip all leading and trailing whitespace, call "cvs status" (if necessary, in several runs, so that no ambiguous file names can be returned). Ciao, Dscho ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2 v2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 18:38 ` Johannes Schindelin 2008-05-14 20:06 ` Robin Rosenberg @ 2008-05-14 22:30 ` Johannes Schindelin 2008-05-15 2:27 ` Junio C Hamano 1 sibling, 1 reply; 9+ messages in thread From: Johannes Schindelin @ 2008-05-14 22:30 UTC (permalink / raw) To: Junio C Hamano; +Cc: Robin Rosenberg, git In commit fef3a7cc(cvsexportcommit: be graceful when "cvs status" reorders the arguments), caution was taken to get the status even for files with leading or trailing whitespace. However, the author of that commit missed that chomp() removes only trailing newlines. With help of the mailing list, the author realized his mistake and provided this patch. The idea is that we do not want to rely on a certain layout of the output of "cvs status". Therefore we only call it with files that are unambiguous after stripping leading and trailing whitespace. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- On Wed, 14 May 2008, Johannes Schindelin wrote: > To prevent bad things from happening, the status is checked on a > set of files which have unique names with regard to the chomp()ed > name (well, whatever we do to the name, really). > > So yes, this patch needs an update. > > Will do so in a couple of hours, And so I did. git-cvsexportcommit.perl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl index b6036bd..52ba7de 100755 --- a/git-cvsexportcommit.perl +++ b/git-cvsexportcommit.perl @@ -210,7 +210,7 @@ if (@canstatusfiles) { my $basename = basename($name); $basename = "no file " . $basename if (exists($added{$basename})); - chomp($basename); + $basename =~ s/^\s+(.*?)\s*$/$1/; if (!exists($fullname{$basename})) { $fullname{$basename} = $name; -- 1.5.5.1.375.g1becb ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2 v2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-14 22:30 ` [PATCH 1/2 v2] " Johannes Schindelin @ 2008-05-15 2:27 ` Junio C Hamano 2008-05-15 3:21 ` Johannes Schindelin 0 siblings, 1 reply; 9+ messages in thread From: Junio C Hamano @ 2008-05-15 2:27 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Robin Rosenberg, git Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > @@ -210,7 +210,7 @@ if (@canstatusfiles) { > my $basename = basename($name); > > $basename = "no file " . $basename if (exists($added{$basename})); > - chomp($basename); > + $basename =~ s/^\s+(.*?)\s*$/$1/; Isn't this no-op for a basename that does not begin with a whitespace? Don't you want to still strip trailing whitespaces in such a case? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2 v2] cvsexportcommit: chomp only removes trailing whitespace 2008-05-15 2:27 ` Junio C Hamano @ 2008-05-15 3:21 ` Johannes Schindelin 0 siblings, 0 replies; 9+ messages in thread From: Johannes Schindelin @ 2008-05-15 3:21 UTC (permalink / raw) To: Junio C Hamano; +Cc: Robin Rosenberg, git Hi, On Wed, 14 May 2008, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > > > @@ -210,7 +210,7 @@ if (@canstatusfiles) { > > my $basename = basename($name); > > > > $basename = "no file " . $basename if (exists($added{$basename})); > > - chomp($basename); > > + $basename =~ s/^\s+(.*?)\s*$/$1/; > > Isn't this no-op for a basename that does not begin with a whitespace? > Don't you want to still strip trailing whitespaces in such a case? D'oh. Time for bed. Ciao, Dscho ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-05-15 3:22 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-05-14 14:27 [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Johannes Schindelin 2008-05-14 14:29 ` [PATCH 2/2] cvsexportcommit: introduce -W for shared working trees (between Git and CVS) Johannes Schindelin 2008-05-14 17:58 ` [PATCH 1/2] cvsexportcommit: chomp only removes trailing whitespace Junio C Hamano 2008-05-14 18:38 ` Johannes Schindelin 2008-05-14 20:06 ` Robin Rosenberg 2008-05-14 22:15 ` Johannes Schindelin 2008-05-14 22:30 ` [PATCH 1/2 v2] " Johannes Schindelin 2008-05-15 2:27 ` Junio C Hamano 2008-05-15 3:21 ` Johannes Schindelin
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox