p4ruby 2017.1.1609394 → 2020.1.2056123

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.
@@ -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
- P4API_VERSION_DIR = 'r17.2'
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(version_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
- do_ssl = have_library('crypto') and have_library('ssl')
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')
@@ -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;
@@ -664,13 +679,6 @@ static VALUE p4_get_messages( VALUE self )
664
679
  return p4->GetMessages();
665
680
  }
666
681
 
667
- static VALUE p4_reset( VALUE self )
668
- {
669
- P4ClientApi *p4;
670
- Data_Get_Struct( self, P4ClientApi, p4 );
671
- return p4->Reset();
672
- }
673
-
674
682
  static VALUE p4_get_warnings( VALUE self )
675
683
  {
676
684
  P4ClientApi *p4;
@@ -1188,6 +1196,14 @@ static VALUE p4msg_get_text( VALUE self )
1188
1196
  return e->GetText();
1189
1197
  }
1190
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
+
1191
1207
  static VALUE p4msg_get_id( VALUE self )
1192
1208
  {
1193
1209
  P4Error * e = 0;
@@ -1263,6 +1279,8 @@ void Init_P4()
1263
1279
  rb_define_method( cP4, "protocol", RUBY_METHOD_FUNC(p4_set_protocol), 2 );
1264
1280
  rb_define_method( cP4, "ticket_file", RUBY_METHOD_FUNC(p4_get_ticket_file), 0 );
1265
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 );
1266
1284
  rb_define_method( cP4, "user", RUBY_METHOD_FUNC(p4_get_user) , 0 );
1267
1285
  rb_define_method( cP4, "user=", RUBY_METHOD_FUNC(p4_set_user) , 1 );
1268
1286
  rb_define_method( cP4, "version", RUBY_METHOD_FUNC(p4_get_version) , 0 );
@@ -1280,7 +1298,6 @@ void Init_P4()
1280
1298
  rb_define_method( cP4, "connect", RUBY_METHOD_FUNC(p4_connect) , 0 );
1281
1299
  rb_define_method( cP4, "connected?",RUBY_METHOD_FUNC(p4_connected) , 0 );
1282
1300
  rb_define_method( cP4, "disconnect", RUBY_METHOD_FUNC(p4_disconnect) , 0 );
1283
- rb_define_method( cP4, "reset", RUBY_METHOD_FUNC(p4_reset), 0 );
1284
1301
 
1285
1302
  // Running commands - general purpose commands
1286
1303
  rb_define_method( cP4, "run", RUBY_METHOD_FUNC(p4_run) ,-2 );
@@ -1363,6 +1380,7 @@ void Init_P4()
1363
1380
  rb_define_method( cP4Msg, "msgid", RUBY_METHOD_FUNC(p4msg_get_id), 0);
1364
1381
  rb_define_method( cP4Msg, "severity", RUBY_METHOD_FUNC(p4msg_get_severity), 0);
1365
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);
1366
1384
  rb_define_method( cP4Msg, "to_s", RUBY_METHOD_FUNC(p4msg_get_text), 0);
1367
1385
 
1368
1386
  // P4::Progress class.
@@ -94,7 +94,17 @@ P4ClientApi::P4ClientApi() : ui( &specMgr )
94
94
  henv.GetTicketFile( ticketFile );
95
95
 
96
96
  if( (t = enviro->Get("P4TICKETS")) )
97
- ticketFile = t;
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
+
106
+ if( (t = enviro->Get("P4TICKETS")) )
107
+ trustFile = t;
98
108
 
99
109
  //
100
110
  // Load the current P4CHARSET if set.
@@ -192,6 +202,13 @@ P4ClientApi::SetTicketFile( const char *p )
192
202
  ticketFile = p;
193
203
  }
194
204
 
205
+ void
206
+ P4ClientApi::SetTrustFile( const char *p )
207
+ {
208
+ client.SetTrustFile( p );
209
+ trustFile = p;
210
+ }
211
+
195
212
  void
196
213
  P4ClientApi::SetDebug( int d )
197
214
  {
@@ -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
 
@@ -409,12 +429,6 @@ P4ClientApi::IsIgnored( const char *path )
409
429
  return ignore->Reject( p, client.GetIgnoreFile() );
410
430
  }
411
431
 
412
- VALUE
413
- P4ClientApi::Reset()
414
- {
415
- ui.Reset();
416
- }
417
-
418
432
  //
419
433
  // Run returns the results of the command. If the client has not been
420
434
  // connected, then an exception is raised but errors from Perforce
@@ -746,4 +760,3 @@ P4ClientApi::Except( const char *func, Error *e )
746
760
  e->Fmt( &m );
747
761
  Except( func, m.Text() );
748
762
  }
749
-
@@ -85,6 +85,7 @@ public:
85
85
  void SetProg( const char *p ) { prog = p; }
86
86
  void SetProtocol( const char *var, const char *val );
87
87
  void SetTicketFile( const char *p );
88
+ void SetTrustFile( const char *p );
88
89
  void SetUser( const char *u ) { client.SetUser( u ); }
89
90
  void SetVersion( const char *v ) { version = v; }
90
91
 
@@ -102,6 +103,7 @@ public:
102
103
  const StrPtr &GetPort() { return client.GetPort(); }
103
104
  const StrPtr &GetProg() { return prog; }
104
105
  const StrPtr &GetTicketFile() { return ticketFile; }
106
+ const StrPtr &GetTrustFile() { return trustFile; }
105
107
  const StrPtr &GetUser() { return client.GetUser(); }
106
108
  const StrPtr &GetVersion() { return version; }
107
109
 
@@ -119,7 +121,6 @@ public:
119
121
  VALUE Connect(); // P4Exception on error
120
122
  VALUE Connected(); // Return true if connected and not dropped.
121
123
  VALUE Disconnect();
122
- VALUE Reset(); // Clear out any results from the previous command
123
124
 
124
125
  // Executing commands.
125
126
  VALUE Run( const char *cmd, int argc, char * const *argv );
@@ -235,6 +236,7 @@ private:
235
236
  StrBuf prog;
236
237
  StrBuf version;
237
238
  StrBuf ticketFile;
239
+ StrBuf trustFile;
238
240
  int depth;
239
241
  int debug;
240
242
  int exceptionLevel;
@@ -245,4 +247,3 @@ private:
245
247
  int maxScanRows;
246
248
  int maxLockTime;
247
249
  };
248
-
@@ -88,6 +88,21 @@ P4Error::GetText()
88
88
  return P4Utils::ruby_string( t.Text(), t.Length() );
89
89
  }
90
90
 
91
+ VALUE
92
+ P4Error::GetDict()
93
+ {
94
+ VALUE dictHash = rb_hash_new();
95
+ StrDict* pDict = error.GetDict();
96
+ StrRef key, val;
97
+ // suppress -Wpointer-arith
98
+ for (int i=0;pDict->GetVar(i,key,val) != 0;i++) {
99
+ rb_hash_aset( dictHash,
100
+ P4Utils::ruby_string(key.Text(), key.Length()),
101
+ P4Utils::ruby_string(val.Text(), val.Length()));
102
+ }
103
+ return dictHash;
104
+ }
105
+
91
106
  VALUE
92
107
  P4Error::Inspect()
93
108
  {
@@ -46,6 +46,7 @@ class P4Error
46
46
  VALUE GetGeneric();
47
47
  VALUE GetSeverity();
48
48
  VALUE GetText();
49
+ VALUE GetDict();
49
50
  VALUE Inspect();
50
51
 
51
52
  // Wrap as Ruby object of class pClass
@@ -57,6 +57,7 @@ P4Result::P4Result()
57
57
  VALUE cP4 = rb_const_get_at( rb_cObject, idP4 );
58
58
  cP4Msg = rb_const_get_at( cP4, idP4Msg );
59
59
 
60
+ Reset();
60
61
  }
61
62
 
62
63
 
@@ -63,21 +63,6 @@ struct defaultspec {
63
63
  "unlocked/locked;;"
64
64
  "View;code:311;type:wlist;words:2;len:64;;"
65
65
  },
66
- {
67
- "changeX",
68
- "Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
69
- "Date;code:202;type:date;ro;fmt:R;seq:3;len:20;;"
70
- "Client;code:203;ro;fmt:L;seq:2;len:32;;"
71
- "User;code:204;ro;fmt:L;seq:4;len:32;;"
72
- "Status;code:205;ro;fmt:R;seq:5;len:10;;"
73
- "Type;code:211;seq:6;type:select;fmt:L;len:10;"
74
- "val:public/restricted;;"
75
- "ImportedBy;code:212;type:line;ro;fmt:L;len:32;;"
76
- "Identity;code:213;type:line;;"
77
- "Description;code:206;type:text;rq;;"
78
- "Jobs;code:209;type:wlist;words:2;len:32;;"
79
- "Files;code:210;type:llist;len:64;;"
80
- },
81
66
  {
82
67
  "change",
83
68
  "Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
@@ -92,6 +77,7 @@ struct defaultspec {
92
77
  "Description;code:206;type:text;rq;seq:7;;"
93
78
  "JobStatus;code:207;fmt:I;type:select;seq:9;;"
94
79
  "Jobs;code:208;type:wlist;seq:8;len:32;;"
80
+ "Stream;code:214;type:line;len:64;;"
95
81
  "Files;code:210;type:llist;len:64;;"
96
82
  },
97
83
  {
@@ -115,47 +101,12 @@ struct defaultspec {
115
101
  "Stream;code:314;type:line;len:64;;"
116
102
  "StreamAtChange;code:316;type:line;len:64;;"
117
103
  "ServerID;code:315;type:line;ro;len:64;;"
118
- "Type;code:318;type:select;len:10;val:writeable/readonly;;"
104
+ "Type;code:318;type:select;len:10;val:"
105
+ "writeable/readonly/graph/partitioned;;"
119
106
  "Backup;code:319;type:select;len:10;val:enable/disable;;"
120
107
  "View;code:311;type:wlist;words:2;len:64;;"
121
108
  "ChangeView;code:317;type:llist;len:64;;"
122
109
  },
123
- {
124
- "clientX",
125
- "Client;code:301;rq;ro;seq:1;len:32;;"
126
- "Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
127
- "Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
128
- "Owner;code:304;seq:3;fmt:R;len:32;;"
129
- "Host;code:305;seq:5;fmt:R;len:32;;"
130
- "Description;code:306;type:text;len:128;;"
131
- "Root;code:307;rq;type:line;len:64;;"
132
- "AltRoots;code:308;type:llist;len:64;;"
133
- "Options;code:309;type:line;len:64;val:"
134
- "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
135
- "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
136
- "SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
137
- "submitunchanged/submitunchanged+reopen/revertunchanged/"
138
- "revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
139
- "LineEnd;code:310;type:select;fmt:L;len:12;val:"
140
- "local/unix/mac/win/share;;"
141
- "View;code:311;type:wlist;words:2;len:64;;"
142
- },
143
- {
144
- "clientSpecing021",
145
- "Client;code:301;rq;ro;len:32;;"
146
- "Update;code:302;type:date;ro;len:20;;"
147
- "Access;code:303;type:date;ro;len:20;;"
148
- "Owner;code:304;len:32;;"
149
- "Host;code:305;len:32;;"
150
- "Description;code:306;type:text;len:128;;"
151
- "Root;code:307;rq;type:line;len:64;;"
152
- "AltRoots;code:308;type:text;len:64;;"
153
- "Options;code:309;type:line;len:64;val:"
154
- "noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
155
- "unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
156
- "LineEnd;code:310;type:select;len:12;val:local/unix/mac/win/share;;"
157
- "View;code:311;type:wlist;words:2;len:64;;"
158
- },
159
110
  {
160
111
  "depot",
161
112
  "Depot;code:251;rq;ro;len:32;;"
@@ -175,11 +126,13 @@ struct defaultspec {
175
126
  "MaxResults;code:402;type:word;len:12;;"
176
127
  "MaxScanRows;code:403;type:word;len:12;;"
177
128
  "MaxLockTime;code:407;type:word;len:12;;"
129
+ "MaxOpenFiles;code:413;type:word;len:12;;"
178
130
  "Timeout;code:406;type:word;len:12;;"
179
131
  "PasswordTimeout;code:409;type:word;len:12;;"
180
132
  "LdapConfig;code:410;type:line;len:128;;"
181
133
  "LdapSearchQuery;code:411;type:line;len:128;;"
182
134
  "LdapUserAttribute;code:412;type:line;len:128;;"
135
+ "LdapUserDNAttribute;code:414;type:line;len:128;;"
183
136
  "Subgroups;code:404;type:wlist;len:32;opt:default;;"
184
137
  "Owners;code:408;type:wlist;len:32;opt:default;;"
185
138
  "Users;code:405;type:wlist;len:32;opt:default;;"
@@ -247,36 +200,62 @@ struct defaultspec {
247
200
  "Clients;code:458;len:8;;"
248
201
  "Users;code:459;len:8;;"
249
202
  "Files;code:460;len:8;;"
203
+ "Repos;code:462;len:8;;"
250
204
  },
251
205
  {
252
206
  "protect",
253
- "Protections;code:501;fmt:C;type:wlist;words:5;opt:default;len:64;;"
207
+ "SubPath;code:502;ro;len:64;;"
208
+ "Update;code:503;type:date;ro;fmt:L;len:20;;"
209
+ "Protections;code:501;fmt:C;type:wlist;words:5;opt:default;z;len:64;;"
254
210
  },
255
211
  {
256
212
  "remote",
257
- "RemoteID;code:851;rq;ro;len:32;;"
213
+ "RemoteID;code:851;rq;ro;fmt:L;len:32;;"
258
214
  "Address;code:852;rq;type:line;len:32;;"
259
215
  "Owner;code:853;fmt:R;len:32;;"
260
216
  "RemoteUser;code:861;fmt:R;len:32;;"
261
217
  "Options;code:854;type:line;len:32;val:"
262
- "unlocked/lockednocompress/compress;;"
218
+ "unlocked/locked,nocompress/compress,copyrcs/nocopyrcs;;"
263
219
  "Update;code:855;type:date;ro;fmt:L;len:20;;"
264
220
  "Access;code:856;type:date;ro;fmt:L;len:20;;"
265
221
  "Description;code:857;type:text;len:128;;"
266
222
  "LastFetch;code:858;fmt:L;len:10;;"
267
223
  "LastPush;code:859;fmt:L;len:10;;"
268
224
  "DepotMap;code:860;type:wlist;words:2;len:64;;"
225
+ "ArchiveLimits;code:862;type:wlist;words:2;len:64;;"
269
226
  },
270
227
  {
271
- "specW",
272
- "Fields;code:351;type:wlist;words:5;rq;;"
273
- "Required;code:357;type:wlist;;"
274
- "Readonly;code:358;type:wlist;;"
275
- "Words;code:352;type:wlist;words:2;;"
276
- "Formats;code:353;type:wlist;words:3;;"
277
- "Values;code:354;type:wlist;words:2;;"
278
- "Presets;code:355;type:wlist;words:2;;"
279
- "Comments;code:356;type:text;;"
228
+ "repo",
229
+ "Repo;code:1001;rq;ro;len:128;;"
230
+ "Owner;code:1002;len:32;;"
231
+ "Created;code:1003;type:date;ro;fmt:L;len:20;;"
232
+ "Pushed;code:1004;type:date;ro;fmt:L;len:20;;"
233
+ "ForkedFrom;code:1005;ro;len:128;;"
234
+ "Description;code:1006;type:text;len:128;;"
235
+ "DefaultBranch;code:1007;len:32;;"
236
+ "MirroredFrom;code:1008;len:32;;"
237
+ "Options;code:1009;type:select;len:10;val:lfs/nolfs;;"
238
+ "GconnMirrorServerId;code:1010;len:32;;"
239
+ },
240
+ {
241
+ "server",
242
+ "ServerID;code:751;rq;ro;len:32;;"
243
+ "Type;code:752;rq;len:32;;"
244
+ "Name;code:753;type:line;len:32;;"
245
+ "Address;code:754;type:line;len:32;;"
246
+ "ExternalAddress;code:755;type:line;len:32;;"
247
+ "Services;code:756;rq;len:128;;"
248
+ "Options;code:764;type:line;len:32;val:"
249
+ "nomandatory/mandatory;;"
250
+ "ReplicatingFrom;code:765;type:line;len:32;;"
251
+ "Description;code:757;type:text;len:128;;"
252
+ "User;code:761;type:line;len:64;;"
253
+ "AllowedAddresses;code:763;type:wlist;len:64;;"
254
+ "UpdateCachedRepos;code:766;type:wlist;len:64;;"
255
+ "ClientDataFilter;code:758;type:wlist;len:64;;"
256
+ "RevisionDataFilter;code:759;type:wlist;len:64;;"
257
+ "ArchiveDataFilter;code:760;type:wlist;len:64;;"
258
+ "DistributedConfig;code:762;type:text;len:128;;"
280
259
  },
281
260
  {
282
261
  "spec",
@@ -293,28 +272,28 @@ struct defaultspec {
293
272
  "Stream;code:701;rq;ro;len:64;;"
294
273
  "Update;code:705;type:date;ro;fmt:L;len:20;;"
295
274
  "Access;code:706;type:date;ro;fmt:L;len:20;;"
296
- "Owner;code:704;len:32;;"
297
- "Name;code:703;rq;type:line;len:32;;"
275
+ "Owner;code:704;len:32;open:isolate;;"
276
+ "Name;code:703;rq;type:line;len:32;open:isolate;;"
298
277
  "Parent;code:702;rq;len:64;open:isolate;;"
299
278
  "Type;code:708;rq;len:32;open:isolate;;"
300
- "Description;code:709;type:text;len:128;;"
279
+ "Description;code:709;type:text;len:128;open:isolate;;"
301
280
  "Options;code:707;type:line;len:64;val:"
302
281
  "allsubmit/ownersubmit,unlocked/locked,"
303
282
  "toparent/notoparent,fromparent/nofromparent,"
304
- "mergedown/mergeany;;"
305
- "Paths;code:710;rq;type:wlist;words:2;maxwords:3;len:64;open:isolate;;"
306
- "Remapped;code:711;type:wlist;words:2;len:64;open:isolate;;"
307
- "Ignored;code:712;type:wlist;words:1;len:64;open:isolate;;"
283
+ "mergedown/mergeany;open:isolate;;"
284
+ "Paths;code:710;rq;type:wlist;words:2;maxwords:3;len:64;open:propagate;;"
285
+ "Remapped;code:711;type:wlist;words:2;len:64;open:propagate;;"
286
+ "Ignored;code:712;type:wlist;words:1;len:64;open:propagate;;"
308
287
  "View;code:713;type:wlist;words:2;len:64;;"
309
288
  "ChangeView;code:714;type:llist;ro;len:64;;"
310
289
  },
311
290
  {
312
291
  "triggers",
313
- "Triggers;code:551;type:wlist;words:4;len:64;opt:default;"
292
+ "Triggers;code:551;type:wlist;words:4;len:64;opt:default;z;;"
314
293
  },
315
294
  {
316
295
  "typemap",
317
- "TypeMap;code:601;type:wlist;words:2;len:64;opt:default;"
296
+ "TypeMap;code:601;type:wlist;words:2;len:64;opt:default;z;;"
318
297
  },
319
298
  {
320
299
  "user",
@@ -326,23 +305,10 @@ struct defaultspec {
326
305
  "FullName;code:655;fmt:R;type:line;rq;len:32;;"
327
306
  "JobView;code:656;type:line;len:64;;"
328
307
  "Password;code:657;len:32;;"
329
- "AuthMethod;code:662;fmt:L;len:10;val:perforce/ldap;;"
308
+ "AuthMethod;code:662;fmt:L;len:10;val:"
309
+ "perforce/perforce+2fa/ldap/ldap+2fa;;"
330
310
  "Reviews;code:658;type:wlist;len:64;;"
331
311
  },
332
- {
333
- "server",
334
- "ServerID;code:751;rq;ro;len:32;;"
335
- "Type;code:752;rq;len:32;;"
336
- "Name;code:753;type:line;len:32;;"
337
- "Address;code:754;type:line;len:32;;"
338
- "ExternalAddress;code:755;type:line;len:32;;"
339
- "Services;code:756;rq;len:128;;"
340
- "Description;code:757;type:text;len:128;;"
341
- "User;code:761;type:line;len:64;;"
342
- "ClientDataFilter;code:758;type:wlist;len:64;;"
343
- "RevisionDataFilter;code:759;type:wlist;len:64;;"
344
- "ArchiveDataFilter;code:760;type:wlist;len:64;;"
345
- },
346
312
  { 0, 0 }
347
313
  };
348
314