chiark / gitweb /
remoteshell as found on jura
[ian-dotfiles.git] / process
diff --git a/process b/process
index 56f25a5a09cc79e28b0aead15374ccd0b7262aa6..bf3295ddfff085cd645aabd1510bb664df558bc3 100755 (executable)
--- a/process
+++ b/process
@@ -6,7 +6,7 @@ $action=0;
 defined($umask=umask) or die $!;
 $home= $ENV{'HOME'}.'/';
 
-while (@ARGV =~ m/^-/) {
+while ($ARGV[0] =~ m/^-/) {
     $_= shift(@ARGV);
     last if m/^--$/;
     while (m/^-./) {
@@ -21,6 +21,7 @@ while (@ARGV =~ m/^-/) {
        }
     }
 }
+die if @ARGV;
 
 stat $home or die $!;
 -d _ or die;
@@ -56,7 +57,7 @@ sub mkparents ($) {
 sub maybe_chmod ($$$) {
     my ($nowperms,$perms,$obj) = @_;
     return if $nowperms==$perms;
-    if ($doing) {
+    if ($action) {
        chmod $perms, $home.$obj or die $!;
     } else {
        would($obj, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
@@ -73,7 +74,7 @@ sub ensuredir ($) {
        maybe_chmod($nowperms,$perms,$dir);
     } else {
        die $! unless $!==&ENOENT;
-       if ($doing) {
+       if ($action) {
            mkdir $home.$dir, $perms or die $!;
        } else {
            would($dir, sprintf 'mkdir %04o', $perms);
@@ -83,25 +84,33 @@ sub ensuredir ($) {
 
 -d 'new' or mkdir 'new', 02700 or die $!;
 
-opendir D, "files" or die $!;
-while ($if=readdir D) {
-    next unless $if =~ m/^[:a-z0-9]/;
-    $of= $if; 
-    $of =~ s,\:,/,g; 
-    $of =~ s,^/,,;
-    $of =~ s,\\\;,:,g;
-    $of =~ s:\\([0-9a-f][0-9a-f]): sprintf '%c', hex $1 :ge;
-
-    $newf= 'new/'.$if;
-    mkparents($of);
+sub prep_proc ($$) {
+    my ($if,$newf) = @_;
+    my ($c);
     defined($c= fork) or die $!;
     if (!$c) {
        unlink $newf;
-       open STDOUT, "> $newf" or die "$of $newf $!";
-       exec './gpt','config','files/'.$if; die $!;
+       open STDOUT, "> $newf" or die "$newf $!";
+       exec './gpt','config',$if; die $!;
     }
     $!=0; waitpid($c,0)==$c or die $!;
     $? and die $?;
+}
+
+opendir D, "files" or die $!;
+while ($if=readdir D) {
+    next unless $if =~ m/^[_a-z0-9\\]/;
+    $of= $if; 
+    $of =~ s,_,/,g; 
+    $of =~ s,^/,,;
+    $of =~ s,//,_,g;
+    $of =~ s/\\([0-9a-f][0-9a-f]|_|\\)/
+       length $1 eq 1 ? $1 : sprintf '%c', hex $1 
+           /ge;
+
+    mkparents($of);
+    $newf= 'new/'.$if;
+    prep_proc('files/'.$if,$newf);
 
     $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
     chmod $perms, $newf or die $!;
@@ -109,12 +118,13 @@ while ($if=readdir D) {
     if (stat $home.$of) {
        -f _ or die "$of is not a file!";
        $nowperms= (stat _)[2] & 07777;
+       if ($nowperms != $perms) {
+           would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
+       }
        if (!$action) {
-           if ($nowperms != $perms) {
-               would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
-           }
            system 'diff','-u',$home.$of,$newf;
            $?==0 or $?==256 or die $?;
+           $changes++ if $?;
        }
     } else {
        would($of, sprintf 'create %04o', $perms);
@@ -137,6 +147,19 @@ sub would ($$) {
     my ($obj,$what) = @_;
     return if $would_done{$obj}++;
     print STDOUT "*** $what $obj\n" or die $!;
+    $changes++;
+}
+
+if ($changes) {
+    print STDOUT "=== $changes changes\n" or die $!;
+} else {
+    print STDOUT "=== no changes\n" or die $!;
+}
+
+prep_proc('execute','new/,execute');
+if ($action) {
+    chmod 0700,'new/,execute' or die $!;
+    system 'new/,execute'; $? and die $?;
 }
 
 close STDOUT or die $!;