p4ruby 2015.2.1313860-x86-mingw32 → 2020.1.2056123-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +3 -865
- data/ext/P4/extconf.rb +62 -12
- data/ext/P4/p4.cpp +63 -9
- data/ext/P4/p4clientapi.cpp +47 -17
- data/ext/P4/p4clientapi.h +17 -7
- data/ext/P4/p4error.cpp +15 -0
- data/ext/P4/p4error.h +1 -0
- data/ext/P4/p4result.cpp +1 -0
- data/ext/P4/specmgr.cpp +54 -88
- data/lib/2.6/P4.so +0 -0
- data/lib/2.7/P4.so +0 -0
- data/lib/P4.rb +1 -1
- data/lib/P4.so +0 -0
- data/lib/P4/version.rb +3 -3
- metadata +11 -11
- data/lib/2.0/P4.so +0 -0
- data/lib/2.1/P4.so +0 -0
- data/lib/2.2/P4.so +0 -0
    
        data/ext/P4/extconf.rb
    CHANGED
    
    | @@ -6,10 +6,19 @@ require 'mkmf' | |
| 6 6 | 
             
            require 'net/ftp'
         | 
| 7 7 | 
             
            require 'P4/version'
         | 
| 8 8 | 
             
            require 'rbconfig'
         | 
| 9 | 
            +
            require 'openssl'
         | 
| 9 10 |  | 
| 10 11 | 
             
            # Set this to the main version directory we look up in ftp.perforce.com for the P4API
         | 
| 11 12 | 
             
            # This is ignored if you specify the version on the command line.
         | 
| 12 | 
            -
             | 
| 13 | 
            +
            # Changed the hardcoded string so that the version is now derived from version.rb file
         | 
| 14 | 
            +
            #P4API_VERSION_DIR = 'r19.1'
         | 
| 15 | 
            +
            def p4api_version_dir
         | 
| 16 | 
            +
                    ver=P4::Version.split(".")
         | 
| 17 | 
            +
                    p4_major = ver[0].chars.last(2).join
         | 
| 18 | 
            +
                    p4_minor = ver[1]
         | 
| 19 | 
            +
                    dir = "r" + p4_major + "." + p4_minor
         | 
| 20 | 
            +
            end
         | 
| 21 | 
            +
             | 
| 13 22 |  | 
| 14 23 | 
             
            #==============================================================================
         | 
| 15 24 | 
             
            # Provide platform variables in P4-specific format
         | 
| @@ -102,6 +111,15 @@ def calculate_p4osver | |
| 102 111 | 
             
              return ver
         | 
| 103 112 | 
             
            end
         | 
| 104 113 |  | 
| 114 | 
            +
            def gcc
         | 
| 115 | 
            +
              @gcc ||= calculate_gcc
         | 
| 116 | 
            +
            end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            def calculate_gcc
         | 
| 119 | 
            +
              gcc = RbConfig::CONFIG["GCC"]
         | 
| 120 | 
            +
              return gcc
         | 
| 121 | 
            +
            end
         | 
| 122 | 
            +
             | 
| 105 123 | 
             
            def uname_platform
         | 
| 106 124 | 
             
              @uname_platform ||= calculate_uname_platform
         | 
| 107 125 | 
             
            end
         | 
| @@ -155,6 +173,13 @@ def set_platform_opts | |
| 155 173 | 
             
              end
         | 
| 156 174 | 
             
            end
         | 
| 157 175 |  | 
| 176 | 
            +
            def set_platform_cxxflags
         | 
| 177 | 
            +
              if (p4osname == 'LINUX') && (gcc == 'yes')
         | 
| 178 | 
            +
                $CXXFLAGS += " -std=c++11 "
         | 
| 179 | 
            +
              end
         | 
| 180 | 
            +
            end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
             | 
| 158 183 | 
             
            def set_platform_cppflags
         | 
| 159 184 | 
             
              $CPPFLAGS += "-DOS_#{p4osname} "
         | 
| 160 185 | 
             
              $CPPFLAGS += "-DOS_#{p4osname}#{p4osver} "
         | 
| @@ -214,6 +239,7 @@ def set_platform_libs | |
| 214 239 | 
             
                    $LDFLAGS += ' -framework CoreFoundation -framework Foundation'
         | 
| 215 240 | 
             
                  end
         | 
| 216 241 | 
             
                when 'LINUX', 'MINGW32'
         | 
| 242 | 
            +
                  $LDFLAGS += ' -Wl,--allow-multiple-definition'
         | 
| 217 243 | 
             
                  have_library('supc++')
         | 
| 218 244 | 
             
              end
         | 
| 219 245 | 
             
            end
         | 
| @@ -445,13 +471,34 @@ def ftp_download_dir(version) | |
| 445 471 | 
             
            end
         | 
| 446 472 |  | 
| 447 473 | 
             
            def filename
         | 
| 474 | 
            +
              openssl_number = OpenSSL::OPENSSL_VERSION.split(' ')[1].to_s
         | 
| 475 | 
            +
              openssl_number = openssl_number.slice(0, (openssl_number.rindex('.')))
         | 
| 476 | 
            +
             | 
| 448 477 | 
             
              if RbConfig::CONFIG['target_os'].downcase =~ /nt|mswin|mingw/
         | 
| 449 | 
            -
                'p4api.zip'
         | 
| 478 | 
            +
                filename = 'p4api.zip'
         | 
| 479 | 
            +
                if !openssl_number.to_s.empty?
         | 
| 480 | 
            +
                    case openssl_number.to_s
         | 
| 481 | 
            +
                        when /1.1/
         | 
| 482 | 
            +
                            filename = 'p4api-openssl1.1.1.zip'
         | 
| 483 | 
            +
                        when /1.0/
         | 
| 484 | 
            +
                            filename = 'p4api-openssl1.0.2.zip'
         | 
| 485 | 
            +
                         end
         | 
| 486 | 
            +
                end
         | 
| 450 487 | 
             
              else
         | 
| 451 | 
            -
                'p4api.tgz'
         | 
| 488 | 
            +
                filename = 'p4api.tgz'
         | 
| 489 | 
            +
                if !openssl_number.to_s.empty?
         | 
| 490 | 
            +
                    case openssl_number.to_s
         | 
| 491 | 
            +
                        when /1.1/
         | 
| 492 | 
            +
                            filename = 'p4api-glibc2.3-openssl1.1.1.tgz'
         | 
| 493 | 
            +
                        when /1.0/
         | 
| 494 | 
            +
                            filename = 'p4api-glibc2.3-openssl1.0.2.tgz'
         | 
| 495 | 
            +
                    end
         | 
| 496 | 
            +
                end
         | 
| 452 497 | 
             
              end
         | 
| 498 | 
            +
              return filename
         | 
| 453 499 | 
             
            end
         | 
| 454 500 |  | 
| 501 | 
            +
             | 
| 455 502 | 
             
            def remote_files_matching(ftp, dir, regex)
         | 
| 456 503 | 
             
              ftp.ls(dir.to_s).map { |entry|
         | 
| 457 504 | 
             
                if match = entry.match(regex)
         | 
| @@ -499,9 +546,8 @@ def download_api_via_ftp | |
| 499 546 | 
             
              # At one point, we allowed the gem build to just find the most recent p4api build.
         | 
| 500 547 | 
             
              # P4Ruby probably shouldn't do that by default.
         | 
| 501 548 | 
             
              #version_dir = find_latest_version_dir(ftp)
         | 
| 502 | 
            -
              version_dir = P4API_VERSION_DIR
         | 
| 503 549 |  | 
| 504 | 
            -
              dir = ftp_download_dir( | 
| 550 | 
            +
              dir = ftp_download_dir(p4api_version_dir)
         | 
| 505 551 | 
             
              ftp.chdir(dir)
         | 
| 506 552 |  | 
| 507 553 | 
             
              puts "downloading #{filename} from #{dir} on ftp.perforce.com"
         | 
| @@ -536,9 +582,11 @@ set_platform_opts | |
| 536 582 | 
             
            # based solely on platform detection.
         | 
| 537 583 | 
             
            set_platform_cppflags
         | 
| 538 584 | 
             
            set_platform_cflags
         | 
| 585 | 
            +
            set_platform_cxxflags
         | 
| 539 586 |  | 
| 540 587 | 
             
            puts "$CPPFLAGS #{$CPPFLAGS}"
         | 
| 541 588 | 
             
            puts "$CFLAGS #{$CFLAGS}"
         | 
| 589 | 
            +
            puts "$CXXFLAGS #{$CXXFLAGS}"
         | 
| 542 590 |  | 
| 543 591 | 
             
            # Setup additional system library definitions based on platform type before
         | 
| 544 592 | 
             
            # we setup other libraries, in order to preserve linking order
         | 
| @@ -554,15 +602,17 @@ resolve_ssl_dirs | |
| 554 602 | 
             
            # If we happen to need SSL on Windows, we also need gdi32
         | 
| 555 603 | 
             
            if RbConfig::CONFIG['target_os'].downcase =~ /mingw/
         | 
| 556 604 | 
             
              have_library('gdi32') or raise
         | 
| 605 | 
            +
              have_library('ole32') or raise
         | 
| 606 | 
            +
              have_library('crypt32') or raise
         | 
| 557 607 | 
             
            end
         | 
| 558 608 |  | 
| 559 | 
            -
             | 
| 560 | 
            -
             | 
| 561 | 
            -
            unless do_ssl
         | 
| 562 | 
            -
              have_library('p4sslstub') or raise
         | 
| 563 | 
            -
            end
         | 
| 564 | 
            -
             | 
| 609 | 
            +
            have_library('crypto') or raise
         | 
| 610 | 
            +
            have_library('ssl') or raise
         | 
| 565 611 | 
             
            have_library('supp') or raise
         | 
| 612 | 
            +
            have_library('p4script_sqlite') or raise
         | 
| 613 | 
            +
            have_library('p4script_curl') or raise
         | 
| 614 | 
            +
            have_library('p4script') or raise
         | 
| 615 | 
            +
            have_library('p4script_c') or raise
         | 
| 566 616 | 
             
            have_library('rpc') or raise
         | 
| 567 617 | 
             
            have_library('client') or raise
         | 
| 568 618 |  | 
| @@ -577,4 +627,4 @@ create_p4rubyconf_header(version_info, $libs) | |
| 577 627 | 
             
            # don't believe we need to rely on actually.
         | 
| 578 628 | 
             
            create_header
         | 
| 579 629 |  | 
| 580 | 
            -
            create_makefile('P4')
         | 
| 630 | 
            +
            create_makefile('P4')
         | 
    
        data/ext/P4/p4.cpp
    CHANGED
    
    | @@ -30,7 +30,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 30 30 | 
             
             *
         | 
| 31 31 | 
             
             * Author	: Tony Smith <tony@perforce.com> or <tony@smee.org>
         | 
| 32 32 | 
             
             *
         | 
| 33 | 
            -
             * Description	: Ruby bindings for the Perforce API. | 
| 33 | 
            +
             * Description	: Ruby bindings for the Perforce API.
         | 
| 34 34 | 
             
             *
         | 
| 35 35 | 
             
             * vim:ts=8:sw=4
         | 
| 36 36 | 
             
             ******************************************************************************/
         | 
| @@ -160,7 +160,7 @@ static VALUE p4_run_tagged( VALUE self, VALUE tagged ) | |
| 160 160 | 
             
            	flag = 0;
         | 
| 161 161 | 
             
                else
         | 
| 162 162 | 
             
            	flag = NUM2INT( tagged ) ? 1 : 0;
         | 
| 163 | 
            -
             | 
| 163 | 
            +
             | 
| 164 164 | 
             
                int old_value = p4->IsTagged();
         | 
| 165 165 | 
             
                p4->Tagged( flag );
         | 
| 166 166 |  | 
| @@ -196,7 +196,7 @@ static VALUE p4_set_tagged( VALUE self, VALUE toggle ) | |
| 196 196 | 
             
            	flag = 0;
         | 
| 197 197 | 
             
                else
         | 
| 198 198 | 
             
            	flag = NUM2INT( toggle ) ? 1 : 0;
         | 
| 199 | 
            -
             | 
| 199 | 
            +
             | 
| 200 200 | 
             
                p4->Tagged( flag );
         | 
| 201 201 | 
             
                return flag ? Qtrue : Qfalse;	// Seems to be ignored...
         | 
| 202 202 | 
             
            }
         | 
| @@ -489,6 +489,21 @@ static VALUE p4_set_ticket_file( VALUE self, VALUE path ) | |
| 489 489 | 
             
                return Qtrue;
         | 
| 490 490 | 
             
            }
         | 
| 491 491 |  | 
| 492 | 
            +
            static VALUE p4_get_trust_file( VALUE self )
         | 
| 493 | 
            +
            {
         | 
| 494 | 
            +
                P4ClientApi *p4;
         | 
| 495 | 
            +
                Data_Get_Struct( self, P4ClientApi, p4 );
         | 
| 496 | 
            +
                return P4Utils::ruby_string( p4->GetTrustFile().Text() );
         | 
| 497 | 
            +
            }
         | 
| 498 | 
            +
             | 
| 499 | 
            +
            static VALUE p4_set_trust_file( VALUE self, VALUE path )
         | 
| 500 | 
            +
            {
         | 
| 501 | 
            +
                P4ClientApi *p4;
         | 
| 502 | 
            +
                Data_Get_Struct( self, P4ClientApi, p4 );
         | 
| 503 | 
            +
                p4->SetTrustFile( StringValuePtr( path ) );
         | 
| 504 | 
            +
                return Qtrue;
         | 
| 505 | 
            +
            }
         | 
| 506 | 
            +
             | 
| 492 507 | 
             
            static VALUE p4_get_user( VALUE self )
         | 
| 493 508 | 
             
            {
         | 
| 494 509 | 
             
                P4ClientApi	*p4;
         | 
| @@ -541,7 +556,7 @@ static VALUE p4_set_track( VALUE self, VALUE toggle ) | |
| 541 556 | 
             
            	flag = 0;
         | 
| 542 557 | 
             
                else
         | 
| 543 558 | 
             
            	flag = NUM2INT( toggle ) ? 1 : 0;
         | 
| 544 | 
            -
             | 
| 559 | 
            +
             | 
| 545 560 | 
             
                p4->SetTrack( flag );
         | 
| 546 561 | 
             
                return flag ? Qtrue : Qfalse;	// Seems to be ignored...
         | 
| 547 562 | 
             
            }
         | 
| @@ -567,11 +582,37 @@ static VALUE p4_set_streams( VALUE self, VALUE toggle ) | |
| 567 582 | 
             
            	flag = 0;
         | 
| 568 583 | 
             
                else
         | 
| 569 584 | 
             
            	flag = NUM2INT( toggle ) ? 1 : 0;
         | 
| 570 | 
            -
             | 
| 585 | 
            +
             | 
| 571 586 | 
             
                p4->SetStreams( flag );
         | 
| 572 587 | 
             
                return flag ? Qtrue : Qfalse;	// Seems to be ignored...
         | 
| 573 588 | 
             
            }
         | 
| 574 589 |  | 
| 590 | 
            +
            static VALUE p4_get_graph( VALUE self )
         | 
| 591 | 
            +
            {
         | 
| 592 | 
            +
                P4ClientApi *p4;
         | 
| 593 | 
            +
                Data_Get_Struct( self, P4ClientApi, p4 );
         | 
| 594 | 
            +
                return p4->IsGraph() ? Qtrue : Qfalse;
         | 
| 595 | 
            +
            }
         | 
| 596 | 
            +
             | 
| 597 | 
            +
            static VALUE p4_set_graph( VALUE self, VALUE toggle )
         | 
| 598 | 
            +
            {
         | 
| 599 | 
            +
                P4ClientApi *p4;
         | 
| 600 | 
            +
                Data_Get_Struct( self, P4ClientApi, p4 );
         | 
| 601 | 
            +
             | 
| 602 | 
            +
                // The user might have passed an integer, or it might be a boolean,
         | 
| 603 | 
            +
                // we convert to int for consistency.
         | 
| 604 | 
            +
                int     flag = 0;
         | 
| 605 | 
            +
                if( toggle == Qtrue )
         | 
| 606 | 
            +
                flag = 1;
         | 
| 607 | 
            +
                else if( toggle == Qfalse )
         | 
| 608 | 
            +
                flag = 0;
         | 
| 609 | 
            +
                else
         | 
| 610 | 
            +
                flag = NUM2INT( toggle ) ? 1 : 0;
         | 
| 611 | 
            +
             | 
| 612 | 
            +
                p4->SetGraph( flag );
         | 
| 613 | 
            +
                return flag ? Qtrue : Qfalse;   // Seems to be ignored...
         | 
| 614 | 
            +
            }
         | 
| 615 | 
            +
             | 
| 575 616 | 
             
            /*******************************************************************************
         | 
| 576 617 | 
             
             * Running commands.  General purpose Run method and method for supplying
         | 
| 577 618 | 
             
             * input to "p4 xxx -i" commands
         | 
| @@ -599,7 +640,7 @@ static VALUE p4_run( VALUE self, VALUE args ) | |
| 599 640 | 
             
                char *cmd = StringValuePtr( v );
         | 
| 600 641 | 
             
                argc = NUM2INT( rb_funcall( flatArgs, idLength, 0 ) );
         | 
| 601 642 |  | 
| 602 | 
            -
                // Allocate storage on the stack so it's automatically reclaimed | 
| 643 | 
            +
                // Allocate storage on the stack so it's automatically reclaimed
         | 
| 603 644 | 
             
                // when we exit.
         | 
| 604 645 | 
             
                char **p4args = ALLOCA_N( char *, argc + 1 );
         | 
| 605 646 |  | 
| @@ -917,7 +958,7 @@ static VALUE p4map_new( int argc, VALUE *argv, VALUE pClass ) | |
| 917 958 |  | 
| 918 959 | 
             
                // First arg is the class
         | 
| 919 960 | 
             
                // pClass = argv[ 0 ];
         | 
| 920 | 
            -
             | 
| 961 | 
            +
             | 
| 921 962 | 
             
                // Now instantiate the new object.
         | 
| 922 963 | 
             
                self = Data_Wrap_Struct( pClass, 0, p4map_free, m );
         | 
| 923 964 | 
             
                rb_obj_call_init( self, 0, argv );
         | 
| @@ -1066,7 +1107,7 @@ static VALUE p4map_reverse( VALUE self ) | |
| 1066 1107 | 
             
                return rval;
         | 
| 1067 1108 | 
             
            }
         | 
| 1068 1109 |  | 
| 1069 | 
            -
            // | 
| 1110 | 
            +
            //
         | 
| 1070 1111 | 
             
            // P4::Map#translate( string, fwd=true )
         | 
| 1071 1112 | 
             
            //
         | 
| 1072 1113 | 
             
            static VALUE p4map_trans( int argc, VALUE *argv, VALUE self )
         | 
| @@ -1076,7 +1117,7 @@ static VALUE p4map_trans( int argc, VALUE *argv, VALUE self ) | |
| 1076 1117 | 
             
                VALUE		string;
         | 
| 1077 1118 |  | 
| 1078 1119 | 
             
                if( argc < 1 || argc > 2 )
         | 
| 1079 | 
            -
            	rb_raise( rb_eArgError, | 
| 1120 | 
            +
            	rb_raise( rb_eArgError,
         | 
| 1080 1121 | 
             
            		"Invalid arguments to P4::Map#translate. "
         | 
| 1081 1122 | 
             
            		"Pass the string you wish to translate, and an optional "
         | 
| 1082 1123 | 
             
            		"boolean to indicate whether translation should be in "
         | 
| @@ -1155,6 +1196,14 @@ static VALUE p4msg_get_text( VALUE self ) | |
| 1155 1196 | 
             
                return e->GetText();
         | 
| 1156 1197 | 
             
            }
         | 
| 1157 1198 |  | 
| 1199 | 
            +
            static VALUE p4msg_get_dict( VALUE self )
         | 
| 1200 | 
            +
            {
         | 
| 1201 | 
            +
                P4Error *   e = 0;
         | 
| 1202 | 
            +
             | 
| 1203 | 
            +
                Data_Get_Struct( self, P4Error, e );
         | 
| 1204 | 
            +
                return e->GetDict();
         | 
| 1205 | 
            +
            }
         | 
| 1206 | 
            +
             | 
| 1158 1207 | 
             
            static VALUE p4msg_get_id( VALUE self )
         | 
| 1159 1208 | 
             
            {
         | 
| 1160 1209 | 
             
                P4Error *	e = 0;
         | 
| @@ -1197,6 +1246,8 @@ void	Init_P4() | |
| 1197 1246 | 
             
                rb_define_method( cP4, "tagged=",	RUBY_METHOD_FUNC(p4_set_tagged), 1 );
         | 
| 1198 1247 | 
             
                rb_define_method( cP4, "track?", 	RUBY_METHOD_FUNC(p4_get_track)   , 0 );
         | 
| 1199 1248 | 
             
                rb_define_method( cP4, "track=", 	RUBY_METHOD_FUNC(p4_set_track)   , 1 );
         | 
| 1249 | 
            +
                rb_define_method( cP4, "graph?",  RUBY_METHOD_FUNC(p4_get_graph) , 0 );
         | 
| 1250 | 
            +
                rb_define_method( cP4, "graph=",  RUBY_METHOD_FUNC(p4_set_graph) , 1 );
         | 
| 1200 1251 |  | 
| 1201 1252 |  | 
| 1202 1253 | 
             
                // Perforce client settings.
         | 
| @@ -1228,6 +1279,8 @@ void	Init_P4() | |
| 1228 1279 | 
             
                rb_define_method( cP4, "protocol", 	RUBY_METHOD_FUNC(p4_set_protocol), 2 );
         | 
| 1229 1280 | 
             
                rb_define_method( cP4, "ticket_file", RUBY_METHOD_FUNC(p4_get_ticket_file), 0 );
         | 
| 1230 1281 | 
             
                rb_define_method( cP4, "ticket_file=", RUBY_METHOD_FUNC(p4_set_ticket_file), 1 );
         | 
| 1282 | 
            +
                rb_define_method( cP4, "trust_file", RUBY_METHOD_FUNC(p4_get_trust_file), 0 );
         | 
| 1283 | 
            +
                rb_define_method( cP4, "trust_file=", RUBY_METHOD_FUNC(p4_set_trust_file), 1 );
         | 
| 1231 1284 | 
             
                rb_define_method( cP4, "user", 	RUBY_METHOD_FUNC(p4_get_user)    , 0 );
         | 
| 1232 1285 | 
             
                rb_define_method( cP4, "user=", 	RUBY_METHOD_FUNC(p4_set_user)    , 1 );
         | 
| 1233 1286 | 
             
                rb_define_method( cP4, "version", 	RUBY_METHOD_FUNC(p4_get_version) , 0 );
         | 
| @@ -1327,6 +1380,7 @@ void	Init_P4() | |
| 1327 1380 | 
             
                rb_define_method( cP4Msg, "msgid", RUBY_METHOD_FUNC(p4msg_get_id), 0);
         | 
| 1328 1381 | 
             
                rb_define_method( cP4Msg, "severity", RUBY_METHOD_FUNC(p4msg_get_severity), 0);
         | 
| 1329 1382 | 
             
                rb_define_method( cP4Msg, "generic", RUBY_METHOD_FUNC(p4msg_get_generic), 0);
         | 
| 1383 | 
            +
                rb_define_method( cP4Msg, "dictionary", RUBY_METHOD_FUNC(p4msg_get_dict), 0);
         | 
| 1330 1384 | 
             
                rb_define_method( cP4Msg, "to_s", RUBY_METHOD_FUNC(p4msg_get_text), 0);
         | 
| 1331 1385 |  | 
| 1332 1386 | 
             
                //	P4::Progress class.
         | 
    
        data/ext/P4/p4clientapi.cpp
    CHANGED
    
    | @@ -92,9 +92,19 @@ P4ClientApi::P4ClientApi() : ui( &specMgr ) | |
| 92 92 | 
             
                const char *t;
         | 
| 93 93 |  | 
| 94 94 | 
             
                henv.GetTicketFile( ticketFile );
         | 
| 95 | 
            -
             | 
| 95 | 
            +
             | 
| 96 | 
            +
                if( (t = enviro->Get("P4TICKETS")) )
         | 
| 97 | 
            +
            	   ticketFile = t;
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                //
         | 
| 100 | 
            +
                // Load the current trust file. Start with the default, and then
         | 
| 101 | 
            +
                // override it if P4TRUST is set.
         | 
| 102 | 
            +
                //
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                henv.GetTrustFile( trustFile );
         | 
| 105 | 
            +
             | 
| 96 106 | 
             
                if( (t = enviro->Get("P4TICKETS")) )
         | 
| 97 | 
            -
             | 
| 107 | 
            +
                    trustFile = t;
         | 
| 98 108 |  | 
| 99 109 | 
             
                //
         | 
| 100 110 | 
             
                // Load the current P4CHARSET if set.
         | 
| @@ -132,7 +142,7 @@ P4ClientApi::GetEnviroFile() | |
| 132 142 | 
             
                return enviro->GetEnviroFile();
         | 
| 133 143 | 
             
            }
         | 
| 134 144 |  | 
| 135 | 
            -
            void | 
| 145 | 
            +
            void
         | 
| 136 146 | 
             
            P4ClientApi::SetApiLevel( int level )
         | 
| 137 147 | 
             
            {
         | 
| 138 148 | 
             
                StrBuf	b;
         | 
| @@ -192,7 +202,14 @@ P4ClientApi::SetTicketFile( const char *p ) | |
| 192 202 | 
             
                ticketFile = p;
         | 
| 193 203 | 
             
            }
         | 
| 194 204 |  | 
| 195 | 
            -
            void | 
| 205 | 
            +
            void
         | 
| 206 | 
            +
            P4ClientApi::SetTrustFile( const char *p )
         | 
| 207 | 
            +
            {
         | 
| 208 | 
            +
                client.SetTrustFile( p );
         | 
| 209 | 
            +
                trustFile = p;
         | 
| 210 | 
            +
            }
         | 
| 211 | 
            +
             | 
| 212 | 
            +
            void
         | 
| 196 213 | 
             
            P4ClientApi::SetDebug( int d )
         | 
| 197 214 | 
             
            {
         | 
| 198 215 | 
             
                debug = d;
         | 
| @@ -241,7 +258,7 @@ P4ClientApi::SetEnv( const char *var, const char *val ) | |
| 241 258 | 
             
            // connect to the Perforce server.
         | 
| 242 259 | 
             
            //
         | 
| 243 260 |  | 
| 244 | 
            -
            VALUE | 
| 261 | 
            +
            VALUE
         | 
| 245 262 | 
             
            P4ClientApi::Connect()
         | 
| 246 263 | 
             
            {
         | 
| 247 264 | 
             
                if ( P4RDB_COMMANDS )
         | 
| @@ -288,7 +305,7 @@ P4ClientApi::ConnectOrReconnect() | |
| 288 305 | 
             
            //
         | 
| 289 306 | 
             
            // Disconnect session
         | 
| 290 307 | 
             
            //
         | 
| 291 | 
            -
            VALUE | 
| 308 | 
            +
            VALUE
         | 
| 292 309 | 
             
            P4ClientApi::Disconnect()
         | 
| 293 310 | 
             
            {
         | 
| 294 311 | 
             
                if ( P4RDB_COMMANDS )
         | 
| @@ -306,6 +323,9 @@ P4ClientApi::Disconnect() | |
| 306 323 | 
             
                // Clear the specdef cache.
         | 
| 307 324 | 
             
                specMgr.Reset();
         | 
| 308 325 |  | 
| 326 | 
            +
                // Clear out any results from the last command
         | 
| 327 | 
            +
                ui.Reset();
         | 
| 328 | 
            +
             | 
| 309 329 | 
             
                return Qtrue;
         | 
| 310 330 | 
             
            }
         | 
| 311 331 |  | 
| @@ -322,7 +342,7 @@ P4ClientApi::Connected() | |
| 322 342 | 
             
                return Qfalse;
         | 
| 323 343 | 
             
            }
         | 
| 324 344 |  | 
| 325 | 
            -
            void | 
| 345 | 
            +
            void
         | 
| 326 346 | 
             
            P4ClientApi::Tagged( int enable )
         | 
| 327 347 | 
             
            {
         | 
| 328 348 | 
             
                if( enable )
         | 
| @@ -359,6 +379,14 @@ void P4ClientApi::SetStreams( int enable ) | |
| 359 379 | 
             
                   ClearStreamsMode();
         | 
| 360 380 | 
             
            }
         | 
| 361 381 |  | 
| 382 | 
            +
            void P4ClientApi::SetGraph( int enable )
         | 
| 383 | 
            +
            {
         | 
| 384 | 
            +
                if ( enable )
         | 
| 385 | 
            +
                   SetGraphMode();
         | 
| 386 | 
            +
                else
         | 
| 387 | 
            +
                   ClearGraphMode();
         | 
| 388 | 
            +
            }
         | 
| 389 | 
            +
             | 
| 362 390 | 
             
            int
         | 
| 363 391 | 
             
            P4ClientApi::GetServerLevel()
         | 
| 364 392 | 
             
            {
         | 
| @@ -410,7 +438,7 @@ P4ClientApi::IsIgnored( const char *path ) | |
| 410 438 | 
             
            // is raised.
         | 
| 411 439 | 
             
            //
         | 
| 412 440 |  | 
| 413 | 
            -
            VALUE | 
| 441 | 
            +
            VALUE
         | 
| 414 442 | 
             
            P4ClientApi::Run( const char *cmd, int argc, char * const *argv )
         | 
| 415 443 | 
             
            {
         | 
| 416 444 | 
             
                // Save the entire command string for our error messages. Makes it
         | 
| @@ -480,6 +508,9 @@ P4ClientApi::RunCmd( const char *cmd, ClientUser *ui, int argc, char * const *ar | |
| 480 508 | 
             
                if ( IsStreams() && apiLevel > 69 )
         | 
| 481 509 | 
             
            	client.SetVar( "enableStreams", "" );
         | 
| 482 510 |  | 
| 511 | 
            +
                if ( IsGraph() && apiLevel > 81 )
         | 
| 512 | 
            +
                client.SetVar( "enableGraph", "" );
         | 
| 513 | 
            +
             | 
| 483 514 | 
             
                // If maxresults or maxscanrows is set, enforce them now
         | 
| 484 515 | 
             
                if( maxResults  )	client.SetVar( "maxResults",  maxResults  );
         | 
| 485 516 | 
             
                if( maxScanRows )	client.SetVar( "maxScanRows", maxScanRows );
         | 
| @@ -512,7 +543,7 @@ P4ClientApi::RunCmd( const char *cmd, ClientUser *ui, int argc, char * const *ar | |
| 512 543 |  | 
| 513 544 | 
             
            //
         | 
| 514 545 | 
             
            // Parses a string supplied by the user into a hash. To do this we need
         | 
| 515 | 
            -
            // the specstring from the server. We try to cache those as we see them, | 
| 546 | 
            +
            // the specstring from the server. We try to cache those as we see them,
         | 
| 516 547 | 
             
            // but the user may not have executed any commands to allow us to cache
         | 
| 517 548 | 
             
            // them so we may have to fetch the spec first.
         | 
| 518 549 | 
             
            //
         | 
| @@ -540,7 +571,7 @@ P4ClientApi::ParseSpec( const char * type, const char *form ) | |
| 540 571 | 
             
                Error e;
         | 
| 541 572 | 
             
                VALUE v;
         | 
| 542 573 | 
             
                v = specMgr.StringToSpec( type, form, &e );
         | 
| 543 | 
            -
             | 
| 574 | 
            +
             | 
| 544 575 | 
             
                if ( e.Test() )
         | 
| 545 576 | 
             
                {
         | 
| 546 577 | 
             
            	if( exceptionLevel )
         | 
| @@ -551,7 +582,7 @@ P4ClientApi::ParseSpec( const char * type, const char *form ) | |
| 551 582 |  | 
| 552 583 | 
             
                return v;
         | 
| 553 584 | 
             
            }
         | 
| 554 | 
            -
             | 
| 585 | 
            +
             | 
| 555 586 |  | 
| 556 587 | 
             
            //
         | 
| 557 588 | 
             
            // Converts a hash supplied by the user into a string using the specstring
         | 
| @@ -577,14 +608,14 @@ P4ClientApi::FormatSpec( const char * type, VALUE hash ) | |
| 577 608 | 
             
            	}
         | 
| 578 609 | 
             
                }
         | 
| 579 610 |  | 
| 580 | 
            -
                // Got a specdef so now we can attempt to convert. | 
| 611 | 
            +
                // Got a specdef so now we can attempt to convert.
         | 
| 581 612 | 
             
                StrBuf	buf;
         | 
| 582 613 | 
             
                Error	e;
         | 
| 583 614 |  | 
| 584 615 | 
             
                specMgr.SpecToString( type, hash, buf, &e );
         | 
| 585 616 | 
             
                if( !e.Test() )
         | 
| 586 617 | 
             
            	return P4Utils::ruby_string( buf.Text() );
         | 
| 587 | 
            -
             | 
| 618 | 
            +
             | 
| 588 619 | 
             
                if( exceptionLevel )
         | 
| 589 620 | 
             
                {
         | 
| 590 621 | 
             
            	StrBuf m;
         | 
| @@ -620,7 +651,7 @@ P4ClientApi::SpecFields( const char * type ) | |
| 620 651 |  | 
| 621 652 | 
             
                return specMgr.SpecFields( type );
         | 
| 622 653 | 
             
            }
         | 
| 623 | 
            -
             | 
| 654 | 
            +
             | 
| 624 655 | 
             
            //
         | 
| 625 656 | 
             
            // Raises an exception or returns Qfalse on bad input
         | 
| 626 657 | 
             
            //
         | 
| @@ -686,13 +717,13 @@ P4ClientApi::Except( const char *func, const char *msg ) | |
| 686 717 | 
             
                StrBuf	errors;
         | 
| 687 718 | 
             
                StrBuf	warnings;
         | 
| 688 719 | 
             
                int		terminate = 0;
         | 
| 689 | 
            -
             | 
| 720 | 
            +
             | 
| 690 721 | 
             
                m << "[" << func << "] " << msg;
         | 
| 691 722 |  | 
| 692 723 | 
             
                // Now append any errors and warnings to the text
         | 
| 693 724 | 
             
                ui.GetResults().FmtErrors( errors );
         | 
| 694 725 | 
             
                ui.GetResults().FmtWarnings( warnings );
         | 
| 695 | 
            -
             | 
| 726 | 
            +
             | 
| 696 727 | 
             
                if( errors.Length() )
         | 
| 697 728 | 
             
                {
         | 
| 698 729 | 
             
            	m << "\n" << errors;
         | 
| @@ -729,4 +760,3 @@ P4ClientApi::Except( const char *func, Error *e ) | |
| 729 760 | 
             
                e->Fmt( &m );
         | 
| 730 761 | 
             
                Except( func, m.Text() );
         | 
| 731 762 | 
             
            }
         | 
| 732 | 
            -
             |