handle deletes and adds including file modes
authorStefan Metzmacher <metze@samba.org>
Wed, 14 Nov 2007 15:51:14 +0000 (09:51 -0600)
committerStefan Metzmacher <metze@samba.org>
Wed, 14 Nov 2007 15:57:34 +0000 (09:57 -0600)
metze

samba4-sync.pl

index 36f6c79..95be2bb 100755 (executable)
@@ -131,14 +131,50 @@ sub is_dir($)
 sub construct_chunk($)
 {
        my ($chunk) = @_;
+       my @content =  @{$chunk->{content}->{lines}};
 
-       my $out = join("\n", @{$chunk->{content}->{lines}});
+       my @hdr = splice(@content, 0, 5);
 
-       $out =~ s/^Index: ([^\n]+)\n[=]+/diff -u a\/$1 b\/$1/g;
-       $out =~ s/--- ([^\(]+)\(revision: 0\)/--- \/dev\/null/g;
-       $out =~ s/--- ([^\(]+)\([^\n]+/--- a\/$1/g;
-       $out =~ s/\+\+\+ ([^\(]+)\(revision: 0\)/+++ \/dev\/null/g;
-       $out =~ s/\+\+\+ ([^\(]+)\([^\n]+/+++ b\/$1/g;
+       confess "hdr[0]" unless $hdr[0] =~ /^Index: /;
+       confess "hdr[1]" unless $hdr[1] =~ /^[=]+$/;
+       confess "hdr[2]" unless $hdr[2] =~ /^--- /;
+       confess "hdr[3]" unless $hdr[3] =~ /^\+\+\+ /;
+       confess "hdr[4]" unless $hdr[4] =~ /^\@@ /;
+
+       $hdr[0] =~ s/^Index: ([^\n]+)$/diff --git a\/$1 b\/$1/g;
+       $hdr[2] =~ s/--- ([^\(]+)\(revision 0\)/--- \/dev\/null/g;
+       $hdr[2] =~ s/--- ([^\(]+)\([^\n]+/--- a\/$1/g;
+       $hdr[3] =~ s/\+\+\+ ([^\(]+)\(revision 0\)/+++ \/dev\/null/g;
+       $hdr[3] =~ s/\+\+\+ ([^\(]+)\([^\n]+/+++ b\/$1/g;
+
+       if ($hdr[4] =~ /\@\@ -\d+,\d+ \+0,0 \@\@/) {
+               $hdr[3] = "+++ /dev/null";
+       }
+
+       my $oldsha1 = "1234567";
+       my $newsha1 = "7654321";
+       my $mode = "";
+
+       if (grep(/svn:executable/, @{$chunk->{properties}->{lines}})) {
+               print join("\n", @{$chunk->{properties}->{lines}});
+               $mode = "new file mode 100755\n";
+       }
+
+       if ($hdr[2] =~ /\/dev\/null/) {
+               $oldsha1 = "0000000";
+               $mode = "new file mode 100644\n" if $mode eq "";
+       }
+
+       if ($hdr[3] =~ /\/dev\/null/) {
+               $newsha1 = "0000000";
+               $mode = "deleted file mode 100644\n";
+       }
+
+       $hdr[1] = $mode."index $oldsha1..$newsha1";
+
+       splice(@content, 0, 0, @hdr);
+
+       my $out = join("\n", @content);
 
        return $out;
 }