p4ruby 2014.2.0.pre2 → 2014.2.0.pre3
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 +4 -4
- data/ext/P4/p4.cpp +19 -0
- data/ext/P4/p4clientapi.cpp +12 -1
- data/ext/P4/p4clientapi.h +2 -0
- data/ext/P4/specmgr.cpp +355 -272
- data/lib/P4.rb +10 -2
- data/lib/P4/version.rb +1 -1
- data/p4-doc/user/p4rubynotes.txt +13 -0
- metadata +6 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d54de1eb7bb72644ffa5f247b42efda01c22783
|
4
|
+
data.tar.gz: 73b7022b99ad6a17f3b2737be1a38396514429f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bbd0db7fa7bbe379a63e8c6b9c3522e6227c8c8c8e3a98166e90a6edb8ac9129e7aa6c625f4eb6bcee777dd6d4a058467e9db59685e77e1bb3ca20ba0744dbc
|
7
|
+
data.tar.gz: 7481faabf71db4ec9bbc860cbbf8b1c2ee37af08b534b7baa33f0ec17dd133ca66b52a892f2adc58bd9318fe7592aba3f292272fd6ee044a1cb98ef9b5e76c22
|
data/ext/P4/p4.cpp
CHANGED
@@ -297,6 +297,23 @@ static VALUE p4_set_env( VALUE self, VALUE var, VALUE val )
|
|
297
297
|
Data_Get_Struct( self, P4ClientApi, p4 );
|
298
298
|
return p4->SetEnv( StringValuePtr( var ), StringValuePtr( val ) );
|
299
299
|
}
|
300
|
+
|
301
|
+
static VALUE p4_get_enviro_file( VALUE self )
|
302
|
+
{
|
303
|
+
P4ClientApi *p4;
|
304
|
+
Data_Get_Struct( self, P4ClientApi, p4 );
|
305
|
+
const StrPtr *enviro_file = p4->GetEnviroFile();
|
306
|
+
return P4Utils::ruby_string( enviro_file->Text() );
|
307
|
+
}
|
308
|
+
|
309
|
+
static VALUE p4_set_enviro_file( VALUE self, VALUE rbstr )
|
310
|
+
{
|
311
|
+
P4ClientApi *p4;
|
312
|
+
Data_Get_Struct( self, P4ClientApi, p4 );
|
313
|
+
p4->SetEnviroFile( StringValuePtr(rbstr) );
|
314
|
+
return Qtrue;
|
315
|
+
}
|
316
|
+
|
300
317
|
static VALUE p4_get_host( VALUE self )
|
301
318
|
{
|
302
319
|
P4ClientApi *p4;
|
@@ -1192,6 +1209,8 @@ void Init_P4()
|
|
1192
1209
|
rb_define_method( cP4, "client=", RUBY_METHOD_FUNC(p4_set_client) , 1 );
|
1193
1210
|
rb_define_method( cP4, "env", RUBY_METHOD_FUNC(p4_get_env) , 1 );
|
1194
1211
|
rb_define_method( cP4, "set_env", RUBY_METHOD_FUNC(p4_set_env) , 2 );
|
1212
|
+
rb_define_method( cP4, "enviro_file", RUBY_METHOD_FUNC(p4_get_enviro_file), 0);
|
1213
|
+
rb_define_method( cP4, "enviro_file=", RUBY_METHOD_FUNC(p4_set_enviro_file), 1);
|
1195
1214
|
rb_define_method( cP4, "host", RUBY_METHOD_FUNC(p4_get_host) , 0 );
|
1196
1215
|
rb_define_method( cP4, "host=", RUBY_METHOD_FUNC(p4_set_host) , 1 );
|
1197
1216
|
rb_define_method( cP4, "ignore_file",RUBY_METHOD_FUNC(p4_get_ignore) , 0 );
|
data/ext/P4/p4clientapi.cpp
CHANGED
@@ -119,7 +119,18 @@ P4ClientApi::GetEnv( const char *v)
|
|
119
119
|
{
|
120
120
|
return enviro->Get( v );
|
121
121
|
}
|
122
|
-
|
122
|
+
|
123
|
+
void
|
124
|
+
P4ClientApi::SetEnviroFile( const char *c )
|
125
|
+
{
|
126
|
+
enviro->SetEnviroFile(c);
|
127
|
+
}
|
128
|
+
|
129
|
+
const StrPtr *
|
130
|
+
P4ClientApi::GetEnviroFile()
|
131
|
+
{
|
132
|
+
return enviro->GetEnviroFile();
|
133
|
+
}
|
123
134
|
|
124
135
|
void
|
125
136
|
P4ClientApi::SetApiLevel( int level )
|
data/ext/P4/p4clientapi.h
CHANGED
@@ -69,6 +69,7 @@ public:
|
|
69
69
|
|
70
70
|
void SetClient( const char *c ) { client.SetClient( c ); }
|
71
71
|
void SetCwd( const char *c );
|
72
|
+
void SetEnviroFile( const char *c );
|
72
73
|
void SetHost( const char *h ) { client.SetHost( h ); }
|
73
74
|
void SetIgnoreFile( const char *f ) { client.SetIgnoreFile( f ); }
|
74
75
|
void SetMaxResults( int v ) { maxResults = v; }
|
@@ -90,6 +91,7 @@ public:
|
|
90
91
|
const StrPtr &GetConfig() { return client.GetConfig(); }
|
91
92
|
const StrPtr &GetCwd() { return client.GetCwd(); }
|
92
93
|
const char * GetEnv( const char *v);
|
94
|
+
const StrPtr *GetEnviroFile();
|
93
95
|
const StrPtr &GetHost() { return client.GetHost(); }
|
94
96
|
const StrPtr &GetIgnoreFile() { return client.GetIgnoreFile();}
|
95
97
|
const StrPtr &GetLanguage() { return client.GetLanguage(); }
|
data/ext/P4/specmgr.cpp
CHANGED
@@ -26,12 +26,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
26
26
|
*******************************************************************************/
|
27
27
|
|
28
28
|
/*******************************************************************************
|
29
|
-
* Name
|
29
|
+
* Name : specmgr.cc
|
30
30
|
*
|
31
|
-
* Description
|
32
|
-
*
|
33
|
-
*
|
34
|
-
*
|
31
|
+
* Description : Ruby bindings for the Perforce API. Class for handling
|
32
|
+
* Perforce specs. This class provides other classes with
|
33
|
+
* generic support for parsing and formatting Perforce
|
34
|
+
* specs.
|
35
35
|
*
|
36
36
|
******************************************************************************/
|
37
37
|
#include <ctype.h>
|
@@ -52,179 +52,262 @@ struct defaultspec {
|
|
52
52
|
const char *type;
|
53
53
|
const char *spec;
|
54
54
|
} speclist[] = {
|
55
|
-
|
56
55
|
{
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
56
|
+
"branch",
|
57
|
+
"Branch;code:301;rq;ro;fmt:L;len:32;;"
|
58
|
+
"Update;code:302;type:date;ro;fmt:L;len:20;;"
|
59
|
+
"Access;code:303;type:date;ro;fmt:L;len:20;;"
|
60
|
+
"Owner;code:304;fmt:R;len:32;;"
|
61
|
+
"Description;code:306;type:text;len:128;;"
|
62
|
+
"Options;code:309;type:line;len:32;val:"
|
63
|
+
"unlocked/locked;;"
|
64
|
+
"View;code:311;type:wlist;words:2;len:64;;"
|
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
|
+
"Description;code:206;type:text;rq;;"
|
76
|
+
"Jobs;code:209;type:wlist;words:2;len:32;;"
|
77
|
+
"Files;code:210;type:llist;len:64;;"
|
78
|
+
},
|
79
|
+
{
|
80
|
+
"change",
|
81
|
+
"Change;code:201;rq;ro;fmt:L;seq:1;len:10;;"
|
82
|
+
"Date;code:202;type:date;ro;fmt:R;seq:3;len:20;;"
|
83
|
+
"Client;code:203;ro;fmt:L;seq:2;len:32;;"
|
84
|
+
"User;code:204;ro;fmt:L;seq:4;len:32;;"
|
85
|
+
"Status;code:205;ro;fmt:R;seq:5;len:10;;"
|
86
|
+
"Type;code:211;seq:6;type:select;fmt:L;len:10;"
|
87
|
+
"val:public/restricted;;"
|
88
|
+
"Description;code:206;type:text;rq;seq:7;;"
|
89
|
+
"JobStatus;code:207;fmt:I;type:select;seq:9;;"
|
90
|
+
"Jobs;code:208;type:wlist;seq:8;len:32;;"
|
91
|
+
"Files;code:210;type:llist;len:64;;"
|
92
|
+
},
|
93
|
+
{
|
94
|
+
"client",
|
95
|
+
"Client;code:301;rq;ro;seq:1;len:32;;"
|
96
|
+
"Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
|
97
|
+
"Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
|
98
|
+
"Owner;code:304;seq:3;fmt:R;len:32;;"
|
99
|
+
"Host;code:305;seq:5;fmt:R;len:32;;"
|
100
|
+
"Description;code:306;type:text;len:128;;"
|
101
|
+
"Root;code:307;rq;type:line;len:64;;"
|
102
|
+
"AltRoots;code:308;type:llist;len:64;;"
|
103
|
+
"Options;code:309;type:line;len:64;val:"
|
104
|
+
"noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
|
105
|
+
"unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
|
106
|
+
"SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
|
107
|
+
"submitunchanged/submitunchanged+reopen/revertunchanged/"
|
108
|
+
"revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
|
109
|
+
"LineEnd;code:310;type:select;fmt:L;len:12;val:"
|
110
|
+
"local/unix/mac/win/share;;"
|
111
|
+
"Stream;code:314;type:line;len:64;;"
|
112
|
+
"StreamAtChange;code:316;type:line;len:64;;"
|
113
|
+
"ServerID;code:315;type:line;ro;len:64;;"
|
114
|
+
"View;code:311;type:wlist;words:2;len:64;;"
|
115
|
+
"ChangeView;code:317;type:llist;len:64;;"
|
116
|
+
},
|
117
|
+
{
|
118
|
+
"clientX",
|
119
|
+
"Client;code:301;rq;ro;seq:1;len:32;;"
|
120
|
+
"Update;code:302;type:date;ro;seq:2;fmt:L;len:20;;"
|
121
|
+
"Access;code:303;type:date;ro;seq:4;fmt:L;len:20;;"
|
122
|
+
"Owner;code:304;seq:3;fmt:R;len:32;;"
|
123
|
+
"Host;code:305;seq:5;fmt:R;len:32;;"
|
124
|
+
"Description;code:306;type:text;len:128;;"
|
125
|
+
"Root;code:307;rq;type:line;len:64;;"
|
126
|
+
"AltRoots;code:308;type:llist;len:64;;"
|
127
|
+
"Options;code:309;type:line;len:64;val:"
|
128
|
+
"noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
|
129
|
+
"unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
|
130
|
+
"SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
|
131
|
+
"submitunchanged/submitunchanged+reopen/revertunchanged/"
|
132
|
+
"revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
|
133
|
+
"LineEnd;code:310;type:select;fmt:L;len:12;val:"
|
134
|
+
"local/unix/mac/win/share;;"
|
135
|
+
"View;code:311;type:wlist;words:2;len:64;;"
|
136
|
+
},
|
137
|
+
{
|
138
|
+
"clientSpecing021",
|
139
|
+
"Client;code:301;rq;ro;len:32;;"
|
140
|
+
"Update;code:302;type:date;ro;len:20;;"
|
141
|
+
"Access;code:303;type:date;ro;len:20;;"
|
142
|
+
"Owner;code:304;len:32;;"
|
143
|
+
"Host;code:305;len:32;;"
|
144
|
+
"Description;code:306;type:text;len:128;;"
|
145
|
+
"Root;code:307;rq;type:line;len:64;;"
|
146
|
+
"AltRoots;code:308;type:text;len:64;;"
|
147
|
+
"Options;code:309;type:line;len:64;val:"
|
148
|
+
"noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
|
149
|
+
"unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
|
150
|
+
"LineEnd;code:310;type:select;len:12;val:local/unix/mac/win/share;;"
|
151
|
+
"View;code:311;type:wlist;words:2;len:64;;"
|
66
152
|
},
|
67
153
|
{
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
"Jobs;code:208;type:wlist;seq:8;len:32;;"
|
79
|
-
"Files;code:210;type:llist;len:64;;"
|
154
|
+
"depot",
|
155
|
+
"Depot;code:251;rq;ro;len:32;;"
|
156
|
+
"Owner;code:252;len:32;;"
|
157
|
+
"Date;code:253;type:date;ro;len:20;;"
|
158
|
+
"Description;code:254;type:text;len:128;;"
|
159
|
+
"Type;code:255;rq;len:10;;"
|
160
|
+
"Address;code:256;len:64;;"
|
161
|
+
"Suffix;code:258;len:64;;"
|
162
|
+
"Map;code:257;rq;len:64;;"
|
163
|
+
"SpecMap;code:259;type:wlist;len:64;;"
|
80
164
|
},
|
81
165
|
{
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
"noallwrite/allwrite,noclobber/clobber,nocompress/compress,"
|
93
|
-
"unlocked/locked,nomodtime/modtime,normdir/rmdir;;"
|
94
|
-
"SubmitOptions;code:313;type:select;fmt:L;len:25;val:"
|
95
|
-
"submitunchanged/submitunchanged+reopen/revertunchanged/"
|
96
|
-
"revertunchanged+reopen/leaveunchanged/leaveunchanged+reopen;;"
|
97
|
-
"LineEnd;code:310;type:select;fmt:L;len:12;val:"
|
98
|
-
"local/unix/mac/win/share;;"
|
99
|
-
"Stream;code:314;type:line;len:64;;"
|
100
|
-
"StreamAtChange;code:316;type:line;len:64;;"
|
101
|
-
"ServerID;code:315;type:line;ro;len:64;;"
|
102
|
-
"View;code:311;type:wlist;words:2;len:64;;"
|
103
|
-
"ChangeView;code:317;type:llist;ro;len:64;;"
|
166
|
+
"group",
|
167
|
+
"Group;code:401;rq;ro;len:32;;"
|
168
|
+
"MaxResults;code:402;type:word;len:12;;"
|
169
|
+
"MaxScanRows;code:403;type:word;len:12;;"
|
170
|
+
"MaxLockTime;code:407;type:word;len:12;;"
|
171
|
+
"Timeout;code:406;type:word;len:12;;"
|
172
|
+
"PasswordTimeout;code:409;type:word;len:12;;"
|
173
|
+
"Subgroups;code:404;type:wlist;len:32;opt:default;;"
|
174
|
+
"Owners;code:408;type:wlist;len:32;opt:default;;"
|
175
|
+
"Users;code:405;type:wlist;len:32;opt:default;;"
|
104
176
|
},
|
105
177
|
{
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
"Suffix;code:258;len:64;;"
|
114
|
-
"Map;code:257;rq;len:64;;"
|
115
|
-
"SpecMap;code:259;type:wlist;len:64;;"
|
178
|
+
"job",
|
179
|
+
"Job;code:101;rq;len:32;;"
|
180
|
+
"Status;code:102;type:select;rq;len:10;"
|
181
|
+
"pre:open;val:open/suspended/closed;;"
|
182
|
+
"User;code:103;rq;len:32;pre:$user;;"
|
183
|
+
"Date;code:104;type:date;ro;len:20;pre:$now;;"
|
184
|
+
"Description;code:105;type:text;rq;pre:$blank;;"
|
116
185
|
},
|
117
186
|
{
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
187
|
+
"label",
|
188
|
+
"Label;code:301;rq;ro;fmt:L;len:32;;"
|
189
|
+
"Update;code:302;type:date;ro;fmt:L;len:20;;"
|
190
|
+
"Access;code:303;type:date;ro;fmt:L;len:20;;"
|
191
|
+
"Owner;code:304;fmt:R;len:32;;"
|
192
|
+
"Description;code:306;type:text;len:128;;"
|
193
|
+
"Options;code:309;type:line;len:64;val:"
|
194
|
+
"unlocked/locked,noautoreload/autoreload;;"
|
195
|
+
"Revision;code:312;type:word;words:1;len:64;;"
|
196
|
+
"ServerID;code:315;type:line;ro;len:64;;"
|
197
|
+
"View;code:311;type:wlist;len:64;;"
|
128
198
|
},
|
129
199
|
{
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
200
|
+
"ldap",
|
201
|
+
"Name;code:801;rq;len:32;;"
|
202
|
+
"Host;code:802;rq;type:word;words:1;len:128;;"
|
203
|
+
"Port;code:803;rq;type:word;words:1;len:5;;"
|
204
|
+
"Encryption;code:804;rq;len:10;val:"
|
205
|
+
"none/ssl/tls;;"
|
206
|
+
"BindMethod;code:805;rq;len:10;val:"
|
207
|
+
"simple/search/sasl;;"
|
208
|
+
"SimplePattern;code:806;type:line;len:128;;"
|
209
|
+
"SearchBaseDN;code:807;type:line;len:128;;"
|
210
|
+
"SearchFilter;code:808;type:line;len:128;;"
|
211
|
+
"SearchScope;code:809;len:10;val:"
|
212
|
+
"baseonly/children/subtree;;"
|
213
|
+
"SearchBindDN;code:810;type:line;len:128;;"
|
214
|
+
"SearchPasswd;code:811;type:line;len:128;;"
|
215
|
+
"SaslRealm;code:812;type:word;words:1;len:128;;"
|
216
|
+
"GroupBaseDN;code:813;type:line;len:128;;"
|
217
|
+
"GroupSearchFilter;code:814;type:line;len:128;;"
|
218
|
+
"GroupSearchScope;code:815;len:10;val:"
|
219
|
+
"baseonly/children/subtree;;"
|
137
220
|
},
|
138
221
|
{
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
222
|
+
"license",
|
223
|
+
"License;code:451;len:32;;"
|
224
|
+
"License-Expires;code:452;len:10;;"
|
225
|
+
"Support-Expires;code:453;len:10;;"
|
226
|
+
"Customer;code:454;type:line;len:128;;"
|
227
|
+
"Application;code:455;len:32;;"
|
228
|
+
"IPaddress;code:456;len:24;;"
|
229
|
+
"IPservice;code:461;type:wlist;len:24;;"
|
230
|
+
"Platform;code:457;len:32;;"
|
231
|
+
"Clients;code:458;len:8;;"
|
232
|
+
"Users;code:459;len:8;;"
|
233
|
+
"Files;code:460;len:8;;"
|
150
234
|
},
|
151
235
|
{
|
152
|
-
|
153
|
-
|
154
|
-
"License-Expires;code:452;len:10;;"
|
155
|
-
"Support-Expires;code:453;len:10;;"
|
156
|
-
"Customer;code:454;type:line;len:128;;"
|
157
|
-
"Application;code:455;len:32;;"
|
158
|
-
"IPaddress;code:456;len:24;;"
|
159
|
-
"IPservice;code:461;type:wlist;len:24;;"
|
160
|
-
"Platform;code:457;len:32;;"
|
161
|
-
"Clients;code:458;len:8;;"
|
162
|
-
"Users;code:459;len:8;;"
|
163
|
-
"Files;code:460;len:8;;"
|
236
|
+
"protect",
|
237
|
+
"Protections;code:501;type:wlist;words:5;opt:default;len:64;;"
|
164
238
|
},
|
165
239
|
{
|
166
|
-
|
167
|
-
|
240
|
+
"specW",
|
241
|
+
"Fields;code:351;type:wlist;words:5;rq;;"
|
242
|
+
"Required;code:357;type:wlist;;"
|
243
|
+
"Readonly;code:358;type:wlist;;"
|
244
|
+
"Words;code:352;type:wlist;words:2;;"
|
245
|
+
"Formats;code:353;type:wlist;words:3;;"
|
246
|
+
"Values;code:354;type:wlist;words:2;;"
|
247
|
+
"Presets;code:355;type:wlist;words:2;;"
|
248
|
+
"Comments;code:356;type:text;;"
|
168
249
|
},
|
169
250
|
{
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
251
|
+
"spec",
|
252
|
+
"Fields;code:351;type:wlist;words:5;rq;;"
|
253
|
+
"Words;code:352;type:wlist;words:2;;"
|
254
|
+
"Formats;code:353;type:wlist;words:3;;"
|
255
|
+
"Values;code:354;type:wlist;words:2;;"
|
256
|
+
"Presets;code:355;type:wlist;words:2;;"
|
257
|
+
"Comments;code:356;type:text;;"
|
177
258
|
},
|
178
259
|
{
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
260
|
+
"stream",
|
261
|
+
"Stream;code:701;rq;ro;len:64;;"
|
262
|
+
"Update;code:705;type:date;ro;fmt:L;len:20;;"
|
263
|
+
"Access;code:706;type:date;ro;fmt:L;len:20;;"
|
264
|
+
"Owner;code:704;len:32;;"
|
265
|
+
"Name;code:703;rq;type:line;len:32;;"
|
266
|
+
"Parent;code:702;rq;len:64;;"
|
267
|
+
"Type;code:708;rq;len:32;;"
|
268
|
+
"Description;code:709;type:text;len:128;;"
|
269
|
+
"Options;code:707;type:line;len:64;val:"
|
270
|
+
"allsubmit/ownersubmit,unlocked/locked,"
|
271
|
+
"toparent/notoparent,fromparent/nofromparent;;"
|
272
|
+
"Paths;code:710;rq;type:wlist;words:2;maxwords:3;len:64;;"
|
273
|
+
"Remapped;code:711;type:wlist;words:2;len:64;;"
|
274
|
+
"Ignored;code:712;type:wlist;words:1;len:64;;"
|
275
|
+
"View;code:713;type:wlist;words:2;len:64;;"
|
276
|
+
"ChangeView;code:714;type:llist;ro;len:64;;"
|
196
277
|
},
|
197
278
|
{
|
198
|
-
|
199
|
-
|
279
|
+
"triggers",
|
280
|
+
"Triggers;code:551;type:wlist;words:4;len:64;opt:default;"
|
200
281
|
},
|
201
282
|
{
|
202
|
-
|
203
|
-
|
283
|
+
"typemap",
|
284
|
+
"TypeMap;code:601;type:wlist;words:2;len:64;opt:default;"
|
204
285
|
},
|
205
286
|
{
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
287
|
+
"user",
|
288
|
+
"User;code:651;rq;ro;seq:1;len:32;;"
|
289
|
+
"Type;code:659;ro;fmt:R;len:10;;"
|
290
|
+
"Email;code:652;fmt:R;rq;seq:3;len:32;;"
|
291
|
+
"Update;code:653;fmt:L;type:date;ro;seq:2;len:20;;"
|
292
|
+
"Access;code:654;fmt:L;type:date;ro;len:20;;"
|
293
|
+
"FullName;code:655;fmt:R;type:line;rq;len:32;;"
|
294
|
+
"JobView;code:656;type:line;len:64;;"
|
295
|
+
"Password;code:657;len:32;;"
|
296
|
+
"AuthMethod;code:662;fmt:L;len:10;val:perforce/ldap;;"
|
297
|
+
"Reviews;code:658;type:wlist;len:64;;"
|
216
298
|
},
|
217
299
|
{
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
300
|
+
"server",
|
301
|
+
"ServerID;code:751;rq;ro;len:32;;"
|
302
|
+
"Type;code:752;rq;len:32;;"
|
303
|
+
"Name;code:753;type:line;len:32;;"
|
304
|
+
"Address;code:754;type:line;len:32;;"
|
305
|
+
"Services;code:755;rq;len:128;;"
|
306
|
+
"Description;code:756;type:text;len:128;;"
|
307
|
+
"User;code:760;type:line;len:64;;"
|
308
|
+
"ClientDataFilter;code:757;type:wlist;len:64;;"
|
309
|
+
"RevisionDataFilter;code:758;type:wlist;len:64;;"
|
310
|
+
"ArchiveDataFilter;code:759;type:wlist;len:64;;"
|
228
311
|
},
|
229
312
|
{ 0, 0 }
|
230
313
|
};
|
@@ -245,7 +328,7 @@ void
|
|
245
328
|
SpecMgr::AddSpecDef( const char *type, StrPtr &specDef )
|
246
329
|
{
|
247
330
|
if( specs->GetVar( type ) )
|
248
|
-
|
331
|
+
specs->RemoveVar( type );
|
249
332
|
specs->SetVar( type, specDef );
|
250
333
|
}
|
251
334
|
|
@@ -253,7 +336,7 @@ void
|
|
253
336
|
SpecMgr::AddSpecDef( const char *type, const char *specDef )
|
254
337
|
{
|
255
338
|
if( specs->GetVar( type ) )
|
256
|
-
|
339
|
+
specs->RemoveVar( type );
|
257
340
|
specs->SetVar( type, specDef );
|
258
341
|
}
|
259
342
|
|
@@ -265,7 +348,7 @@ SpecMgr::Reset()
|
|
265
348
|
specs = new StrBufDict;
|
266
349
|
|
267
350
|
for( struct defaultspec *sp = &speclist[ 0 ]; sp->type; sp++ )
|
268
|
-
|
351
|
+
AddSpecDef( sp->type, sp->spec );
|
269
352
|
|
270
353
|
}
|
271
354
|
|
@@ -276,25 +359,25 @@ SpecMgr::HaveSpecDef( const char *type )
|
|
276
359
|
}
|
277
360
|
|
278
361
|
//
|
279
|
-
// Convert a Perforce StrDict into a Ruby hash. Convert multi-level
|
280
|
-
// data (Files0, Files1 etc. ) into (nested) array members of the hash.
|
362
|
+
// Convert a Perforce StrDict into a Ruby hash. Convert multi-level
|
363
|
+
// data (Files0, Files1 etc. ) into (nested) array members of the hash.
|
281
364
|
//
|
282
365
|
|
283
366
|
VALUE
|
284
367
|
SpecMgr::StrDictToHash( StrDict *dict, VALUE hash )
|
285
368
|
{
|
286
|
-
StrRef
|
287
|
-
int
|
369
|
+
StrRef var, val;
|
370
|
+
int i;
|
288
371
|
|
289
372
|
if( hash == Qnil )
|
290
|
-
|
373
|
+
hash = rb_hash_new();
|
291
374
|
|
292
375
|
for ( i = 0; dict->GetVar( i, var, val ); i++ )
|
293
376
|
{
|
294
|
-
|
295
|
-
|
377
|
+
if ( var == "specdef" || var == "func" || var == "specFormatted" )
|
378
|
+
continue;
|
296
379
|
|
297
|
-
|
380
|
+
InsertItem( hash, &var, &val );
|
298
381
|
}
|
299
382
|
return hash;
|
300
383
|
}
|
@@ -307,17 +390,17 @@ VALUE
|
|
307
390
|
SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
|
308
391
|
{
|
309
392
|
|
310
|
-
// This converts it to a string, and then to a hash, so we go from one
|
393
|
+
// This converts it to a string, and then to a hash, so we go from one
|
311
394
|
// type of dictionary to another, via an intermediate form (a StrBuf).
|
312
395
|
|
313
|
-
Error
|
314
|
-
SpecDataTable
|
396
|
+
Error e;
|
397
|
+
SpecDataTable dictData( dict );
|
315
398
|
#if P4APIVER_ID >= 513538
|
316
|
-
Spec
|
399
|
+
Spec s( specDef->Text(), "", &e );
|
317
400
|
#else
|
318
|
-
Spec
|
401
|
+
Spec s( specDef->Text(), "" );
|
319
402
|
#endif
|
320
|
-
StrBuf
|
403
|
+
StrBuf form;
|
321
404
|
|
322
405
|
if( e.Test() ) return Qfalse;
|
323
406
|
|
@@ -325,12 +408,12 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
|
|
325
408
|
s.Format( &dictData, &form );
|
326
409
|
|
327
410
|
// Now parse the StrBuf into a new P4::Spec object
|
328
|
-
VALUE
|
329
|
-
SpecDataRuby
|
411
|
+
VALUE spec = NewSpec( specDef );
|
412
|
+
SpecDataRuby hashData( spec );
|
330
413
|
|
331
414
|
s.ParseNoValid( form.Text(), &hashData, &e );
|
332
415
|
if( e.Test() ) return Qfalse;
|
333
|
-
|
416
|
+
|
334
417
|
// Now see if there are any extraTag fields as we'll need to
|
335
418
|
// add those fields into our output. Just iterate over them
|
336
419
|
// extracting the fields and inserting them as we go.
|
@@ -339,16 +422,16 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
|
|
339
422
|
for( i = 0; ; i++ )
|
340
423
|
{
|
341
424
|
StrBuf tag;
|
342
|
-
|
343
|
-
|
425
|
+
StrPtr *var;
|
426
|
+
StrPtr *val;
|
344
427
|
|
345
428
|
tag << et << i;
|
346
|
-
|
429
|
+
if( !(var = dict->GetVar( tag ) ) )
|
347
430
|
break;
|
348
431
|
|
349
|
-
|
350
|
-
|
351
|
-
|
432
|
+
val = dict->GetVar( *var );
|
433
|
+
if( !val ) continue;
|
434
|
+
|
352
435
|
InsertItem( spec, var, val );
|
353
436
|
}
|
354
437
|
|
@@ -358,48 +441,48 @@ SpecMgr::StrDictToSpec( StrDict *dict, StrPtr *specDef )
|
|
358
441
|
VALUE
|
359
442
|
SpecMgr::StringToSpec( const char *type, const char *form, Error *e )
|
360
443
|
{
|
361
|
-
|
362
|
-
StrPtr *
|
363
|
-
VALUE
|
364
|
-
SpecDataRuby
|
444
|
+
|
445
|
+
StrPtr * specDef = specs->GetVar( type );
|
446
|
+
VALUE hash = NewSpec( specDef );
|
447
|
+
SpecDataRuby specData( hash );
|
365
448
|
#if P4APIVER_ID >= 513538
|
366
|
-
Spec
|
449
|
+
Spec s( specDef->Text(), "", e );
|
367
450
|
#else
|
368
|
-
Spec
|
451
|
+
Spec s( specDef->Text(), "" );
|
369
452
|
#endif
|
370
453
|
|
371
|
-
if( !e->Test() )
|
372
|
-
|
454
|
+
if( !e->Test() )
|
455
|
+
s.ParseNoValid( form, &specData, e );
|
373
456
|
|
374
457
|
if ( e->Test() )
|
375
|
-
|
458
|
+
return Qfalse;
|
376
459
|
|
377
460
|
return hash;
|
378
461
|
}
|
379
462
|
|
380
463
|
|
381
464
|
//
|
382
|
-
// Format routine. updates a StrBuf object with the form content.
|
465
|
+
// Format routine. updates a StrBuf object with the form content.
|
383
466
|
// The StrBuf can then be converted to a Ruby string where required.
|
384
467
|
//
|
385
468
|
void
|
386
469
|
SpecMgr::SpecToString( const char *type, VALUE hash, StrBuf &b, Error *e )
|
387
470
|
{
|
388
471
|
|
389
|
-
StrBuf
|
390
|
-
StrPtr *
|
472
|
+
StrBuf buf;
|
473
|
+
StrPtr * specDef = specs->GetVar( type );
|
391
474
|
if ( !specDef )
|
392
475
|
{
|
393
|
-
|
394
|
-
|
395
|
-
|
476
|
+
e->Set( E_FAILED, "No specdef available. Cannot convert hash to a "
|
477
|
+
"Perforce form" );
|
478
|
+
return;
|
396
479
|
}
|
397
480
|
|
398
|
-
SpecDataRuby
|
481
|
+
SpecDataRuby specData( hash );
|
399
482
|
#if P4APIVER_ID >= 513538
|
400
|
-
Spec
|
483
|
+
Spec s( specDef->Text(), "", e );
|
401
484
|
#else
|
402
|
-
Spec
|
485
|
+
Spec s( specDef->Text(), "" );
|
403
486
|
#endif
|
404
487
|
|
405
488
|
if( e->Test() ) return;
|
@@ -431,29 +514,29 @@ SpecMgr::SpecFields( StrPtr *specDef )
|
|
431
514
|
// see that changing anytime soon, and it makes this so simple and
|
432
515
|
// reliable. So...
|
433
516
|
//
|
434
|
-
VALUE
|
435
|
-
Error
|
517
|
+
VALUE hash = rb_hash_new();
|
518
|
+
Error e;
|
436
519
|
|
437
520
|
#if P4APIVER_ID >= 513538
|
438
|
-
Spec
|
521
|
+
Spec s( specDef->Text(), "", &e );
|
439
522
|
#else
|
440
|
-
Spec
|
523
|
+
Spec s( specDef->Text(), "" );
|
441
524
|
#endif
|
442
525
|
if( e.Test() ) return Qnil;
|
443
526
|
|
444
527
|
for( int i = 0; i < s.Count(); i++ )
|
445
528
|
{
|
446
|
-
|
447
|
-
|
448
|
-
|
529
|
+
StrBuf k;
|
530
|
+
StrBuf v;
|
531
|
+
SpecElem * se = s.Get( i );
|
449
532
|
|
450
|
-
|
451
|
-
|
452
|
-
|
533
|
+
v = se->tag;
|
534
|
+
k = v;
|
535
|
+
StrOps::Lower( k );
|
453
536
|
|
454
|
-
|
455
|
-
|
456
|
-
|
537
|
+
rb_hash_aset(hash,
|
538
|
+
P4Utils::ruby_string( k.Text(), k.Length() ),
|
539
|
+
P4Utils::ruby_string( v.Text(), v.Length() ) );
|
457
540
|
}
|
458
541
|
return hash;
|
459
542
|
}
|
@@ -474,13 +557,13 @@ SpecMgr::SplitKey( const StrPtr *key, StrBuf &base, StrBuf &index )
|
|
474
557
|
index = "";
|
475
558
|
for ( i = key->Length(); i; i-- )
|
476
559
|
{
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
560
|
+
char prev = (*key)[ i-1 ];
|
561
|
+
if ( !isdigit( prev ) && prev != ',' )
|
562
|
+
{
|
563
|
+
base.Set( key->Text(), i );
|
564
|
+
index.Set( key->Text() + i );
|
565
|
+
break;
|
566
|
+
}
|
484
567
|
}
|
485
568
|
}
|
486
569
|
|
@@ -492,16 +575,16 @@ SpecMgr::SplitKey( const StrPtr *key, StrBuf &base, StrBuf &index )
|
|
492
575
|
void
|
493
576
|
SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
|
494
577
|
{
|
495
|
-
VALUE
|
496
|
-
VALUE
|
497
|
-
VALUE
|
498
|
-
ID
|
499
|
-
StrBuf
|
500
|
-
StrRef
|
578
|
+
VALUE ary = 0;
|
579
|
+
VALUE tary = 0;
|
580
|
+
VALUE key;
|
581
|
+
ID idLength = rb_intern( "length" );
|
582
|
+
StrBuf base, index;
|
583
|
+
StrRef comma( "," );
|
501
584
|
|
502
585
|
SplitKey( var, base, index );
|
503
586
|
|
504
|
-
// If there's no index, then we insert into the top level hash
|
587
|
+
// If there's no index, then we insert into the top level hash
|
505
588
|
// but if the key is already defined then we need to rename the key. This
|
506
589
|
// is probably one of those special keys like otherOpen which can be
|
507
590
|
// both an array element and a scalar. The scalar comes last, so we
|
@@ -509,18 +592,18 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
|
|
509
592
|
// value
|
510
593
|
if ( index == "" )
|
511
594
|
{
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
595
|
+
ID idHasKey = rb_intern( "has_key?");
|
596
|
+
ID idPlus = rb_intern( "+" );
|
597
|
+
|
598
|
+
key = P4Utils::ruby_string( var->Text() );
|
599
|
+
if ( rb_funcall( hash, idHasKey, 1, key ) == Qtrue )
|
600
|
+
key = rb_funcall( key, idPlus, 1, P4Utils::ruby_string( "s" ) );
|
601
|
+
|
602
|
+
if( P4RDB_DATA )
|
603
|
+
fprintf( stderr, "... %s -> %s\n", StringValuePtr( key ), val->Text() );
|
604
|
+
|
605
|
+
rb_hash_aset( hash, key, P4Utils::ruby_string( val->Text() ) );
|
606
|
+
return;
|
524
607
|
}
|
525
608
|
|
526
609
|
//
|
@@ -531,57 +614,57 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
|
|
531
614
|
|
532
615
|
if ( Qnil == ary )
|
533
616
|
{
|
534
|
-
|
535
|
-
|
617
|
+
ary = rb_ary_new();
|
618
|
+
rb_hash_aset( hash, key, ary );
|
536
619
|
}
|
537
620
|
else if( rb_obj_is_kind_of( ary, rb_cArray ) != Qtrue )
|
538
621
|
{
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
622
|
+
//
|
623
|
+
// There's an index in our var name, but the name is already defined
|
624
|
+
// and the value it contains is not an array. This means we've got a
|
625
|
+
// name collision. This can happen in 'p4 diff2' for example, when
|
626
|
+
// one file gets 'depotFile' and the other gets 'depotFile2'. In
|
627
|
+
// these cases it makes sense to keep the structure flat so we
|
628
|
+
// just use the raw variable name.
|
629
|
+
//
|
630
|
+
if( P4RDB_DATA )
|
631
|
+
fprintf( stderr, "... %s -> %s\n", var->Text(), val->Text() );
|
632
|
+
|
633
|
+
rb_hash_aset( hash, P4Utils::ruby_string( var->Text() ) ,
|
634
|
+
P4Utils::ruby_string( val->Text() ) );
|
635
|
+
return;
|
553
636
|
}
|
554
637
|
|
555
638
|
// The index may be a simple digit, or it could be a comma separated
|
556
639
|
// list of digits. For each "level" in the index, we need a containing
|
557
640
|
// array.
|
558
641
|
if( P4RDB_DATA )
|
559
|
-
|
642
|
+
fprintf( stderr, "... %s -> [", base.Text() );
|
560
643
|
|
561
644
|
for( const char *c = 0 ; ( c = index.Contains( comma ) ); )
|
562
645
|
{
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
646
|
+
StrBuf level;
|
647
|
+
level.Set( index.Text(), c - index.Text() );
|
648
|
+
index.Set( c + 1 );
|
649
|
+
|
650
|
+
// Found another level so we need to get/create a nested array
|
651
|
+
// under the current entry. We use the level as an index so that
|
652
|
+
// missing entries are left empty deliberately.
|
653
|
+
|
654
|
+
tary = rb_ary_entry( ary, level.Atoi() );
|
655
|
+
if ( ! RTEST( tary ) )
|
573
656
|
{
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
657
|
+
tary = rb_ary_new();
|
658
|
+
rb_ary_store( ary, level.Atoi(), tary );
|
659
|
+
}
|
660
|
+
if( P4RDB_DATA )
|
661
|
+
fprintf( stderr, "%s][", level.Text() );
|
662
|
+
ary = tary;
|
580
663
|
}
|
581
664
|
int pos = index.Atoi();
|
582
665
|
|
583
666
|
if( P4RDB_DATA )
|
584
|
-
|
667
|
+
fprintf( stderr, "%d] = %s\n", pos, val->Text() );
|
585
668
|
|
586
669
|
rb_ary_store( ary, pos, P4Utils::ruby_string( val->Text() ) );
|
587
670
|
}
|
@@ -593,12 +676,12 @@ SpecMgr::InsertItem( VALUE hash, const StrPtr *var, const StrPtr *val )
|
|
593
676
|
VALUE
|
594
677
|
SpecMgr::NewSpec( StrPtr *specDef )
|
595
678
|
{
|
596
|
-
ID
|
597
|
-
ID
|
598
|
-
ID
|
599
|
-
VALUE
|
600
|
-
VALUE
|
601
|
-
VALUE
|
679
|
+
ID idNew = rb_intern( "new" );
|
680
|
+
ID idP4 = rb_intern( "P4" );
|
681
|
+
ID idP4Spec = rb_intern( "Spec" );
|
682
|
+
VALUE cP4 = rb_const_get_at( rb_cObject, idP4 );
|
683
|
+
VALUE cP4Spec = rb_const_get_at( cP4, idP4Spec );
|
684
|
+
VALUE fields = SpecFields( specDef );
|
602
685
|
|
603
686
|
return rb_funcall( cP4Spec, idNew, 1, fields );
|
604
687
|
}
|
data/lib/P4.rb
CHANGED
@@ -35,9 +35,17 @@
|
|
35
35
|
require_relative 'P4/version'
|
36
36
|
|
37
37
|
#
|
38
|
-
# Get the bulk of the definition of the P4 class from the API interface
|
38
|
+
# Get the bulk of the definition of the P4 class from the API interface.
|
39
39
|
#
|
40
|
-
|
40
|
+
# If this is our precompiled gem, the shared library will lie underneath a
|
41
|
+
# a version specific folder.
|
42
|
+
#
|
43
|
+
begin
|
44
|
+
RUBY_VERSION =~ /(\d+\.\d+)/
|
45
|
+
require "#{$1}/P4.so"
|
46
|
+
rescue LoadError
|
47
|
+
require 'P4.so'
|
48
|
+
end
|
41
49
|
|
42
50
|
#
|
43
51
|
# Add the extra's written purely in ruby.
|
data/lib/P4/version.rb
CHANGED
data/p4-doc/user/p4rubynotes.txt
CHANGED
@@ -316,6 +316,19 @@ New functionality in 2014.2
|
|
316
316
|
on rubygems.org were unofficial builds, and prone to fail in
|
317
317
|
non-interactive environments like bundler.
|
318
318
|
|
319
|
+
# (SIR#75097 / P4RUBY-169)
|
320
|
+
Add `enviro_file` property to P4 object, which underneath, uses the
|
321
|
+
new `SetEnviroFile`/`GetEnviroFile` mechanism from the 14.2 C++ API.
|
322
|
+
|
323
|
+
Bugs fixed in 2014.2.0.pre3
|
324
|
+
|
325
|
+
* (BUG#75096 / P4RUBY-168)
|
326
|
+
Spec mappings updated to 14.2 definitions.
|
327
|
+
|
328
|
+
* (TASK#76795 / P4RUBY-176)
|
329
|
+
Configuring pre-compiled gems for Linux and OS X, for supported
|
330
|
+
Ruby versions (2.0, 2.1, 2.2).
|
331
|
+
|
319
332
|
Bugs fixed in 2014.2.0.pre2
|
320
333
|
|
321
334
|
# (BUG#76321 / P4RUBY-171)
|
metadata
CHANGED
@@ -1,57 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p4ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2014.2.0.
|
4
|
+
version: 2014.2.0.pre3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Perforce Software, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: rake
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 10.3.2
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 10.3.2
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake-compiler
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.9'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.9'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: test-unit
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '3.0'
|
11
|
+
date: 2015-01-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
55
13
|
description: Ruby extensions to the C++ Perforce API.
|
56
14
|
email: support@perforce.com
|
57
15
|
executables: []
|
@@ -98,17 +56,17 @@ require_paths:
|
|
98
56
|
- lib
|
99
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
58
|
requirements:
|
101
|
-
- -
|
59
|
+
- - '>='
|
102
60
|
- !ruby/object:Gem::Version
|
103
61
|
version: '0'
|
104
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
63
|
requirements:
|
106
|
-
- -
|
64
|
+
- - '>'
|
107
65
|
- !ruby/object:Gem::Version
|
108
66
|
version: 1.3.1
|
109
67
|
requirements: []
|
110
68
|
rubyforge_project:
|
111
|
-
rubygems_version: 2.
|
69
|
+
rubygems_version: 2.4.5
|
112
70
|
signing_key:
|
113
71
|
specification_version: 4
|
114
72
|
summary: Ruby extensions to the C++ Perforce API
|