[X2Go-Commits] [x2goserver] 19/30: x2goserver/lib/x2goupdateoptionsstring: write wrapper that handles program options, creates intermediate, passes through transform chains, reconverts to a string and prints it.

git-admin at x2go.org git-admin at x2go.org
Thu Dec 13 11:22:48 CET 2018


This is an automated email from the git hooks/post-receive script.

x2go pushed a commit to branch master
in repository x2goserver.

commit 6a13ec94dc7e78580304862bd037e3d9de62475a
Author: Mihai Moldovan <ionic at ionic.de>
Date:   Wed Dec 12 09:55:44 2018 +0100

    x2goserver/lib/x2goupdateoptionsstring: write wrapper that handles program options, creates intermediate, passes through transform chains, reconverts to a string and prints it.
---
 debian/changelog                       |   3 +
 x2goserver/lib/x2goupdateoptionsstring | 151 ++++++++++++++++++++++++++-------
 2 files changed, 121 insertions(+), 33 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index e7d59b9..d54fd18 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -46,6 +46,9 @@ x2goserver (4.1.0.4-0x2go1) UNRELEASED; urgency=medium
     - x2goserver/lib/x2goupdateoptionsstring: fix interpolated string warning.
     - x2goserver/lib/x2goupdateoptionsstring: add helper function for
       transform string interpretation.
+    - x2goserver/lib/x2goupdateoptionsstring: write wrapper that handles
+      program options, creates intermediate, passes through transform chains,
+      reconverts to a string and prints it.
   * debian/control:
     + Build-depend upon lsb-release for distro version detection.
   * debian/x2goserver.manpages:
diff --git a/x2goserver/lib/x2goupdateoptionsstring b/x2goserver/lib/x2goupdateoptionsstring
index 811bf6d..c562974 100755
--- a/x2goserver/lib/x2goupdateoptionsstring
+++ b/x2goserver/lib/x2goupdateoptionsstring
@@ -25,12 +25,19 @@ use warnings;
 
 #use X2Go::Utils qw (is_int);
 use English qw (-no_match_vars);
-use Getopt::Long;
+use Getopt::Long qw (GetOptionsFromArray);
 use Pod::Usage;
 use Storable qw (dclone);
 use Switch qw (fallthrough);
 use Data::Dumper qw (Dumper);
 
+exit (Main (@ARGV));
+
+BEGIN {
+}
+
+# No code past this point should be getting executed!
+
 # Accepts an option string and returns a reference to an array of hashes
 # (actually hash references) corresponding to the parsed key-value pairs.
 #
@@ -661,59 +668,137 @@ sub interpret_transform {
         }
       }
     }
+
     # Set up return value accordingly.
     $ret = [ $mode, $sanitized_transform ];
   }
+
   return $ret;
 }
 
-Getopt::Long::Configure('gnu_getopt', 'no_auto_abbrev');
+# Main function, no code outside of it shall be executed.
+#
+# Expects @ARGV to be passed in.
+sub Main {
+  my $error_detected = 0;
 
-my $help = 0;
-my $man = 0;
-GetOptions('help|?|h' => \$help, 'man' => \$man) or pod2usage(2);
-pod2usage(1) if $help;
-pod2usage(-verbose => 2, -exitval => 0) if $man;
+  Getopt::Long::Configure ('gnu_getopt', 'no_auto_abbrev', 'pass_through');
 
-my $options = shift;
+  my $help = 0;
+  my $man = 0;
+  GetOptionsFromArray (\@_, 'help|?|h' => \$help, 'man' => \$man) or pod2usage (2);
 
-my $intermediate = parse_options ($options);
+  if ($help) {
+    pod2usage (1);
+  }
 
-print {*STDERR} Dumper ($intermediate) . "\n";
+  if ($man) {
+    pod2usage (-verbose => 2, -exitval => 3);
+  }
 
-print {*STDERR} Dumper (intermediate_to_string ($intermediate)) . "\n";
+  my $options = shift;
 
-my $option_to_remove = shift;
+  if (!(defined ($options))) {
+    print {*STDERR} "No or invalid options string given, aborting.\n";
+    $error_detected = 4;
+  }
 
-my $intermediate_removed = transform_intermediate ($intermediate, 1, $option_to_remove);
+  my $intermediate = undef;
 
-print {*STDERR} Dumper ($intermediate_removed) . "\n";
+  if (!($error_detected)) {
+    $intermediate = parse_options ($options);
 
-print {*STDERR} Dumper (intermediate_to_string ($intermediate_removed)) . "\n";
+    if (!(defined ($intermediate))) {
+      print {*STDERR} "Unable to parse option string, aborting.\n";
+      $error_detected = 5;
+    }
+  }
 
-my $option_to_add = shift;
+  if (!($error_detected)) {
+    my $cur_transform = shift;
+
+    # Nasty trick (to some degree): "do"-blocks are not recognized as loops by
+    # Perl, but we can wrap the body in another block, which WILL BE recognized
+    # as a loop (one, that only executes once), oddly enough.
+    do {{
+      # Shall only be relevant for the first run of the loop.
+      if (!(defined ($cur_transform))) {
+        print {*STDERR} "No transformation passed, aborting.\n";
+        $error_detected = 6;
+        last;
+      }
 
-my $intermediate_added = transform_intermediate ($intermediate_removed, 0, $option_to_add);
+      my $interpreted_transform_ref = interpret_transform ($cur_transform);
 
-print {*STDERR} Dumper ($intermediate_added) . "\n";
+      if (!(defined ($interpreted_transform_ref))) {
+        print {*STDERR} "Invalid transformation passed, aborting.\n";
+        $error_detected = 7;
+        last;
+      }
 
-print {*STDERR} Dumper (intermediate_to_string ($intermediate_added)) . "\n";
+      my ($transform_mode, $sanitized_transform) = @{$interpreted_transform_ref};
 
-#my $value = shift;
-#my $allow_negative = shift;
-#
-#if (!(defined ($value))) {
-#  print {*STDERR} "No value passed in, assuming empty string.\n";
-#  $value = q{};
-#}
-#
-#if (!(defined ($allow_negative))) {
-#  $allow_negative = 0;
-#}
-#
-#exit is_int ($value);
+      $intermediate = transform_intermediate ($intermediate, $transform_mode, $sanitized_transform);
 
-exit 1;
+      if (!(defined ($intermediate))) {
+        print {*STDERR} "Error while transforming intermediate representation, aborting.\n";
+        $error_detected = 7;
+        last;
+      }
+    }} while (defined ($cur_transform = shift));
+  }
+
+  my $out = undef;
+
+  if (!($error_detected)) {
+    $out = intermediate_to_string ($intermediate);
+
+    if (!(defined ($out))) {
+      print {*STDERR} "Unable to transform intermediate back into string, aborting.\n";
+      $error_detected = 8;
+    }
+  }
+
+  if (!($error_detected)) {
+    print {*STDOUT} $out . "\n";
+  }
+
+  #print {*STDERR} Dumper ($intermediate) . "\n";
+
+  #print {*STDERR} Dumper (intermediate_to_string ($intermediate)) . "\n";
+
+  #my $option_to_remove = shift;
+
+  #my $intermediate_removed = transform_intermediate ($intermediate, 1, $option_to_remove);
+
+  #print {*STDERR} Dumper ($intermediate_removed) . "\n";
+
+  #print {*STDERR} Dumper (intermediate_to_string ($intermediate_removed)) . "\n";
+
+  #my $option_to_add = shift;
+
+  #my $intermediate_added = transform_intermediate ($intermediate_removed, 0, $option_to_add);
+
+  #print {*STDERR} Dumper ($intermediate_added) . "\n";
+
+  #print {*STDERR} Dumper (intermediate_to_string ($intermediate_added)) . "\n";
+
+  #my $value = shift;
+  #my $allow_negative = shift;
+  #
+  #if (!(defined ($value))) {
+  #  print {*STDERR} "No value passed in, assuming empty string.\n";
+  #  $value = q{};
+  #}
+  #
+  #if (!(defined ($allow_negative))) {
+  #  $allow_negative = 0;
+  #}
+  #
+  #exit is_int ($value);
+
+  return $error_detected;
+}
 
 __END__
 

--
Alioth's /home/x2go-admin/maintenancescripts/git/hooks/post-receive-email on /srv/git/code.x2go.org/x2goserver.git


More information about the x2go-commits mailing list