# [PATCH 0/3] Handful of cvsexportcommit patches

6 messages from 2006-05-27 to 2006-06-17. Participants: Yann Dirson, Sven Verdoolaege.
Thread: https://gitlist.dev/t/4311

## Yann Dirson, 2006-05-27 16:36

Subject: [PATCH 0/3] Handful of cvsexportcommit patches
Message-ID: <20060527163641.474.93575.stgit@gandelf.nowhere.earth>
URL: https://gitlist.dev/e/20060527163641.474.93575.stgit%40gandelf.nowhere.earth

```
The following series contains a collection of cvsexportcommit changes I have at hand.
The support for creating directory files was only tested on a 1.0.7 code base, I'll
have to shake this one before being confident with it, but that will be done next week.
In the meantime, it may still be of interest for someone :)

Best regards,
-- 
Yann Dirson    <ydirson@altern.org> |
Debian-related: <dirson@debian.org> |   Support Debian GNU/Linux:
                                    |  Freedom, Power, Stability, Gratis
     http://ydirson.free.fr/        | Check <http://www.debian.org/>

```

## Yann Dirson, 2006-05-27 16:39

Subject: [PATCH 1/3] Do not call 'cmp' with non-existant -q flag.
Message-ID: <20060527163931.474.19611.stgit@gandelf.nowhere.earth>
URL: https://gitlist.dev/e/20060527163931.474.19611.stgit%40gandelf.nowhere.earth
In-Reply-To: <20060527163641.474.93575.stgit@gandelf.nowhere.earth>

```

I cannot find when that flag was removed if it ever existed, I can find
nothing about it in the ChangeLog and NEWS file of GNU diff.  The current
flag is -s aka --quiet aka --silent, so let's use -s, assuming it is a
portable flag.  Feel free to lart me with a POSIX bible if needed.

Signed-off-by: Yann Dirson <ydirson@altern.org>
---

 git-cvsexportcommit.perl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index f994443..ed87dc9 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -151,7 +151,7 @@ foreach my $f (@bfiles) {
     my $blob = `git-ls-tree $tree "$f" | cut -f 1 | cut -d ' ' -f 3`;
     chomp $blob;
     `git-cat-file blob $blob > $tmpdir/blob`;
-    if (system('cmp', '-q', $f, "$tmpdir/blob")) {
+    if (system('cmp', '-s', $f, "$tmpdir/blob")) {
 	warn "Binary file $f in CVS does not match parent.\n";
 	$dirty = 1;
 	next;

```

## Yann Dirson, 2006-05-27 16:39

Subject: [PATCH 2/3] Document current cvsps limitations.
Message-ID: <20060527163933.474.4059.stgit@gandelf.nowhere.earth>
URL: https://gitlist.dev/e/20060527163933.474.4059.stgit%40gandelf.nowhere.earth
In-Reply-To: <20060527163641.474.93575.stgit@gandelf.nowhere.earth>

```

Since there is no bugtracker that I know of, let's just use the scripts
themselves to document their limitations.

Signed-off-by: Yann Dirson <ydirson@altern.org>
---

 git-cvsexportcommit.perl |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index ed87dc9..3e4e90b 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -1,5 +1,12 @@
 #!/usr/bin/perl -w
 
+# Known limitations:
+# - cannot add or remove binary files
+# - cannot add parent directories when needed
+# - does not propagate permissions
+# - tells "ready for commit" even when things could not be completed
+#   (eg addition of a binary file)
+
 use strict;
 use Getopt::Std;
 use File::Temp qw(tempdir);

```

## Yann Dirson, 2006-05-27 16:39

Subject: [PATCH 3/3] Make cvsexportcommit create parent directories as needed.
Message-ID: <20060527163935.474.22794.stgit@gandelf.nowhere.earth>
URL: https://gitlist.dev/e/20060527163935.474.22794.stgit%40gandelf.nowhere.earth
In-Reply-To: <20060527163641.474.93575.stgit@gandelf.nowhere.earth>

```

This is a quick port of my initial patch for 1.0.7, that I had forgotten to
post.  Possibly needs some testing before applying to master.

Signed-off-by: Yann Dirson <ydirson@altern.org>
---

 git-cvsexportcommit.perl |   37 ++++++++++++++++++++++++++++++++-----
 1 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index 3e4e90b..57088c3 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -2,7 +2,6 @@ #!/usr/bin/perl -w
 
 # Known limitations:
 # - cannot add or remove binary files
-# - cannot add parent directories when needed
 # - does not propagate permissions
 # - tells "ready for commit" even when things could not be completed
 #   (eg addition of a binary file)
@@ -11,7 +10,7 @@ use strict;
 use Getopt::Std;
 use File::Temp qw(tempdir);
 use Data::Dumper;
-use File::Basename qw(basename);
+use File::Basename qw(basename dirname);
 
 unless ($ENV{GIT_DIR} && -r $ENV{GIT_DIR}){
     die "GIT_DIR is not defined or is unreadable";
@@ -91,7 +90,7 @@ close MSG;
 `git-cat-file commit $commit | sed -e '1,/^\$/d' >> .msg`;
 $? && die "Error extracting the commit message";
 
-my (@afiles, @dfiles, @mfiles);
+my (@afiles, @dfiles, @mfiles, @dirs);
 my @files = safe_pipe_capture('git-diff-tree', '-r', $parent, $commit);
 #print @files;
 $? && die "Error in git-diff-tree";
@@ -99,7 +98,14 @@ foreach my $f (@files) {
     chomp $f;
     my @fields = split(m!\s+!, $f);
     if ($fields[4] eq 'A') {
-	push @afiles, $fields[5];
+        my $path = $fields[5];
+	push @afiles, $path;
+        # add any needed parent directories
+	$path = dirname $path;
+	while (!-d $path and ! grep { $_ eq $path } @dirs) {
+	    unshift @dirs, $path;
+	    $path = dirname $path;
+	}
     }
     if ($fields[4] eq 'M') {
 	push @mfiles, $fields[5];
@@ -114,13 +120,21 @@ undef @files; # don't need it anymore
 
 # check that the files are clean and up to date according to cvs
 my $dirty;
+foreach my $d (@dirs) {
+    if (-e $d) {
+	$dirty = 1;
+	warn "$d exists and is not a directory!\n";
+    }
+}
 foreach my $f (@afiles) {
     # This should return only one value
     my @status = grep(m/^File/,  safe_pipe_capture('cvs', '-q', 'status' ,$f));
     if (@status > 1) { warn 'Strange! cvs status returned more than one line?'};
-    unless ($status[0] =~ m/Status: Unknown$/) {
+    if (-d dirname $f and $status[0] !~ m/Status: Unknown$/
+	and $status[0] !~ m/^File: no file /) {
  	$dirty = 1;
 	warn "File $f is already known in your CVS checkout -- perhaps it has been added by another user. Or this may indicate that it exists on a different branch. If this is the case, use -f to force the merge.\n";
+	warn "Status was: $status\n";
     }
 }
 foreach my $f (@mfiles, @dfiles) {
@@ -146,6 +160,19 @@ ###       you MUST call cleanupcvs(@file
 ###
 
 
+print "Creating new directories\n";
+foreach my $d (@dirs) {
+    unless (mkdir $d) {
+        warn "Could not mkdir $d: $!";
+	$dirty = 1;
+    }
+    `cvs add $d`;
+    if ($?) {
+	$dirty = 1;
+	warn "Failed to cvs add directory $d -- you may need to do it manually";
+    }
+}
+
 print "'Patching' binary files\n";
 
 my @bfiles = grep(m/^Binary/, safe_pipe_capture('git-diff-tree', '-p', $parent, $commit));

```

## Yann Dirson, 2006-05-27 19:13

Subject: Re: [PATCH 2/3] Document current cvsps limitations.
Message-ID: <20060527191358.GN6535@nowhere.earth>
URL: https://gitlist.dev/e/20060527191358.GN6535%40nowhere.earth
In-Reply-To: <20060527163933.474.4059.stgit@gandelf.nowhere.earth>

```
Well, you will have corrected by yourself, but I did mean
"cvsexportcommit limitations" :)

-- 
Yann Dirson    <ydirson@altern.org> |
Debian-related: <dirson@debian.org> |   Support Debian GNU/Linux:
                                    |  Freedom, Power, Stability, Gratis
     http://ydirson.free.fr/        | Check <http://www.debian.org/>

```

## Sven Verdoolaege, 2006-06-17 17:46

Subject: [PATCH] git-cvsexportcommit.perl: fix typo
Message-ID: <20060617174640.GG1325MdfPADPa@greensroom.kotnet.org>
URL: https://gitlist.dev/e/20060617174640.GG1325MdfPADPa%40greensroom.kotnet.org
In-Reply-To: <20060527163935.474.22794.stgit@gandelf.nowhere.earth>

```
---
 git-cvsexportcommit.perl |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/git-cvsexportcommit.perl b/git-cvsexportcommit.perl
index 57088c3..d1051d0 100755
--- a/git-cvsexportcommit.perl
+++ b/git-cvsexportcommit.perl
@@ -134,7 +134,7 @@ foreach my $f (@afiles) {
 	and $status[0] !~ m/^File: no file /) {
  	$dirty = 1;
 	warn "File $f is already known in your CVS checkout -- perhaps it has been added by another user. Or this may indicate that it exists on a different branch. If this is the case, use -f to force the merge.\n";
-	warn "Status was: $status\n";
+	warn "Status was: $status[0]\n";
     }
 }
 foreach my $f (@mfiles, @dfiles) {
-- 
1.4.0-dirty

```
