diff --git a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html new file mode 100644 index 0000000000..49cb047dca --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.Designer.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+Classes | +Namespaces
+
+
20181124231534_MSToggleTestmergeComments.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html new file mode 100644 index 0000000000..08d33ee4d0 --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.Designer.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231534_MSToggleTestmergeComments.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Migrations;
7 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
9 namespace Tgstation.Server.Host.Models.Migrations
10 {
11  [DbContext(typeof(SqlServerDatabaseContext))]
12  [Migration("20181124231534_MSToggleTestmergeComments")]
13  partial class MSToggleTestmergeComments
14  {
19  protected override void BuildTargetModel(ModelBuilder modelBuilder)
20  {
21 #pragma warning disable 612, 618
22  modelBuilder
23  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
24  .HasAnnotation("Relational:MaxIdentifierLength", 128)
25  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
26 
27  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
28  {
29  b.Property<long>("Id")
30  .ValueGeneratedOnAdd()
31  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
32 
33  b.Property<string>("ConnectionString")
34  .IsRequired();
35 
36  b.Property<bool?>("Enabled");
37 
38  b.Property<long>("InstanceId");
39 
40  b.Property<string>("Name")
41  .IsRequired();
42 
43  b.Property<int?>("Provider");
44 
45  b.HasKey("Id");
46 
47  b.HasIndex("InstanceId");
48 
49  b.HasIndex("Name")
50  .IsUnique();
51 
52  b.ToTable("ChatBots");
53  });
54 
55  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
56  {
57  b.Property<long>("Id")
58  .ValueGeneratedOnAdd()
59  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
60 
61  b.Property<long>("ChatSettingsId");
62 
63  b.Property<decimal?>("DiscordChannelId")
64  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
65 
66  b.Property<string>("IrcChannel");
67 
68  b.Property<bool?>("IsAdminChannel")
69  .IsRequired();
70 
71  b.Property<bool?>("IsUpdatesChannel")
72  .IsRequired();
73 
74  b.Property<bool?>("IsWatchdogChannel")
75  .IsRequired();
76 
77  b.Property<string>("Tag");
78 
79  b.HasKey("Id");
80 
81  b.HasIndex("ChatSettingsId", "DiscordChannelId")
82  .IsUnique()
83  .HasFilter("[DiscordChannelId] IS NOT NULL");
84 
85  b.HasIndex("ChatSettingsId", "IrcChannel")
86  .IsUnique()
87  .HasFilter("[IrcChannel] IS NOT NULL");
88 
89  b.ToTable("ChatChannels");
90  });
91 
92  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
93  {
94  b.Property<long>("Id")
95  .ValueGeneratedOnAdd()
96  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
97 
98  b.Property<string>("ByondVersion")
99  .IsRequired();
100 
101  b.Property<Guid?>("DirectoryName")
102  .IsRequired();
103 
104  b.Property<string>("DmeName")
105  .IsRequired();
106 
107  b.Property<long>("JobId");
108 
109  b.Property<int>("MinimumSecurityLevel");
110 
111  b.Property<string>("Output")
112  .IsRequired();
113 
114  b.Property<long>("RevisionInformationId");
115 
116  b.HasKey("Id");
117 
118  b.HasIndex("DirectoryName");
119 
120  b.HasIndex("JobId")
121  .IsUnique();
122 
123  b.HasIndex("RevisionInformationId");
124 
125  b.ToTable("CompileJobs");
126  });
127 
128  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
129  {
130  b.Property<long>("Id")
131  .ValueGeneratedOnAdd()
132  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
133 
134  b.Property<string>("AccessToken");
135 
136  b.Property<bool?>("AllowWebClient")
137  .IsRequired();
138 
139  b.Property<bool?>("AutoStart")
140  .IsRequired();
141 
142  b.Property<long>("InstanceId");
143 
144  b.Property<int>("PrimaryPort");
145 
146  b.Property<int?>("ProcessId");
147 
148  b.Property<int>("SecondaryPort");
149 
150  b.Property<int>("SecurityLevel");
151 
152  b.Property<bool?>("SoftRestart")
153  .IsRequired();
154 
155  b.Property<bool?>("SoftShutdown")
156  .IsRequired();
157 
158  b.Property<long>("StartupTimeout");
159 
160  b.HasKey("Id");
161 
162  b.HasIndex("InstanceId")
163  .IsUnique();
164 
165  b.ToTable("DreamDaemonSettings");
166  });
167 
168  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
169  {
170  b.Property<long>("Id")
171  .ValueGeneratedOnAdd()
172  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
173 
174  b.Property<int>("ApiValidationPort");
175 
176  b.Property<int>("ApiValidationSecurityLevel");
177 
178  b.Property<long>("InstanceId");
179 
180  b.Property<string>("ProjectName");
181 
182  b.HasKey("Id");
183 
184  b.HasIndex("InstanceId")
185  .IsUnique();
186 
187  b.ToTable("DreamMakerSettings");
188  });
189 
190  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
191  {
192  b.Property<long>("Id")
193  .ValueGeneratedOnAdd()
194  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
195 
196  b.Property<long>("AutoUpdateInterval");
197 
198  b.Property<int>("ConfigurationType");
199 
200  b.Property<string>("Name")
201  .IsRequired();
202 
203  b.Property<bool?>("Online")
204  .IsRequired();
205 
206  b.Property<string>("Path")
207  .IsRequired();
208 
209  b.HasKey("Id");
210 
211  b.HasIndex("Path")
212  .IsUnique();
213 
214  b.ToTable("Instances");
215  });
216 
217  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
218  {
219  b.Property<long>("Id")
220  .ValueGeneratedOnAdd()
221  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
222 
223  b.Property<decimal>("ByondRights")
224  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
225 
226  b.Property<decimal>("ChatBotRights")
227  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
228 
229  b.Property<decimal>("ConfigurationRights")
230  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
231 
232  b.Property<decimal>("DreamDaemonRights")
233  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
234 
235  b.Property<decimal>("DreamMakerRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<long>("InstanceId");
239 
240  b.Property<decimal>("InstanceUserRights")
241  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
242 
243  b.Property<decimal>("RepositoryRights")
244  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
245 
246  b.Property<long?>("UserId")
247  .IsRequired();
248 
249  b.HasKey("Id");
250 
251  b.HasIndex("InstanceId");
252 
253  b.HasIndex("UserId", "InstanceId")
254  .IsUnique();
255 
256  b.ToTable("InstanceUsers");
257  });
258 
259  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
260  {
261  b.Property<long>("Id")
262  .ValueGeneratedOnAdd()
263  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
264 
265  b.Property<decimal?>("CancelRight")
266  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
267 
268  b.Property<decimal?>("CancelRightsType")
269  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
270 
271  b.Property<bool?>("Cancelled")
272  .IsRequired();
273 
274  b.Property<long?>("CancelledById");
275 
276  b.Property<string>("Description")
277  .IsRequired();
278 
279  b.Property<string>("ExceptionDetails");
280 
281  b.Property<long>("InstanceId");
282 
283  b.Property<DateTimeOffset?>("StartedAt")
284  .IsRequired();
285 
286  b.Property<long>("StartedById");
287 
288  b.Property<DateTimeOffset?>("StoppedAt");
289 
290  b.HasKey("Id");
291 
292  b.HasIndex("CancelledById");
293 
294  b.HasIndex("InstanceId");
295 
296  b.HasIndex("StartedById");
297 
298  b.ToTable("Jobs");
299  });
300 
301  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
302  {
303  b.Property<long>("Id")
304  .ValueGeneratedOnAdd()
305  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
306 
307  b.Property<string>("AccessIdentifier")
308  .IsRequired();
309 
310  b.Property<string>("ChatChannelsJson")
311  .IsRequired();
312 
313  b.Property<string>("ChatCommandsJson")
314  .IsRequired();
315 
316  b.Property<long>("CompileJobId");
317 
318  b.Property<bool>("IsPrimary");
319 
320  b.Property<int>("Port");
321 
322  b.Property<int>("ProcessId");
323 
324  b.Property<int>("RebootState");
325 
326  b.Property<string>("ServerCommandsJson")
327  .IsRequired();
328 
329  b.HasKey("Id");
330 
331  b.HasIndex("CompileJobId");
332 
333  b.ToTable("ReattachInformations");
334  });
335 
336  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
337  {
338  b.Property<long>("Id")
339  .ValueGeneratedOnAdd()
340  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
341 
342  b.Property<string>("AccessToken");
343 
344  b.Property<string>("AccessUser");
345 
346  b.Property<bool?>("AutoUpdatesKeepTestMerges")
347  .IsRequired();
348 
349  b.Property<bool?>("AutoUpdatesSynchronize")
350  .IsRequired();
351 
352  b.Property<string>("CommitterEmail")
353  .IsRequired();
354 
355  b.Property<string>("CommitterName")
356  .IsRequired();
357 
358  b.Property<long>("InstanceId");
359 
360  b.Property<bool?>("PostTestMergeComment")
361  .IsRequired();
362 
363  b.Property<bool?>("PushTestMergeCommits")
364  .IsRequired();
365 
366  b.Property<bool?>("ShowTestMergeCommitters")
367  .IsRequired();
368 
369  b.HasKey("Id");
370 
371  b.HasIndex("InstanceId")
372  .IsUnique();
373 
374  b.ToTable("RepositorySettings");
375  });
376 
377  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
378  {
379  b.Property<long>("Id")
380  .ValueGeneratedOnAdd()
381  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
382 
383  b.Property<long>("RevisionInformationId");
384 
385  b.Property<long>("TestMergeId");
386 
387  b.HasKey("Id");
388 
389  b.HasIndex("RevisionInformationId");
390 
391  b.HasIndex("TestMergeId");
392 
393  b.ToTable("RevInfoTestMerges");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd()
400  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
401 
402  b.Property<string>("CommitSha")
403  .IsRequired()
404  .HasMaxLength(40);
405 
406  b.Property<long>("InstanceId");
407 
408  b.Property<string>("OriginCommitSha")
409  .IsRequired()
410  .HasMaxLength(40);
411 
412  b.HasKey("Id");
413 
414  b.HasIndex("CommitSha")
415  .IsUnique();
416 
417  b.HasIndex("InstanceId");
418 
419  b.ToTable("RevisionInformations");
420  });
421 
422  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
423  {
424  b.Property<long>("Id")
425  .ValueGeneratedOnAdd()
426  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
427 
428  b.Property<string>("Author")
429  .IsRequired();
430 
431  b.Property<string>("BodyAtMerge")
432  .IsRequired();
433 
434  b.Property<string>("Comment");
435 
436  b.Property<DateTimeOffset>("MergedAt");
437 
438  b.Property<long>("MergedById");
439 
440  b.Property<int?>("Number")
441  .IsRequired();
442 
443  b.Property<long?>("PrimaryRevisionInformationId")
444  .IsRequired();
445 
446  b.Property<string>("PullRequestRevision")
447  .IsRequired();
448 
449  b.Property<string>("TitleAtMerge")
450  .IsRequired();
451 
452  b.Property<string>("Url")
453  .IsRequired();
454 
455  b.HasKey("Id");
456 
457  b.HasIndex("MergedById");
458 
459  b.HasIndex("PrimaryRevisionInformationId")
460  .IsUnique();
461 
462  b.ToTable("TestMerges");
463  });
464 
465  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
466  {
467  b.Property<long>("Id")
468  .ValueGeneratedOnAdd()
469  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
470 
471  b.Property<decimal>("AdministrationRights")
472  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
473 
474  b.Property<string>("CanonicalName")
475  .IsRequired();
476 
477  b.Property<DateTimeOffset?>("CreatedAt")
478  .IsRequired();
479 
480  b.Property<long?>("CreatedById");
481 
482  b.Property<bool?>("Enabled")
483  .IsRequired();
484 
485  b.Property<decimal>("InstanceManagerRights")
486  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
487 
488  b.Property<DateTimeOffset?>("LastPasswordUpdate");
489 
490  b.Property<string>("Name")
491  .IsRequired();
492 
493  b.Property<string>("PasswordHash");
494 
495  b.Property<string>("SystemIdentifier");
496 
497  b.HasKey("Id");
498 
499  b.HasIndex("CanonicalName")
500  .IsUnique();
501 
502  b.HasIndex("CreatedById");
503 
504  b.ToTable("Users");
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
508  {
509  b.Property<long>("Id")
510  .ValueGeneratedOnAdd()
511  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
512 
513  b.Property<long?>("AlphaId");
514 
515  b.Property<bool>("AlphaIsActive");
516 
517  b.Property<long?>("BravoId");
518 
519  b.Property<long>("InstanceId");
520 
521  b.HasKey("Id");
522 
523  b.HasIndex("AlphaId");
524 
525  b.HasIndex("BravoId");
526 
527  b.HasIndex("InstanceId")
528  .IsUnique();
529 
530  b.ToTable("WatchdogReattachInformations");
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
536  .WithMany("ChatSettings")
537  .HasForeignKey("InstanceId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
544  .WithMany("Channels")
545  .HasForeignKey("ChatSettingsId")
546  .OnDelete(DeleteBehavior.Cascade);
547  });
548 
549  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
550  {
551  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
552  .WithOne()
553  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
554  .OnDelete(DeleteBehavior.Restrict);
555 
556  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
557  .WithMany("CompileJobs")
558  .HasForeignKey("RevisionInformationId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamDaemonSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithOne("DreamMakerSettings")
574  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576  });
577 
578  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
579  {
580  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
581  .WithMany("InstanceUsers")
582  .HasForeignKey("InstanceId")
583  .OnDelete(DeleteBehavior.Cascade);
584 
585  b.HasOne("Tgstation.Server.Host.Models.User")
586  .WithMany("InstanceUsers")
587  .HasForeignKey("UserId")
588  .OnDelete(DeleteBehavior.Cascade);
589  });
590 
591  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
592  {
593  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
594  .WithMany()
595  .HasForeignKey("CancelledById");
596 
597  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
598  .WithMany("Jobs")
599  .HasForeignKey("InstanceId")
600  .OnDelete(DeleteBehavior.Cascade);
601 
602  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
603  .WithMany()
604  .HasForeignKey("StartedById")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
611  .WithMany()
612  .HasForeignKey("CompileJobId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
619  .WithOne("RepositorySettings")
620  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
621  .OnDelete(DeleteBehavior.Cascade);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
627  .WithMany("ActiveTestMerges")
628  .HasForeignKey("RevisionInformationId")
629  .OnDelete(DeleteBehavior.Cascade);
630 
631  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
632  .WithMany("RevisonInformations")
633  .HasForeignKey("TestMergeId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
640  .WithMany("RevisionInformations")
641  .HasForeignKey("InstanceId")
642  .OnDelete(DeleteBehavior.Cascade);
643  });
644 
645  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
646  {
647  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
648  .WithMany("TestMerges")
649  .HasForeignKey("MergedById")
650  .OnDelete(DeleteBehavior.Restrict);
651 
652  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
653  .WithOne("PrimaryTestMerge")
654  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
655  .OnDelete(DeleteBehavior.Restrict);
656  });
657 
658  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
659  {
660  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
661  .WithMany("CreatedUsers")
662  .HasForeignKey("CreatedById");
663  });
664 
665  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
666  {
667  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
668  .WithMany()
669  .HasForeignKey("AlphaId");
670 
671  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
672  .WithMany()
673  .HasForeignKey("BravoId");
674 
675  b.HasOne("Tgstation.Server.Host.Models.Instance")
676  .WithOne("WatchdogReattachInformation")
677  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
678  .OnDelete(DeleteBehavior.Cascade);
679  });
680 #pragma warning restore 612, 618
681  }
682  }
683 }
+ + + +
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+ +
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs.html b/20181124231534___m_s_toggle_testmerge_comments_8cs.html new file mode 100644 index 0000000000..fbf08cf9b9 --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+Classes | +Namespaces
+
+
20181124231534_MSToggleTestmergeComments.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html new file mode 100644 index 0000000000..4f06cfee63 --- /dev/null +++ b/20181124231534___m_s_toggle_testmerge_comments_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231534_MSToggleTestmergeComments.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231534_MSToggleTestmergeComments.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 
3 namespace Tgstation.Server.Host.Models.Migrations
4 {
8  public partial class MSToggleTestmergeComments : Migration
9  {
14  protected override void Up(MigrationBuilder migrationBuilder)
15  {
16  migrationBuilder.AddColumn<bool>(
17  name: "PostTestMergeComment",
18  table: "RepositorySettings",
19  nullable: false,
20  defaultValue: true);
21  }
22 
27  protected override void Down(MigrationBuilder migrationBuilder)
28  {
29  migrationBuilder.DropColumn(
30  name: "PostTestMergeComment",
31  table: "RepositorySettings");
32  }
33  }
34 }
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ + +
Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL ...
+ +
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html new file mode 100644 index 0000000000..47de611061 --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.Designer.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+Classes | +Namespaces
+
+
20181124231549_MYToggleTestmergeComments.Designer.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html new file mode 100644 index 0000000000..35b5ec75c2 --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.Designer.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231549_MYToggleTestmergeComments.Designer.cs
+
+
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Migrations;
6 
7 namespace Tgstation.Server.Host.Models.Migrations
8 {
9  [DbContext(typeof(MySqlDatabaseContext))]
10  [Migration("20181124231549_MYToggleTestmergeComments")]
11  partial class MYToggleTestmergeComments
12  {
17  protected override void BuildTargetModel(ModelBuilder modelBuilder)
18  {
19 #pragma warning disable 612, 618
20  modelBuilder
21  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
22  .HasAnnotation("Relational:MaxIdentifierLength", 64);
23 
24  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
25  {
26  b.Property<long>("Id")
27  .ValueGeneratedOnAdd();
28 
29  b.Property<string>("ConnectionString")
30  .IsRequired();
31 
32  b.Property<bool?>("Enabled");
33 
34  b.Property<long>("InstanceId");
35 
36  b.Property<string>("Name")
37  .IsRequired();
38 
39  b.Property<int?>("Provider");
40 
41  b.HasKey("Id");
42 
43  b.HasIndex("InstanceId");
44 
45  b.HasIndex("Name")
46  .IsUnique();
47 
48  b.ToTable("ChatBots");
49  });
50 
51  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
52  {
53  b.Property<long>("Id")
54  .ValueGeneratedOnAdd();
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<ulong?>("DiscordChannelId");
59 
60  b.Property<string>("IrcChannel");
61 
62  b.Property<bool?>("IsAdminChannel")
63  .IsRequired();
64 
65  b.Property<bool?>("IsUpdatesChannel")
66  .IsRequired();
67 
68  b.Property<bool?>("IsWatchdogChannel")
69  .IsRequired();
70 
71  b.Property<string>("Tag");
72 
73  b.HasKey("Id");
74 
75  b.HasIndex("ChatSettingsId", "DiscordChannelId")
76  .IsUnique();
77 
78  b.HasIndex("ChatSettingsId", "IrcChannel")
79  .IsUnique();
80 
81  b.ToTable("ChatChannels");
82  });
83 
84  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
85  {
86  b.Property<long>("Id")
87  .ValueGeneratedOnAdd();
88 
89  b.Property<string>("ByondVersion")
90  .IsRequired();
91 
92  b.Property<Guid?>("DirectoryName")
93  .IsRequired();
94 
95  b.Property<string>("DmeName")
96  .IsRequired();
97 
98  b.Property<long>("JobId");
99 
100  b.Property<int>("MinimumSecurityLevel");
101 
102  b.Property<string>("Output")
103  .IsRequired();
104 
105  b.Property<long>("RevisionInformationId");
106 
107  b.HasKey("Id");
108 
109  b.HasIndex("DirectoryName");
110 
111  b.HasIndex("JobId")
112  .IsUnique();
113 
114  b.HasIndex("RevisionInformationId");
115 
116  b.ToTable("CompileJobs");
117  });
118 
119  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
120  {
121  b.Property<long>("Id")
122  .ValueGeneratedOnAdd();
123 
124  b.Property<string>("AccessToken");
125 
126  b.Property<bool?>("AllowWebClient")
127  .IsRequired();
128 
129  b.Property<bool?>("AutoStart")
130  .IsRequired();
131 
132  b.Property<long>("InstanceId");
133 
134  b.Property<ushort?>("PrimaryPort")
135  .IsRequired();
136 
137  b.Property<int?>("ProcessId");
138 
139  b.Property<ushort?>("SecondaryPort")
140  .IsRequired();
141 
142  b.Property<int>("SecurityLevel");
143 
144  b.Property<bool?>("SoftRestart")
145  .IsRequired();
146 
147  b.Property<bool?>("SoftShutdown")
148  .IsRequired();
149 
150  b.Property<uint?>("StartupTimeout")
151  .IsRequired();
152 
153  b.HasKey("Id");
154 
155  b.HasIndex("InstanceId")
156  .IsUnique();
157 
158  b.ToTable("DreamDaemonSettings");
159  });
160 
161  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
162  {
163  b.Property<long>("Id")
164  .ValueGeneratedOnAdd();
165 
166  b.Property<ushort?>("ApiValidationPort")
167  .IsRequired();
168 
169  b.Property<int>("ApiValidationSecurityLevel");
170 
171  b.Property<long>("InstanceId");
172 
173  b.Property<string>("ProjectName");
174 
175  b.HasKey("Id");
176 
177  b.HasIndex("InstanceId")
178  .IsUnique();
179 
180  b.ToTable("DreamMakerSettings");
181  });
182 
183  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
184  {
185  b.Property<long>("Id")
186  .ValueGeneratedOnAdd();
187 
188  b.Property<uint?>("AutoUpdateInterval")
189  .IsRequired();
190 
191  b.Property<int>("ConfigurationType");
192 
193  b.Property<string>("Name")
194  .IsRequired();
195 
196  b.Property<bool?>("Online")
197  .IsRequired();
198 
199  b.Property<string>("Path")
200  .IsRequired();
201 
202  b.HasKey("Id");
203 
204  b.HasIndex("Path")
205  .IsUnique();
206 
207  b.ToTable("Instances");
208  });
209 
210  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
211  {
212  b.Property<long>("Id")
213  .ValueGeneratedOnAdd();
214 
215  b.Property<ulong>("ByondRights");
216 
217  b.Property<ulong>("ChatBotRights");
218 
219  b.Property<ulong>("ConfigurationRights");
220 
221  b.Property<ulong>("DreamDaemonRights");
222 
223  b.Property<ulong>("DreamMakerRights");
224 
225  b.Property<long>("InstanceId");
226 
227  b.Property<ulong>("InstanceUserRights");
228 
229  b.Property<ulong>("RepositoryRights");
230 
231  b.Property<long?>("UserId")
232  .IsRequired();
233 
234  b.HasKey("Id");
235 
236  b.HasIndex("InstanceId");
237 
238  b.HasIndex("UserId", "InstanceId")
239  .IsUnique();
240 
241  b.ToTable("InstanceUsers");
242  });
243 
244  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
245  {
246  b.Property<long>("Id")
247  .ValueGeneratedOnAdd();
248 
249  b.Property<ulong?>("CancelRight");
250 
251  b.Property<ulong?>("CancelRightsType");
252 
253  b.Property<bool?>("Cancelled")
254  .IsRequired();
255 
256  b.Property<long?>("CancelledById");
257 
258  b.Property<string>("Description")
259  .IsRequired();
260 
261  b.Property<string>("ExceptionDetails");
262 
263  b.Property<long>("InstanceId");
264 
265  b.Property<DateTimeOffset?>("StartedAt")
266  .IsRequired();
267 
268  b.Property<long>("StartedById");
269 
270  b.Property<DateTimeOffset?>("StoppedAt");
271 
272  b.HasKey("Id");
273 
274  b.HasIndex("CancelledById");
275 
276  b.HasIndex("InstanceId");
277 
278  b.HasIndex("StartedById");
279 
280  b.ToTable("Jobs");
281  });
282 
283  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
284  {
285  b.Property<long>("Id")
286  .ValueGeneratedOnAdd();
287 
288  b.Property<string>("AccessIdentifier")
289  .IsRequired();
290 
291  b.Property<string>("ChatChannelsJson")
292  .IsRequired();
293 
294  b.Property<string>("ChatCommandsJson")
295  .IsRequired();
296 
297  b.Property<long>("CompileJobId");
298 
299  b.Property<bool>("IsPrimary");
300 
301  b.Property<ushort>("Port");
302 
303  b.Property<int>("ProcessId");
304 
305  b.Property<int>("RebootState");
306 
307  b.Property<string>("ServerCommandsJson")
308  .IsRequired();
309 
310  b.HasKey("Id");
311 
312  b.HasIndex("CompileJobId");
313 
314  b.ToTable("ReattachInformations");
315  });
316 
317  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
318  {
319  b.Property<long>("Id")
320  .ValueGeneratedOnAdd();
321 
322  b.Property<string>("AccessToken");
323 
324  b.Property<string>("AccessUser");
325 
326  b.Property<bool?>("AutoUpdatesKeepTestMerges")
327  .IsRequired();
328 
329  b.Property<bool?>("AutoUpdatesSynchronize")
330  .IsRequired();
331 
332  b.Property<string>("CommitterEmail")
333  .IsRequired();
334 
335  b.Property<string>("CommitterName")
336  .IsRequired();
337 
338  b.Property<long>("InstanceId");
339 
340  b.Property<bool?>("PostTestMergeComment")
341  .IsRequired();
342 
343  b.Property<bool?>("PushTestMergeCommits")
344  .IsRequired();
345 
346  b.Property<bool?>("ShowTestMergeCommitters")
347  .IsRequired();
348 
349  b.HasKey("Id");
350 
351  b.HasIndex("InstanceId")
352  .IsUnique();
353 
354  b.ToTable("RepositorySettings");
355  });
356 
357  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
358  {
359  b.Property<long>("Id")
360  .ValueGeneratedOnAdd();
361 
362  b.Property<long>("RevisionInformationId");
363 
364  b.Property<long>("TestMergeId");
365 
366  b.HasKey("Id");
367 
368  b.HasIndex("RevisionInformationId");
369 
370  b.HasIndex("TestMergeId");
371 
372  b.ToTable("RevInfoTestMerges");
373  });
374 
375  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
376  {
377  b.Property<long>("Id")
378  .ValueGeneratedOnAdd();
379 
380  b.Property<string>("CommitSha")
381  .IsRequired()
382  .HasMaxLength(40);
383 
384  b.Property<long>("InstanceId");
385 
386  b.Property<string>("OriginCommitSha")
387  .IsRequired()
388  .HasMaxLength(40);
389 
390  b.HasKey("Id");
391 
392  b.HasIndex("CommitSha")
393  .IsUnique();
394 
395  b.HasIndex("InstanceId");
396 
397  b.ToTable("RevisionInformations");
398  });
399 
400  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
401  {
402  b.Property<long>("Id")
403  .ValueGeneratedOnAdd();
404 
405  b.Property<string>("Author")
406  .IsRequired();
407 
408  b.Property<string>("BodyAtMerge")
409  .IsRequired();
410 
411  b.Property<string>("Comment");
412 
413  b.Property<DateTimeOffset>("MergedAt");
414 
415  b.Property<long>("MergedById");
416 
417  b.Property<int?>("Number")
418  .IsRequired();
419 
420  b.Property<long?>("PrimaryRevisionInformationId")
421  .IsRequired();
422 
423  b.Property<string>("PullRequestRevision")
424  .IsRequired();
425 
426  b.Property<string>("TitleAtMerge")
427  .IsRequired();
428 
429  b.Property<string>("Url")
430  .IsRequired();
431 
432  b.HasKey("Id");
433 
434  b.HasIndex("MergedById");
435 
436  b.HasIndex("PrimaryRevisionInformationId")
437  .IsUnique();
438 
439  b.ToTable("TestMerges");
440  });
441 
442  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
443  {
444  b.Property<long>("Id")
445  .ValueGeneratedOnAdd();
446 
447  b.Property<ulong>("AdministrationRights");
448 
449  b.Property<string>("CanonicalName")
450  .IsRequired();
451 
452  b.Property<DateTimeOffset?>("CreatedAt")
453  .IsRequired();
454 
455  b.Property<long?>("CreatedById");
456 
457  b.Property<bool?>("Enabled")
458  .IsRequired();
459 
460  b.Property<ulong>("InstanceManagerRights");
461 
462  b.Property<DateTimeOffset?>("LastPasswordUpdate");
463 
464  b.Property<string>("Name")
465  .IsRequired();
466 
467  b.Property<string>("PasswordHash");
468 
469  b.Property<string>("SystemIdentifier");
470 
471  b.HasKey("Id");
472 
473  b.HasIndex("CanonicalName")
474  .IsUnique();
475 
476  b.HasIndex("CreatedById");
477 
478  b.ToTable("Users");
479  });
480 
481  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
482  {
483  b.Property<long>("Id")
484  .ValueGeneratedOnAdd();
485 
486  b.Property<long?>("AlphaId");
487 
488  b.Property<bool>("AlphaIsActive");
489 
490  b.Property<long?>("BravoId");
491 
492  b.Property<long>("InstanceId");
493 
494  b.HasKey("Id");
495 
496  b.HasIndex("AlphaId");
497 
498  b.HasIndex("BravoId");
499 
500  b.HasIndex("InstanceId")
501  .IsUnique();
502 
503  b.ToTable("WatchdogReattachInformations");
504  });
505 
506  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
507  {
508  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
509  .WithMany("ChatSettings")
510  .HasForeignKey("InstanceId")
511  .OnDelete(DeleteBehavior.Cascade);
512  });
513 
514  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
515  {
516  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
517  .WithMany("Channels")
518  .HasForeignKey("ChatSettingsId")
519  .OnDelete(DeleteBehavior.Cascade);
520  });
521 
522  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
523  {
524  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
525  .WithOne()
526  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
527  .OnDelete(DeleteBehavior.Restrict);
528 
529  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
530  .WithMany("CompileJobs")
531  .HasForeignKey("RevisionInformationId")
532  .OnDelete(DeleteBehavior.Cascade);
533  });
534 
535  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
536  {
537  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
538  .WithOne("DreamDaemonSettings")
539  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
540  .OnDelete(DeleteBehavior.Cascade);
541  });
542 
543  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
544  {
545  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
546  .WithOne("DreamMakerSettings")
547  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
548  .OnDelete(DeleteBehavior.Cascade);
549  });
550 
551  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
552  {
553  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
554  .WithMany("InstanceUsers")
555  .HasForeignKey("InstanceId")
556  .OnDelete(DeleteBehavior.Cascade);
557 
558  b.HasOne("Tgstation.Server.Host.Models.User")
559  .WithMany("InstanceUsers")
560  .HasForeignKey("UserId")
561  .OnDelete(DeleteBehavior.Cascade);
562  });
563 
564  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
565  {
566  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
567  .WithMany()
568  .HasForeignKey("CancelledById");
569 
570  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
571  .WithMany("Jobs")
572  .HasForeignKey("InstanceId")
573  .OnDelete(DeleteBehavior.Cascade);
574 
575  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
576  .WithMany()
577  .HasForeignKey("StartedById")
578  .OnDelete(DeleteBehavior.Cascade);
579  });
580 
581  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
582  {
583  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
584  .WithMany()
585  .HasForeignKey("CompileJobId")
586  .OnDelete(DeleteBehavior.Cascade);
587  });
588 
589  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
590  {
591  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
592  .WithOne("RepositorySettings")
593  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
594  .OnDelete(DeleteBehavior.Cascade);
595  });
596 
597  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
598  {
599  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
600  .WithMany("ActiveTestMerges")
601  .HasForeignKey("RevisionInformationId")
602  .OnDelete(DeleteBehavior.Cascade);
603 
604  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
605  .WithMany("RevisonInformations")
606  .HasForeignKey("TestMergeId")
607  .OnDelete(DeleteBehavior.Cascade);
608  });
609 
610  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
611  {
612  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
613  .WithMany("RevisionInformations")
614  .HasForeignKey("InstanceId")
615  .OnDelete(DeleteBehavior.Cascade);
616  });
617 
618  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
619  {
620  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
621  .WithMany("TestMerges")
622  .HasForeignKey("MergedById")
623  .OnDelete(DeleteBehavior.Restrict);
624 
625  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
626  .WithOne("PrimaryTestMerge")
627  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
628  .OnDelete(DeleteBehavior.Restrict);
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
634  .WithMany("CreatedUsers")
635  .HasForeignKey("CreatedById");
636  });
637 
638  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
639  {
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
641  .WithMany()
642  .HasForeignKey("AlphaId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
645  .WithMany()
646  .HasForeignKey("BravoId");
647 
648  b.HasOne("Tgstation.Server.Host.Models.Instance")
649  .WithOne("WatchdogReattachInformation")
650  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
651  .OnDelete(DeleteBehavior.Cascade);
652  });
653 #pragma warning restore 612, 618
654  }
655  }
656 }
override void BuildTargetModel(ModelBuilder modelBuilder)
Builds the target model
+ + + + + +
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs.html b/20181124231549___m_y_toggle_testmerge_comments_8cs.html new file mode 100644 index 0000000000..7a09449d02 --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs.html @@ -0,0 +1,120 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs File Reference + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+Classes | +Namespaces
+
+
20181124231549_MYToggleTestmergeComments.cs File Reference
+
+
+ +

Go to the source code of this file.

+ + + + + +

+Classes

class  Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
 Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
 
+ + + +

+Namespaces

namespace  Tgstation.Server.Host.Models.Migrations
 
+
+ + + + diff --git a/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html new file mode 100644 index 0000000000..05440f6f5c --- /dev/null +++ b/20181124231549___m_y_toggle_testmerge_comments_8cs_source.html @@ -0,0 +1,109 @@ + + + + + + +tgstation-server: src/Tgstation.Server.Host/Models/Migrations/20181124231549_MYToggleTestmergeComments.cs Source File + + + + + + + + + + +
+
+ + + + + + + +
+
tgstation-server +
+
The /tg/station 13 server suite
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
20181124231549_MYToggleTestmergeComments.cs
+
+
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore.Migrations;
2 
3 namespace Tgstation.Server.Host.Models.Migrations
4 {
8  public partial class MYToggleTestmergeComments : Migration
9  {
14  protected override void Up(MigrationBuilder migrationBuilder)
15  {
16  migrationBuilder.AddColumn<bool>(
17  name: "PostTestMergeComment",
18  table: "RepositorySettings",
19  nullable: false,
20  defaultValue: true);
21  }
22 
27  protected override void Down(MigrationBuilder migrationBuilder)
28  {
29  migrationBuilder.DropColumn(
30  name: "PostTestMergeComment",
31  table: "RepositorySettings");
32  }
33  }
34 }
+ +
Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB ...
+
override void Up(MigrationBuilder migrationBuilder)
Applies the migration
+
override void Down(MigrationBuilder migrationBuilder)
Unapplies the migration
+ +
+ + + + diff --git a/_api_controller_8cs_source.html b/_api_controller_8cs_source.html index a4d8213a8b..542a82071b 100644 --- a/_api_controller_8cs_source.html +++ b/_api_controller_8cs_source.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Api.Models.ErrorMessage.Message
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
Controller
Tgstation.Server.Host.Controllers.ApiController
A Controller for API functions
Definition: ApiController.cs:22
-
Tgstation.Server.Host.Models.DatabaseContext
Definition: DatabaseContext.cs:18
+
Tgstation.Server.Host.Models.DatabaseContext
Definition: DatabaseContext.cs:19
Tgstation.Server.Host.Security
Definition: AuthenticationContext.cs:6
Tgstation.Server.Api.Models.User
Definition: User.cs:4
Tgstation.Server.Host.Controllers.ApiController.requireHeaders
readonly bool requireHeaders
If ApiHeaders are required
Definition: ApiController.cs:57
diff --git a/_application_8cs_source.html b/_application_8cs_source.html index 792e9edaa6..37919e1d6b 100644 --- a/_application_8cs_source.html +++ b/_application_8cs_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Configuration.FileLoggingConfiguration
File logging configuration options
Definition: FileLoggingConfiguration.cs:10
Tgstation.Server.Host.Core.IPlatformIdentifier.IsWindows
bool IsWindows
If the current platform is a Windows platform
Definition: IPlatformIdentifier.cs:11
Tgstation.Server.Host.Core.Application.startupTcs
readonly TaskCompletionSource< object > startupTcs
The TaskCompletionSource<TResult> used for determining when the Application is Ready(Exception) ...
Definition: Application.cs:62
-
Tgstation.Server.Host.Models.DatabaseContext
Definition: DatabaseContext.cs:18
+
Tgstation.Server.Host.Models.DatabaseContext
Definition: DatabaseContext.cs:19
Tgstation.Server.Host.Core.PlatformIdentifier
Definition: PlatformIdentifier.cs:6
Tgstation.Server.Host.Security.AuthenticationContextFactory
Definition: AuthenticationContextFactory.cs:11
Tgstation.Server.Host.Components.Chat.IProviderFactory
Factory for IProviders
Definition: IProviderFactory.cs:9
diff --git a/_chat_controller_8cs_source.html b/_chat_controller_8cs_source.html index 2d48262897..9cef6d405b 100644 --- a/_chat_controller_8cs_source.html +++ b/_chat_controller_8cs_source.html @@ -95,13 +95,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); Go to the documentation of this file.
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Linq.Expressions;
5 using System.Net;
6 using System.Reflection;
7 using System.Threading;
8 using System.Threading.Tasks;
9 using Microsoft.AspNetCore.Mvc;
10 using Microsoft.EntityFrameworkCore;
11 using Microsoft.Extensions.Logging;
12 using Tgstation.Server.Api;
13 using Tgstation.Server.Api.Models;
14 using Tgstation.Server.Api.Rights;
15 using Tgstation.Server.Host.Components;
16 using Tgstation.Server.Host.Models;
17 using Tgstation.Server.Host.Security;
18 using Z.EntityFramework.Plus;
19 
20 namespace Tgstation.Server.Host.Controllers
21 {
25  [Route(Routes.Chat)]
26  public sealed class ChatController : ModelController<Api.Models.ChatBot>
27  {
31  readonly IInstanceManager instanceManager;
32 
40  public ChatController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, ILogger<ChatController> logger) : base(databaseContext, authenticationContextFactory, logger, true)
41  {
42  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
43  }
44 
50  static Models.ChatChannel ConvertApiChatChannel(Api.Models.ChatChannel api) => new Models.ChatChannel
51  {
52  DiscordChannelId = api.DiscordChannelId,
53  IrcChannel = api.IrcChannel,
54  IsAdminChannel = api.IsAdminChannel ?? false,
55  IsWatchdogChannel = api.IsWatchdogChannel ?? false,
56  IsUpdatesChannel = api.IsUpdatesChannel ?? false,
57  Tag = api.Tag
58  };
59 
61  [TgsAuthorize(ChatBotRights.Create)]
62  public override async Task<IActionResult> Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
63  {
64  if (model == null)
65  throw new ArgumentNullException(nameof(model));
66 
67  if (String.IsNullOrWhiteSpace(model.Name))
68  return BadRequest(new ErrorMessage { Message = "name cannot be null or whitespace!" });
69 
70  if (String.IsNullOrWhiteSpace(model.ConnectionString))
71  return BadRequest(new ErrorMessage { Message = "connection_string cannot be null or whitespace!" });
72 
73  if (!model.Provider.HasValue)
74  return BadRequest(new ErrorMessage { Message = "provider cannot be null!" });
75 
76  switch (model.Provider)
77  {
78  case ChatProvider.Discord:
79  case ChatProvider.Irc:
80  break;
81  default:
82  return BadRequest(new ErrorMessage { Message = "Invalid provider!" });
83  }
84 
85  if (!model.ValidateProviderChannelTypes())
86  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
87 
88  model.Enabled = model.Enabled ?? false;
89 
90  // try to update das db first
91  var dbModel = new Models.ChatBot
92  {
93  Name = model.Name,
94  ConnectionString = model.ConnectionString,
95  Enabled = model.Enabled,
96  Channels = model.Channels?.Select(x => ConvertApiChatChannel(x)).ToList() ?? new List<Models.ChatChannel>(), // important that this isn't null
97  InstanceId = Instance.Id,
98  Provider = model.Provider,
99  };
100 
101  DatabaseContext.ChatBots.Add(dbModel);
102 
103  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
104 
105  try
106  {
107  try
108  {
109  // try to create it
110  var instance = instanceManager.GetInstance(Instance);
111  await instance.Chat.ChangeSettings(dbModel, cancellationToken).ConfigureAwait(false);
112 
113  if (dbModel.Channels.Count > 0)
114  await instance.Chat.ChangeChannels(dbModel.Id, dbModel.Channels, cancellationToken).ConfigureAwait(false);
115  }
116  catch
117  {
118  // undo the add
119  DatabaseContext.ChatBots.Remove(dbModel);
120  await DatabaseContext.Save(default).ConfigureAwait(false);
121  throw;
122  }
123  }
124  catch (InvalidOperationException e)
125  {
126  return BadRequest(new ErrorMessage { Message = e.Message });
127  }
128 
129  return StatusCode((int)HttpStatusCode.Created, dbModel.ToApi());
130  }
131 
133  [TgsAuthorize(ChatBotRights.Delete)]
134  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
135  {
136  var instance = instanceManager.GetInstance(Instance);
137  await Task.WhenAll(instance.Chat.DeleteConnection(id, cancellationToken), DatabaseContext.ChatBots.Where(x => x.Id == id).DeleteAsync(cancellationToken)).ConfigureAwait(false);
138 
139  return Ok();
140  }
141 
143  [TgsAuthorize(ChatBotRights.Read)]
144  public override async Task<IActionResult> List(CancellationToken cancellationToken)
145  {
146  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id).Include(x => x.Channels);
147 
148  var results = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
149 
150  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
151 
152  if (!connectionStrings)
153  foreach (var I in results)
154  I.ConnectionString = null;
155 
156  return Json(results.Select(x => x.ToApi()));
157  }
158 
160  [TgsAuthorize(ChatBotRights.Read)]
161  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
162  {
163  var query = DatabaseContext.ChatBots.Where(x => x.Id == id).Include(x => x.Channels);
164 
165  var results = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
166  if (results == default)
167  return StatusCode((int)HttpStatusCode.Gone);
168 
169  var connectionStrings = (AuthenticationContext.GetRight(RightsType.ChatBots) & (ulong)ChatBotRights.ReadConnectionString) != 0;
170 
171  if (!connectionStrings)
172  results.ConnectionString = null;
173 
174  return Json(results.ToApi());
175  }
176 
178  #pragma warning disable CA1506 // TODO: Decomplexify
179  [TgsAuthorize(ChatBotRights.WriteChannels | ChatBotRights.WriteConnectionString | ChatBotRights.WriteEnabled | ChatBotRights.WriteName | ChatBotRights.WriteProvider)]
180  public override async Task<IActionResult> Update([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
181  {
182  if (model == null)
183  throw new ArgumentNullException(nameof(model));
184 
185  if (model.Provider.HasValue && !model.ValidateProviderChannelTypes())
186  return BadRequest(new ErrorMessage { Message = "One or more of channels aren't formatted correctly for the given provider!" });
187 
188  var query = DatabaseContext.ChatBots.Where(x => x.InstanceId == Instance.Id && x.Id == model.Id).Include(x => x.Channels);
189 
190  var current = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
191 
192  if (current == default)
193  return StatusCode((int)HttpStatusCode.Gone);
194 
195  var userRights = (ChatBotRights)AuthenticationContext.GetRight(RightsType.ChatBots);
196 
197  bool anySettingsModified = false;
198 
199  bool CheckModified<T>(Expression<Func<Api.Models.Internal.ChatBot, T>> expression, ChatBotRights requiredRight)
200  {
201  var memberSelectorExpression = (MemberExpression)expression.Body;
202  var property = (PropertyInfo)memberSelectorExpression.Member;
203 
204  var newVal = property.GetValue(model);
205  if (newVal == null)
206  return false;
207  if (!userRights.HasFlag(requiredRight) && property.GetValue(current) != newVal)
208  return true;
209 
210  property.SetValue(current, newVal);
211  anySettingsModified = true;
212  return false;
213  }
214 
215  var oldProvider = current.Provider;
216 
217  if (CheckModified(x => x.ConnectionString, ChatBotRights.WriteConnectionString)
218  || CheckModified(x => x.Enabled, ChatBotRights.WriteEnabled)
219  || CheckModified(x => x.Name, ChatBotRights.WriteName)
220  || CheckModified(x => x.Provider, ChatBotRights.WriteProvider)
221  || (model.Channels != null && !userRights.HasFlag(ChatBotRights.WriteChannels)))
222  return Forbid();
223 
224  var hasChannels = model.Channels != null;
225  if (hasChannels || (model.Provider.HasValue && model.Provider != oldProvider))
226  {
227  DatabaseContext.ChatChannels.RemoveRange(current.Channels);
228  if (hasChannels)
229  {
230  var dbChannels = model.Channels.Select(x => ConvertApiChatChannel(x)).ToList();
231  DatabaseContext.ChatChannels.AddRange(dbChannels);
232  current.Channels = dbChannels;
233  }
234  else
235  current.Channels.Clear();
236  }
237 
238  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
239 
240  var chat = instanceManager.GetInstance(Instance).Chat;
241 
242  if (anySettingsModified)
243  await chat.ChangeSettings(current, cancellationToken).ConfigureAwait(false); // have to rebuild the thing first
244 
245  if (model.Channels != null || anySettingsModified)
246  await chat.ChangeChannels(current.Id, current.Channels, cancellationToken).ConfigureAwait(false);
247 
248  if (userRights.HasFlag(ChatBotRights.Read))
249  {
250  if (!userRights.HasFlag(ChatBotRights.ReadConnectionString))
251  current.ConnectionString = null;
252  return Json(current.ToApi());
253  }
254 
255  return Ok();
256  }
257  #pragma warning restore CA1506
258  }
259 }
Represents the database
For creating and accessing authentication contexts
Manages Api.Models.Users for a scope
-
DbSet< ChatChannel > ChatChannels
+
DbSet< ChatChannel > ChatChannels
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
Definition: ApiHeaders.cs:11
Use server authentication
Definition: ChatBot.cs:5
User may list files
-
DbSet< ChatBot > ChatBots
+
DbSet< ChatBot > ChatBots
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
@@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
const string Chat
The Models.ChatBot controller
Definition: Routes.cs:69
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
-
+
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
override async Task< IActionResult > Create([FromBody] Api.Models.ChatBot model, CancellationToken cancellationToken)
An ApiController representing a TModel
diff --git a/_database_context_8cs_source.html b/_database_context_8cs_source.html index c8e9f851e9..90bc14ec5a 100644 --- a/_database_context_8cs_source.html +++ b/_database_context_8cs_source.html @@ -92,30 +92,33 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DatabaseContext.cs
-Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.EntityFrameworkCore.Infrastructure;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Logging;
6 using Microsoft.Extensions.Options;
7 using System;
8 using System.Globalization;
9 using System.Linq;
10 using System.Threading;
11 using System.Threading.Tasks;
13 
14 namespace Tgstation.Server.Host.Models
15 {
17  #pragma warning disable CA1506 // TODO: Decomplexify
18  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
19  {
21  public DbSet<User> Users { get; set; }
22 
24  public DbSet<Instance> Instances { get; set; }
25 
27  public DbSet<CompileJob> CompileJobs { get; set; }
28 
30  public DbSet<RevisionInformation> RevisionInformations { get; set; }
31 
33  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
34 
36  public DbSet<ChatBot> ChatBots { get; set; }
37 
39  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
40 
42  public DbSet<RepositorySettings> RepositorySettings { get; set; }
43 
45  public DbSet<InstanceUser> InstanceUsers { get; set; }
46 
48  public DbSet<ChatChannel> ChatChannels { get; set; }
49 
51  public DbSet<Job> Jobs { get; set; }
52 
54  public DbSet<ReattachInformation> ReattachInformations { get; set; }
55 
57  public DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
58 
62  public DbSet<TestMerge> TestMerges { get; set; }
63 
67  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
68 
72  protected ILogger Logger { get; }
73 
78 
83 
91  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
92  {
93  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
94  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
95  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
96  }
97 
99  protected override void OnModelCreating(ModelBuilder modelBuilder)
100  {
101  Logger.LogTrace("Building entity framework context...");
102  base.OnModelCreating(modelBuilder);
103 
104  var userModel = modelBuilder.Entity<User>();
105  userModel.HasIndex(x => x.CanonicalName).IsUnique();
106  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
107 
108  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
109 
110  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
111 
112  var revInfo = modelBuilder.Entity<RevisionInformation>();
113  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
114  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
115  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
116  revInfo.HasIndex(x => x.CommitSha).IsUnique();
117 
118  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
119 
120  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
121 
122  var chatChannel = modelBuilder.Entity<ChatChannel>();
123  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
124  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
125  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
126 
127  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
128 
129  var instanceModel = modelBuilder.Entity<Instance>();
130  instanceModel.HasIndex(x => x.Path).IsUnique();
131  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
132  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
134  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
135  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
136  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
137  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
138  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
139  }
140 
142  public async Task Initialize(CancellationToken cancellationToken)
143  {
145  {
146  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
147  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
148  }
149 
150  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
151  var wasEmpty = !migrations.Any();
152 
153  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
154  {
155  Logger.LogInformation("Migrating database...");
156  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
157  }
158  else
159  Logger.LogDebug("No migrations to apply.");
160 
161  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
162 
163  if (wasEmpty)
164  {
165  Logger.LogInformation("Seeding database...");
166  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
167  }
169  {
170  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
171  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
172  }
173  }
174 
176  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
177 
182  protected abstract bool UseMySQLMigrations();
183 
185  public async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
186  {
187  if (version == null)
188  throw new ArgumentNullException(nameof(version));
189  if (version < new Version(4, 0))
190  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
191 
192  string targetMigration = null;
193 
194  // Update this with new migrations as they are made
195  // Always use the MS class
196 
197  // TODO: Uncomment once #816 is merged
198  /*
199  if (version < new Version(4, 0, 2))
200  targetMigration = nameof(MSReattachCompileJobRequired);
201  */
202 
203  if (targetMigration == null)
204  return;
205 
206  if (UseMySQLMigrations())
207  targetMigration = String.Format(CultureInfo.InvariantCulture, "MY" + targetMigration.Substring(2));
208 
209  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
210  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
211  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
212 
213  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
214  try
215  {
216  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
217  }
218  catch (Exception e)
219  {
220  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
221  }
222  }
223  }
224 }
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.EntityFrameworkCore.Infrastructure;
3 using Microsoft.EntityFrameworkCore.Migrations;
4 using Microsoft.Extensions.DependencyInjection;
5 using Microsoft.Extensions.Logging;
6 using Microsoft.Extensions.Options;
7 using System;
8 using System.Globalization;
9 using System.Linq;
10 using System.Threading;
11 using System.Threading.Tasks;
14 
15 namespace Tgstation.Server.Host.Models
16 {
18  #pragma warning disable CA1506 // TODO: Decomplexify
19  abstract class DatabaseContext<TParentContext> : DbContext, IDatabaseContext where TParentContext : DbContext
20  {
22  public DbSet<User> Users { get; set; }
23 
25  public DbSet<Instance> Instances { get; set; }
26 
28  public DbSet<CompileJob> CompileJobs { get; set; }
29 
31  public DbSet<RevisionInformation> RevisionInformations { get; set; }
32 
34  public DbSet<DreamMakerSettings> DreamMakerSettings { get; set; }
35 
37  public DbSet<ChatBot> ChatBots { get; set; }
38 
40  public DbSet<DreamDaemonSettings> DreamDaemonSettings { get; set; }
41 
43  public DbSet<RepositorySettings> RepositorySettings { get; set; }
44 
46  public DbSet<InstanceUser> InstanceUsers { get; set; }
47 
49  public DbSet<ChatChannel> ChatChannels { get; set; }
50 
52  public DbSet<Job> Jobs { get; set; }
53 
55  public DbSet<ReattachInformation> ReattachInformations { get; set; }
56 
58  public DbSet<WatchdogReattachInformation> WatchdogReattachInformations { get; set; }
59 
63  public DbSet<TestMerge> TestMerges { get; set; }
64 
68  public DbSet<RevInfoTestMerge> RevInfoTestMerges { get; set; }
69 
73  protected ILogger Logger { get; }
74 
79 
84 
92  public DatabaseContext(DbContextOptions<TParentContext> dbContextOptions, IOptions<DatabaseConfiguration> databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger) : base(dbContextOptions)
93  {
94  DatabaseConfiguration = databaseConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(databaseConfigurationOptions));
95  this.databaseSeeder = databaseSeeder ?? throw new ArgumentNullException(nameof(databaseSeeder));
96  Logger = logger ?? throw new ArgumentNullException(nameof(logger));
97  }
98 
100  protected override void OnModelCreating(ModelBuilder modelBuilder)
101  {
102  Logger.LogTrace("Building entity framework context...");
103  base.OnModelCreating(modelBuilder);
104 
105  var userModel = modelBuilder.Entity<User>();
106  userModel.HasIndex(x => x.CanonicalName).IsUnique();
107  userModel.HasMany(x => x.TestMerges).WithOne(x => x.MergedBy).OnDelete(DeleteBehavior.Restrict);
108 
109  modelBuilder.Entity<InstanceUser>().HasIndex(x => new { x.UserId, x.InstanceId }).IsUnique();
110 
111  modelBuilder.Entity<TestMerge>().HasMany(x => x.RevisonInformations).WithOne(x => x.TestMerge).OnDelete(DeleteBehavior.Cascade);
112 
113  var revInfo = modelBuilder.Entity<RevisionInformation>();
114  revInfo.HasMany(x => x.CompileJobs).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
115  revInfo.HasMany(x => x.ActiveTestMerges).WithOne(x => x.RevisionInformation).OnDelete(DeleteBehavior.Cascade);
116  revInfo.HasOne(x => x.PrimaryTestMerge).WithOne(x => x.PrimaryRevisionInformation).OnDelete(DeleteBehavior.Restrict);
117  revInfo.HasIndex(x => x.CommitSha).IsUnique();
118 
119  modelBuilder.Entity<CompileJob>().HasIndex(x => x.DirectoryName);
120 
121  modelBuilder.Entity<Job>().HasOne<CompileJob>().WithOne(x => x.Job).OnDelete(DeleteBehavior.Restrict);
122 
123  var chatChannel = modelBuilder.Entity<ChatChannel>();
124  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.IrcChannel }).IsUnique();
125  chatChannel.HasIndex(x => new { x.ChatSettingsId, x.DiscordChannelId }).IsUnique();
126  chatChannel.HasOne(x => x.ChatSettings).WithMany(x => x.Channels).HasForeignKey(x => x.ChatSettingsId).OnDelete(DeleteBehavior.Cascade);
127 
128  modelBuilder.Entity<ChatBot>().HasIndex(x => x.Name).IsUnique();
129 
130  var instanceModel = modelBuilder.Entity<Instance>();
131  instanceModel.HasIndex(x => x.Path).IsUnique();
132  instanceModel.HasMany(x => x.ChatSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
133  instanceModel.HasOne(x => x.DreamDaemonSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
134  instanceModel.HasOne(x => x.DreamMakerSettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
135  instanceModel.HasOne(x => x.RepositorySettings).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
136  instanceModel.HasMany(x => x.RevisionInformations).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
137  instanceModel.HasMany(x => x.InstanceUsers).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
138  instanceModel.HasMany(x => x.Jobs).WithOne(x => x.Instance).OnDelete(DeleteBehavior.Cascade);
139  instanceModel.HasOne(x => x.WatchdogReattachInformation).WithOne().OnDelete(DeleteBehavior.Cascade);
140  }
141 
143  public async Task Initialize(CancellationToken cancellationToken)
144  {
146  {
147  Logger.LogCritical("DropDatabase configuration option set! Dropping any existing database...");
148  await Database.EnsureDeletedAsync(cancellationToken).ConfigureAwait(false);
149  }
150 
151  var migrations = await Database.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false);
152  var wasEmpty = !migrations.Any();
153 
154  if (wasEmpty || (await Database.GetPendingMigrationsAsync(cancellationToken).ConfigureAwait(false)).Any())
155  {
156  Logger.LogInformation("Migrating database...");
157  await Database.MigrateAsync(cancellationToken).ConfigureAwait(false);
158  }
159  else
160  Logger.LogDebug("No migrations to apply.");
161 
162  wasEmpty |= (await Users.CountAsync(cancellationToken).ConfigureAwait(false)) == 0;
163 
164  if (wasEmpty)
165  {
166  Logger.LogInformation("Seeding database...");
167  await databaseSeeder.SeedDatabase(this, cancellationToken).ConfigureAwait(false);
168  }
170  {
171  Logger.LogWarning("Enabling and resetting admin password due to configuration!");
172  await databaseSeeder.ResetAdminPassword(this, cancellationToken).ConfigureAwait(false);
173  }
174  }
175 
177  public Task Save(CancellationToken cancellationToken) => SaveChangesAsync(cancellationToken);
178 
183  protected abstract bool UseMySQLMigrations();
184 
186  public async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
187  {
188  if (version == null)
189  throw new ArgumentNullException(nameof(version));
190  if (version < new Version(4, 0))
191  throw new ArgumentOutOfRangeException(nameof(version), version, "Not a valid V4 version!");
192 
193  string targetMigration = null;
194 
195  // Update this with new migrations as they are made
196  // Always use the MS class
197  if (version < new Version(4, 0, 2))
198  targetMigration = nameof(MSReattachCompileJobRequired);
199 
200  if (targetMigration == null)
201  return;
202 
203  if (UseMySQLMigrations())
204  targetMigration = String.Format(CultureInfo.InvariantCulture, "MY" + targetMigration.Substring(2));
205 
206  // even though it clearly implements it in the DatabaseFacade definition this won't work without casting (╯ಠ益ಠ)╯︵ ┻━┻
207  var dbServiceProvider = ((IInfrastructure<IServiceProvider>)Database).Instance;
208  var migrator = dbServiceProvider.GetRequiredService<IMigrator>();
209 
210  Logger.LogInformation("Migrating down to version {0}. Target: {1}", version, targetMigration);
211  try
212  {
213  await migrator.MigrateAsync(targetMigration, cancellationToken).ConfigureAwait(false);
214  }
215  catch (Exception e)
216  {
217  Logger.LogCritical("Failed to migrate! Exception: {0}", e);
218  }
219  }
220  }
221 }
+ +
For initially seeding a database
-
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
+
async Task Initialize(CancellationToken cancellationToken)
Creates and migrates the IDatabaseContext
bool ResetAdminPassword
If the admin user should be enabled and have it&#39;s password reset
-
override void OnModelCreating(ModelBuilder modelBuilder)
-
async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version ...
+
override void OnModelCreating(ModelBuilder modelBuilder)
+
async Task SchemaDowngradeForServerVersion(Version version, CancellationToken cancellationToken)
Attempt to downgrade the schema to the migration used for a given server version ...
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
- -
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
+ +
Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL
+
DatabaseContext(DbContextOptions< TParentContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfigurationOptions, IDatabaseSeeder databaseSeeder, ILogger logger)
Construct a DatabaseContext<TParentContext>
Configuration options for the Models.DatabaseContext<TParentContext>
bool DropDatabase
If the database should be deleted on application startup. Should not be used in production! ...
-
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
+
readonly IDatabaseSeeder databaseSeeder
The IDatabaseSeeder for the DatabaseContext<TParentContext>
diff --git a/_dream_daemon_controller_8cs_source.html b/_dream_daemon_controller_8cs_source.html index a261f526ba..71f0a496cb 100644 --- a/_dream_daemon_controller_8cs_source.html +++ b/_dream_daemon_controller_8cs_source.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
DreamDaemonSecurity SecurityLevel
The DreamDaemonSecurity level of DreamDaemon
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
bool AutoStart
If DreamDaemon starts when it&#39;s Instance starts
@@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DreamDaemonRights
Rights for Models.DreamDaemon
override async Task< IActionResult > Update([FromBody] DreamDaemon model, CancellationToken cancellationToken)
- +
DreamDaemonController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamDaemonController > logger)
Construct a DreamDaemonController
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
ModelController<TModel> for managing the DreamDaemon
diff --git a/_dream_maker_controller_8cs_source.html b/_dream_maker_controller_8cs_source.html index 87c7ac101b..791c4ab97e 100644 --- a/_dream_maker_controller_8cs_source.html +++ b/_dream_maker_controller_8cs_source.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Represents the state of the DreamMaker compiler. Create action starts a new compile. Delete action cancels the current compile
Definition: DreamMaker.cs:8
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
-
DbSet< DreamMakerSettings > DreamMakerSettings
+
DbSet< DreamMakerSettings > DreamMakerSettings
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
@@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Routes to a server actions
Definition: Routes.cs:9
const string DreamMaker
The Models.DreamMaker controller
Definition: Routes.cs:74
DreamMakerRights
Rights for Models.DreamMaker
- +
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
DreamMakerController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, ILogger< DreamMakerController > logger)
Construct a DreamMakerController
readonly IJobManager jobManager
The IJobManager for the DreamMakerController
@@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Represents an error message returned by the server
Definition: ErrorMessage.cs:8
- +
diff --git a/_home_controller_8cs_source.html b/_home_controller_8cs_source.html index 4e9ee4e1f6..7cf1347e7e 100644 --- a/_home_controller_8cs_source.html +++ b/_home_controller_8cs_source.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Definition: ApiHeaders.cs:11
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
Use server authentication
-
DbSet< User > Users
+
DbSet< User > Users
Represents a user on the current System.Runtime.InteropServices.OSPlatform
Definition: ChatBot.cs:5
@@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Configuration options for the web control panel
A Controller for API functions
bool IsTokenAuthentication
If the header uses password or JWT authentication
Definition: ApiHeaders.cs:91
-
+
const string Root
The root controller
Definition: Routes.cs:14
string Username
The user&#39;s name
diff --git a/_instance_controller_8cs_source.html b/_instance_controller_8cs_source.html index 11630bb480..e8b2b63d32 100644 --- a/_instance_controller_8cs_source.html +++ b/_instance_controller_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
InstanceController.cs
-Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.IO;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
19 using Tgstation.Server.Host.IO;
22 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.InstanceManager)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class InstanceController : ModelController<Api.Models.Instance>
31  {
35  const string InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH";
36 
37  const string MoveInstanceJobPrefix = "Move instance ID ";
38 
43 
48 
53 
58 
63 
75  public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
76  {
77  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
78  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.application = application ?? throw new ArgumentNullException(nameof(application));
81  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
82  }
83 
84  void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
85  {
86  if (model.Path == null)
87  {
88  absolutePath = null;
89  return;
90  }
91 
92  absolutePath = ioManager.ResolvePath(model.Path);
93  if (platformIdentifier.IsWindows)
94  model.Path = absolutePath.ToUpperInvariant();
95  else
96  model.Path = absolutePath;
97  }
98 
99  Models.InstanceUser InstanceAdminUser() => new Models.InstanceUser
100  {
101  ByondRights = (ByondRights)~0U,
108  UserId = AuthenticationContext.User.Id
109  };
110 
112  [TgsAuthorize(InstanceManagerRights.Create)]
113  public override async Task<IActionResult> Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
114  {
115  if (model == null)
116  throw new ArgumentNullException(nameof(model));
117 
118  if (String.IsNullOrWhiteSpace(model.Name))
119  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
120 
121  if (model.Path == null)
122  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
123 
124  NormalizeModelPath(model, out var rawPath);
125 
126  var localPath = ioManager.ResolvePath(".");
127  NormalizeModelPath(new Api.Models.Instance
128  {
129  Path = localPath
130  }, out var normalizedLocalPath);
131 
132  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
133  return Conflict("Instances cannot be created in the installation directory!");
134 
135  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
136  bool attached = false;
137  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
138  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
139  return Conflict(new ErrorMessage { Message = "Path not empty!" });
140  else
141  attached = true;
142 
143  var newInstance = new Models.Instance
144  {
145  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
147  {
148  AllowWebClient = false,
149  AutoStart = false,
150  PrimaryPort = 1337,
151  SecondaryPort = 1338,
152  SecurityLevel = DreamDaemonSecurity.Safe,
153  SoftRestart = false,
154  SoftShutdown = false,
155  StartupTimeout = 20
156  },
158  {
159  ApiValidationPort = 1339,
160  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
161  },
162  Name = model.Name,
163  Online = false,
164  Path = model.Path,
165  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
167  {
168  CommitterEmail = "tgstation-server@users.noreply.github.com",
169  CommitterName = application.VersionPrefix,
170  PushTestMergeCommits = false,
171  ShowTestMergeCommitters = false,
172  AutoUpdatesKeepTestMerges = false,
173  AutoUpdatesSynchronize = false
174  },
175  InstanceUsers = new List<Models.InstanceUser> // give this user full privileges on the instance
176  {
177  InstanceAdminUser()
178  }
179  };
180 
181  DatabaseContext.Instances.Add(newInstance);
182  try
183  {
184  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
185 
186  try
187  {
188  // actually reserve it now
189  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
190  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
191  }
192  catch
193  {
194  // oh shit delete the model
195  DatabaseContext.Instances.Remove(newInstance);
196 
197  await DatabaseContext.Save(default).ConfigureAwait(false);
198  throw;
199  }
200  }
201  catch (IOException e)
202  {
203  return Conflict(new ErrorMessage { Message = e.Message });
204  }
205  catch (DbUpdateException e)
206  {
207  return Conflict(new ErrorMessage { Message = e.Message });
208  }
209 
210  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
211 
212  var api = newInstance.ToApi();
213  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
214  }
215 
217  [TgsAuthorize(InstanceManagerRights.Delete)]
218  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
219  {
220  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
221  .Include(x => x.WatchdogReattachInformation)
222  .Include(x => x.WatchdogReattachInformation.Alpha)
223  .Include(x => x.WatchdogReattachInformation.Bravo)
224  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225  if (originalModel == default)
226  return StatusCode((int)HttpStatusCode.Gone);
227  if (originalModel.Online.Value)
228  return Conflict(new ErrorMessage
229  {
230  Message = "Cannot detach an online instance!"
231  });
232 
233  if (originalModel.WatchdogReattachInformation != null)
234  {
235  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
236  if (originalModel.WatchdogReattachInformation.Alpha != null)
237  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
238  if (originalModel.WatchdogReattachInformation.Bravo != null)
239  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
240  }
241 
242  DatabaseContext.Instances.Remove(originalModel);
243 
244  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
245  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
246  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); // cascades everything
247  return Ok();
248  }
249 
251  [TgsAuthorize(InstanceManagerRights.Relocate | InstanceManagerRights.Rename | InstanceManagerRights.SetAutoUpdate | InstanceManagerRights.SetConfiguration | InstanceManagerRights.SetOnline)]
252  #pragma warning disable CA1502 // TODO: Decomplexify
253  public override async Task<IActionResult> Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
254  {
255  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
256 
257  var moveJob = await instanceQuery
258  .SelectMany(x => x.Jobs).
259 #pragma warning disable CA1307 // Specify StringComparison
260  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
261 #pragma warning restore CA1307 // Specify StringComparison
262  .Select(x => new Models.Job
263  {
264  Id = x.Id
265  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
266 
267  if (moveJob != default)
268  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false); // cancel it now
269 
270  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
271 
272  var originalModel = await instanceQuery
273  .Include(x => x.RepositorySettings)
274  .Include(x => x.ChatSettings)
275  .ThenInclude(x => x.Channels)
276  .Include(x => x.DreamDaemonSettings) // need these for onlining
277  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
278  if (originalModel == default(Models.Instance))
279  return StatusCode((int)HttpStatusCode.Gone);
280 
281  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
282  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
283  {
284  var memberSelectorExpression = (MemberExpression)expression.Body;
285  var property = (PropertyInfo)memberSelectorExpression.Member;
286 
287  var newVal = property.GetValue(model);
288  if (newVal == null)
289  return false;
290  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
291  return true;
292 
293  property.SetValue(originalModel, newVal);
294  return false;
295  }
296 
297  string originalModelPath = null;
298  string rawPath = null;
299  if (model.Path != null)
300  {
301  NormalizeModelPath(model, out rawPath);
302 
303  if (model.Path != originalModel.Path)
304  {
305  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
306  return Forbid();
307  if (originalModel.Online.Value && model.Online != true)
308  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
309 
310  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
311  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
312  return Conflict(new ErrorMessage { Message = "Path not empty!" });
313 
314  originalModelPath = originalModel.Path;
315  originalModel.Path = model.Path;
316  }
317  }
318 
319  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
320  var originalOnline = originalModel.Online.Value;
321  var renamed = model.Name != null && originalModel.Name != model.Name;
322 
323  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
324  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
325  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
326  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
327  return Forbid();
328 
329  // ensure the current user has write privilege on the instance
330  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
331  if (usersInstanceUser == default)
332  {
333  var instanceAdminUser = InstanceAdminUser();
334  instanceAdminUser.InstanceId = originalModel.Id;
335  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
336  }
337  else
338  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
339 
340  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
341 
342  if (renamed)
343  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
344 
345  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
346  try
347  {
348  if (originalOnline && model.Online == false)
349  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
350  else if (!originalOnline && model.Online == true)
351  {
352  // force autostart false here because we don't want any long running jobs right now
353  // remember to document this
354  originalModel.DreamDaemonSettings.AutoStart = false;
355  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
356  }
357  }
358  catch (Exception e)
359  {
360  if(!(e is OperationCanceledException))
361  Logger.LogError("Error changing instance online state! Exception: {0}", e);
362  originalModel.Online = originalOnline;
363  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
364  if (originalModelPath != null)
365  originalModel.Path = originalModelPath;
366  await DatabaseContext.Save(default).ConfigureAwait(false);
367  throw;
368  }
369 
370  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
371  {
372  Id = originalModel.Id
373  };
374  if (originalModelPath != null)
375  {
376  var job = new Models.Job
377  {
378  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
379  Instance = originalModel,
380  CancelRightsType = RightsType.InstanceManager,
381  CancelRight = (ulong)InstanceManagerRights.Relocate,
382  StartedBy = AuthenticationContext.User
383  };
384 
385  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
386  api.MoveJob = job.ToApi();
387  }
388 
389  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
390  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
391 
392  return Json(api);
393  }
394  #pragma warning restore CA1502
395 
397  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
398  public override async Task<IActionResult> List(CancellationToken cancellationToken)
399  {
400  IQueryable<Models.Instance> query = DatabaseContext.Instances;
402  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
403 
404  var moveJobTasks = query
405  .SelectMany(x => x.Jobs)
406 #pragma warning disable CA1307 // Specify StringComparison
407  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
408 #pragma warning restore CA1307 // Specify StringComparison
409  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
410  .Include(x => x.Instance)
411  .ToListAsync(cancellationToken);
412  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
413  var apis = instances.Select(x => x.ToApi());
414  var moveJobs = await moveJobTasks.ConfigureAwait(false);
415  foreach(var I in moveJobs)
416  apis.Where(x => x.Id == I.Instance.Id).First().MoveJob = I.ToApi(); // if this .First() fails i will personally murder kevinz000 because I just know he is somehow responsible
417  return Json(apis);
418  }
419 
421  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
422  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
423  {
424  var query = DatabaseContext.Instances.Where(x => x.Id == id);
425  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
426 
427  if (cantList)
428  query = query.Include(x => x.InstanceUsers);
429 
430  var moveJobTask = query
431  .SelectMany(x => x.Jobs)
432 #pragma warning disable CA1307 // Specify StringComparison
433  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
434 #pragma warning restore CA1307 // Specify StringComparison
435  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
436  .FirstOrDefaultAsync(cancellationToken);
437  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
438 
439  if (instance == null)
440  return StatusCode((int)HttpStatusCode.Gone);
441 
442  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
443  return Forbid();
444 
445  var api = instance.ToApi();
446  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
447  return Json(api);
448  }
449  }
450 }
string Name
The name of the User
Definition: User.cs:38
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.IO;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
19 using Tgstation.Server.Host.IO;
22 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.InstanceManager)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class InstanceController : ModelController<Api.Models.Instance>
31  {
35  const string InstanceAttachFileName = "TGS4_ALLOW_INSTANCE_ATTACH";
36 
37  const string MoveInstanceJobPrefix = "Move instance ID ";
38 
43 
48 
53 
58 
63 
75  public InstanceController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IJobManager jobManager, IInstanceManager instanceManager, IIOManager ioManager, IApplication application, IPlatformIdentifier platformIdentifier, ILogger<InstanceController> logger) : base(databaseContext, authenticationContextFactory, logger, false)
76  {
77  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
78  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
79  this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager));
80  this.application = application ?? throw new ArgumentNullException(nameof(application));
81  this.platformIdentifier = platformIdentifier ?? throw new ArgumentNullException(nameof(platformIdentifier));
82  }
83 
84  void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
85  {
86  if (model.Path == null)
87  {
88  absolutePath = null;
89  return;
90  }
91 
92  absolutePath = ioManager.ResolvePath(model.Path);
93  if (platformIdentifier.IsWindows)
94  model.Path = absolutePath.ToUpperInvariant();
95  else
96  model.Path = absolutePath;
97  }
98 
99  Models.InstanceUser InstanceAdminUser() => new Models.InstanceUser
100  {
101  ByondRights = (ByondRights)~0U,
108  UserId = AuthenticationContext.User.Id
109  };
110 
112  [TgsAuthorize(InstanceManagerRights.Create)]
113  public override async Task<IActionResult> Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
114  {
115  if (model == null)
116  throw new ArgumentNullException(nameof(model));
117 
118  if (String.IsNullOrWhiteSpace(model.Name))
119  return BadRequest(new ErrorMessage { Message = "name must not be empty!" });
120 
121  if (model.Path == null)
122  return BadRequest(new ErrorMessage { Message = "path must not be empty!" });
123 
124  NormalizeModelPath(model, out var rawPath);
125 
126  var localPath = ioManager.ResolvePath(".");
127  NormalizeModelPath(new Api.Models.Instance
128  {
129  Path = localPath
130  }, out var normalizedLocalPath);
131 
132  if (rawPath.StartsWith(normalizedLocalPath, StringComparison.Ordinal))
133  return Conflict("Instances cannot be created in the installation directory!");
134 
135  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
136  bool attached = false;
137  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
138  if (!await ioManager.FileExists(ioManager.ConcatPath(model.Path, InstanceAttachFileName), cancellationToken).ConfigureAwait(false))
139  return Conflict(new ErrorMessage { Message = "Path not empty!" });
140  else
141  attached = true;
142 
143  var newInstance = new Models.Instance
144  {
145  ConfigurationType = model.ConfigurationType ?? ConfigurationType.Disallowed,
147  {
148  AllowWebClient = false,
149  AutoStart = false,
150  PrimaryPort = 1337,
151  SecondaryPort = 1338,
152  SecurityLevel = DreamDaemonSecurity.Safe,
153  SoftRestart = false,
154  SoftShutdown = false,
155  StartupTimeout = 20
156  },
158  {
159  ApiValidationPort = 1339,
160  ApiValidationSecurityLevel = DreamDaemonSecurity.Safe
161  },
162  Name = model.Name,
163  Online = false,
164  Path = model.Path,
165  AutoUpdateInterval = model.AutoUpdateInterval ?? 0,
167  {
168  CommitterEmail = "tgstation-server@users.noreply.github.com",
169  CommitterName = application.VersionPrefix,
170  PushTestMergeCommits = false,
171  ShowTestMergeCommitters = false,
172  AutoUpdatesKeepTestMerges = false,
173  AutoUpdatesSynchronize = false,
174  PostTestMergeComment = false
175  },
176  InstanceUsers = new List<Models.InstanceUser> // give this user full privileges on the instance
177  {
178  InstanceAdminUser()
179  }
180  };
181 
182  DatabaseContext.Instances.Add(newInstance);
183  try
184  {
185  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
186 
187  try
188  {
189  // actually reserve it now
190  await ioManager.CreateDirectory(rawPath, cancellationToken).ConfigureAwait(false);
191  await ioManager.DeleteFile(ioManager.ConcatPath(rawPath, InstanceAttachFileName), cancellationToken).ConfigureAwait(false);
192  }
193  catch
194  {
195  // oh shit delete the model
196  DatabaseContext.Instances.Remove(newInstance);
197 
198  await DatabaseContext.Save(default).ConfigureAwait(false);
199  throw;
200  }
201  }
202  catch (IOException e)
203  {
204  return Conflict(new ErrorMessage { Message = e.Message });
205  }
206  catch (DbUpdateException e)
207  {
208  return Conflict(new ErrorMessage { Message = e.Message });
209  }
210 
211  Logger.LogInformation("{0} {1} instance {2}: {3} ({4})", AuthenticationContext.User.Name, attached ? "attached" : "created", newInstance.Name, newInstance.Id, newInstance.Path);
212 
213  var api = newInstance.ToApi();
214  return attached ? (IActionResult)Json(api) : StatusCode((int)HttpStatusCode.Created, api);
215  }
216 
218  [TgsAuthorize(InstanceManagerRights.Delete)]
219  public override async Task<IActionResult> Delete(long id, CancellationToken cancellationToken)
220  {
221  var originalModel = await DatabaseContext.Instances.Where(x => x.Id == id)
222  .Include(x => x.WatchdogReattachInformation)
223  .Include(x => x.WatchdogReattachInformation.Alpha)
224  .Include(x => x.WatchdogReattachInformation.Bravo)
225  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
226  if (originalModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228  if (originalModel.Online.Value)
229  return Conflict(new ErrorMessage
230  {
231  Message = "Cannot detach an online instance!"
232  });
233 
234  if (originalModel.WatchdogReattachInformation != null)
235  {
236  DatabaseContext.WatchdogReattachInformations.Remove(originalModel.WatchdogReattachInformation);
237  if (originalModel.WatchdogReattachInformation.Alpha != null)
238  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Alpha);
239  if (originalModel.WatchdogReattachInformation.Bravo != null)
240  DatabaseContext.ReattachInformations.Remove(originalModel.WatchdogReattachInformation.Bravo);
241  }
242 
243  DatabaseContext.Instances.Remove(originalModel);
244 
245  var attachFileName = ioManager.ConcatPath(originalModel.Path, InstanceAttachFileName);
246  await ioManager.WriteAllBytes(attachFileName, Array.Empty<byte>(), default).ConfigureAwait(false);
247  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false); // cascades everything
248  return Ok();
249  }
250 
252  [TgsAuthorize(InstanceManagerRights.Relocate | InstanceManagerRights.Rename | InstanceManagerRights.SetAutoUpdate | InstanceManagerRights.SetConfiguration | InstanceManagerRights.SetOnline)]
253  #pragma warning disable CA1502 // TODO: Decomplexify
254  public override async Task<IActionResult> Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
255  {
256  var instanceQuery = DatabaseContext.Instances.Where(x => x.Id == model.Id);
257 
258  var moveJob = await instanceQuery
259  .SelectMany(x => x.Jobs).
260 #pragma warning disable CA1307 // Specify StringComparison
261  Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
262 #pragma warning restore CA1307 // Specify StringComparison
263  .Select(x => new Models.Job
264  {
265  Id = x.Id
266  }).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
267 
268  if (moveJob != default)
269  await jobManager.CancelJob(moveJob, AuthenticationContext.User, true, cancellationToken).ConfigureAwait(false); // cancel it now
270 
271  var usersInstanceUserTask = instanceQuery.SelectMany(x => x.InstanceUsers).Where(x => x.UserId == AuthenticationContext.User.Id).FirstOrDefaultAsync(cancellationToken);
272 
273  var originalModel = await instanceQuery
274  .Include(x => x.RepositorySettings)
275  .Include(x => x.ChatSettings)
276  .ThenInclude(x => x.Channels)
277  .Include(x => x.DreamDaemonSettings) // need these for onlining
278  .FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
279  if (originalModel == default(Models.Instance))
280  return StatusCode((int)HttpStatusCode.Gone);
281 
282  var userRights = (InstanceManagerRights)AuthenticationContext.GetRight(RightsType.InstanceManager);
283  bool CheckModified<T>(Expression<Func<Api.Models.Instance, T>> expression, InstanceManagerRights requiredRight)
284  {
285  var memberSelectorExpression = (MemberExpression)expression.Body;
286  var property = (PropertyInfo)memberSelectorExpression.Member;
287 
288  var newVal = property.GetValue(model);
289  if (newVal == null)
290  return false;
291  if (!userRights.HasFlag(requiredRight) && property.GetValue(originalModel) != newVal)
292  return true;
293 
294  property.SetValue(originalModel, newVal);
295  return false;
296  }
297 
298  string originalModelPath = null;
299  string rawPath = null;
300  if (model.Path != null)
301  {
302  NormalizeModelPath(model, out rawPath);
303 
304  if (model.Path != originalModel.Path)
305  {
306  if (!userRights.HasFlag(InstanceManagerRights.Relocate))
307  return Forbid();
308  if (originalModel.Online.Value && model.Online != true)
309  return Conflict(new ErrorMessage { Message = "Cannot relocate an online instance!" });
310 
311  var dirExistsTask = ioManager.DirectoryExists(model.Path, cancellationToken);
312  if (await ioManager.FileExists(model.Path, cancellationToken).ConfigureAwait(false) || await dirExistsTask.ConfigureAwait(false))
313  return Conflict(new ErrorMessage { Message = "Path not empty!" });
314 
315  originalModelPath = originalModel.Path;
316  originalModel.Path = model.Path;
317  }
318  }
319 
320  var oldAutoUpdateInterval = originalModel.AutoUpdateInterval.Value;
321  var originalOnline = originalModel.Online.Value;
322  var renamed = model.Name != null && originalModel.Name != model.Name;
323 
324  if (CheckModified(x => x.AutoUpdateInterval, InstanceManagerRights.SetAutoUpdate)
325  || CheckModified(x => x.ConfigurationType, InstanceManagerRights.SetConfiguration)
326  || CheckModified(x => x.Name, InstanceManagerRights.Rename)
327  || CheckModified(x => x.Online, InstanceManagerRights.SetOnline))
328  return Forbid();
329 
330  // ensure the current user has write privilege on the instance
331  var usersInstanceUser = await usersInstanceUserTask.ConfigureAwait(false);
332  if (usersInstanceUser == default)
333  {
334  var instanceAdminUser = InstanceAdminUser();
335  instanceAdminUser.InstanceId = originalModel.Id;
336  DatabaseContext.InstanceUsers.Add(instanceAdminUser);
337  }
338  else
339  usersInstanceUser.InstanceUserRights |= InstanceUserRights.WriteUsers;
340 
341  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
342 
343  if (renamed)
344  instanceManager.GetInstance(originalModel).Rename(originalModel.Name);
345 
346  var oldAutoStart = originalModel.DreamDaemonSettings.AutoStart;
347  try
348  {
349  if (originalOnline && model.Online == false)
350  await instanceManager.OfflineInstance(originalModel, AuthenticationContext.User, cancellationToken).ConfigureAwait(false);
351  else if (!originalOnline && model.Online == true)
352  {
353  // force autostart false here because we don't want any long running jobs right now
354  // remember to document this
355  originalModel.DreamDaemonSettings.AutoStart = false;
356  await instanceManager.OnlineInstance(originalModel, cancellationToken).ConfigureAwait(false);
357  }
358  }
359  catch (Exception e)
360  {
361  if(!(e is OperationCanceledException))
362  Logger.LogError("Error changing instance online state! Exception: {0}", e);
363  originalModel.Online = originalOnline;
364  originalModel.DreamDaemonSettings.AutoStart = oldAutoStart;
365  if (originalModelPath != null)
366  originalModel.Path = originalModelPath;
367  await DatabaseContext.Save(default).ConfigureAwait(false);
368  throw;
369  }
370 
371  var api = (AuthenticationContext.GetRight(RightsType.InstanceManager) & (ulong)InstanceManagerRights.Read) != 0 ? originalModel.ToApi() : new Api.Models.Instance
372  {
373  Id = originalModel.Id
374  };
375  if (originalModelPath != null)
376  {
377  var job = new Models.Job
378  {
379  Description = String.Format(CultureInfo.InvariantCulture, MoveInstanceJobPrefix + "{0} from {1} to {2}", originalModel.Id, originalModel.Path, rawPath),
380  Instance = originalModel,
381  CancelRightsType = RightsType.InstanceManager,
382  CancelRight = (ulong)InstanceManagerRights.Relocate,
383  StartedBy = AuthenticationContext.User
384  };
385 
386  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressHandler, ct) => instanceManager.MoveInstance(originalModel, rawPath, ct), cancellationToken).ConfigureAwait(false);
387  api.MoveJob = job.ToApi();
388  }
389 
390  if (originalModel.Online.Value && model.AutoUpdateInterval.HasValue && oldAutoUpdateInterval != model.AutoUpdateInterval)
391  await instanceManager.GetInstance(originalModel).SetAutoUpdateInterval(model.AutoUpdateInterval.Value).ConfigureAwait(false);
392 
393  return Json(api);
394  }
395  #pragma warning restore CA1502
396 
398  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
399  public override async Task<IActionResult> List(CancellationToken cancellationToken)
400  {
401  IQueryable<Models.Instance> query = DatabaseContext.Instances;
403  query = query.Where(x => x.InstanceUsers.Any(y => y.UserId == AuthenticationContext.User.Id)).Where(x => x.InstanceUsers.Any(y => y.AnyRights));
404 
405  var moveJobTasks = query
406  .SelectMany(x => x.Jobs)
407 #pragma warning disable CA1307 // Specify StringComparison
408  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
409 #pragma warning restore CA1307 // Specify StringComparison
410  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
411  .Include(x => x.Instance)
412  .ToListAsync(cancellationToken);
413  var instances = await query.ToListAsync(cancellationToken).ConfigureAwait(false);
414  var apis = instances.Select(x => x.ToApi());
415  var moveJobs = await moveJobTasks.ConfigureAwait(false);
416  foreach(var I in moveJobs)
417  apis.Where(x => x.Id == I.Instance.Id).First().MoveJob = I.ToApi(); // if this .First() fails i will personally murder kevinz000 because I just know he is somehow responsible
418  return Json(apis);
419  }
420 
422  [TgsAuthorize(InstanceManagerRights.List | InstanceManagerRights.Read)]
423  public override async Task<IActionResult> GetId(long id, CancellationToken cancellationToken)
424  {
425  var query = DatabaseContext.Instances.Where(x => x.Id == id);
426  var cantList = !AuthenticationContext.User.InstanceManagerRights.Value.HasFlag(InstanceManagerRights.List);
427 
428  if (cantList)
429  query = query.Include(x => x.InstanceUsers);
430 
431  var moveJobTask = query
432  .SelectMany(x => x.Jobs)
433 #pragma warning disable CA1307 // Specify StringComparison
434  .Where(x => !x.StoppedAt.HasValue && x.Description.StartsWith(MoveInstanceJobPrefix))
435 #pragma warning restore CA1307 // Specify StringComparison
436  .Include(x => x.StartedBy).ThenInclude(x => x.CreatedBy)
437  .FirstOrDefaultAsync(cancellationToken);
438  var instance = await query.FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
439 
440  if (instance == null)
441  return StatusCode((int)HttpStatusCode.Gone);
442 
443  if (cantList && !instance.InstanceUsers.Any(x => x.UserId == AuthenticationContext.User.Id && x.AnyRights))
444  return Forbid();
445 
446  var api = instance.ToApi();
447  api.MoveJob = (await moveJobTask.ConfigureAwait(false))?.ToApi();
448  return Json(api);
449  }
450  }
451 }
string Name
The name of the User
Definition: User.cs:38
Manages the runtime of Jobs
Definition: IJobManager.cs:12
@@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ByondRights
Rights for Models.Byond
Definition: ByondRights.cs:9
RightsType
The type of rights a model uses
Definition: RightsType.cs:6
-
DbSet< ReattachInformation > ReattachInformations
+
DbSet< ReattachInformation > ReattachInformations
InstanceUserRights
Rights for an Models.Instance
Configures the ASP.NET Core web application
Definition: IApplication.cs:8
@@ -116,7 +116,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
ConfigurationType
The type of configuration allowed on an Instance
ulong GetRight(RightsType rightsType)
Get the value of a given rightsType
@@ -130,13 +130,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
InstanceManagerRights
Rights for managing Models.Instances
string Message
A human readable description of the error
Definition: ErrorMessage.cs:13
DreamMakerRights
Rights for Models.DreamMaker
- - + +
override async Task< IActionResult > Create([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
RepositoryRights
Rights for a Models.Repository
An ApiController representing a TModel
-
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
+
override async Task< IActionResult > List(CancellationToken cancellationToken)
Attempt to list entries of the TModel
const string InstanceManager
The Models.Instance controller
Definition: Routes.cs:29
readonly IPlatformIdentifier platformIdentifier
The IPlatformIdentifier for the InstanceController
@@ -144,13 +144,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
long Id
The ID of the User
Definition: User.cs:15
Metadata about a server instance
Definition: Instance.cs:9
-
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
+
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
-
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
+
DbSet< WatchdogReattachInformation > WatchdogReattachInformations
DreamDaemonSecurity
DreamDaemon&#39;s security level
Interface for using filesystems
Definition: IIOManager.cs:11
-
override async Task< IActionResult > Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
-
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
+
override async Task< IActionResult > Update([FromBody] Api.Models.Instance model, CancellationToken cancellationToken)
+
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
For identifying the current platform
ChatBotRights
Rights for Models.ChatBot
Definition: ChatBotRights.cs:9
void NormalizeModelPath(Api.Models.Instance model, out string absolutePath)
diff --git a/_instance_user_controller_8cs_source.html b/_instance_user_controller_8cs_source.html index 2c7ad7f1e5..bf4d2a89cc 100644 --- a/_instance_user_controller_8cs_source.html +++ b/_instance_user_controller_8cs_source.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
const string InstanceUser
The Models.InstanceUser controller
Definition: Routes.cs:64
- +
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
Task Save(CancellationToken cancellationToken)
Saves changes made to the IDatabaseContext
override async Task< IActionResult > Create([FromBody] Api.Models.InstanceUser model, CancellationToken cancellationToken)
@@ -118,8 +118,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
BadRequestObjectResult StandardModelChecks(Api.Models.InstanceUser model)
Checks a model for errors
DreamMakerRights
Rights for Models.DreamMaker
- - + +
RepositoryRights
Rights for a Models.Repository
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
override async Task< IActionResult > GetId(long id, CancellationToken cancellationToken)
Attempt to get a specific a TModel
diff --git a/_job_controller_8cs_source.html b/_job_controller_8cs_source.html index 6694da5e29..0823d3e8ee 100644 --- a/_job_controller_8cs_source.html +++ b/_job_controller_8cs_source.html @@ -108,9 +108,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
override async Task< IActionResult > Delete(long id, CancellationToken cancellationToken)
Attempt to delete a model with a particular id
Routes to a server actions
Definition: Routes.cs:9
- +
Represents an Api.Models.Instance in the database
Definition: Instance.cs:8
- +
const string Jobs
The Models.Job controller
Definition: Routes.cs:79
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
An ApiController representing a TModel
diff --git a/_my_sql_database_context_8cs_source.html b/_my_sql_database_context_8cs_source.html index f13f83c8a2..5828221b45 100644 --- a/_my_sql_database_context_8cs_source.html +++ b/_my_sql_database_context_8cs_source.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
For initially seeding a database
DatabaseType DatabaseType
The Configuration.DatabaseType to create
- +
string MySqlServerVersion
The string form of the System.Version of a target MySQL/MariaDB server
Configuration options for the Models.DatabaseContext<TParentContext>
diff --git a/_my_sql_database_context_model_snapshot_8cs_source.html b/_my_sql_database_context_model_snapshot_8cs_source.html index 26b1d5d541..ba87e41073 100644 --- a/_my_sql_database_context_model_snapshot_8cs_source.html +++ b/_my_sql_database_context_model_snapshot_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
MySqlDatabaseContextModelSnapshot.cs
-Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
7 
8 namespace Tgstation.Server.Host.Models.Migrations
9 {
12  {
13  protected override void BuildModel(ModelBuilder modelBuilder)
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
18  .HasAnnotation("Relational:MaxIdentifierLength", 64);
19 
20  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
21  {
22  b.Property<long>("Id")
23  .ValueGeneratedOnAdd();
24 
25  b.Property<string>("ConnectionString")
26  .IsRequired();
27 
28  b.Property<bool?>("Enabled");
29 
30  b.Property<long>("InstanceId");
31 
32  b.Property<string>("Name")
33  .IsRequired();
34 
35  b.Property<int?>("Provider");
36 
37  b.HasKey("Id");
38 
39  b.HasIndex("InstanceId");
40 
41  b.HasIndex("Name")
42  .IsUnique();
43 
44  b.ToTable("ChatBots");
45  });
46 
47  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
48  {
49  b.Property<long>("Id")
50  .ValueGeneratedOnAdd();
51 
52  b.Property<long>("ChatSettingsId");
53 
54  b.Property<ulong?>("DiscordChannelId");
55 
56  b.Property<string>("IrcChannel");
57 
58  b.Property<bool?>("IsAdminChannel")
59  .IsRequired();
60 
61  b.Property<bool?>("IsUpdatesChannel")
62  .IsRequired();
63 
64  b.Property<bool?>("IsWatchdogChannel")
65  .IsRequired();
66 
67  b.Property<string>("Tag");
68 
69  b.HasKey("Id");
70 
71  b.HasIndex("ChatSettingsId", "DiscordChannelId")
72  .IsUnique();
73 
74  b.HasIndex("ChatSettingsId", "IrcChannel")
75  .IsUnique();
76 
77  b.ToTable("ChatChannels");
78  });
79 
80  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
81  {
82  b.Property<long>("Id")
83  .ValueGeneratedOnAdd();
84 
85  b.Property<string>("ByondVersion")
86  .IsRequired();
87 
88  b.Property<Guid?>("DirectoryName")
89  .IsRequired();
90 
91  b.Property<string>("DmeName")
92  .IsRequired();
93 
94  b.Property<long>("JobId");
95 
96  b.Property<int>("MinimumSecurityLevel");
97 
98  b.Property<string>("Output")
99  .IsRequired();
100 
101  b.Property<long>("RevisionInformationId");
102 
103  b.HasKey("Id");
104 
105  b.HasIndex("DirectoryName");
106 
107  b.HasIndex("JobId")
108  .IsUnique();
109 
110  b.HasIndex("RevisionInformationId");
111 
112  b.ToTable("CompileJobs");
113  });
114 
115  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
116  {
117  b.Property<long>("Id")
118  .ValueGeneratedOnAdd();
119 
120  b.Property<string>("AccessToken");
121 
122  b.Property<bool?>("AllowWebClient")
123  .IsRequired();
124 
125  b.Property<bool?>("AutoStart")
126  .IsRequired();
127 
128  b.Property<long>("InstanceId");
129 
130  b.Property<ushort?>("PrimaryPort")
131  .IsRequired();
132 
133  b.Property<int?>("ProcessId");
134 
135  b.Property<ushort?>("SecondaryPort")
136  .IsRequired();
137 
138  b.Property<int>("SecurityLevel");
139 
140  b.Property<bool?>("SoftRestart")
141  .IsRequired();
142 
143  b.Property<bool?>("SoftShutdown")
144  .IsRequired();
145 
146  b.Property<uint?>("StartupTimeout")
147  .IsRequired();
148 
149  b.HasKey("Id");
150 
151  b.HasIndex("InstanceId")
152  .IsUnique();
153 
154  b.ToTable("DreamDaemonSettings");
155  });
156 
157  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
158  {
159  b.Property<long>("Id")
160  .ValueGeneratedOnAdd();
161 
162  b.Property<ushort?>("ApiValidationPort")
163  .IsRequired();
164 
165  b.Property<int>("ApiValidationSecurityLevel");
166 
167  b.Property<long>("InstanceId");
168 
169  b.Property<string>("ProjectName");
170 
171  b.HasKey("Id");
172 
173  b.HasIndex("InstanceId")
174  .IsUnique();
175 
176  b.ToTable("DreamMakerSettings");
177  });
178 
179  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
180  {
181  b.Property<long>("Id")
182  .ValueGeneratedOnAdd();
183 
184  b.Property<uint?>("AutoUpdateInterval")
185  .IsRequired();
186 
187  b.Property<int>("ConfigurationType");
188 
189  b.Property<string>("Name")
190  .IsRequired();
191 
192  b.Property<bool?>("Online")
193  .IsRequired();
194 
195  b.Property<string>("Path")
196  .IsRequired();
197 
198  b.HasKey("Id");
199 
200  b.HasIndex("Path")
201  .IsUnique();
202 
203  b.ToTable("Instances");
204  });
205 
206  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
207  {
208  b.Property<long>("Id")
209  .ValueGeneratedOnAdd();
210 
211  b.Property<ulong>("ByondRights");
212 
213  b.Property<ulong>("ChatBotRights");
214 
215  b.Property<ulong>("ConfigurationRights");
216 
217  b.Property<ulong>("DreamDaemonRights");
218 
219  b.Property<ulong>("DreamMakerRights");
220 
221  b.Property<long>("InstanceId");
222 
223  b.Property<ulong>("InstanceUserRights");
224 
225  b.Property<ulong>("RepositoryRights");
226 
227  b.Property<long?>("UserId")
228  .IsRequired();
229 
230  b.HasKey("Id");
231 
232  b.HasIndex("InstanceId");
233 
234  b.HasIndex("UserId", "InstanceId")
235  .IsUnique();
236 
237  b.ToTable("InstanceUsers");
238  });
239 
240  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
241  {
242  b.Property<long>("Id")
243  .ValueGeneratedOnAdd();
244 
245  b.Property<ulong?>("CancelRight");
246 
247  b.Property<ulong?>("CancelRightsType");
248 
249  b.Property<bool?>("Cancelled")
250  .IsRequired();
251 
252  b.Property<long?>("CancelledById");
253 
254  b.Property<string>("Description")
255  .IsRequired();
256 
257  b.Property<string>("ExceptionDetails");
258 
259  b.Property<long>("InstanceId");
260 
261  b.Property<DateTimeOffset?>("StartedAt")
262  .IsRequired();
263 
264  b.Property<long>("StartedById");
265 
266  b.Property<DateTimeOffset?>("StoppedAt");
267 
268  b.HasKey("Id");
269 
270  b.HasIndex("CancelledById");
271 
272  b.HasIndex("InstanceId");
273 
274  b.HasIndex("StartedById");
275 
276  b.ToTable("Jobs");
277  });
278 
279  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
280  {
281  b.Property<long>("Id")
282  .ValueGeneratedOnAdd();
283 
284  b.Property<string>("AccessIdentifier")
285  .IsRequired();
286 
287  b.Property<string>("ChatChannelsJson")
288  .IsRequired();
289 
290  b.Property<string>("ChatCommandsJson")
291  .IsRequired();
292 
293  b.Property<long>("CompileJobId");
294 
295  b.Property<bool>("IsPrimary");
296 
297  b.Property<ushort>("Port");
298 
299  b.Property<int>("ProcessId");
300 
301  b.Property<int>("RebootState");
302 
303  b.Property<string>("ServerCommandsJson")
304  .IsRequired();
305 
306  b.HasKey("Id");
307 
308  b.HasIndex("CompileJobId");
309 
310  b.ToTable("ReattachInformations");
311  });
312 
313  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
314  {
315  b.Property<long>("Id")
316  .ValueGeneratedOnAdd();
317 
318  b.Property<string>("AccessToken");
319 
320  b.Property<string>("AccessUser");
321 
322  b.Property<bool?>("AutoUpdatesKeepTestMerges")
323  .IsRequired();
324 
325  b.Property<bool?>("AutoUpdatesSynchronize")
326  .IsRequired();
327 
328  b.Property<string>("CommitterEmail")
329  .IsRequired();
330 
331  b.Property<string>("CommitterName")
332  .IsRequired();
333 
334  b.Property<long>("InstanceId");
335 
336  b.Property<bool?>("PushTestMergeCommits")
337  .IsRequired();
338 
339  b.Property<bool?>("ShowTestMergeCommitters")
340  .IsRequired();
341 
342  b.HasKey("Id");
343 
344  b.HasIndex("InstanceId")
345  .IsUnique();
346 
347  b.ToTable("RepositorySettings");
348  });
349 
350  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
351  {
352  b.Property<long>("Id")
353  .ValueGeneratedOnAdd();
354 
355  b.Property<long>("RevisionInformationId");
356 
357  b.Property<long>("TestMergeId");
358 
359  b.HasKey("Id");
360 
361  b.HasIndex("RevisionInformationId");
362 
363  b.HasIndex("TestMergeId");
364 
365  b.ToTable("RevInfoTestMerges");
366  });
367 
368  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
369  {
370  b.Property<long>("Id")
371  .ValueGeneratedOnAdd();
372 
373  b.Property<string>("CommitSha")
374  .IsRequired()
375  .HasMaxLength(40);
376 
377  b.Property<long>("InstanceId");
378 
379  b.Property<string>("OriginCommitSha")
380  .IsRequired()
381  .HasMaxLength(40);
382 
383  b.HasKey("Id");
384 
385  b.HasIndex("CommitSha")
386  .IsUnique();
387 
388  b.HasIndex("InstanceId");
389 
390  b.ToTable("RevisionInformations");
391  });
392 
393  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
394  {
395  b.Property<long>("Id")
396  .ValueGeneratedOnAdd();
397 
398  b.Property<string>("Author")
399  .IsRequired();
400 
401  b.Property<string>("BodyAtMerge")
402  .IsRequired();
403 
404  b.Property<string>("Comment");
405 
406  b.Property<DateTimeOffset>("MergedAt");
407 
408  b.Property<long>("MergedById");
409 
410  b.Property<int?>("Number")
411  .IsRequired();
412 
413  b.Property<long?>("PrimaryRevisionInformationId")
414  .IsRequired();
415 
416  b.Property<string>("PullRequestRevision")
417  .IsRequired();
418 
419  b.Property<string>("TitleAtMerge")
420  .IsRequired();
421 
422  b.Property<string>("Url")
423  .IsRequired();
424 
425  b.HasKey("Id");
426 
427  b.HasIndex("MergedById");
428 
429  b.HasIndex("PrimaryRevisionInformationId")
430  .IsUnique();
431 
432  b.ToTable("TestMerges");
433  });
434 
435  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
436  {
437  b.Property<long>("Id")
438  .ValueGeneratedOnAdd();
439 
440  b.Property<ulong>("AdministrationRights");
441 
442  b.Property<string>("CanonicalName")
443  .IsRequired();
444 
445  b.Property<DateTimeOffset?>("CreatedAt")
446  .IsRequired();
447 
448  b.Property<long?>("CreatedById");
449 
450  b.Property<bool?>("Enabled")
451  .IsRequired();
452 
453  b.Property<ulong>("InstanceManagerRights");
454 
455  b.Property<DateTimeOffset?>("LastPasswordUpdate");
456 
457  b.Property<string>("Name")
458  .IsRequired();
459 
460  b.Property<string>("PasswordHash");
461 
462  b.Property<string>("SystemIdentifier");
463 
464  b.HasKey("Id");
465 
466  b.HasIndex("CanonicalName")
467  .IsUnique();
468 
469  b.HasIndex("CreatedById");
470 
471  b.ToTable("Users");
472  });
473 
474  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
475  {
476  b.Property<long>("Id")
477  .ValueGeneratedOnAdd();
478 
479  b.Property<long?>("AlphaId");
480 
481  b.Property<bool>("AlphaIsActive");
482 
483  b.Property<long?>("BravoId");
484 
485  b.Property<long>("InstanceId");
486 
487  b.HasKey("Id");
488 
489  b.HasIndex("AlphaId");
490 
491  b.HasIndex("BravoId");
492 
493  b.HasIndex("InstanceId")
494  .IsUnique();
495 
496  b.ToTable("WatchdogReattachInformations");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
500  {
501  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
502  .WithMany("ChatSettings")
503  .HasForeignKey("InstanceId")
504  .OnDelete(DeleteBehavior.Cascade);
505  });
506 
507  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
508  {
509  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
510  .WithMany("Channels")
511  .HasForeignKey("ChatSettingsId")
512  .OnDelete(DeleteBehavior.Cascade);
513  });
514 
515  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
516  {
517  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
518  .WithOne()
519  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
520  .OnDelete(DeleteBehavior.Restrict);
521 
522  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
523  .WithMany("CompileJobs")
524  .HasForeignKey("RevisionInformationId")
525  .OnDelete(DeleteBehavior.Cascade);
526  });
527 
528  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
529  {
530  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
531  .WithOne("DreamDaemonSettings")
532  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
533  .OnDelete(DeleteBehavior.Cascade);
534  });
535 
536  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
537  {
538  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
539  .WithOne("DreamMakerSettings")
540  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
541  .OnDelete(DeleteBehavior.Cascade);
542  });
543 
544  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
545  {
546  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
547  .WithMany("InstanceUsers")
548  .HasForeignKey("InstanceId")
549  .OnDelete(DeleteBehavior.Cascade);
550 
551  b.HasOne("Tgstation.Server.Host.Models.User")
552  .WithMany("InstanceUsers")
553  .HasForeignKey("UserId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
560  .WithMany()
561  .HasForeignKey("CancelledById");
562 
563  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
564  .WithMany("Jobs")
565  .HasForeignKey("InstanceId")
566  .OnDelete(DeleteBehavior.Cascade);
567 
568  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
569  .WithMany()
570  .HasForeignKey("StartedById")
571  .OnDelete(DeleteBehavior.Cascade);
572  });
573 
574  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
575  {
576  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
577  .WithMany()
578  .HasForeignKey("CompileJobId")
579  .OnDelete(DeleteBehavior.Cascade);
580  });
581 
582  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
583  {
584  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
585  .WithOne("RepositorySettings")
586  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
587  .OnDelete(DeleteBehavior.Cascade);
588  });
589 
590  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
591  {
592  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
593  .WithMany("ActiveTestMerges")
594  .HasForeignKey("RevisionInformationId")
595  .OnDelete(DeleteBehavior.Cascade);
596 
597  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
598  .WithMany("RevisonInformations")
599  .HasForeignKey("TestMergeId")
600  .OnDelete(DeleteBehavior.Cascade);
601  });
602 
603  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
604  {
605  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
606  .WithMany("RevisionInformations")
607  .HasForeignKey("InstanceId")
608  .OnDelete(DeleteBehavior.Cascade);
609  });
610 
611  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
612  {
613  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
614  .WithMany("TestMerges")
615  .HasForeignKey("MergedById")
616  .OnDelete(DeleteBehavior.Restrict);
617 
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
619  .WithOne("PrimaryTestMerge")
620  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
621  .OnDelete(DeleteBehavior.Restrict);
622  });
623 
624  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
625  {
626  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
627  .WithMany("CreatedUsers")
628  .HasForeignKey("CreatedById");
629  });
630 
631  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
632  {
633  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
634  .WithMany()
635  .HasForeignKey("AlphaId");
636 
637  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
638  .WithMany()
639  .HasForeignKey("BravoId");
640 
641  b.HasOne("Tgstation.Server.Host.Models.Instance")
642  .WithOne("WatchdogReattachInformation")
643  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
644  .OnDelete(DeleteBehavior.Cascade);
645  });
646 #pragma warning restore 612, 618
647  }
648  }
649 }
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
7 
8 namespace Tgstation.Server.Host.Models.Migrations
9 {
12  {
13  protected override void BuildModel(ModelBuilder modelBuilder)
14  {
15 #pragma warning disable 612, 618
16  modelBuilder
17  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
18  .HasAnnotation("Relational:MaxIdentifierLength", 64);
19 
20  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
21  {
22  b.Property<long>("Id")
23  .ValueGeneratedOnAdd();
24 
25  b.Property<string>("ConnectionString")
26  .IsRequired();
27 
28  b.Property<bool?>("Enabled");
29 
30  b.Property<long>("InstanceId");
31 
32  b.Property<string>("Name")
33  .IsRequired();
34 
35  b.Property<int?>("Provider");
36 
37  b.HasKey("Id");
38 
39  b.HasIndex("InstanceId");
40 
41  b.HasIndex("Name")
42  .IsUnique();
43 
44  b.ToTable("ChatBots");
45  });
46 
47  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
48  {
49  b.Property<long>("Id")
50  .ValueGeneratedOnAdd();
51 
52  b.Property<long>("ChatSettingsId");
53 
54  b.Property<ulong?>("DiscordChannelId");
55 
56  b.Property<string>("IrcChannel");
57 
58  b.Property<bool?>("IsAdminChannel")
59  .IsRequired();
60 
61  b.Property<bool?>("IsUpdatesChannel")
62  .IsRequired();
63 
64  b.Property<bool?>("IsWatchdogChannel")
65  .IsRequired();
66 
67  b.Property<string>("Tag");
68 
69  b.HasKey("Id");
70 
71  b.HasIndex("ChatSettingsId", "DiscordChannelId")
72  .IsUnique();
73 
74  b.HasIndex("ChatSettingsId", "IrcChannel")
75  .IsUnique();
76 
77  b.ToTable("ChatChannels");
78  });
79 
80  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
81  {
82  b.Property<long>("Id")
83  .ValueGeneratedOnAdd();
84 
85  b.Property<string>("ByondVersion")
86  .IsRequired();
87 
88  b.Property<Guid?>("DirectoryName")
89  .IsRequired();
90 
91  b.Property<string>("DmeName")
92  .IsRequired();
93 
94  b.Property<long>("JobId");
95 
96  b.Property<int>("MinimumSecurityLevel");
97 
98  b.Property<string>("Output")
99  .IsRequired();
100 
101  b.Property<long>("RevisionInformationId");
102 
103  b.HasKey("Id");
104 
105  b.HasIndex("DirectoryName");
106 
107  b.HasIndex("JobId")
108  .IsUnique();
109 
110  b.HasIndex("RevisionInformationId");
111 
112  b.ToTable("CompileJobs");
113  });
114 
115  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
116  {
117  b.Property<long>("Id")
118  .ValueGeneratedOnAdd();
119 
120  b.Property<string>("AccessToken");
121 
122  b.Property<bool?>("AllowWebClient")
123  .IsRequired();
124 
125  b.Property<bool?>("AutoStart")
126  .IsRequired();
127 
128  b.Property<long>("InstanceId");
129 
130  b.Property<ushort?>("PrimaryPort")
131  .IsRequired();
132 
133  b.Property<int?>("ProcessId");
134 
135  b.Property<ushort?>("SecondaryPort")
136  .IsRequired();
137 
138  b.Property<int>("SecurityLevel");
139 
140  b.Property<bool?>("SoftRestart")
141  .IsRequired();
142 
143  b.Property<bool?>("SoftShutdown")
144  .IsRequired();
145 
146  b.Property<uint?>("StartupTimeout")
147  .IsRequired();
148 
149  b.HasKey("Id");
150 
151  b.HasIndex("InstanceId")
152  .IsUnique();
153 
154  b.ToTable("DreamDaemonSettings");
155  });
156 
157  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
158  {
159  b.Property<long>("Id")
160  .ValueGeneratedOnAdd();
161 
162  b.Property<ushort?>("ApiValidationPort")
163  .IsRequired();
164 
165  b.Property<int>("ApiValidationSecurityLevel");
166 
167  b.Property<long>("InstanceId");
168 
169  b.Property<string>("ProjectName");
170 
171  b.HasKey("Id");
172 
173  b.HasIndex("InstanceId")
174  .IsUnique();
175 
176  b.ToTable("DreamMakerSettings");
177  });
178 
179  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
180  {
181  b.Property<long>("Id")
182  .ValueGeneratedOnAdd();
183 
184  b.Property<uint?>("AutoUpdateInterval")
185  .IsRequired();
186 
187  b.Property<int>("ConfigurationType");
188 
189  b.Property<string>("Name")
190  .IsRequired();
191 
192  b.Property<bool?>("Online")
193  .IsRequired();
194 
195  b.Property<string>("Path")
196  .IsRequired();
197 
198  b.HasKey("Id");
199 
200  b.HasIndex("Path")
201  .IsUnique();
202 
203  b.ToTable("Instances");
204  });
205 
206  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
207  {
208  b.Property<long>("Id")
209  .ValueGeneratedOnAdd();
210 
211  b.Property<ulong>("ByondRights");
212 
213  b.Property<ulong>("ChatBotRights");
214 
215  b.Property<ulong>("ConfigurationRights");
216 
217  b.Property<ulong>("DreamDaemonRights");
218 
219  b.Property<ulong>("DreamMakerRights");
220 
221  b.Property<long>("InstanceId");
222 
223  b.Property<ulong>("InstanceUserRights");
224 
225  b.Property<ulong>("RepositoryRights");
226 
227  b.Property<long?>("UserId")
228  .IsRequired();
229 
230  b.HasKey("Id");
231 
232  b.HasIndex("InstanceId");
233 
234  b.HasIndex("UserId", "InstanceId")
235  .IsUnique();
236 
237  b.ToTable("InstanceUsers");
238  });
239 
240  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
241  {
242  b.Property<long>("Id")
243  .ValueGeneratedOnAdd();
244 
245  b.Property<ulong?>("CancelRight");
246 
247  b.Property<ulong?>("CancelRightsType");
248 
249  b.Property<bool?>("Cancelled")
250  .IsRequired();
251 
252  b.Property<long?>("CancelledById");
253 
254  b.Property<string>("Description")
255  .IsRequired();
256 
257  b.Property<string>("ExceptionDetails");
258 
259  b.Property<long>("InstanceId");
260 
261  b.Property<DateTimeOffset?>("StartedAt")
262  .IsRequired();
263 
264  b.Property<long>("StartedById");
265 
266  b.Property<DateTimeOffset?>("StoppedAt");
267 
268  b.HasKey("Id");
269 
270  b.HasIndex("CancelledById");
271 
272  b.HasIndex("InstanceId");
273 
274  b.HasIndex("StartedById");
275 
276  b.ToTable("Jobs");
277  });
278 
279  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
280  {
281  b.Property<long>("Id")
282  .ValueGeneratedOnAdd();
283 
284  b.Property<string>("AccessIdentifier")
285  .IsRequired();
286 
287  b.Property<string>("ChatChannelsJson")
288  .IsRequired();
289 
290  b.Property<string>("ChatCommandsJson")
291  .IsRequired();
292 
293  b.Property<long>("CompileJobId");
294 
295  b.Property<bool>("IsPrimary");
296 
297  b.Property<ushort>("Port");
298 
299  b.Property<int>("ProcessId");
300 
301  b.Property<int>("RebootState");
302 
303  b.Property<string>("ServerCommandsJson")
304  .IsRequired();
305 
306  b.HasKey("Id");
307 
308  b.HasIndex("CompileJobId");
309 
310  b.ToTable("ReattachInformations");
311  });
312 
313  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
314  {
315  b.Property<long>("Id")
316  .ValueGeneratedOnAdd();
317 
318  b.Property<string>("AccessToken");
319 
320  b.Property<string>("AccessUser");
321 
322  b.Property<bool?>("AutoUpdatesKeepTestMerges")
323  .IsRequired();
324 
325  b.Property<bool?>("AutoUpdatesSynchronize")
326  .IsRequired();
327 
328  b.Property<string>("CommitterEmail")
329  .IsRequired();
330 
331  b.Property<string>("CommitterName")
332  .IsRequired();
333 
334  b.Property<long>("InstanceId");
335 
336  b.Property<bool?>("PostTestMergeComment")
337  .IsRequired();
338 
339  b.Property<bool?>("PushTestMergeCommits")
340  .IsRequired();
341 
342  b.Property<bool?>("ShowTestMergeCommitters")
343  .IsRequired();
344 
345  b.HasKey("Id");
346 
347  b.HasIndex("InstanceId")
348  .IsUnique();
349 
350  b.ToTable("RepositorySettings");
351  });
352 
353  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
354  {
355  b.Property<long>("Id")
356  .ValueGeneratedOnAdd();
357 
358  b.Property<long>("RevisionInformationId");
359 
360  b.Property<long>("TestMergeId");
361 
362  b.HasKey("Id");
363 
364  b.HasIndex("RevisionInformationId");
365 
366  b.HasIndex("TestMergeId");
367 
368  b.ToTable("RevInfoTestMerges");
369  });
370 
371  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
372  {
373  b.Property<long>("Id")
374  .ValueGeneratedOnAdd();
375 
376  b.Property<string>("CommitSha")
377  .IsRequired()
378  .HasMaxLength(40);
379 
380  b.Property<long>("InstanceId");
381 
382  b.Property<string>("OriginCommitSha")
383  .IsRequired()
384  .HasMaxLength(40);
385 
386  b.HasKey("Id");
387 
388  b.HasIndex("CommitSha")
389  .IsUnique();
390 
391  b.HasIndex("InstanceId");
392 
393  b.ToTable("RevisionInformations");
394  });
395 
396  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
397  {
398  b.Property<long>("Id")
399  .ValueGeneratedOnAdd();
400 
401  b.Property<string>("Author")
402  .IsRequired();
403 
404  b.Property<string>("BodyAtMerge")
405  .IsRequired();
406 
407  b.Property<string>("Comment");
408 
409  b.Property<DateTimeOffset>("MergedAt");
410 
411  b.Property<long>("MergedById");
412 
413  b.Property<int?>("Number")
414  .IsRequired();
415 
416  b.Property<long?>("PrimaryRevisionInformationId")
417  .IsRequired();
418 
419  b.Property<string>("PullRequestRevision")
420  .IsRequired();
421 
422  b.Property<string>("TitleAtMerge")
423  .IsRequired();
424 
425  b.Property<string>("Url")
426  .IsRequired();
427 
428  b.HasKey("Id");
429 
430  b.HasIndex("MergedById");
431 
432  b.HasIndex("PrimaryRevisionInformationId")
433  .IsUnique();
434 
435  b.ToTable("TestMerges");
436  });
437 
438  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
439  {
440  b.Property<long>("Id")
441  .ValueGeneratedOnAdd();
442 
443  b.Property<ulong>("AdministrationRights");
444 
445  b.Property<string>("CanonicalName")
446  .IsRequired();
447 
448  b.Property<DateTimeOffset?>("CreatedAt")
449  .IsRequired();
450 
451  b.Property<long?>("CreatedById");
452 
453  b.Property<bool?>("Enabled")
454  .IsRequired();
455 
456  b.Property<ulong>("InstanceManagerRights");
457 
458  b.Property<DateTimeOffset?>("LastPasswordUpdate");
459 
460  b.Property<string>("Name")
461  .IsRequired();
462 
463  b.Property<string>("PasswordHash");
464 
465  b.Property<string>("SystemIdentifier");
466 
467  b.HasKey("Id");
468 
469  b.HasIndex("CanonicalName")
470  .IsUnique();
471 
472  b.HasIndex("CreatedById");
473 
474  b.ToTable("Users");
475  });
476 
477  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
478  {
479  b.Property<long>("Id")
480  .ValueGeneratedOnAdd();
481 
482  b.Property<long?>("AlphaId");
483 
484  b.Property<bool>("AlphaIsActive");
485 
486  b.Property<long?>("BravoId");
487 
488  b.Property<long>("InstanceId");
489 
490  b.HasKey("Id");
491 
492  b.HasIndex("AlphaId");
493 
494  b.HasIndex("BravoId");
495 
496  b.HasIndex("InstanceId")
497  .IsUnique();
498 
499  b.ToTable("WatchdogReattachInformations");
500  });
501 
502  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
503  {
504  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
505  .WithMany("ChatSettings")
506  .HasForeignKey("InstanceId")
507  .OnDelete(DeleteBehavior.Cascade);
508  });
509 
510  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
511  {
512  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
513  .WithMany("Channels")
514  .HasForeignKey("ChatSettingsId")
515  .OnDelete(DeleteBehavior.Cascade);
516  });
517 
518  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
519  {
520  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
521  .WithOne()
522  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
523  .OnDelete(DeleteBehavior.Restrict);
524 
525  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
526  .WithMany("CompileJobs")
527  .HasForeignKey("RevisionInformationId")
528  .OnDelete(DeleteBehavior.Cascade);
529  });
530 
531  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
532  {
533  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
534  .WithOne("DreamDaemonSettings")
535  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
536  .OnDelete(DeleteBehavior.Cascade);
537  });
538 
539  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
540  {
541  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
542  .WithOne("DreamMakerSettings")
543  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
544  .OnDelete(DeleteBehavior.Cascade);
545  });
546 
547  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
548  {
549  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
550  .WithMany("InstanceUsers")
551  .HasForeignKey("InstanceId")
552  .OnDelete(DeleteBehavior.Cascade);
553 
554  b.HasOne("Tgstation.Server.Host.Models.User")
555  .WithMany("InstanceUsers")
556  .HasForeignKey("UserId")
557  .OnDelete(DeleteBehavior.Cascade);
558  });
559 
560  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
561  {
562  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
563  .WithMany()
564  .HasForeignKey("CancelledById");
565 
566  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
567  .WithMany("Jobs")
568  .HasForeignKey("InstanceId")
569  .OnDelete(DeleteBehavior.Cascade);
570 
571  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
572  .WithMany()
573  .HasForeignKey("StartedById")
574  .OnDelete(DeleteBehavior.Cascade);
575  });
576 
577  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
578  {
579  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
580  .WithMany()
581  .HasForeignKey("CompileJobId")
582  .OnDelete(DeleteBehavior.Cascade);
583  });
584 
585  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
586  {
587  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
588  .WithOne("RepositorySettings")
589  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
590  .OnDelete(DeleteBehavior.Cascade);
591  });
592 
593  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
594  {
595  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
596  .WithMany("ActiveTestMerges")
597  .HasForeignKey("RevisionInformationId")
598  .OnDelete(DeleteBehavior.Cascade);
599 
600  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
601  .WithMany("RevisonInformations")
602  .HasForeignKey("TestMergeId")
603  .OnDelete(DeleteBehavior.Cascade);
604  });
605 
606  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
607  {
608  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
609  .WithMany("RevisionInformations")
610  .HasForeignKey("InstanceId")
611  .OnDelete(DeleteBehavior.Cascade);
612  });
613 
614  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
615  {
616  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
617  .WithMany("TestMerges")
618  .HasForeignKey("MergedById")
619  .OnDelete(DeleteBehavior.Restrict);
620 
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
622  .WithOne("PrimaryTestMerge")
623  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
624  .OnDelete(DeleteBehavior.Restrict);
625  });
626 
627  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
628  {
629  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
630  .WithMany("CreatedUsers")
631  .HasForeignKey("CreatedById");
632  });
633 
634  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
635  {
636  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
637  .WithMany()
638  .HasForeignKey("AlphaId");
639 
640  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
641  .WithMany()
642  .HasForeignKey("BravoId");
643 
644  b.HasOne("Tgstation.Server.Host.Models.Instance")
645  .WithOne("WatchdogReattachInformation")
646  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
647  .OnDelete(DeleteBehavior.Cascade);
648  });
649 #pragma warning restore 612, 618
650  }
651  }
652 }
diff --git a/_release_notes_8_assembly_info_8cs.html b/_release_notes_8_assembly_info_8cs.html index 638a7353fc..85ccdc6409 100644 --- a/_release_notes_8_assembly_info_8cs.html +++ b/_release_notes_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: tools/ReleaseNotes/obj/Release/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs File Reference +tgstation-server: tools/ReleaseNotes/obj/Debug/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_release_notes_8_assembly_info_8cs_source.html b/_release_notes_8_assembly_info_8cs_source.html index 2af530f94b..9a5ab05d0e 100644 --- a/_release_notes_8_assembly_info_8cs_source.html +++ b/_release_notes_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tools/ReleaseNotes/obj/Release/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs Source File +tgstation-server: tools/ReleaseNotes/obj/Debug/netcoreapp2.1/ReleaseNotes.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
ReleaseNotes.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("ReleaseNotes")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("ReleaseNotes")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("ReleaseNotes")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("ReleaseNotes")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("ReleaseNotes")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("ReleaseNotes")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
-Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
22 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.Repository)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class RepositoryController : ModelController<Repository>
31  {
36 
41 
46 
51 
62  public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
63  {
64  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
65  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
66  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
67  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
68  }
69 
70  async Task<bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action<Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken)
71  {
72  var repoSha = repository.Head;
73 
74  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
75  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
76  .Include(x => x.CompileJobs)
77  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
78 
79  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
80 
81  if (revisionInfo == default)
82  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
83 
84  var needsDbUpdate = revisionInfo == default;
85  if (needsDbUpdate)
86  {
87  // needs insertion
88  revisionInfo = new Models.RevisionInformation
89  {
90  Instance = instance,
91  CommitSha = repoSha,
92  CompileJobs = new List<Models.CompileJob>(),
93  ActiveTestMerges = new List<RevInfoTestMerge>() // non null vals for api returns
94  };
95 
96  lock (databaseContext) // cleaner this way
97  databaseContext.RevisionInformations.Add(revisionInfo);
98  }
99 
100  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
101  if (revisionInfo.OriginCommitSha == null)
102  {
103  revisionInfo.OriginCommitSha = repoSha;
104  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
105  }
106 
107  revInfoSink?.Invoke(revisionInfo);
108  return needsDbUpdate;
109  }
110 
111  async Task<bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
112  {
113  if (repository.IsGitHubRepository)
114  {
115  model.GitHubOwner = repository.GitHubOwner;
116  model.GitHubName = repository.GitHubRepoName;
117  }
118 
119  model.Origin = repository.Origin;
120  model.Reference = repository.Reference;
121 
122  // rev info stuff
123  Models.RevisionInformation revisionInfo = null;
124  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
125  model.RevisionInformation = revisionInfo.ToApi();
126  return needsDbUpdate;
127  }
128 
130  [TgsAuthorize(RepositoryRights.SetOrigin)]
131  public override async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
132  {
133  if (model == null)
134  throw new ArgumentNullException(nameof(model));
135 
136  if (model.Origin == null)
137  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
138 
139  if (model.AccessUser == null ^ model.AccessToken == null)
140  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
141 
142  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
143 
144  if (currentModel == default)
145  return StatusCode((int)HttpStatusCode.Gone);
146 
147  // normalize github urls
148  const string BadGitHubUrl = "://www.github.com/";
149  var uiOrigin = model.Origin.ToUpperInvariant();
150  var uiBad = BadGitHubUrl.ToUpperInvariant();
151  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
152  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
153  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
154 
155  currentModel.AccessToken = model.AccessToken;
156  currentModel.AccessUser = model.AccessUser; // intentionally only these fields, user not allowed to change anything else atm
157  var cloneBranch = model.Reference;
158  var origin = model.Origin;
159 
160  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
161 
162  if (repoManager.CloneInProgress)
163  return Conflict(new ErrorMessage
164  {
165  Message = "A clone operation is in progress!"
166  });
167 
168  if(repoManager.InUse)
169  return Conflict(new ErrorMessage
170  {
171  Message = "The repo is busy!"
172  });
173 
174  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
175  {
176  // clone conflict
177  if (repo != null)
178  return Conflict(new ErrorMessage
179  {
180  Message = "The repository already exists!"
181  });
182 
183  var job = new Models.Job
184  {
185  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
186  StartedBy = AuthenticationContext.User,
187  CancelRightsType = RightsType.Repository,
188  CancelRight = (ulong)RepositoryRights.CancelClone,
190  };
191  var api = currentModel.ToApi();
192  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
193  {
194  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
195  {
196  if (repos == null)
197  throw new JobException("Filesystem conflict while cloning repository!");
198  var instance = new Models.Instance
199  {
200  Id = Instance.Id
201  };
202  databaseContext.Instances.Attach(instance);
203  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
204  await databaseContext.Save(ct).ConfigureAwait(false);
205  }
206  }, cancellationToken).ConfigureAwait(false);
207 
208  api.Origin = model.Origin;
209  api.Reference = model.Reference;
210  api.ActiveJob = job.ToApi();
211 
212  return StatusCode((int)HttpStatusCode.Created, api);
213  }
214  }
215 
221  [TgsAuthorize(RepositoryRights.Delete)]
222  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
223  {
224  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225 
226  if (currentModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228 
229  currentModel.AccessToken = null;
230  currentModel.AccessUser = null;
231 
232  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
233 
234  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
235 
236  var job = new Models.Job
237  {
238  Description = "Delete repository",
239  StartedBy = AuthenticationContext.User,
241  };
242  var api = currentModel.ToApi();
243  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
244  api.ActiveJob = job.ToApi();
245  return Accepted(api);
246  }
247 
249  [TgsAuthorize(RepositoryRights.Read)]
250  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
251  {
252  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
253 
254  if (currentModel == default)
255  return StatusCode((int)HttpStatusCode.Gone);
256 
257  var api = currentModel.ToApi();
258  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
259 
260  if (repoManager.CloneInProgress)
261  return Conflict(new ErrorMessage
262  {
263  Message = "A clone operation is in progress!"
264  });
265 
266  if (repoManager.InUse)
267  return Conflict(new ErrorMessage
268  {
269  Message = "The repo is busy!"
270  });
271 
272  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
273  {
274  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
275  {
276  // user may have fucked with the repo without telling us, do what we can
277  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
278  return StatusCode((int)HttpStatusCode.Created, api);
279  }
280 
281  return Json(api);
282  }
283  }
284 
286  [TgsAuthorize(RepositoryRights.ChangeAutoUpdateSettings | RepositoryRights.ChangeCommitter | RepositoryRights.ChangeCredentials | RepositoryRights.ChangeTestMergeCommits | RepositoryRights.MergePullRequest | RepositoryRights.SetReference | RepositoryRights.SetSha | RepositoryRights.UpdateBranch)]
287  #pragma warning disable CA1502 // TODO: Decomplexify
288  #pragma warning disable CA1505
289  public override async Task<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
290  {
291  if (model == null)
292  throw new ArgumentNullException(nameof(model));
293 
294  if (model.AccessUser == null ^ model.AccessToken == null)
295  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
296 
297  if (model.CheckoutSha != null && model.Reference != null)
298  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
299 
300  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
301  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
302 
303  if (model.Origin != null)
304  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
305 
306  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
307  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
308 
309  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
310  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
311 
312  if (model.CommitterName?.Length == 0)
313  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
314 
315  if (model.CommitterEmail?.Length == 0)
316  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
317 
318  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
319  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
320  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
321  return Forbid();
322 
323  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
324 
325  if (currentModel == default)
326  return StatusCode((int)HttpStatusCode.Gone);
327 
328  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
329  {
330  var memberSelectorExpression = (MemberExpression)expression.Body;
331  var property = (PropertyInfo)memberSelectorExpression.Member;
332 
333  var newVal = property.GetValue(model);
334  if (newVal == null)
335  return false;
336  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
337  return true;
338 
339  property.SetValue(currentModel, newVal);
340  return false;
341  }
342 
343  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
344  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
345  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
346  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
347  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
348  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
349  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
350  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
351  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
352  return Forbid();
353 
354  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
355  {
356  // setting an empty string clears everything
357  currentModel.AccessUser = null;
358  currentModel.AccessToken = null;
359  }
360 
361  var canRead = userRights.HasFlag(RepositoryRights.Read);
362 
363  var api = canRead ? currentModel.ToApi() : new Repository();
364  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
365 
366  if (canRead)
367  {
368  if (repoManager.CloneInProgress)
369  return Conflict(new ErrorMessage
370  {
371  Message = "A clone operation is in progress!"
372  });
373 
374  if (repoManager.InUse)
375  return Conflict(new ErrorMessage
376  {
377  Message = "The repo is busy!"
378  });
379 
380  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
381  {
382  if (repo == null)
383  return Conflict(new ErrorMessage
384  {
385  Message = "Repository could not be loaded!"
386  });
387  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
388  }
389  }
390 
391  // this is just db stuf so stow it away
392  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
393 
394  // format the job description
395  string description = null;
396  if (model.UpdateFromOrigin == true)
397  if (model.Reference != null)
398  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
399  else if (model.CheckoutSha != null)
400  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
401  else
402  description = "Pull current repository reference";
403  else if (model.Reference != null || model.CheckoutSha != null)
404  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
405 
406  if (newTestMerges)
407  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
408  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
409  String.Join(", ", model.NewTestMerges.Select(x =>
410  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
411  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
412  description != null ? String.Empty : " in repository");
413 
414  if (description == null)
415  return Json(api); // no git changes
416 
417  var job = new Models.Job
418  {
419  Description = description,
420  StartedBy = AuthenticationContext.User,
421  Instance = Instance,
422  CancelRightsType = RightsType.Repository,
423  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
424  };
425 
426  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
427  {
428  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
429  {
430  if (repo == null)
431  throw new JobException("Repository could not be loaded!");
432 
433  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
434 
435  var startReference = repo.Reference;
436  var startSha = repo.Head;
437  string postUpdateSha = null;
438 
439  if (newTestMerges && !repo.IsGitHubRepository)
440  throw new JobException("Cannot test merge on a non GitHub based repository!");
441 
442  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
443 
444  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
445 
446  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
447  var doneSteps = 0;
448 
449  Action<int> NextProgressReporter()
450  {
451  var tmpDoneSteps = doneSteps;
452  ++doneSteps;
453  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / numSteps);
454  }
455 
456  progressReporter(0);
457 
458  // get a base line for where we are
459  Models.RevisionInformation lastRevisionInfo = null;
460 
461  var attachedInstance = new Models.Instance
462  {
463  Id = Instance.Id
464  };
465  databaseContext.Instances.Attach(attachedInstance);
466 
467  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
468 
469  // apply new rev info, tracking applied test merges
470  async Task UpdateRevInfo()
471  {
472  var last = lastRevisionInfo;
473  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
474  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
475  }
476 
477  try
478  {
479  // fetch/pull
480  if (model.UpdateFromOrigin == true)
481  {
482  if (!repo.Tracking)
483  throw new JobException("Not on an updatable reference!");
484  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
485  doneSteps = 1;
486  if (!modelHasShaOrReference)
487  {
488  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
489  if (!fastForward.HasValue)
490  throw new JobException("Merge conflict occurred during origin update!");
491  await UpdateRevInfo().ConfigureAwait(false);
492  if (fastForward.Value)
493  {
494  lastRevisionInfo.OriginCommitSha = repo.Head;
495  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
496  postUpdateSha = repo.Head;
497  }
498  else
499  NextProgressReporter()(100);
500  }
501  }
502 
503  // checkout/hard reset
504  if (modelHasShaOrReference)
505  {
506  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
507  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
508  {
509  var committish = model.CheckoutSha ?? model.Reference;
510  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
511 
512  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
513  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
514 
515  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
516  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false); // we've either seen origin before or what we're checking out is on origin
517  }
518  else
519  NextProgressReporter()(100);
520 
521  if (hardResettingToOriginReference)
522  {
523  if (!repo.Tracking)
524  throw new JobException("Checked out reference does not track a remote object!");
525  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
526  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
527  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
528 
529  // repo head is on origin so force this
530  // will update the db if necessary
531  lastRevisionInfo.OriginCommitSha = repo.Head;
532  }
533  }
534 
535  // test merging
536  Dictionary<int, Octokit.PullRequest> prMap = null;
537  if (newTestMerges)
538  {
539  // bit of sanitization
540  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
541  I.PullRequestRevision = null;
542 
543  var gitHubClient = currentModel.AccessToken != null
544  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
545  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
546  ? gitHubClientFactory.CreateClient()
547  : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken));
548 
549  var repoOwner = repo.GitHubOwner;
550  var repoName = repo.GitHubRepoName;
551 
552  // optimization: if we've already merged these exact same commits in this fashion before, just find the rev info for it and check it out
553  Models.RevisionInformation revInfoWereLookingFor = null;
554  bool needToApplyRemainingPrs = true;
555  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
556  {
557  // In order for this to work though we need the shas of all the commits
558  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
559  prMap = new Dictionary<int, Octokit.PullRequest>();
560 
561  bool cantSearch = false;
562  foreach (var I in model.NewTestMerges)
563  {
564  if (I.PullRequestRevision != null)
565 #pragma warning disable CA1308 // Normalize strings to uppercase
566  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant(); // ala libgit2
567 #pragma warning restore CA1308 // Normalize strings to uppercase
568  else
569  try
570  {
571  // retrieve the latest sha
572  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
573  prMap.Add(I.Number.Value, pr);
574  I.PullRequestRevision = pr.Head.Sha;
575  }
576  catch
577  {
578  cantSearch = true;
579  break;
580  }
581  }
582 
583  if (!cantSearch)
584  {
585  var dbPull = await databaseContext.RevisionInformations
586  .Where(x => x.Instance.Id == Instance.Id
587  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
588  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
589  && x.ActiveTestMerges.Count > 0)
590  .Include(x => x.ActiveTestMerges)
591  .ThenInclude(x => x.TestMerge)
592  .ToListAsync(cancellationToken).ConfigureAwait(false);
593 
594  // split here cause this bit has to be done locally
595  revInfoWereLookingFor = dbPull
596  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
597  && x.ActiveTestMerges.Select(y => y.TestMerge)
598  .All(y => model.NewTestMerges.Any(z =>
599  y.Number == z.Number
600  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
601  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
602  .FirstOrDefault();
603 
604  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
605  {
606  // okay try to add at least SOME prs we've seen before
607  var search = model.NewTestMerges.ToList();
608 
609  var appliedTestMergeIds = new List<long>();
610 
611  Models.RevisionInformation lastGoodRevInfo = null;
612  do
613  {
614  foreach (var I in search)
615  {
616  revInfoWereLookingFor = dbPull
617  .Where(x => model.NewTestMerges.Any(z =>
618  x.PrimaryTestMerge.Number == z.Number
619  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
620  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
621  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
622  .FirstOrDefault();
623 
624  if (revInfoWereLookingFor != null)
625  {
626  lastGoodRevInfo = revInfoWereLookingFor;
627  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
628  search.Remove(I);
629  break;
630  }
631  }
632  }
633  while (revInfoWereLookingFor != null && search.Count > 0);
634 
635  revInfoWereLookingFor = lastGoodRevInfo;
636  needToApplyRemainingPrs = search.Count != 0;
637  if (needToApplyRemainingPrs)
638  model.NewTestMerges = search;
639  }
640  else if (revInfoWereLookingFor != null)
641  needToApplyRemainingPrs = false;
642  }
643  }
644 
645  if (revInfoWereLookingFor != null)
646  {
647  // goteem
648  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
649  lastRevisionInfo = revInfoWereLookingFor;
650  }
651 
652  if (needToApplyRemainingPrs)
653  {
654  // an invocation of LoadRevisionInformation could have already loaded this user
655  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
656  if (contextUser == default)
657  {
658  contextUser = new Models.User
659  {
661  };
662  databaseContext.Users.Attach(contextUser);
663  }
664  else
665  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
666 
667  foreach (var I in model.NewTestMerges)
668  {
669  Octokit.PullRequest pr = null;
670  string errorMessage = null;
671 
672  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
673  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
674 
675  try
676  {
677  // load from cache if possible
678  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
679  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
680  }
681  catch (Octokit.RateLimitExceededException)
682  {
683  // you look at your anonymous access and sigh
684  errorMessage = "P.R.E. RATE LIMITED";
685  }
686  catch (Octokit.AuthorizationException)
687  {
688  errorMessage = "P.R.E. BAD CREDENTIALS";
689  }
690  catch (Octokit.NotFoundException)
691  {
692  // you look at your shithub and sigh
693  errorMessage = "P.R.E. NOT FOUND";
694  }
695 
696  // we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
697  if (I.PullRequestRevision == null && pr != null)
698  I.PullRequestRevision = pr.Head.Sha;
699 
700  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
701 
702  if (!mergeResult.HasValue)
703  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
704 
705  ++doneSteps;
706 
707  var revInfoUpdateTask = UpdateRevInfo();
708 
709  var tm = new Models.TestMerge
710  {
711  Author = pr?.User.Login ?? errorMessage,
712  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
713  MergedAt = DateTimeOffset.Now,
714  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
715  Comment = I.Comment,
716  Number = I.Number,
717  MergedBy = contextUser,
718  PullRequestRevision = I.PullRequestRevision,
719  Url = pr?.HtmlUrl ?? errorMessage
720  };
721 
722  await revInfoUpdateTask.ConfigureAwait(false);
723 
724  lastRevisionInfo.PrimaryTestMerge = tm;
725  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
726  {
727  TestMerge = tm
728  });
729  }
730  }
731  }
732 
733  var currentHead = repo.Head;
734  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
735  {
736  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
737  await UpdateRevInfo().ConfigureAwait(false);
738  }
739 
740  await databaseContext.Save(ct).ConfigureAwait(false);
741  }
742  catch
743  {
744  doneSteps = 0;
745  numSteps = 2;
746 
747  // the stuff didn't make it into the db, forget what we've done and abort
748  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
749  if (startReference != null && repo.Head != startSha)
750  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
751  else
752  progressReporter(100);
753  throw;
754  }
755  }
756  }, cancellationToken).ConfigureAwait(false);
757 
758  api.ActiveJob = job.ToApi();
759  return Accepted(api);
760  }
761  #pragma warning restore CA1502
762  #pragma warning restore CA1505
763  }
764 }
string Name
The name of the User
Definition: User.cs:38
+Go to the documentation of this file.
1 using Microsoft.AspNetCore.Mvc;
2 using Microsoft.EntityFrameworkCore;
3 using Microsoft.Extensions.Logging;
4 using Microsoft.Extensions.Options;
5 using System;
6 using System.Collections.Generic;
7 using System.Globalization;
8 using System.Linq;
9 using System.Linq.Expressions;
10 using System.Net;
11 using System.Reflection;
12 using System.Threading;
13 using System.Threading.Tasks;
14 using Tgstation.Server.Api;
22 
23 namespace Tgstation.Server.Host.Controllers
24 {
28  [Route(Routes.Repository)]
29  #pragma warning disable CA1506 // TODO: Decomplexify
30  public sealed class RepositoryController : ModelController<Repository>
31  {
36 
41 
46 
51 
62  public RepositoryController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, IInstanceManager instanceManager, IGitHubClientFactory gitHubClientFactory, IJobManager jobManager, ILogger<RepositoryController> logger, IOptions<GeneralConfiguration> generalConfigurationOptions) : base(databaseContext, authenticationContextFactory, logger, true)
63  {
64  this.instanceManager = instanceManager ?? throw new ArgumentNullException(nameof(instanceManager));
65  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
66  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
67  generalConfiguration = generalConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(generalConfigurationOptions));
68  }
69 
70  async Task<bool> LoadRevisionInformation(Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, string lastOriginCommitSha, Action<Models.RevisionInformation> revInfoSink, CancellationToken cancellationToken)
71  {
72  var repoSha = repository.Head;
73 
74  IQueryable<Models.RevisionInformation> ApplyQuery(IQueryable<Models.RevisionInformation> query) => query
75  .Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id)
76  .Include(x => x.CompileJobs)
77  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy);
78 
79  var revisionInfo = await ApplyQuery(databaseContext.RevisionInformations).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
80 
81  if (revisionInfo == default)
82  revisionInfo = databaseContext.RevisionInformations.Local.Where(x => x.CommitSha == repoSha && x.Instance.Id == instance.Id).FirstOrDefault();
83 
84  var needsDbUpdate = revisionInfo == default;
85  if (needsDbUpdate)
86  {
87  // needs insertion
88  revisionInfo = new Models.RevisionInformation
89  {
90  Instance = instance,
91  CommitSha = repoSha,
92  CompileJobs = new List<Models.CompileJob>(),
93  ActiveTestMerges = new List<RevInfoTestMerge>() // non null vals for api returns
94  };
95 
96  lock (databaseContext) // cleaner this way
97  databaseContext.RevisionInformations.Add(revisionInfo);
98  }
99 
100  revisionInfo.OriginCommitSha = revisionInfo.OriginCommitSha ?? lastOriginCommitSha;
101  if (revisionInfo.OriginCommitSha == null)
102  {
103  revisionInfo.OriginCommitSha = repoSha;
104  Logger.LogWarning(Components.Repository.Repository.OriginTrackingErrorTemplate, repoSha);
105  }
106 
107  revInfoSink?.Invoke(revisionInfo);
108  return needsDbUpdate;
109  }
110 
111  async Task<bool> PopulateApi(Repository model, Components.Repository.IRepository repository, IDatabaseContext databaseContext, Models.Instance instance, CancellationToken cancellationToken)
112  {
113  if (repository.IsGitHubRepository)
114  {
115  model.GitHubOwner = repository.GitHubOwner;
116  model.GitHubName = repository.GitHubRepoName;
117  }
118 
119  model.Origin = repository.Origin;
120  model.Reference = repository.Reference;
121 
122  // rev info stuff
123  Models.RevisionInformation revisionInfo = null;
124  var needsDbUpdate = await LoadRevisionInformation(repository, databaseContext, instance, null, x => revisionInfo = x, cancellationToken).ConfigureAwait(false);
125  model.RevisionInformation = revisionInfo.ToApi();
126  return needsDbUpdate;
127  }
128 
130  [TgsAuthorize(RepositoryRights.SetOrigin)]
131  public override async Task<IActionResult> Create([FromBody] Repository model, CancellationToken cancellationToken)
132  {
133  if (model == null)
134  throw new ArgumentNullException(nameof(model));
135 
136  if (model.Origin == null)
137  return BadRequest(new ErrorMessage { Message = "Missing repo origin!" });
138 
139  if (model.AccessUser == null ^ model.AccessToken == null)
140  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
141 
142  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
143 
144  if (currentModel == default)
145  return StatusCode((int)HttpStatusCode.Gone);
146 
147  // normalize github urls
148  const string BadGitHubUrl = "://www.github.com/";
149  var uiOrigin = model.Origin.ToUpperInvariant();
150  var uiBad = BadGitHubUrl.ToUpperInvariant();
151  var uiGitHub = Components.Repository.Repository.GitHubUrl.ToUpperInvariant();
152  if (uiOrigin.Contains(uiBad, StringComparison.Ordinal))
153  model.Origin = uiOrigin.Replace(uiBad, uiGitHub, StringComparison.Ordinal);
154 
155  currentModel.AccessToken = model.AccessToken;
156  currentModel.AccessUser = model.AccessUser; // intentionally only these fields, user not allowed to change anything else atm
157  var cloneBranch = model.Reference;
158  var origin = model.Origin;
159 
160  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
161 
162  if (repoManager.CloneInProgress)
163  return Conflict(new ErrorMessage
164  {
165  Message = "A clone operation is in progress!"
166  });
167 
168  if(repoManager.InUse)
169  return Conflict(new ErrorMessage
170  {
171  Message = "The repo is busy!"
172  });
173 
174  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
175  {
176  // clone conflict
177  if (repo != null)
178  return Conflict(new ErrorMessage
179  {
180  Message = "The repository already exists!"
181  });
182 
183  var job = new Models.Job
184  {
185  Description = String.Format(CultureInfo.InvariantCulture, "Clone branch {1} of repository {0}", origin, cloneBranch ?? "master"),
186  StartedBy = AuthenticationContext.User,
187  CancelRightsType = RightsType.Repository,
188  CancelRight = (ulong)RepositoryRights.CancelClone,
190  };
191  var api = currentModel.ToApi();
192  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
193  {
194  using (var repos = await repoManager.CloneRepository(new Uri(origin), cloneBranch, currentModel.AccessUser, currentModel.AccessToken, progressReporter, ct).ConfigureAwait(false))
195  {
196  if (repos == null)
197  throw new JobException("Filesystem conflict while cloning repository!");
198  var instance = new Models.Instance
199  {
200  Id = Instance.Id
201  };
202  databaseContext.Instances.Attach(instance);
203  if (await PopulateApi(api, repos, databaseContext, instance, ct).ConfigureAwait(false))
204  await databaseContext.Save(ct).ConfigureAwait(false);
205  }
206  }, cancellationToken).ConfigureAwait(false);
207 
208  api.Origin = model.Origin;
209  api.Reference = model.Reference;
210  api.ActiveJob = job.ToApi();
211 
212  return StatusCode((int)HttpStatusCode.Created, api);
213  }
214  }
215 
221  [TgsAuthorize(RepositoryRights.Delete)]
222  public async Task<IActionResult> Delete(CancellationToken cancellationToken)
223  {
224  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
225 
226  if (currentModel == default)
227  return StatusCode((int)HttpStatusCode.Gone);
228 
229  currentModel.AccessToken = null;
230  currentModel.AccessUser = null;
231 
232  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
233 
234  Logger.LogInformation("Instance {0} repository delete initiated by user {1}", Instance.Id, AuthenticationContext.User.Id);
235 
236  var job = new Models.Job
237  {
238  Description = "Delete repository",
239  StartedBy = AuthenticationContext.User,
241  };
242  var api = currentModel.ToApi();
243  await jobManager.RegisterOperation(job, (paramJob, databaseContext, progressReporter, ct) => instanceManager.GetInstance(Instance).RepositoryManager.DeleteRepository(cancellationToken), cancellationToken).ConfigureAwait(false);
244  api.ActiveJob = job.ToApi();
245  return Accepted(api);
246  }
247 
249  [TgsAuthorize(RepositoryRights.Read)]
250  public override async Task<IActionResult> Read(CancellationToken cancellationToken)
251  {
252  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
253 
254  if (currentModel == default)
255  return StatusCode((int)HttpStatusCode.Gone);
256 
257  var api = currentModel.ToApi();
258  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
259 
260  if (repoManager.CloneInProgress)
261  return Conflict(new ErrorMessage
262  {
263  Message = "A clone operation is in progress!"
264  });
265 
266  if (repoManager.InUse)
267  return Conflict(new ErrorMessage
268  {
269  Message = "The repo is busy!"
270  });
271 
272  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
273  {
274  if (repo != null && await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false))
275  {
276  // user may have fucked with the repo without telling us, do what we can
277  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
278  return StatusCode((int)HttpStatusCode.Created, api);
279  }
280 
281  return Json(api);
282  }
283  }
284 
286  [TgsAuthorize(RepositoryRights.ChangeAutoUpdateSettings | RepositoryRights.ChangeCommitter | RepositoryRights.ChangeCredentials | RepositoryRights.ChangeTestMergeCommits | RepositoryRights.MergePullRequest | RepositoryRights.SetReference | RepositoryRights.SetSha | RepositoryRights.UpdateBranch)]
287  #pragma warning disable CA1502 // TODO: Decomplexify
288  #pragma warning disable CA1505
289  public override async Task<IActionResult> Update([FromBody]Repository model, CancellationToken cancellationToken)
290  {
291  if (model == null)
292  throw new ArgumentNullException(nameof(model));
293 
294  if (model.AccessUser == null ^ model.AccessToken == null)
295  return BadRequest(new ErrorMessage { Message = "Either both accessToken and accessUser must be present or neither!" });
296 
297  if (model.CheckoutSha != null && model.Reference != null)
298  return BadRequest(new ErrorMessage { Message = "Only one of sha or reference may be specified!" });
299 
300  if (model.CheckoutSha != null && model.UpdateFromOrigin == true)
301  return BadRequest(new ErrorMessage { Message = "Cannot update a reference when checking out a sha!" });
302 
303  if (model.Origin != null)
304  return BadRequest(new ErrorMessage { Message = "origin cannot be modified without deleting the repository!" });
305 
306  if (model.NewTestMerges?.Any(x => !x.Number.HasValue) == true)
307  return BadRequest(new ErrorMessage { Message = "All new test merges must provide a number!" });
308 
309  if (model.NewTestMerges?.Any(x => model.NewTestMerges.Any(y => x != y && x.Number == y.Number)) == true)
310  return BadRequest(new ErrorMessage { Message = "Cannot test merge the same PR twice in one job!" });
311 
312  if (model.CommitterName?.Length == 0)
313  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer name!" });
314 
315  if (model.CommitterEmail?.Length == 0)
316  return BadRequest(new ErrorMessage { Message = "Cannot set empty committer e=mail!" });
317 
318  var newTestMerges = model.NewTestMerges != null && model.NewTestMerges.Count > 0;
319  var userRights = (RepositoryRights)AuthenticationContext.GetRight(RightsType.Repository);
320  if (newTestMerges && !userRights.HasFlag(RepositoryRights.MergePullRequest))
321  return Forbid();
322 
323  var currentModel = await DatabaseContext.RepositorySettings.Where(x => x.InstanceId == Instance.Id).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
324 
325  if (currentModel == default)
326  return StatusCode((int)HttpStatusCode.Gone);
327 
328  bool CheckModified<T>(Expression<Func<Api.Models.Internal.RepositorySettings, T>> expression, RepositoryRights requiredRight)
329  {
330  var memberSelectorExpression = (MemberExpression)expression.Body;
331  var property = (PropertyInfo)memberSelectorExpression.Member;
332 
333  var newVal = property.GetValue(model);
334  if (newVal == null)
335  return false;
336  if (!userRights.HasFlag(requiredRight) && property.GetValue(currentModel) != newVal)
337  return true;
338 
339  property.SetValue(currentModel, newVal);
340  return false;
341  }
342 
343  if (CheckModified(x => x.AccessToken, RepositoryRights.ChangeCredentials)
344  || CheckModified(x => x.AccessUser, RepositoryRights.ChangeCredentials)
345  || CheckModified(x => x.AutoUpdatesKeepTestMerges, RepositoryRights.ChangeAutoUpdateSettings)
346  || CheckModified(x => x.AutoUpdatesSynchronize, RepositoryRights.ChangeAutoUpdateSettings)
347  || CheckModified(x => x.CommitterEmail, RepositoryRights.ChangeCommitter)
348  || CheckModified(x => x.CommitterName, RepositoryRights.ChangeCommitter)
349  || CheckModified(x => x.PushTestMergeCommits, RepositoryRights.ChangeTestMergeCommits)
350  || CheckModified(x => x.ShowTestMergeCommitters, RepositoryRights.ChangeTestMergeCommits)
351  || CheckModified(x => x.PostTestMergeComment, RepositoryRights.ChangeTestMergeCommits)
352  || (model.UpdateFromOrigin == true && !userRights.HasFlag(RepositoryRights.UpdateBranch)))
353  return Forbid();
354 
355  if (currentModel.AccessToken?.Length == 0 && currentModel.AccessUser?.Length == 0)
356  {
357  // setting an empty string clears everything
358  currentModel.AccessUser = null;
359  currentModel.AccessToken = null;
360  }
361 
362  var canRead = userRights.HasFlag(RepositoryRights.Read);
363 
364  var api = canRead ? currentModel.ToApi() : new Repository();
365  var repoManager = instanceManager.GetInstance(Instance).RepositoryManager;
366 
367  if (canRead)
368  {
369  if (repoManager.CloneInProgress)
370  return Conflict(new ErrorMessage
371  {
372  Message = "A clone operation is in progress!"
373  });
374 
375  if (repoManager.InUse)
376  return Conflict(new ErrorMessage
377  {
378  Message = "The repo is busy!"
379  });
380 
381  using (var repo = await repoManager.LoadRepository(cancellationToken).ConfigureAwait(false))
382  {
383  if (repo == null)
384  return Conflict(new ErrorMessage
385  {
386  Message = "Repository could not be loaded!"
387  });
388  await PopulateApi(api, repo, DatabaseContext, Instance, cancellationToken).ConfigureAwait(false);
389  }
390  }
391 
392  // this is just db stuf so stow it away
393  await DatabaseContext.Save(cancellationToken).ConfigureAwait(false);
394 
395  // format the job description
396  string description = null;
397  if (model.UpdateFromOrigin == true)
398  if (model.Reference != null)
399  description = String.Format(CultureInfo.InvariantCulture, "Fetch and hard reset repository to origin/{0}", model.Reference);
400  else if (model.CheckoutSha != null)
401  description = String.Format(CultureInfo.InvariantCulture, "Fetch and checkout {0} in repository", model.CheckoutSha);
402  else
403  description = "Pull current repository reference";
404  else if (model.Reference != null || model.CheckoutSha != null)
405  description = String.Format(CultureInfo.InvariantCulture, "Checkout repository {0} {1}", model.Reference != null ? "reference" : "SHA", model.Reference ?? model.CheckoutSha);
406 
407  if (newTestMerges)
408  description = String.Format(CultureInfo.InvariantCulture, "{0}est merge pull request(s) {1}{2}",
409  description != null ? String.Format(CultureInfo.InvariantCulture, "{0} and t", description) : "T",
410  String.Join(", ", model.NewTestMerges.Select(x =>
411  String.Format(CultureInfo.InvariantCulture, "#{0}{1}", x.Number,
412  x.PullRequestRevision != null ? String.Format(CultureInfo.InvariantCulture, " at {0}", x.PullRequestRevision.Substring(0, 7)) : String.Empty))),
413  description != null ? String.Empty : " in repository");
414 
415  if (description == null)
416  return Json(api); // no git changes
417 
418  var job = new Models.Job
419  {
420  Description = description,
421  StartedBy = AuthenticationContext.User,
422  Instance = Instance,
423  CancelRightsType = RightsType.Repository,
424  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
425  };
426 
427  await jobManager.RegisterOperation(job, async (paramJob, databaseContext, progressReporter, ct) =>
428  {
429  using (var repo = await repoManager.LoadRepository(ct).ConfigureAwait(false))
430  {
431  if (repo == null)
432  throw new JobException("Repository could not be loaded!");
433 
434  var modelHasShaOrReference = model.CheckoutSha != null || model.Reference != null;
435 
436  var startReference = repo.Reference;
437  var startSha = repo.Head;
438  string postUpdateSha = null;
439 
440  if (newTestMerges && !repo.IsGitHubRepository)
441  throw new JobException("Cannot test merge on a non GitHub based repository!");
442 
443  var committerName = currentModel.ShowTestMergeCommitters.Value ? AuthenticationContext.User.Name : currentModel.CommitterName;
444 
445  var hardResettingToOriginReference = model.UpdateFromOrigin == true && model.Reference != null;
446 
447  var numSteps = (model.NewTestMerges?.Count ?? 0) + (model.UpdateFromOrigin == true ? 1 : 0) + (!modelHasShaOrReference ? 2 : (hardResettingToOriginReference ? 3 : 1));
448  var doneSteps = 0;
449 
450  Action<int> NextProgressReporter()
451  {
452  var tmpDoneSteps = doneSteps;
453  ++doneSteps;
454  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / numSteps);
455  }
456 
457  progressReporter(0);
458 
459  // get a base line for where we are
460  Models.RevisionInformation lastRevisionInfo = null;
461 
462  var attachedInstance = new Models.Instance
463  {
464  Id = Instance.Id
465  };
466  databaseContext.Instances.Attach(attachedInstance);
467 
468  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
469 
470  // apply new rev info, tracking applied test merges
471  async Task UpdateRevInfo()
472  {
473  var last = lastRevisionInfo;
474  await LoadRevisionInformation(repo, databaseContext, attachedInstance, last.OriginCommitSha, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
475  lastRevisionInfo.ActiveTestMerges.AddRange(last.ActiveTestMerges);
476  }
477 
478  try
479  {
480  // fetch/pull
481  if (model.UpdateFromOrigin == true)
482  {
483  if (!repo.Tracking)
484  throw new JobException("Not on an updatable reference!");
485  await repo.FetchOrigin(currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
486  doneSteps = 1;
487  if (!modelHasShaOrReference)
488  {
489  var fastForward = await repo.MergeOrigin(committerName, currentModel.CommitterEmail, NextProgressReporter(), ct).ConfigureAwait(false);
490  if (!fastForward.HasValue)
491  throw new JobException("Merge conflict occurred during origin update!");
492  await UpdateRevInfo().ConfigureAwait(false);
493  if (fastForward.Value)
494  {
495  lastRevisionInfo.OriginCommitSha = repo.Head;
496  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
497  postUpdateSha = repo.Head;
498  }
499  else
500  NextProgressReporter()(100);
501  }
502  }
503 
504  // checkout/hard reset
505  if (modelHasShaOrReference)
506  {
507  if ((model.CheckoutSha != null && repo.Head.ToUpperInvariant().StartsWith(model.CheckoutSha.ToUpperInvariant(), StringComparison.Ordinal))
508  || (model.Reference != null && repo.Reference.ToUpperInvariant() != model.Reference.ToUpperInvariant()))
509  {
510  var committish = model.CheckoutSha ?? model.Reference;
511  var isSha = await repo.IsSha(committish, cancellationToken).ConfigureAwait(false);
512 
513  if ((isSha && model.Reference != null) || (!isSha && model.CheckoutSha != null))
514  throw new JobException("Attempted to checkout a SHA or reference that was actually the opposite!");
515 
516  await repo.CheckoutObject(committish, NextProgressReporter(), ct).ConfigureAwait(false);
517  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false); // we've either seen origin before or what we're checking out is on origin
518  }
519  else
520  NextProgressReporter()(100);
521 
522  if (hardResettingToOriginReference)
523  {
524  if (!repo.Tracking)
525  throw new JobException("Checked out reference does not track a remote object!");
526  await repo.ResetToOrigin(NextProgressReporter(), ct).ConfigureAwait(false);
527  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), true, ct).ConfigureAwait(false);
528  await LoadRevisionInformation(repo, databaseContext, attachedInstance, null, x => lastRevisionInfo = x, ct).ConfigureAwait(false);
529 
530  // repo head is on origin so force this
531  // will update the db if necessary
532  lastRevisionInfo.OriginCommitSha = repo.Head;
533  }
534  }
535 
536  // test merging
537  Dictionary<int, Octokit.PullRequest> prMap = null;
538  if (newTestMerges)
539  {
540  // bit of sanitization
541  foreach (var I in model.NewTestMerges.Where(x => String.IsNullOrWhiteSpace(x.PullRequestRevision)))
542  I.PullRequestRevision = null;
543 
544  var gitHubClient = currentModel.AccessToken != null
545  ? gitHubClientFactory.CreateClient(currentModel.AccessToken)
546  : (String.IsNullOrEmpty(generalConfiguration.GitHubAccessToken)
547  ? gitHubClientFactory.CreateClient()
548  : gitHubClientFactory.CreateClient(generalConfiguration.GitHubAccessToken));
549 
550  var repoOwner = repo.GitHubOwner;
551  var repoName = repo.GitHubRepoName;
552 
553  // optimization: if we've already merged these exact same commits in this fashion before, just find the rev info for it and check it out
554  Models.RevisionInformation revInfoWereLookingFor = null;
555  bool needToApplyRemainingPrs = true;
556  if (lastRevisionInfo.OriginCommitSha == lastRevisionInfo.CommitSha)
557  {
558  // In order for this to work though we need the shas of all the commits
559  if (model.NewTestMerges.Any(x => x.PullRequestRevision == null))
560  prMap = new Dictionary<int, Octokit.PullRequest>();
561 
562  bool cantSearch = false;
563  foreach (var I in model.NewTestMerges)
564  {
565  if (I.PullRequestRevision != null)
566 #pragma warning disable CA1308 // Normalize strings to uppercase
567  I.PullRequestRevision = I.PullRequestRevision?.ToLowerInvariant(); // ala libgit2
568 #pragma warning restore CA1308 // Normalize strings to uppercase
569  else
570  try
571  {
572  // retrieve the latest sha
573  var pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
574  prMap.Add(I.Number.Value, pr);
575  I.PullRequestRevision = pr.Head.Sha;
576  }
577  catch
578  {
579  cantSearch = true;
580  break;
581  }
582  }
583 
584  if (!cantSearch)
585  {
586  var dbPull = await databaseContext.RevisionInformations
587  .Where(x => x.Instance.Id == Instance.Id
588  && x.OriginCommitSha == lastRevisionInfo.OriginCommitSha
589  && x.ActiveTestMerges.Count <= model.NewTestMerges.Count
590  && x.ActiveTestMerges.Count > 0)
591  .Include(x => x.ActiveTestMerges)
592  .ThenInclude(x => x.TestMerge)
593  .ToListAsync(cancellationToken).ConfigureAwait(false);
594 
595  // split here cause this bit has to be done locally
596  revInfoWereLookingFor = dbPull
597  .Where(x => x.ActiveTestMerges.Count == model.NewTestMerges.Count
598  && x.ActiveTestMerges.Select(y => y.TestMerge)
599  .All(y => model.NewTestMerges.Any(z =>
600  y.Number == z.Number
601  && y.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
602  && (y.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))))
603  .FirstOrDefault();
604 
605  if (revInfoWereLookingFor == null && model.NewTestMerges.Count > 1)
606  {
607  // okay try to add at least SOME prs we've seen before
608  var search = model.NewTestMerges.ToList();
609 
610  var appliedTestMergeIds = new List<long>();
611 
612  Models.RevisionInformation lastGoodRevInfo = null;
613  do
614  {
615  foreach (var I in search)
616  {
617  revInfoWereLookingFor = dbPull
618  .Where(x => model.NewTestMerges.Any(z =>
619  x.PrimaryTestMerge.Number == z.Number
620  && x.PrimaryTestMerge.PullRequestRevision.StartsWith(z.PullRequestRevision, StringComparison.Ordinal)
621  && (x.PrimaryTestMerge.Comment?.Trim().ToUpperInvariant() == z.Comment?.Trim().ToUpperInvariant() || z.Comment == null))
622  && x.ActiveTestMerges.Select(y => y.TestMerge).All(y => appliedTestMergeIds.Contains(y.Id)))
623  .FirstOrDefault();
624 
625  if (revInfoWereLookingFor != null)
626  {
627  lastGoodRevInfo = revInfoWereLookingFor;
628  appliedTestMergeIds.Add(revInfoWereLookingFor.PrimaryTestMerge.Id);
629  search.Remove(I);
630  break;
631  }
632  }
633  }
634  while (revInfoWereLookingFor != null && search.Count > 0);
635 
636  revInfoWereLookingFor = lastGoodRevInfo;
637  needToApplyRemainingPrs = search.Count != 0;
638  if (needToApplyRemainingPrs)
639  model.NewTestMerges = search;
640  }
641  else if (revInfoWereLookingFor != null)
642  needToApplyRemainingPrs = false;
643  }
644  }
645 
646  if (revInfoWereLookingFor != null)
647  {
648  // goteem
649  await repo.ResetToSha(revInfoWereLookingFor.CommitSha, NextProgressReporter(), cancellationToken).ConfigureAwait(false);
650  lastRevisionInfo = revInfoWereLookingFor;
651  }
652 
653  if (needToApplyRemainingPrs)
654  {
655  // an invocation of LoadRevisionInformation could have already loaded this user
656  var contextUser = databaseContext.Users.Local.Where(x => x.Id == AuthenticationContext.User.Id).FirstOrDefault();
657  if (contextUser == default)
658  {
659  contextUser = new Models.User
660  {
662  };
663  databaseContext.Users.Attach(contextUser);
664  }
665  else
666  Logger.LogTrace("Skipping attaching the user to the database context as it is already loaded!");
667 
668  foreach (var I in model.NewTestMerges)
669  {
670  Octokit.PullRequest pr = null;
671  string errorMessage = null;
672 
673  if (lastRevisionInfo.ActiveTestMerges.Any(x => x.TestMerge.Number == I.Number.Value))
674  throw new JobException("Cannot test merge the same PR twice in one HEAD!");
675 
676  try
677  {
678  // load from cache if possible
679  if (prMap == null || !prMap.TryGetValue(I.Number.Value, out pr))
680  pr = await gitHubClient.PullRequest.Get(repoOwner, repoName, I.Number.Value).ConfigureAwait(false);
681  }
682  catch (Octokit.RateLimitExceededException)
683  {
684  // you look at your anonymous access and sigh
685  errorMessage = "P.R.E. RATE LIMITED";
686  }
687  catch (Octokit.AuthorizationException)
688  {
689  errorMessage = "P.R.E. BAD CREDENTIALS";
690  }
691  catch (Octokit.NotFoundException)
692  {
693  // you look at your shithub and sigh
694  errorMessage = "P.R.E. NOT FOUND";
695  }
696 
697  // we want to take the earliest truth possible to prevent RCEs, if this fails AddTestMerge will set it
698  if (I.PullRequestRevision == null && pr != null)
699  I.PullRequestRevision = pr.Head.Sha;
700 
701  var mergeResult = await repo.AddTestMerge(I, committerName, currentModel.CommitterEmail, currentModel.AccessUser, currentModel.AccessToken, NextProgressReporter(), ct).ConfigureAwait(false);
702 
703  if (!mergeResult.HasValue)
704  throw new JobException(String.Format(CultureInfo.InvariantCulture, "Merge of PR #{0} at {1} conflicted!", I.Number, I.PullRequestRevision.Substring(0, 7)));
705 
706  ++doneSteps;
707 
708  var revInfoUpdateTask = UpdateRevInfo();
709 
710  var tm = new Models.TestMerge
711  {
712  Author = pr?.User.Login ?? errorMessage,
713  BodyAtMerge = pr?.Body ?? errorMessage ?? String.Empty,
714  MergedAt = DateTimeOffset.Now,
715  TitleAtMerge = pr?.Title ?? errorMessage ?? String.Empty,
716  Comment = I.Comment,
717  Number = I.Number,
718  MergedBy = contextUser,
719  PullRequestRevision = I.PullRequestRevision,
720  Url = pr?.HtmlUrl ?? errorMessage
721  };
722 
723  await revInfoUpdateTask.ConfigureAwait(false);
724 
725  lastRevisionInfo.PrimaryTestMerge = tm;
726  lastRevisionInfo.ActiveTestMerges.Add(new RevInfoTestMerge
727  {
728  TestMerge = tm
729  });
730  }
731  }
732  }
733 
734  var currentHead = repo.Head;
735  if (startSha != currentHead || (postUpdateSha != null && postUpdateSha != currentHead))
736  {
737  await repo.Sychronize(currentModel.AccessUser, currentModel.AccessToken, currentModel.CommitterName, currentModel.CommitterEmail, NextProgressReporter(), false, ct).ConfigureAwait(false);
738  await UpdateRevInfo().ConfigureAwait(false);
739  }
740 
741  await databaseContext.Save(ct).ConfigureAwait(false);
742  }
743  catch
744  {
745  doneSteps = 0;
746  numSteps = 2;
747 
748  // the stuff didn't make it into the db, forget what we've done and abort
749  await repo.CheckoutObject(startReference ?? startSha, NextProgressReporter(), default).ConfigureAwait(false);
750  if (startReference != null && repo.Head != startSha)
751  await repo.ResetToSha(startSha, NextProgressReporter(), default).ConfigureAwait(false);
752  else
753  progressReporter(100);
754  throw;
755  }
756  }
757  }, cancellationToken).ConfigureAwait(false);
758 
759  api.ActiveJob = job.ToApi();
760  return Accepted(api);
761  }
762  #pragma warning restore CA1502
763  #pragma warning restore CA1505
764  }
765 }
string Name
The name of the User
Definition: User.cs:38
Manages the runtime of Jobs
Definition: IJobManager.cs:12
@@ -122,8 +122,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Represents a git repository
Definition: Repository.cs:8
const string Repository
The Models.Repository controller
Definition: Routes.cs:39
RevisionInformation RevisionInformation
The current Models.RevisionInformation for the Repository
Definition: Repository.cs:23
- -
DbSet< RepositorySettings > RepositorySettings
+ +
DbSet< RepositorySettings > RepositorySettings
RepositoryRights
Rights for a Models.Repository
long Id
The id of the Instance. Not modifiable
Definition: Instance.cs:14
readonly IGitHubClientFactory gitHubClientFactory
The IGitHubClientFactory for the RepositoryController
diff --git a/_repository_rights_8cs_source.html b/_repository_rights_8cs_source.html index e401289d14..b79c56c617 100644 --- a/_repository_rights_8cs_source.html +++ b/_repository_rights_8cs_source.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
User may fetch and merge GitHub pull requests
-
User may change Models.Internal.RepositorySettings.PushTestMergeCommits
+
User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models.Internal.RepositorySettings.PostTestMergeComment
diff --git a/_sql_server_database_context_8cs_source.html b/_sql_server_database_context_8cs_source.html index e145b493ca..a4e7d5e31c 100644 --- a/_sql_server_database_context_8cs_source.html +++ b/_sql_server_database_context_8cs_source.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
DatabaseContext<TParentContext> for Sqlserver
SqlServerDatabaseContext(DbContextOptions< SqlServerDatabaseContext > dbContextOptions, IOptions< DatabaseConfiguration > databaseConfiguration, IDatabaseSeeder databaseSeeder, ILogger< SqlServerDatabaseContext > logger)
Construct a SqlServerDatabaseContext
- +
Configuration options for the Models.DatabaseContext<TParentContext>
diff --git a/_sql_server_database_context_model_snapshot_8cs_source.html b/_sql_server_database_context_model_snapshot_8cs_source.html index 41d490a592..f552fd6ccd 100644 --- a/_sql_server_database_context_model_snapshot_8cs_source.html +++ b/_sql_server_database_context_model_snapshot_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
SqlServerDatabaseContextModelSnapshot.cs
-Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
9 namespace Tgstation.Server.Host.Models.Migrations
10 {
13  {
14  protected override void BuildModel(ModelBuilder modelBuilder)
15  {
16 #pragma warning disable 612, 618
17  modelBuilder
18  .HasAnnotation("ProductVersion", "2.1.3-rtm-32065")
19  .HasAnnotation("Relational:MaxIdentifierLength", 128)
20  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
21 
22  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
23  {
24  b.Property<long>("Id")
25  .ValueGeneratedOnAdd()
26  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
27 
28  b.Property<string>("ConnectionString")
29  .IsRequired();
30 
31  b.Property<bool?>("Enabled");
32 
33  b.Property<long>("InstanceId");
34 
35  b.Property<string>("Name")
36  .IsRequired();
37 
38  b.Property<int?>("Provider");
39 
40  b.HasKey("Id");
41 
42  b.HasIndex("InstanceId");
43 
44  b.HasIndex("Name")
45  .IsUnique();
46 
47  b.ToTable("ChatBots");
48  });
49 
50  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
51  {
52  b.Property<long>("Id")
53  .ValueGeneratedOnAdd()
54  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<decimal?>("DiscordChannelId")
59  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
60 
61  b.Property<string>("IrcChannel");
62 
63  b.Property<bool?>("IsAdminChannel")
64  .IsRequired();
65 
66  b.Property<bool?>("IsUpdatesChannel")
67  .IsRequired();
68 
69  b.Property<bool?>("IsWatchdogChannel")
70  .IsRequired();
71 
72  b.Property<string>("Tag");
73 
74  b.HasKey("Id");
75 
76  b.HasIndex("ChatSettingsId", "DiscordChannelId")
77  .IsUnique()
78  .HasFilter("[DiscordChannelId] IS NOT NULL");
79 
80  b.HasIndex("ChatSettingsId", "IrcChannel")
81  .IsUnique()
82  .HasFilter("[IrcChannel] IS NOT NULL");
83 
84  b.ToTable("ChatChannels");
85  });
86 
87  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
88  {
89  b.Property<long>("Id")
90  .ValueGeneratedOnAdd()
91  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
92 
93  b.Property<string>("ByondVersion")
94  .IsRequired();
95 
96  b.Property<Guid?>("DirectoryName")
97  .IsRequired();
98 
99  b.Property<string>("DmeName")
100  .IsRequired();
101 
102  b.Property<long>("JobId");
103 
104  b.Property<int>("MinimumSecurityLevel");
105 
106  b.Property<string>("Output")
107  .IsRequired();
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId")
116  .IsUnique();
117 
118  b.HasIndex("RevisionInformationId");
119 
120  b.ToTable("CompileJobs");
121  });
122 
123  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
124  {
125  b.Property<long>("Id")
126  .ValueGeneratedOnAdd()
127  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
128 
129  b.Property<string>("AccessToken");
130 
131  b.Property<bool?>("AllowWebClient")
132  .IsRequired();
133 
134  b.Property<bool?>("AutoStart")
135  .IsRequired();
136 
137  b.Property<long>("InstanceId");
138 
139  b.Property<int>("PrimaryPort");
140 
141  b.Property<int?>("ProcessId");
142 
143  b.Property<int>("SecondaryPort");
144 
145  b.Property<int>("SecurityLevel");
146 
147  b.Property<bool?>("SoftRestart")
148  .IsRequired();
149 
150  b.Property<bool?>("SoftShutdown")
151  .IsRequired();
152 
153  b.Property<long>("StartupTimeout");
154 
155  b.HasKey("Id");
156 
157  b.HasIndex("InstanceId")
158  .IsUnique();
159 
160  b.ToTable("DreamDaemonSettings");
161  });
162 
163  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
164  {
165  b.Property<long>("Id")
166  .ValueGeneratedOnAdd()
167  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
168 
169  b.Property<int>("ApiValidationPort");
170 
171  b.Property<int>("ApiValidationSecurityLevel");
172 
173  b.Property<long>("InstanceId");
174 
175  b.Property<string>("ProjectName");
176 
177  b.HasKey("Id");
178 
179  b.HasIndex("InstanceId")
180  .IsUnique();
181 
182  b.ToTable("DreamMakerSettings");
183  });
184 
185  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
186  {
187  b.Property<long>("Id")
188  .ValueGeneratedOnAdd()
189  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
190 
191  b.Property<long>("AutoUpdateInterval");
192 
193  b.Property<int>("ConfigurationType");
194 
195  b.Property<string>("Name")
196  .IsRequired();
197 
198  b.Property<bool?>("Online")
199  .IsRequired();
200 
201  b.Property<string>("Path")
202  .IsRequired();
203 
204  b.HasKey("Id");
205 
206  b.HasIndex("Path")
207  .IsUnique();
208 
209  b.ToTable("Instances");
210  });
211 
212  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
213  {
214  b.Property<long>("Id")
215  .ValueGeneratedOnAdd()
216  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
217 
218  b.Property<decimal>("ByondRights")
219  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
220 
221  b.Property<decimal>("ChatBotRights")
222  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
223 
224  b.Property<decimal>("ConfigurationRights")
225  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
226 
227  b.Property<decimal>("DreamDaemonRights")
228  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
229 
230  b.Property<decimal>("DreamMakerRights")
231  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
232 
233  b.Property<long>("InstanceId");
234 
235  b.Property<decimal>("InstanceUserRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<decimal>("RepositoryRights")
239  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
240 
241  b.Property<long?>("UserId")
242  .IsRequired();
243 
244  b.HasKey("Id");
245 
246  b.HasIndex("InstanceId");
247 
248  b.HasIndex("UserId", "InstanceId")
249  .IsUnique();
250 
251  b.ToTable("InstanceUsers");
252  });
253 
254  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
255  {
256  b.Property<long>("Id")
257  .ValueGeneratedOnAdd()
258  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
259 
260  b.Property<decimal?>("CancelRight")
261  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
262 
263  b.Property<decimal?>("CancelRightsType")
264  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
265 
266  b.Property<bool?>("Cancelled")
267  .IsRequired();
268 
269  b.Property<long?>("CancelledById");
270 
271  b.Property<string>("Description")
272  .IsRequired();
273 
274  b.Property<string>("ExceptionDetails");
275 
276  b.Property<long>("InstanceId");
277 
278  b.Property<DateTimeOffset?>("StartedAt")
279  .IsRequired();
280 
281  b.Property<long>("StartedById");
282 
283  b.Property<DateTimeOffset?>("StoppedAt");
284 
285  b.HasKey("Id");
286 
287  b.HasIndex("CancelledById");
288 
289  b.HasIndex("InstanceId");
290 
291  b.HasIndex("StartedById");
292 
293  b.ToTable("Jobs");
294  });
295 
296  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
297  {
298  b.Property<long>("Id")
299  .ValueGeneratedOnAdd()
300  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
301 
302  b.Property<string>("AccessIdentifier")
303  .IsRequired();
304 
305  b.Property<string>("ChatChannelsJson")
306  .IsRequired();
307 
308  b.Property<string>("ChatCommandsJson")
309  .IsRequired();
310 
311  b.Property<long>("CompileJobId");
312 
313  b.Property<bool>("IsPrimary");
314 
315  b.Property<int>("Port");
316 
317  b.Property<int>("ProcessId");
318 
319  b.Property<int>("RebootState");
320 
321  b.Property<string>("ServerCommandsJson")
322  .IsRequired();
323 
324  b.HasKey("Id");
325 
326  b.HasIndex("CompileJobId");
327 
328  b.ToTable("ReattachInformations");
329  });
330 
331  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
332  {
333  b.Property<long>("Id")
334  .ValueGeneratedOnAdd()
335  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
336 
337  b.Property<string>("AccessToken");
338 
339  b.Property<string>("AccessUser");
340 
341  b.Property<bool?>("AutoUpdatesKeepTestMerges")
342  .IsRequired();
343 
344  b.Property<bool?>("AutoUpdatesSynchronize")
345  .IsRequired();
346 
347  b.Property<string>("CommitterEmail")
348  .IsRequired();
349 
350  b.Property<string>("CommitterName")
351  .IsRequired();
352 
353  b.Property<long>("InstanceId");
354 
355  b.Property<bool?>("PushTestMergeCommits")
356  .IsRequired();
357 
358  b.Property<bool?>("ShowTestMergeCommitters")
359  .IsRequired();
360 
361  b.HasKey("Id");
362 
363  b.HasIndex("InstanceId")
364  .IsUnique();
365 
366  b.ToTable("RepositorySettings");
367  });
368 
369  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
370  {
371  b.Property<long>("Id")
372  .ValueGeneratedOnAdd()
373  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
374 
375  b.Property<long>("RevisionInformationId");
376 
377  b.Property<long>("TestMergeId");
378 
379  b.HasKey("Id");
380 
381  b.HasIndex("RevisionInformationId");
382 
383  b.HasIndex("TestMergeId");
384 
385  b.ToTable("RevInfoTestMerges");
386  });
387 
388  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
389  {
390  b.Property<long>("Id")
391  .ValueGeneratedOnAdd()
392  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
393 
394  b.Property<string>("CommitSha")
395  .IsRequired()
396  .HasMaxLength(40);
397 
398  b.Property<long>("InstanceId");
399 
400  b.Property<string>("OriginCommitSha")
401  .IsRequired()
402  .HasMaxLength(40);
403 
404  b.HasKey("Id");
405 
406  b.HasIndex("CommitSha")
407  .IsUnique();
408 
409  b.HasIndex("InstanceId");
410 
411  b.ToTable("RevisionInformations");
412  });
413 
414  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
415  {
416  b.Property<long>("Id")
417  .ValueGeneratedOnAdd()
418  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
419 
420  b.Property<string>("Author")
421  .IsRequired();
422 
423  b.Property<string>("BodyAtMerge")
424  .IsRequired();
425 
426  b.Property<string>("Comment");
427 
428  b.Property<DateTimeOffset>("MergedAt");
429 
430  b.Property<long>("MergedById");
431 
432  b.Property<int?>("Number")
433  .IsRequired();
434 
435  b.Property<long?>("PrimaryRevisionInformationId")
436  .IsRequired();
437 
438  b.Property<string>("PullRequestRevision")
439  .IsRequired();
440 
441  b.Property<string>("TitleAtMerge")
442  .IsRequired();
443 
444  b.Property<string>("Url")
445  .IsRequired();
446 
447  b.HasKey("Id");
448 
449  b.HasIndex("MergedById");
450 
451  b.HasIndex("PrimaryRevisionInformationId")
452  .IsUnique();
453 
454  b.ToTable("TestMerges");
455  });
456 
457  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
458  {
459  b.Property<long>("Id")
460  .ValueGeneratedOnAdd()
461  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
462 
463  b.Property<decimal>("AdministrationRights")
464  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
465 
466  b.Property<string>("CanonicalName")
467  .IsRequired();
468 
469  b.Property<DateTimeOffset?>("CreatedAt")
470  .IsRequired();
471 
472  b.Property<long?>("CreatedById");
473 
474  b.Property<bool?>("Enabled")
475  .IsRequired();
476 
477  b.Property<decimal>("InstanceManagerRights")
478  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
479 
480  b.Property<DateTimeOffset?>("LastPasswordUpdate");
481 
482  b.Property<string>("Name")
483  .IsRequired();
484 
485  b.Property<string>("PasswordHash");
486 
487  b.Property<string>("SystemIdentifier");
488 
489  b.HasKey("Id");
490 
491  b.HasIndex("CanonicalName")
492  .IsUnique();
493 
494  b.HasIndex("CreatedById");
495 
496  b.ToTable("Users");
497  });
498 
499  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
500  {
501  b.Property<long>("Id")
502  .ValueGeneratedOnAdd()
503  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
504 
505  b.Property<long?>("AlphaId");
506 
507  b.Property<bool>("AlphaIsActive");
508 
509  b.Property<long?>("BravoId");
510 
511  b.Property<long>("InstanceId");
512 
513  b.HasKey("Id");
514 
515  b.HasIndex("AlphaId");
516 
517  b.HasIndex("BravoId");
518 
519  b.HasIndex("InstanceId")
520  .IsUnique();
521 
522  b.ToTable("WatchdogReattachInformations");
523  });
524 
525  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
526  {
527  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
528  .WithMany("ChatSettings")
529  .HasForeignKey("InstanceId")
530  .OnDelete(DeleteBehavior.Cascade);
531  });
532 
533  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
534  {
535  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
536  .WithMany("Channels")
537  .HasForeignKey("ChatSettingsId")
538  .OnDelete(DeleteBehavior.Cascade);
539  });
540 
541  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
542  {
543  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
544  .WithOne()
545  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
546  .OnDelete(DeleteBehavior.Restrict);
547 
548  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
549  .WithMany("CompileJobs")
550  .HasForeignKey("RevisionInformationId")
551  .OnDelete(DeleteBehavior.Cascade);
552  });
553 
554  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
555  {
556  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
557  .WithOne("DreamDaemonSettings")
558  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
559  .OnDelete(DeleteBehavior.Cascade);
560  });
561 
562  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
563  {
564  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
565  .WithOne("DreamMakerSettings")
566  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
567  .OnDelete(DeleteBehavior.Cascade);
568  });
569 
570  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
571  {
572  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
573  .WithMany("InstanceUsers")
574  .HasForeignKey("InstanceId")
575  .OnDelete(DeleteBehavior.Cascade);
576 
577  b.HasOne("Tgstation.Server.Host.Models.User")
578  .WithMany("InstanceUsers")
579  .HasForeignKey("UserId")
580  .OnDelete(DeleteBehavior.Cascade);
581  });
582 
583  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
584  {
585  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
586  .WithMany()
587  .HasForeignKey("CancelledById");
588 
589  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
590  .WithMany("Jobs")
591  .HasForeignKey("InstanceId")
592  .OnDelete(DeleteBehavior.Cascade);
593 
594  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
595  .WithMany()
596  .HasForeignKey("StartedById")
597  .OnDelete(DeleteBehavior.Cascade);
598  });
599 
600  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
601  {
602  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
603  .WithMany()
604  .HasForeignKey("CompileJobId")
605  .OnDelete(DeleteBehavior.Cascade);
606  });
607 
608  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
609  {
610  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
611  .WithOne("RepositorySettings")
612  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
613  .OnDelete(DeleteBehavior.Cascade);
614  });
615 
616  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
617  {
618  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
619  .WithMany("ActiveTestMerges")
620  .HasForeignKey("RevisionInformationId")
621  .OnDelete(DeleteBehavior.Cascade);
622 
623  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
624  .WithMany("RevisonInformations")
625  .HasForeignKey("TestMergeId")
626  .OnDelete(DeleteBehavior.Cascade);
627  });
628 
629  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
630  {
631  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
632  .WithMany("RevisionInformations")
633  .HasForeignKey("InstanceId")
634  .OnDelete(DeleteBehavior.Cascade);
635  });
636 
637  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
638  {
639  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
640  .WithMany("TestMerges")
641  .HasForeignKey("MergedById")
642  .OnDelete(DeleteBehavior.Restrict);
643 
644  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
645  .WithOne("PrimaryTestMerge")
646  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
647  .OnDelete(DeleteBehavior.Restrict);
648  });
649 
650  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
651  {
652  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
653  .WithMany("CreatedUsers")
654  .HasForeignKey("CreatedById");
655  });
656 
657  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
658  {
659  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
660  .WithMany()
661  .HasForeignKey("AlphaId");
662 
663  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
664  .WithMany()
665  .HasForeignKey("BravoId");
666 
667  b.HasOne("Tgstation.Server.Host.Models.Instance")
668  .WithOne("WatchdogReattachInformation")
669  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
670  .OnDelete(DeleteBehavior.Cascade);
671  });
672 #pragma warning restore 612, 618
673  }
674  }
675 }
+Go to the documentation of this file.
1 // <auto-generated />
2 using System;
3 using Microsoft.EntityFrameworkCore;
4 using Microsoft.EntityFrameworkCore.Infrastructure;
5 using Microsoft.EntityFrameworkCore.Metadata;
6 using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
8 
9 namespace Tgstation.Server.Host.Models.Migrations
10 {
13  {
14  protected override void BuildModel(ModelBuilder modelBuilder)
15  {
16 #pragma warning disable 612, 618
17  modelBuilder
18  .HasAnnotation("ProductVersion", "2.1.4-rtm-31024")
19  .HasAnnotation("Relational:MaxIdentifierLength", 128)
20  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
21 
22  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
23  {
24  b.Property<long>("Id")
25  .ValueGeneratedOnAdd()
26  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
27 
28  b.Property<string>("ConnectionString")
29  .IsRequired();
30 
31  b.Property<bool?>("Enabled");
32 
33  b.Property<long>("InstanceId");
34 
35  b.Property<string>("Name")
36  .IsRequired();
37 
38  b.Property<int?>("Provider");
39 
40  b.HasKey("Id");
41 
42  b.HasIndex("InstanceId");
43 
44  b.HasIndex("Name")
45  .IsUnique();
46 
47  b.ToTable("ChatBots");
48  });
49 
50  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
51  {
52  b.Property<long>("Id")
53  .ValueGeneratedOnAdd()
54  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
55 
56  b.Property<long>("ChatSettingsId");
57 
58  b.Property<decimal?>("DiscordChannelId")
59  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
60 
61  b.Property<string>("IrcChannel");
62 
63  b.Property<bool?>("IsAdminChannel")
64  .IsRequired();
65 
66  b.Property<bool?>("IsUpdatesChannel")
67  .IsRequired();
68 
69  b.Property<bool?>("IsWatchdogChannel")
70  .IsRequired();
71 
72  b.Property<string>("Tag");
73 
74  b.HasKey("Id");
75 
76  b.HasIndex("ChatSettingsId", "DiscordChannelId")
77  .IsUnique()
78  .HasFilter("[DiscordChannelId] IS NOT NULL");
79 
80  b.HasIndex("ChatSettingsId", "IrcChannel")
81  .IsUnique()
82  .HasFilter("[IrcChannel] IS NOT NULL");
83 
84  b.ToTable("ChatChannels");
85  });
86 
87  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
88  {
89  b.Property<long>("Id")
90  .ValueGeneratedOnAdd()
91  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
92 
93  b.Property<string>("ByondVersion")
94  .IsRequired();
95 
96  b.Property<Guid?>("DirectoryName")
97  .IsRequired();
98 
99  b.Property<string>("DmeName")
100  .IsRequired();
101 
102  b.Property<long>("JobId");
103 
104  b.Property<int>("MinimumSecurityLevel");
105 
106  b.Property<string>("Output")
107  .IsRequired();
108 
109  b.Property<long>("RevisionInformationId");
110 
111  b.HasKey("Id");
112 
113  b.HasIndex("DirectoryName");
114 
115  b.HasIndex("JobId")
116  .IsUnique();
117 
118  b.HasIndex("RevisionInformationId");
119 
120  b.ToTable("CompileJobs");
121  });
122 
123  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
124  {
125  b.Property<long>("Id")
126  .ValueGeneratedOnAdd()
127  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
128 
129  b.Property<string>("AccessToken");
130 
131  b.Property<bool?>("AllowWebClient")
132  .IsRequired();
133 
134  b.Property<bool?>("AutoStart")
135  .IsRequired();
136 
137  b.Property<long>("InstanceId");
138 
139  b.Property<int>("PrimaryPort");
140 
141  b.Property<int?>("ProcessId");
142 
143  b.Property<int>("SecondaryPort");
144 
145  b.Property<int>("SecurityLevel");
146 
147  b.Property<bool?>("SoftRestart")
148  .IsRequired();
149 
150  b.Property<bool?>("SoftShutdown")
151  .IsRequired();
152 
153  b.Property<long>("StartupTimeout");
154 
155  b.HasKey("Id");
156 
157  b.HasIndex("InstanceId")
158  .IsUnique();
159 
160  b.ToTable("DreamDaemonSettings");
161  });
162 
163  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
164  {
165  b.Property<long>("Id")
166  .ValueGeneratedOnAdd()
167  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
168 
169  b.Property<int>("ApiValidationPort");
170 
171  b.Property<int>("ApiValidationSecurityLevel");
172 
173  b.Property<long>("InstanceId");
174 
175  b.Property<string>("ProjectName");
176 
177  b.HasKey("Id");
178 
179  b.HasIndex("InstanceId")
180  .IsUnique();
181 
182  b.ToTable("DreamMakerSettings");
183  });
184 
185  modelBuilder.Entity("Tgstation.Server.Host.Models.Instance", b =>
186  {
187  b.Property<long>("Id")
188  .ValueGeneratedOnAdd()
189  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
190 
191  b.Property<long>("AutoUpdateInterval");
192 
193  b.Property<int>("ConfigurationType");
194 
195  b.Property<string>("Name")
196  .IsRequired();
197 
198  b.Property<bool?>("Online")
199  .IsRequired();
200 
201  b.Property<string>("Path")
202  .IsRequired();
203 
204  b.HasKey("Id");
205 
206  b.HasIndex("Path")
207  .IsUnique();
208 
209  b.ToTable("Instances");
210  });
211 
212  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
213  {
214  b.Property<long>("Id")
215  .ValueGeneratedOnAdd()
216  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
217 
218  b.Property<decimal>("ByondRights")
219  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
220 
221  b.Property<decimal>("ChatBotRights")
222  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
223 
224  b.Property<decimal>("ConfigurationRights")
225  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
226 
227  b.Property<decimal>("DreamDaemonRights")
228  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
229 
230  b.Property<decimal>("DreamMakerRights")
231  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
232 
233  b.Property<long>("InstanceId");
234 
235  b.Property<decimal>("InstanceUserRights")
236  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
237 
238  b.Property<decimal>("RepositoryRights")
239  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
240 
241  b.Property<long?>("UserId")
242  .IsRequired();
243 
244  b.HasKey("Id");
245 
246  b.HasIndex("InstanceId");
247 
248  b.HasIndex("UserId", "InstanceId")
249  .IsUnique();
250 
251  b.ToTable("InstanceUsers");
252  });
253 
254  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
255  {
256  b.Property<long>("Id")
257  .ValueGeneratedOnAdd()
258  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
259 
260  b.Property<decimal?>("CancelRight")
261  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
262 
263  b.Property<decimal?>("CancelRightsType")
264  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
265 
266  b.Property<bool?>("Cancelled")
267  .IsRequired();
268 
269  b.Property<long?>("CancelledById");
270 
271  b.Property<string>("Description")
272  .IsRequired();
273 
274  b.Property<string>("ExceptionDetails");
275 
276  b.Property<long>("InstanceId");
277 
278  b.Property<DateTimeOffset?>("StartedAt")
279  .IsRequired();
280 
281  b.Property<long>("StartedById");
282 
283  b.Property<DateTimeOffset?>("StoppedAt");
284 
285  b.HasKey("Id");
286 
287  b.HasIndex("CancelledById");
288 
289  b.HasIndex("InstanceId");
290 
291  b.HasIndex("StartedById");
292 
293  b.ToTable("Jobs");
294  });
295 
296  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
297  {
298  b.Property<long>("Id")
299  .ValueGeneratedOnAdd()
300  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
301 
302  b.Property<string>("AccessIdentifier")
303  .IsRequired();
304 
305  b.Property<string>("ChatChannelsJson")
306  .IsRequired();
307 
308  b.Property<string>("ChatCommandsJson")
309  .IsRequired();
310 
311  b.Property<long>("CompileJobId");
312 
313  b.Property<bool>("IsPrimary");
314 
315  b.Property<int>("Port");
316 
317  b.Property<int>("ProcessId");
318 
319  b.Property<int>("RebootState");
320 
321  b.Property<string>("ServerCommandsJson")
322  .IsRequired();
323 
324  b.HasKey("Id");
325 
326  b.HasIndex("CompileJobId");
327 
328  b.ToTable("ReattachInformations");
329  });
330 
331  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
332  {
333  b.Property<long>("Id")
334  .ValueGeneratedOnAdd()
335  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
336 
337  b.Property<string>("AccessToken");
338 
339  b.Property<string>("AccessUser");
340 
341  b.Property<bool?>("AutoUpdatesKeepTestMerges")
342  .IsRequired();
343 
344  b.Property<bool?>("AutoUpdatesSynchronize")
345  .IsRequired();
346 
347  b.Property<string>("CommitterEmail")
348  .IsRequired();
349 
350  b.Property<string>("CommitterName")
351  .IsRequired();
352 
353  b.Property<long>("InstanceId");
354 
355  b.Property<bool?>("PostTestMergeComment")
356  .IsRequired();
357 
358  b.Property<bool?>("PushTestMergeCommits")
359  .IsRequired();
360 
361  b.Property<bool?>("ShowTestMergeCommitters")
362  .IsRequired();
363 
364  b.HasKey("Id");
365 
366  b.HasIndex("InstanceId")
367  .IsUnique();
368 
369  b.ToTable("RepositorySettings");
370  });
371 
372  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
373  {
374  b.Property<long>("Id")
375  .ValueGeneratedOnAdd()
376  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
377 
378  b.Property<long>("RevisionInformationId");
379 
380  b.Property<long>("TestMergeId");
381 
382  b.HasKey("Id");
383 
384  b.HasIndex("RevisionInformationId");
385 
386  b.HasIndex("TestMergeId");
387 
388  b.ToTable("RevInfoTestMerges");
389  });
390 
391  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
392  {
393  b.Property<long>("Id")
394  .ValueGeneratedOnAdd()
395  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
396 
397  b.Property<string>("CommitSha")
398  .IsRequired()
399  .HasMaxLength(40);
400 
401  b.Property<long>("InstanceId");
402 
403  b.Property<string>("OriginCommitSha")
404  .IsRequired()
405  .HasMaxLength(40);
406 
407  b.HasKey("Id");
408 
409  b.HasIndex("CommitSha")
410  .IsUnique();
411 
412  b.HasIndex("InstanceId");
413 
414  b.ToTable("RevisionInformations");
415  });
416 
417  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
418  {
419  b.Property<long>("Id")
420  .ValueGeneratedOnAdd()
421  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
422 
423  b.Property<string>("Author")
424  .IsRequired();
425 
426  b.Property<string>("BodyAtMerge")
427  .IsRequired();
428 
429  b.Property<string>("Comment");
430 
431  b.Property<DateTimeOffset>("MergedAt");
432 
433  b.Property<long>("MergedById");
434 
435  b.Property<int?>("Number")
436  .IsRequired();
437 
438  b.Property<long?>("PrimaryRevisionInformationId")
439  .IsRequired();
440 
441  b.Property<string>("PullRequestRevision")
442  .IsRequired();
443 
444  b.Property<string>("TitleAtMerge")
445  .IsRequired();
446 
447  b.Property<string>("Url")
448  .IsRequired();
449 
450  b.HasKey("Id");
451 
452  b.HasIndex("MergedById");
453 
454  b.HasIndex("PrimaryRevisionInformationId")
455  .IsUnique();
456 
457  b.ToTable("TestMerges");
458  });
459 
460  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
461  {
462  b.Property<long>("Id")
463  .ValueGeneratedOnAdd()
464  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
465 
466  b.Property<decimal>("AdministrationRights")
467  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
468 
469  b.Property<string>("CanonicalName")
470  .IsRequired();
471 
472  b.Property<DateTimeOffset?>("CreatedAt")
473  .IsRequired();
474 
475  b.Property<long?>("CreatedById");
476 
477  b.Property<bool?>("Enabled")
478  .IsRequired();
479 
480  b.Property<decimal>("InstanceManagerRights")
481  .HasConversion(new ValueConverter<decimal, decimal>(v => default(decimal), v => default(decimal), new ConverterMappingHints(precision: 20, scale: 0)));
482 
483  b.Property<DateTimeOffset?>("LastPasswordUpdate");
484 
485  b.Property<string>("Name")
486  .IsRequired();
487 
488  b.Property<string>("PasswordHash");
489 
490  b.Property<string>("SystemIdentifier");
491 
492  b.HasKey("Id");
493 
494  b.HasIndex("CanonicalName")
495  .IsUnique();
496 
497  b.HasIndex("CreatedById");
498 
499  b.ToTable("Users");
500  });
501 
502  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
503  {
504  b.Property<long>("Id")
505  .ValueGeneratedOnAdd()
506  .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
507 
508  b.Property<long?>("AlphaId");
509 
510  b.Property<bool>("AlphaIsActive");
511 
512  b.Property<long?>("BravoId");
513 
514  b.Property<long>("InstanceId");
515 
516  b.HasKey("Id");
517 
518  b.HasIndex("AlphaId");
519 
520  b.HasIndex("BravoId");
521 
522  b.HasIndex("InstanceId")
523  .IsUnique();
524 
525  b.ToTable("WatchdogReattachInformations");
526  });
527 
528  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatBot", b =>
529  {
530  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
531  .WithMany("ChatSettings")
532  .HasForeignKey("InstanceId")
533  .OnDelete(DeleteBehavior.Cascade);
534  });
535 
536  modelBuilder.Entity("Tgstation.Server.Host.Models.ChatChannel", b =>
537  {
538  b.HasOne("Tgstation.Server.Host.Models.ChatBot", "ChatSettings")
539  .WithMany("Channels")
540  .HasForeignKey("ChatSettingsId")
541  .OnDelete(DeleteBehavior.Cascade);
542  });
543 
544  modelBuilder.Entity("Tgstation.Server.Host.Models.CompileJob", b =>
545  {
546  b.HasOne("Tgstation.Server.Host.Models.Job", "Job")
547  .WithOne()
548  .HasForeignKey("Tgstation.Server.Host.Models.CompileJob", "JobId")
549  .OnDelete(DeleteBehavior.Restrict);
550 
551  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
552  .WithMany("CompileJobs")
553  .HasForeignKey("RevisionInformationId")
554  .OnDelete(DeleteBehavior.Cascade);
555  });
556 
557  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamDaemonSettings", b =>
558  {
559  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
560  .WithOne("DreamDaemonSettings")
561  .HasForeignKey("Tgstation.Server.Host.Models.DreamDaemonSettings", "InstanceId")
562  .OnDelete(DeleteBehavior.Cascade);
563  });
564 
565  modelBuilder.Entity("Tgstation.Server.Host.Models.DreamMakerSettings", b =>
566  {
567  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
568  .WithOne("DreamMakerSettings")
569  .HasForeignKey("Tgstation.Server.Host.Models.DreamMakerSettings", "InstanceId")
570  .OnDelete(DeleteBehavior.Cascade);
571  });
572 
573  modelBuilder.Entity("Tgstation.Server.Host.Models.InstanceUser", b =>
574  {
575  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
576  .WithMany("InstanceUsers")
577  .HasForeignKey("InstanceId")
578  .OnDelete(DeleteBehavior.Cascade);
579 
580  b.HasOne("Tgstation.Server.Host.Models.User")
581  .WithMany("InstanceUsers")
582  .HasForeignKey("UserId")
583  .OnDelete(DeleteBehavior.Cascade);
584  });
585 
586  modelBuilder.Entity("Tgstation.Server.Host.Models.Job", b =>
587  {
588  b.HasOne("Tgstation.Server.Host.Models.User", "CancelledBy")
589  .WithMany()
590  .HasForeignKey("CancelledById");
591 
592  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
593  .WithMany("Jobs")
594  .HasForeignKey("InstanceId")
595  .OnDelete(DeleteBehavior.Cascade);
596 
597  b.HasOne("Tgstation.Server.Host.Models.User", "StartedBy")
598  .WithMany()
599  .HasForeignKey("StartedById")
600  .OnDelete(DeleteBehavior.Cascade);
601  });
602 
603  modelBuilder.Entity("Tgstation.Server.Host.Models.ReattachInformation", b =>
604  {
605  b.HasOne("Tgstation.Server.Host.Models.CompileJob", "CompileJob")
606  .WithMany()
607  .HasForeignKey("CompileJobId")
608  .OnDelete(DeleteBehavior.Cascade);
609  });
610 
611  modelBuilder.Entity("Tgstation.Server.Host.Models.RepositorySettings", b =>
612  {
613  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
614  .WithOne("RepositorySettings")
615  .HasForeignKey("Tgstation.Server.Host.Models.RepositorySettings", "InstanceId")
616  .OnDelete(DeleteBehavior.Cascade);
617  });
618 
619  modelBuilder.Entity("Tgstation.Server.Host.Models.RevInfoTestMerge", b =>
620  {
621  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "RevisionInformation")
622  .WithMany("ActiveTestMerges")
623  .HasForeignKey("RevisionInformationId")
624  .OnDelete(DeleteBehavior.Cascade);
625 
626  b.HasOne("Tgstation.Server.Host.Models.TestMerge", "TestMerge")
627  .WithMany("RevisonInformations")
628  .HasForeignKey("TestMergeId")
629  .OnDelete(DeleteBehavior.Cascade);
630  });
631 
632  modelBuilder.Entity("Tgstation.Server.Host.Models.RevisionInformation", b =>
633  {
634  b.HasOne("Tgstation.Server.Host.Models.Instance", "Instance")
635  .WithMany("RevisionInformations")
636  .HasForeignKey("InstanceId")
637  .OnDelete(DeleteBehavior.Cascade);
638  });
639 
640  modelBuilder.Entity("Tgstation.Server.Host.Models.TestMerge", b =>
641  {
642  b.HasOne("Tgstation.Server.Host.Models.User", "MergedBy")
643  .WithMany("TestMerges")
644  .HasForeignKey("MergedById")
645  .OnDelete(DeleteBehavior.Restrict);
646 
647  b.HasOne("Tgstation.Server.Host.Models.RevisionInformation", "PrimaryRevisionInformation")
648  .WithOne("PrimaryTestMerge")
649  .HasForeignKey("Tgstation.Server.Host.Models.TestMerge", "PrimaryRevisionInformationId")
650  .OnDelete(DeleteBehavior.Restrict);
651  });
652 
653  modelBuilder.Entity("Tgstation.Server.Host.Models.User", b =>
654  {
655  b.HasOne("Tgstation.Server.Host.Models.User", "CreatedBy")
656  .WithMany("CreatedUsers")
657  .HasForeignKey("CreatedById");
658  });
659 
660  modelBuilder.Entity("Tgstation.Server.Host.Models.WatchdogReattachInformation", b =>
661  {
662  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Alpha")
663  .WithMany()
664  .HasForeignKey("AlphaId");
665 
666  b.HasOne("Tgstation.Server.Host.Models.ReattachInformation", "Bravo")
667  .WithMany()
668  .HasForeignKey("BravoId");
669 
670  b.HasOne("Tgstation.Server.Host.Models.Instance")
671  .WithOne("WatchdogReattachInformation")
672  .HasForeignKey("Tgstation.Server.Host.Models.WatchdogReattachInformation", "InstanceId")
673  .OnDelete(DeleteBehavior.Cascade);
674  });
675 #pragma warning restore 612, 618
676  }
677  }
678 }
diff --git a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html index e252fc7267..8964ae7560 100644 --- a/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html +++ b/_tgstation_8_server_8_api_2_models_2_internal_2_repository_settings_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
RepositorySettings.cs
-Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
3 namespace Tgstation.Server.Api.Models.Internal
4 {
8  public class RepositorySettings
9  {
13  [Required]
14  public string CommitterName { get; set; }
15 
19  [Required]
20  public string CommitterEmail { get; set; }
21 
25  public string AccessUser { get; set; }
26 
30  public string AccessToken { get; set; }
31 
35  [Required]
36  public bool? PushTestMergeCommits { get; set; }
37 
41  [Required]
42  public bool? ShowTestMergeCommitters { get; set; }
43 
47  [Required]
48  public bool? AutoUpdatesKeepTestMerges { get; set; }
49 
53  [Required]
54  public bool? AutoUpdatesSynchronize { get; set; }
55  }
56 }
Represents configurable settings for a Repository
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
2 
3 namespace Tgstation.Server.Api.Models.Internal
4 {
8  public class RepositorySettings
9  {
13  [Required]
14  public string CommitterName { get; set; }
15 
19  [Required]
20  public string CommitterEmail { get; set; }
21 
25  public string AccessUser { get; set; }
26 
30  public string AccessToken { get; set; }
31 
35  [Required]
36  public bool? PushTestMergeCommits { get; set; }
37 
41  [Required]
42  public bool? ShowTestMergeCommitters { get; set; }
43 
47  [Required]
48  public bool? AutoUpdatesKeepTestMerges { get; set; }
49 
53  [Required]
54  public bool? AutoUpdatesSynchronize { get; set; }
55 
59  [Required]
60  public bool? PostTestMergeComment { get; set; }
61  }
62 }
Represents configurable settings for a Repository
diff --git a/_tgstation_8_server_8_api_8_assembly_info_8cs.html b/_tgstation_8_server_8_api_8_assembly_info_8cs.html index 88fc90fce7..823d805b2e 100644 --- a/_tgstation_8_server_8_api_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Api/obj/Release/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs File Reference +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html index 98c24396e2..3be502a2a1 100644 --- a/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_api_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Api/obj/Release/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0/Tgstation.Server.Api.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Api.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("API definitions for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.0.1")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.0.1")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.0.1")]
23 
24 // Generated by the MSBuild WriteCodeFragment class.
25 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("API definitions for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.0")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.0")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.0")]
23 
24 // Generated by the MSBuild WriteCodeFragment class.
25 
diff --git a/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html index f0cb13b64e..8aba9d97b3 100644 --- a/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_api_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Api.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Api.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Api.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Api.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Api.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Api.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html index f735cdd6bf..e0e4ccf475 100644 --- a/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_api_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Api.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Api.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_client_8_assembly_info_8cs.html b/_tgstation_8_server_8_client_8_assembly_info_8cs.html index c1b2251f60..fb681e6583 100644 --- a/_tgstation_8_server_8_client_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Client/obj/Release/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs File Reference +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html index a6fc98d958..59fb6e8c22 100644 --- a/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_client_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Client/obj/Release/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0/Tgstation.Server.Client.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Client.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station 13")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("Client library for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.2.1")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.2.1")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.2.1")]
23 [assembly: System.Resources.NeutralResourcesLanguageAttribute("en-CA")]
24 
25 // Generated by the MSBuild WriteCodeFragment class.
26 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("/tg/station 13")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyCopyrightAttribute("2018")]
17 [assembly: System.Reflection.AssemblyDescriptionAttribute("Client library for tgstation-server")]
18 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.3.0")]
19 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.3.0")]
20 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client")]
21 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client")]
22 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.3.0")]
23 [assembly: System.Resources.NeutralResourcesLanguageAttribute("en-CA")]
24 
25 // Generated by the MSBuild WriteCodeFragment class.
26 
diff --git a/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html index 3eef0f64ad..3c2a097db5 100644 --- a/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_client_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Client.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Client.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Client.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Client.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Client.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Client.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html index 0bb889fa5e..9ef26d4cd5 100644 --- a/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_client_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Client.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Client.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html index 40a038742d..356a249bbe 100644 --- a/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html +++ b/_tgstation_8_server_8_host_2_components_2_instance_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Instance.cs
-Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Octokit;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Threading;
9 using System.Threading.Tasks;
18 
19 namespace Tgstation.Server.Host.Components
20 {
22  #pragma warning disable CA1506 // TODO: Decomplexify
23  sealed class Instance : IInstance
24  {
27 
29  public IByondManager ByondManager { get; }
30 
32  public IWatchdog Watchdog { get; }
33 
35  public IChat Chat { get; }
36 
38  public StaticFiles.IConfiguration Configuration { get; }
39 
44 
49 
54 
59 
64 
69 
74 
78  readonly ILogger<Instance> logger;
79 
83  readonly Api.Models.Instance metadata;
84 
88  Task timerTask;
89 
93  CancellationTokenSource timerCts;
94 
112  public Instance(Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger<Instance> logger)
113  {
114  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
115  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
116  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
117  this.dreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
118  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
119  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
120  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
121  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
122  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
123  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
124  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
125  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
126  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
127  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
128  }
129 
131  public void Dispose()
132  {
133  timerCts?.Dispose();
134  compileJobConsumer.Dispose();
135  Configuration.Dispose();
136  Chat.Dispose();
137  Watchdog.Dispose();
139  }
140 
142  public async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action<int> progressReporter, CancellationToken cancellationToken)
143  {
144 #pragma warning disable IDE0016 // Use 'throw' expression
145  if (job == null)
146  throw new ArgumentNullException(nameof(job));
147 #pragma warning restore IDE0016 // Use 'throw' expression
148  if (databaseContext == null)
149  throw new ArgumentNullException(nameof(databaseContext));
150  if (progressReporter == null)
151  throw new ArgumentNullException(nameof(progressReporter));
152 
153  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
154  {
155  StartupTimeout = x.StartupTimeout,
156  }).FirstOrDefaultAsync(cancellationToken);
157 
158  var compileJobsTask = databaseContext.CompileJobs
159  .Where(x => x.Job.Instance.Id == metadata.Id)
160  .OrderByDescending(x => x.Job.StoppedAt)
161  .Select(x => new Job
162  {
163  StoppedAt = x.Job.StoppedAt,
164  StartedAt = x.Job.StartedAt
165  })
166  .Take(10)
167  .ToListAsync(cancellationToken);
168 
169  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
170  if (dreamMakerSettings == default)
171  throw new JobException("Missing DreamMakerSettings in DB!");
172  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
173  if (ddSettings == default)
174  throw new JobException("Missing DreamDaemonSettings in DB!");
175 
176  Task<RepositorySettings> repositorySettingsTask = null;
177  string repoOwner = null;
178  string repoName = null;
179  CompileJob compileJob;
180  RevisionInformation revInfo;
181  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
182  {
183  if (repo == null)
184  throw new JobException("Missing Repository!");
185 
186  if (repo.IsGitHubRepository)
187  {
188  repoOwner = repo.GitHubOwner;
189  repoName = repo.GitHubRepoName;
190  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
191  {
192  AccessToken = x.AccessToken,
193  ShowTestMergeCommitters = x.ShowTestMergeCommitters
194  }).FirstOrDefaultAsync(cancellationToken);
195  }
196 
197  var repoSha = repo.Head;
198  revInfo = await databaseContext.RevisionInformations.Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id).Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy).FirstOrDefaultAsync().ConfigureAwait(false);
199 
200  if (revInfo == default)
201  {
202  revInfo = new RevisionInformation
203  {
204  CommitSha = repoSha,
205  OriginCommitSha = repoSha,
206  Instance = new Models.Instance
207  {
208  Id = metadata.Id
209  }
210  };
211  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
212  databaseContext.Instances.Attach(revInfo.Instance);
213  }
214 
215  TimeSpan? averageSpan = null;
216  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
217  if(previousCompileJobs.Count != 0)
218  {
219  var totalSpan = TimeSpan.Zero;
220  foreach (var I in previousCompileJobs)
221  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
222  averageSpan = totalSpan / previousCompileJobs.Count;
223  }
224 
225  compileJob = await dreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
226  }
227 
228  compileJob.Job = job;
229 
230  databaseContext.CompileJobs.Add(compileJob); // will be saved by job context
231 
232  job.PostComplete = ct => compileJobConsumer.LoadCompileJob(compileJob, ct);
233 
234  if (repositorySettingsTask != null)
235  {
236  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
237  if (repositorySettings == default)
238  throw new JobException("Missing repository settings!");
239 
240  if (repositorySettings.AccessToken != null)
241  {
242  // potential for commenting on a test merge change
243  var outgoingCompileJob = LatestCompileJob();
244 
245  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha)
246  {
247  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
248 
249  async Task CommentOnPR(int prNumber, string comment)
250  {
251  try
252  {
253  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
254  }
255  catch (ApiException e)
256  {
257  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
258  }
259  }
260 
261  var tasks = new List<Task>();
262 
263  string FormatTestMerge(TestMerge testMerge, bool updated) => String.Format(CultureInfo.InvariantCulture, "#### Test Merge {4}{0}{0}##### Server Instance{0}{5}{1}{0}{0}##### Revision{0}Origin: {6}{0}Pull Request: {2}{0}Server: {7}{3}",
264  Environment.NewLine,
265  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
266  testMerge.PullRequestRevision,
267  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
268  updated ? "Updated" : "Deployed",
269  metadata.Name,
271  compileJob.RevisionInformation.CommitSha);
272 
273  // added prs
274  foreach (var I in compileJob
276  .ActiveTestMerges
277  .Select(x => x.TestMerge)
278  .Where(x => !outgoingCompileJob
280  .ActiveTestMerges
281  .Any(y => y.TestMerge.Number == x.Number)))
282  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
283 
284  // removed prs
285  foreach (var I in outgoingCompileJob
287  .ActiveTestMerges
288  .Select(x => x.TestMerge)
289  .Where(x => !compileJob
292  .Any(y => y.TestMerge.Number == x.Number)))
293  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
294 
295  // updated prs
296  foreach(var I in compileJob
298  .ActiveTestMerges
299  .Select(x => x.TestMerge)
300  .Where(x => outgoingCompileJob
301  .RevisionInformation
302  .ActiveTestMerges
303  .Any(y => y.TestMerge.Number == x.Number)))
304  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
305 
306  if (tasks.Any())
307  await Task.WhenAll(tasks).ConfigureAwait(false);
308  }
309  }
310  }
311  }
312 
319  #pragma warning disable CA1502 // TODO: Decomplexify
320  async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
321  {
322  while (true)
323  try
324  {
325  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
326  logger.LogDebug("Beginning auto update...");
327  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
328  try
329  {
330  Models.User user = null;
331  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
332  var repositoryUpdateJob = new Job
333  {
334  Instance = new Models.Instance
335  {
336  Id = metadata.Id
337  },
338  Description = "Scheduled repository update",
339  CancelRightsType = RightsType.Repository,
340  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
341  StartedBy = user
342  };
343 
344  string deploySha = null;
345  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
346  {
347  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
348 
349  // assume 5 steps with synchronize
350  const int ProgressSections = 7;
351  const int ProgressStep = 100 / ProgressSections;
352 
353  const int NumSteps = 3;
354  var doneSteps = 0;
355 
356  Action<int> NextProgressReporter()
357  {
358  var tmpDoneSteps = doneSteps;
359  ++doneSteps;
360  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / NumSteps);
361  }
362 
363  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
364  {
365  if (repo == null)
366  {
367  logger.LogTrace("Aborting repo update, no repository!");
368  return;
369  }
370 
371  var startSha = repo.Head;
372  if (!repo.Tracking)
373  {
374  logger.LogTrace("Aborting repo update, not tracking origin!");
375  deploySha = startSha;
376  return;
377  }
378 
379  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
380 
381  // the main point of auto update is to pull the remote
382  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
383 
384  RevisionInformation currentRevInfo = null;
385  bool hasDbChanges = false;
386 
387  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
388  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
389  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
390  .FirstOrDefaultAsync(cancellationToken);
391 
392  async Task UpdateRevInfo(string currentHead, bool onOrigin)
393  {
394  if(currentRevInfo == null)
395  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
396 
397  if (currentRevInfo == default)
398  {
399  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
400  onOrigin = true;
401  }
402 
403  var attachedInstance = new Models.Instance
404  {
405  Id = metadata.Id
406  };
407  var oldRevInfo = currentRevInfo;
408  currentRevInfo = new RevisionInformation
409  {
410  CommitSha = currentHead,
411  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
412  Instance = attachedInstance
413  };
414  if (!onOrigin)
415  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
416 
417  databaseContext.Instances.Attach(attachedInstance);
418  databaseContext.RevisionInformations.Add(currentRevInfo);
419  hasDbChanges = true;
420  }
421 
422  // take appropriate auto update actions
423  bool shouldSyncTracked;
424  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
425  {
426  logger.LogTrace("Preserving test merges...");
427 
428  var currentRevInfoTask = LoadRevInfo();
429 
430  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
431 
432  if (!result.HasValue)
433  throw new JobException("Merge conflict while preserving test merges!");
434 
435  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
436 
437  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
438  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
439 
440  var currentHead = repo.Head;
441  if (currentHead != startSha)
442  {
443  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
444  shouldSyncTracked = stillOnOrigin;
445  }
446  else
447  shouldSyncTracked = false;
448  }
449  else
450  {
451  logger.LogTrace("Not preserving test merges...");
452  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
453 
454  var currentHead = repo.Head;
455 
456  currentRevInfo = await databaseContext.RevisionInformations
457  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
458  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
459 
460  if (currentHead != startSha && currentRevInfo != default)
461  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
462 
463  shouldSyncTracked = true;
464  }
465 
466  // synch if necessary
467  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
468  {
469  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
470  var currentHead = repo.Head;
471  if (currentHead != currentRevInfo.CommitSha)
472  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
473  }
474 
475  if(hasDbChanges)
476  try
477  {
478  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
479  }
480  catch
481  {
482  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
483  throw;
484  }
485 
486  progressReporter(5 * ProgressStep);
487  deploySha = repo.Head;
488  }
489  }, cancellationToken).ConfigureAwait(false);
490 
491  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
492 
493  if (deploySha == null)
494  {
495  logger.LogTrace("Aborting auto update, repository error!");
496  continue;
497  }
498 
499  if(deploySha == LatestCompileJob()?.RevisionInformation.CommitSha)
500  {
501  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
502  continue;
503  }
504 
505  // finally set up the job
506  var compileProcessJob = new Job
507  {
508  StartedBy = user,
509  Instance = repositoryUpdateJob.Instance,
510  Description = "Scheduled code deployment",
511  CancelRightsType = RightsType.DreamMaker,
512  CancelRight = (ulong)DreamMakerRights.CancelCompile
513  };
514 
515  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
516 
517  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
518  }
519  catch (OperationCanceledException)
520  {
521  logger.LogDebug("Cancelled auto update job!");
522  throw;
523  }
524  catch (Exception e)
525  {
526  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
527  continue;
528  }
529  }
530  catch (OperationCanceledException)
531  {
532  break;
533  }
534 
535  logger.LogTrace("Leaving auto update loop...");
536  }
537  #pragma warning restore CA1502
538 
540  public void Rename(string newName)
541  {
542  if (String.IsNullOrWhiteSpace(newName))
543  throw new ArgumentNullException(nameof(newName));
544  metadata.Name = newName;
545  }
546 
548  public async Task StartAsync(CancellationToken cancellationToken)
549  {
550  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), compileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
551 
552  // dependent on so many things, its just safer this way
553  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
554 
555  CompileJob latestCompileJob = null;
556  await databaseContextFactory.UseContext(async db =>
557  {
558  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
559  }).ConfigureAwait(false);
560  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
561  }
562 
564  public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), compileJobConsumer.StopAsync(cancellationToken));
565 
567  public async Task SetAutoUpdateInterval(uint newInterval)
568  {
569  Task toWait;
570  lock (this)
571  {
572  if (timerTask != null)
573  {
574  timerCts.Cancel();
575  toWait = timerTask;
576  }
577  else
578  toWait = Task.CompletedTask;
579  }
580 
581  await toWait.ConfigureAwait(false);
582  if (newInterval == 0)
583  return;
584  lock (this)
585  {
586  // race condition, just quit
587  if (timerTask != null)
588  return;
589  timerCts?.Dispose();
590  timerCts = new CancellationTokenSource();
591  timerTask = TimerLoop(newInterval, timerCts.Token);
592  }
593  }
594 
597  {
598  if (!dmbFactory.DmbAvailable)
599  return null;
600  return dmbFactory.LockNextDmb(0)?.CompileJob;
601  }
602  }
603 }
+Go to the documentation of this file.
1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
3 using Octokit;
4 using System;
5 using System.Collections.Generic;
6 using System.Globalization;
7 using System.Linq;
8 using System.Threading;
9 using System.Threading.Tasks;
18 
19 namespace Tgstation.Server.Host.Components
20 {
22  #pragma warning disable CA1506 // TODO: Decomplexify
23  sealed class Instance : IInstance
24  {
27 
29  public IByondManager ByondManager { get; }
30 
32  public IWatchdog Watchdog { get; }
33 
35  public IChat Chat { get; }
36 
38  public StaticFiles.IConfiguration Configuration { get; }
39 
44 
49 
54 
59 
64 
69 
74 
78  readonly ILogger<Instance> logger;
79 
83  readonly Api.Models.Instance metadata;
84 
88  Task timerTask;
89 
93  CancellationTokenSource timerCts;
94 
112  public Instance(Api.Models.Instance metadata, IRepositoryManager repositoryManager, IByondManager byondManager, IDreamMaker dreamMaker, IWatchdog watchdog, IChat chat, StaticFiles.IConfiguration configuration, ICompileJobConsumer compileJobConsumer, IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IJobManager jobManager, IEventConsumer eventConsumer, IGitHubClientFactory gitHubClientFactory, ILogger<Instance> logger)
113  {
114  this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata));
115  RepositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager));
116  ByondManager = byondManager ?? throw new ArgumentNullException(nameof(byondManager));
117  this.dreamMaker = dreamMaker ?? throw new ArgumentNullException(nameof(dreamMaker));
118  Watchdog = watchdog ?? throw new ArgumentNullException(nameof(watchdog));
119  Chat = chat ?? throw new ArgumentNullException(nameof(chat));
120  Configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
121  this.compileJobConsumer = compileJobConsumer ?? throw new ArgumentNullException(nameof(compileJobConsumer));
122  this.databaseContextFactory = databaseContextFactory ?? throw new ArgumentNullException(nameof(databaseContextFactory));
123  this.dmbFactory = dmbFactory ?? throw new ArgumentNullException(nameof(dmbFactory));
124  this.jobManager = jobManager ?? throw new ArgumentNullException(nameof(jobManager));
125  this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer));
126  this.gitHubClientFactory = gitHubClientFactory ?? throw new ArgumentNullException(nameof(gitHubClientFactory));
127  this.logger = logger ?? throw new ArgumentNullException(nameof(logger));
128  }
129 
131  public void Dispose()
132  {
133  timerCts?.Dispose();
134  compileJobConsumer.Dispose();
135  Configuration.Dispose();
136  Chat.Dispose();
137  Watchdog.Dispose();
139  }
140 
142  public async Task CompileProcess(Job job, IDatabaseContext databaseContext, Action<int> progressReporter, CancellationToken cancellationToken)
143  {
144 #pragma warning disable IDE0016 // Use 'throw' expression
145  if (job == null)
146  throw new ArgumentNullException(nameof(job));
147 #pragma warning restore IDE0016 // Use 'throw' expression
148  if (databaseContext == null)
149  throw new ArgumentNullException(nameof(databaseContext));
150  if (progressReporter == null)
151  throw new ArgumentNullException(nameof(progressReporter));
152 
153  var ddSettingsTask = databaseContext.DreamDaemonSettings.Where(x => x.InstanceId == metadata.Id).Select(x => new DreamDaemonSettings
154  {
155  StartupTimeout = x.StartupTimeout,
156  }).FirstOrDefaultAsync(cancellationToken);
157 
158  var compileJobsTask = databaseContext.CompileJobs
159  .Where(x => x.Job.Instance.Id == metadata.Id)
160  .OrderByDescending(x => x.Job.StoppedAt)
161  .Select(x => new Job
162  {
163  StoppedAt = x.Job.StoppedAt,
164  StartedAt = x.Job.StartedAt
165  })
166  .Take(10)
167  .ToListAsync(cancellationToken);
168 
169  var dreamMakerSettings = await databaseContext.DreamMakerSettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(cancellationToken).ConfigureAwait(false);
170  if (dreamMakerSettings == default)
171  throw new JobException("Missing DreamMakerSettings in DB!");
172  var ddSettings = await ddSettingsTask.ConfigureAwait(false);
173  if (ddSettings == default)
174  throw new JobException("Missing DreamDaemonSettings in DB!");
175 
176  Task<RepositorySettings> repositorySettingsTask = null;
177  string repoOwner = null;
178  string repoName = null;
179  CompileJob compileJob;
180  RevisionInformation revInfo;
181  using (var repo = await RepositoryManager.LoadRepository(cancellationToken).ConfigureAwait(false))
182  {
183  if (repo == null)
184  throw new JobException("Missing Repository!");
185 
186  if (repo.IsGitHubRepository)
187  {
188  repoOwner = repo.GitHubOwner;
189  repoName = repo.GitHubRepoName;
190  repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).Select(x => new RepositorySettings
191  {
192  AccessToken = x.AccessToken,
193  ShowTestMergeCommitters = x.ShowTestMergeCommitters
194  }).FirstOrDefaultAsync(cancellationToken);
195  }
196 
197  var repoSha = repo.Head;
198  revInfo = await databaseContext.RevisionInformations.Where(x => x.CommitSha == repoSha && x.Instance.Id == metadata.Id).Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge).ThenInclude(x => x.MergedBy).FirstOrDefaultAsync().ConfigureAwait(false);
199 
200  if (revInfo == default)
201  {
202  revInfo = new RevisionInformation
203  {
204  CommitSha = repoSha,
205  OriginCommitSha = repoSha,
206  Instance = new Models.Instance
207  {
208  Id = metadata.Id
209  }
210  };
211  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, repoSha);
212  databaseContext.Instances.Attach(revInfo.Instance);
213  }
214 
215  TimeSpan? averageSpan = null;
216  var previousCompileJobs = await compileJobsTask.ConfigureAwait(false);
217  if(previousCompileJobs.Count != 0)
218  {
219  var totalSpan = TimeSpan.Zero;
220  foreach (var I in previousCompileJobs)
221  totalSpan += I.StoppedAt.Value - I.StartedAt.Value;
222  averageSpan = totalSpan / previousCompileJobs.Count;
223  }
224 
225  compileJob = await dreamMaker.Compile(revInfo, dreamMakerSettings, ddSettings.StartupTimeout.Value, repo, progressReporter, averageSpan, cancellationToken).ConfigureAwait(false);
226  }
227 
228  compileJob.Job = job;
229 
230  databaseContext.CompileJobs.Add(compileJob); // will be saved by job context
231 
232  job.PostComplete = ct => compileJobConsumer.LoadCompileJob(compileJob, ct);
233 
234  if (repositorySettingsTask != null)
235  {
236  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
237  if (repositorySettings == default)
238  throw new JobException("Missing repository settings!");
239 
240  if (repositorySettings.AccessToken != null)
241  {
242  // potential for commenting on a test merge change
243  var outgoingCompileJob = LatestCompileJob();
244 
245  if(outgoingCompileJob != null && outgoingCompileJob.RevisionInformation.CommitSha != compileJob.RevisionInformation.CommitSha && repositorySettings.PostTestMergeComment.Value)
246  {
247  var gitHubClient = gitHubClientFactory.CreateClient(repositorySettings.AccessToken);
248 
249  async Task CommentOnPR(int prNumber, string comment)
250  {
251  try
252  {
253  await gitHubClient.Issue.Comment.Create(repoOwner, repoName, prNumber, comment).ConfigureAwait(false);
254  }
255  catch (ApiException e)
256  {
257  logger.LogWarning("Error posting GitHub comment! Exception: {0}", e);
258  }
259  }
260 
261  var tasks = new List<Task>();
262 
263  string FormatTestMerge(TestMerge testMerge, bool updated) => String.Format(CultureInfo.InvariantCulture, "#### Test Merge {4}{0}{0}##### Server Instance{0}{5}{1}{0}{0}##### Revision{0}Origin: {6}{0}Pull Request: {2}{0}Server: {7}{3}",
264  Environment.NewLine,
265  repositorySettings.ShowTestMergeCommitters.Value ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Merged By{0}{1}", Environment.NewLine, testMerge.MergedBy.Name) : String.Empty,
266  testMerge.PullRequestRevision,
267  testMerge.Comment != null ? String.Format(CultureInfo.InvariantCulture, "{0}{0}##### Comment{0}{1}", Environment.NewLine, testMerge.Comment) : String.Empty,
268  updated ? "Updated" : "Deployed",
269  metadata.Name,
271  compileJob.RevisionInformation.CommitSha);
272 
273  // added prs
274  foreach (var I in compileJob
276  .ActiveTestMerges
277  .Select(x => x.TestMerge)
278  .Where(x => !outgoingCompileJob
280  .ActiveTestMerges
281  .Any(y => y.TestMerge.Number == x.Number)))
282  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, false)));
283 
284  // removed prs
285  foreach (var I in outgoingCompileJob
287  .ActiveTestMerges
288  .Select(x => x.TestMerge)
289  .Where(x => !compileJob
292  .Any(y => y.TestMerge.Number == x.Number)))
293  tasks.Add(CommentOnPR(I.Number.Value, "#### Test Merge Removed"));
294 
295  // updated prs
296  foreach(var I in compileJob
298  .ActiveTestMerges
299  .Select(x => x.TestMerge)
300  .Where(x => outgoingCompileJob
301  .RevisionInformation
302  .ActiveTestMerges
303  .Any(y => y.TestMerge.Number == x.Number)))
304  tasks.Add(CommentOnPR(I.Number.Value, FormatTestMerge(I, true)));
305 
306  if (tasks.Any())
307  await Task.WhenAll(tasks).ConfigureAwait(false);
308  }
309  }
310  }
311  }
312 
319  #pragma warning disable CA1502 // TODO: Decomplexify
320  async Task TimerLoop(uint minutes, CancellationToken cancellationToken)
321  {
322  while (true)
323  try
324  {
325  await Task.Delay(TimeSpan.FromMinutes(minutes > Int32.MaxValue ? Int32.MaxValue : (int)minutes), cancellationToken).ConfigureAwait(false);
326  logger.LogDebug("Beginning auto update...");
327  await eventConsumer.HandleEvent(EventType.InstanceAutoUpdateStart, new List<string>(), cancellationToken).ConfigureAwait(false);
328  try
329  {
330  Models.User user = null;
331  await databaseContextFactory.UseContext(async (db) => user = await db.Users.Where(x => x.CanonicalName == Api.Models.User.AdminName.ToUpperInvariant()).FirstAsync(cancellationToken).ConfigureAwait(false)).ConfigureAwait(false);
332  var repositoryUpdateJob = new Job
333  {
334  Instance = new Models.Instance
335  {
336  Id = metadata.Id
337  },
338  Description = "Scheduled repository update",
339  CancelRightsType = RightsType.Repository,
340  CancelRight = (ulong)RepositoryRights.CancelPendingChanges,
341  StartedBy = user
342  };
343 
344  string deploySha = null;
345  await jobManager.RegisterOperation(repositoryUpdateJob, async (paramJob, databaseContext, progressReporter, jobCancellationToken) =>
346  {
347  var repositorySettingsTask = databaseContext.RepositorySettings.Where(x => x.InstanceId == metadata.Id).FirstAsync(jobCancellationToken);
348 
349  // assume 5 steps with synchronize
350  const int ProgressSections = 7;
351  const int ProgressStep = 100 / ProgressSections;
352 
353  const int NumSteps = 3;
354  var doneSteps = 0;
355 
356  Action<int> NextProgressReporter()
357  {
358  var tmpDoneSteps = doneSteps;
359  ++doneSteps;
360  return progress => progressReporter((progress + (100 * tmpDoneSteps)) / NumSteps);
361  }
362 
363  using (var repo = await RepositoryManager.LoadRepository(jobCancellationToken).ConfigureAwait(false))
364  {
365  if (repo == null)
366  {
367  logger.LogTrace("Aborting repo update, no repository!");
368  return;
369  }
370 
371  var startSha = repo.Head;
372  if (!repo.Tracking)
373  {
374  logger.LogTrace("Aborting repo update, not tracking origin!");
375  deploySha = startSha;
376  return;
377  }
378 
379  var repositorySettings = await repositorySettingsTask.ConfigureAwait(false);
380 
381  // the main point of auto update is to pull the remote
382  await repo.FetchOrigin(repositorySettings.AccessUser, repositorySettings.AccessToken, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
383 
384  RevisionInformation currentRevInfo = null;
385  bool hasDbChanges = false;
386 
387  Task<RevisionInformation> LoadRevInfo() => databaseContext.RevisionInformations
388  .Where(x => x.CommitSha == startSha && x.Instance.Id == metadata.Id)
389  .Include(x => x.ActiveTestMerges).ThenInclude(x => x.TestMerge)
390  .FirstOrDefaultAsync(cancellationToken);
391 
392  async Task UpdateRevInfo(string currentHead, bool onOrigin)
393  {
394  if(currentRevInfo == null)
395  currentRevInfo = await LoadRevInfo().ConfigureAwait(false);
396 
397  if (currentRevInfo == default)
398  {
399  logger.LogWarning(Repository.Repository.OriginTrackingErrorTemplate, currentHead);
400  onOrigin = true;
401  }
402 
403  var attachedInstance = new Models.Instance
404  {
405  Id = metadata.Id
406  };
407  var oldRevInfo = currentRevInfo;
408  currentRevInfo = new RevisionInformation
409  {
410  CommitSha = currentHead,
411  OriginCommitSha = onOrigin ? currentHead : oldRevInfo.OriginCommitSha,
412  Instance = attachedInstance
413  };
414  if (!onOrigin)
415  currentRevInfo.ActiveTestMerges = new List<RevInfoTestMerge>(oldRevInfo.ActiveTestMerges);
416 
417  databaseContext.Instances.Attach(attachedInstance);
418  databaseContext.RevisionInformations.Add(currentRevInfo);
419  hasDbChanges = true;
420  }
421 
422  // take appropriate auto update actions
423  bool shouldSyncTracked;
424  if (repositorySettings.AutoUpdatesKeepTestMerges.Value)
425  {
426  logger.LogTrace("Preserving test merges...");
427 
428  var currentRevInfoTask = LoadRevInfo();
429 
430  var result = await repo.MergeOrigin(repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
431 
432  if (!result.HasValue)
433  throw new JobException("Merge conflict while preserving test merges!");
434 
435  currentRevInfo = await currentRevInfoTask.ConfigureAwait(false);
436 
437  var lastRevInfoWasOriginCommit = currentRevInfo == default || currentRevInfo.CommitSha == currentRevInfo.OriginCommitSha;
438  var stillOnOrigin = result.Value && lastRevInfoWasOriginCommit;
439 
440  var currentHead = repo.Head;
441  if (currentHead != startSha)
442  {
443  await UpdateRevInfo(currentHead, stillOnOrigin).ConfigureAwait(false);
444  shouldSyncTracked = stillOnOrigin;
445  }
446  else
447  shouldSyncTracked = false;
448  }
449  else
450  {
451  logger.LogTrace("Not preserving test merges...");
452  await repo.ResetToOrigin(NextProgressReporter(), jobCancellationToken).ConfigureAwait(false);
453 
454  var currentHead = repo.Head;
455 
456  currentRevInfo = await databaseContext.RevisionInformations
457  .Where(x => x.CommitSha == currentHead && x.Instance.Id == metadata.Id)
458  .FirstOrDefaultAsync(jobCancellationToken).ConfigureAwait(false);
459 
460  if (currentHead != startSha && currentRevInfo != default)
461  await UpdateRevInfo(currentHead, true).ConfigureAwait(false);
462 
463  shouldSyncTracked = true;
464  }
465 
466  // synch if necessary
467  if (repositorySettings.AutoUpdatesSynchronize.Value && startSha != repo.Head)
468  {
469  var pushedOrigin = await repo.Sychronize(repositorySettings.AccessUser, repositorySettings.AccessToken, repositorySettings.CommitterName, repositorySettings.CommitterEmail, NextProgressReporter(), shouldSyncTracked, jobCancellationToken).ConfigureAwait(false);
470  var currentHead = repo.Head;
471  if (currentHead != currentRevInfo.CommitSha)
472  await UpdateRevInfo(currentHead, pushedOrigin).ConfigureAwait(false);
473  }
474 
475  if(hasDbChanges)
476  try
477  {
478  await databaseContext.Save(cancellationToken).ConfigureAwait(false);
479  }
480  catch
481  {
482  await repo.ResetToSha(startSha, progressReporter, default).ConfigureAwait(false);
483  throw;
484  }
485 
486  progressReporter(5 * ProgressStep);
487  deploySha = repo.Head;
488  }
489  }, cancellationToken).ConfigureAwait(false);
490 
491  await jobManager.WaitForJobCompletion(repositoryUpdateJob, user, cancellationToken, default).ConfigureAwait(false);
492 
493  if (deploySha == null)
494  {
495  logger.LogTrace("Aborting auto update, repository error!");
496  continue;
497  }
498 
499  if(deploySha == LatestCompileJob()?.RevisionInformation.CommitSha)
500  {
501  logger.LogTrace("Aborting auto update, same revision as latest CompileJob");
502  continue;
503  }
504 
505  // finally set up the job
506  var compileProcessJob = new Job
507  {
508  StartedBy = user,
509  Instance = repositoryUpdateJob.Instance,
510  Description = "Scheduled code deployment",
511  CancelRightsType = RightsType.DreamMaker,
512  CancelRight = (ulong)DreamMakerRights.CancelCompile
513  };
514 
515  await jobManager.RegisterOperation(compileProcessJob, CompileProcess, cancellationToken).ConfigureAwait(false);
516 
517  await jobManager.WaitForJobCompletion(compileProcessJob, user, cancellationToken, default).ConfigureAwait(false);
518  }
519  catch (OperationCanceledException)
520  {
521  logger.LogDebug("Cancelled auto update job!");
522  throw;
523  }
524  catch (Exception e)
525  {
526  logger.LogWarning("Error in auto update loop! Exception: {0}", e);
527  continue;
528  }
529  }
530  catch (OperationCanceledException)
531  {
532  break;
533  }
534 
535  logger.LogTrace("Leaving auto update loop...");
536  }
537  #pragma warning restore CA1502
538 
540  public void Rename(string newName)
541  {
542  if (String.IsNullOrWhiteSpace(newName))
543  throw new ArgumentNullException(nameof(newName));
544  metadata.Name = newName;
545  }
546 
548  public async Task StartAsync(CancellationToken cancellationToken)
549  {
550  await Task.WhenAll(SetAutoUpdateInterval(metadata.AutoUpdateInterval.Value), Configuration.StartAsync(cancellationToken), ByondManager.StartAsync(cancellationToken), Chat.StartAsync(cancellationToken), compileJobConsumer.StartAsync(cancellationToken)).ConfigureAwait(false);
551 
552  // dependent on so many things, its just safer this way
553  await Watchdog.StartAsync(cancellationToken).ConfigureAwait(false);
554 
555  CompileJob latestCompileJob = null;
556  await databaseContextFactory.UseContext(async db =>
557  {
558  latestCompileJob = await db.CompileJobs.Where(x => x.Job.Instance.Id == metadata.Id).OrderByDescending(x => x.Job.StoppedAt).FirstOrDefaultAsync(cancellationToken).ConfigureAwait(false);
559  }).ConfigureAwait(false);
560  await dmbFactory.CleanUnusedCompileJobs(latestCompileJob, cancellationToken).ConfigureAwait(false);
561  }
562 
564  public Task StopAsync(CancellationToken cancellationToken) => Task.WhenAll(SetAutoUpdateInterval(0), Configuration.StopAsync(cancellationToken), ByondManager.StopAsync(cancellationToken), Watchdog.StopAsync(cancellationToken), Chat.StopAsync(cancellationToken), compileJobConsumer.StopAsync(cancellationToken));
565 
567  public async Task SetAutoUpdateInterval(uint newInterval)
568  {
569  Task toWait;
570  lock (this)
571  {
572  if (timerTask != null)
573  {
574  timerCts.Cancel();
575  toWait = timerTask;
576  }
577  else
578  toWait = Task.CompletedTask;
579  }
580 
581  await toWait.ConfigureAwait(false);
582  if (newInterval == 0)
583  return;
584  lock (this)
585  {
586  // race condition, just quit
587  if (timerTask != null)
588  return;
589  timerCts?.Dispose();
590  timerCts = new CancellationTokenSource();
591  timerTask = TimerLoop(newInterval, timerCts.Token);
592  }
593  }
594 
597  {
598  if (!dmbFactory.DmbAvailable)
599  return null;
600  return dmbFactory.LockNextDmb(0)?.CompileJob;
601  }
602  }
603 }
string Name
The name of the User
Definition: User.cs:38
Manages the runtime of Jobs
Definition: IJobManager.cs:12
diff --git a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html index 8b86a2ccbc..cff1837085 100644 --- a/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html +++ b/_tgstation_8_server_8_host_2_models_2_repository_settings_8cs_source.html @@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
RepositorySettings.cs
-Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
3 
4 namespace Tgstation.Server.Host.Models
5 {
7  public sealed class RepositorySettings : Api.Models.Internal.RepositorySettings
8  {
12  public long Id { get; set; }
13 
17  public long InstanceId { get; set; }
18 
22  [Required]
23  public Instance Instance { get; set; }
24 
29  public Repository ToApi() => new Repository
30  {
31  // AccessToken = AccessToken, // never show this
32  AccessUser = AccessUser,
33  AutoUpdatesKeepTestMerges = AutoUpdatesKeepTestMerges,
34  AutoUpdatesSynchronize = AutoUpdatesSynchronize,
35  CommitterEmail = CommitterEmail,
36  CommitterName = CommitterName,
37  PushTestMergeCommits = PushTestMergeCommits,
38  ShowTestMergeCommitters = ShowTestMergeCommitters
39 
40  // revision information and the rest retrieved by controller
41  };
42  }
43 }
+Go to the documentation of this file.
1 using System.ComponentModel.DataAnnotations;
3 
4 namespace Tgstation.Server.Host.Models
5 {
7  public sealed class RepositorySettings : Api.Models.Internal.RepositorySettings
8  {
12  public long Id { get; set; }
13 
17  public long InstanceId { get; set; }
18 
22  [Required]
23  public Instance Instance { get; set; }
24 
29  public Repository ToApi() => new Repository
30  {
31  // AccessToken = AccessToken, // never show this
32  AccessUser = AccessUser,
33  AutoUpdatesKeepTestMerges = AutoUpdatesKeepTestMerges,
34  AutoUpdatesSynchronize = AutoUpdatesSynchronize,
35  CommitterEmail = CommitterEmail,
36  CommitterName = CommitterName,
37  PushTestMergeCommits = PushTestMergeCommits,
38  ShowTestMergeCommitters = ShowTestMergeCommitters,
39  PostTestMergeComment = PostTestMergeComment
40 
41  // revision information and the rest retrieved by controller
42  };
43  }
44 }
diff --git a/_tgstation_8_server_8_host_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_assembly_info_8cs.html index df4548a1f4..43c0f7534c 100644 --- a/_tgstation_8_server_8_host_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs File Reference +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html index c45aa1af40..a3aa5b9790 100644 --- a/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html index 52a84c0f9a..ac265aa2be 100644 --- a/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_console_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Console/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Console.AssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Console.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html index 76fc39106d..5d18b1948e 100644 --- a/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Console.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Console.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Console.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html index 37466fca50..53fc29de6a 100644 --- a/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_host_8_console_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Console.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html index 3203ae4cf7..22f2c188b8 100644 --- a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs File Reference +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html index c53270b03d..38a995518c 100644 --- a/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_razor_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.RazorAssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html index b50f09579f..13e5231737 100644 --- a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs File Reference +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html index 4e22852711..76db250606 100644 --- a/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html index bd9abbdcce..6f4b8b8668 100644 --- a/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_host_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html index 33f02c41de..1966731549 100644 --- a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs File Reference +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html index 11fec32519..96cc6a8bf5 100644 --- a/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_watchdog_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs Source File +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0/Tgstation.Server.Host.Watchdog.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Watchdog.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("4.0.1.4")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("4.0.1.4")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("4.0.1.4")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html index 6b02753515..1bc613db7b 100644 --- a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Host.Watchdog.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Host.Watchdog.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Host.Watchdog.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html index 05521465ef..30b70e2f1d 100644 --- a/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_host_8_watchdog_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Host.Watchdog.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_tests_8_assembly_info_8cs.html b/_tgstation_8_server_8_tests_8_assembly_info_8cs.html index 6ffe9f992d..26e4c9ba82 100644 --- a/_tgstation_8_server_8_tests_8_assembly_info_8cs.html +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs File Reference +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs File Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html b/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html index 4ac2885489..ce315e8a0d 100644 --- a/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html +++ b/_tgstation_8_server_8_tests_8_assembly_info_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs Source File +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.AssemblyInfo.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
@@ -92,7 +92,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
Tgstation.Server.Tests.AssemblyInfo.cs
-Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
+Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // <auto-generated>
3 // This code was generated by a tool.
4 // Runtime Version:4.0.30319.42000
5 //
6 // Changes to this file may cause incorrect behavior and will be lost if
7 // the code is regenerated.
8 // </auto-generated>
9 //------------------------------------------------------------------------------
10 
11 using System;
12 using System.Reflection;
13 
14 [assembly: System.Reflection.AssemblyCompanyAttribute("Tgstation.Server.Tests")]
15 [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
16 [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
17 [assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
18 [assembly: System.Reflection.AssemblyProductAttribute("Tgstation.Server.Tests")]
19 [assembly: System.Reflection.AssemblyTitleAttribute("Tgstation.Server.Tests")]
20 [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
21 
22 // Generated by the MSBuild WriteCodeFragment class.
23 
diff --git a/_tgstation_8_server_8_tests_8_program_8cs_source.html b/_tgstation_8_server_8_tests_8_program_8cs_source.html index ba2161b75f..fa15cfe690 100644 --- a/_tgstation_8_server_8_tests_8_program_8cs_source.html +++ b/_tgstation_8_server_8_tests_8_program_8cs_source.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Tests/obj/Release/netcoreapp2.1/Tgstation.Server.Tests.Program.cs Source File +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1/Tgstation.Server.Tests.Program.cs Source File @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/_user_controller_8cs_source.html b/_user_controller_8cs_source.html index 0eed3bf44c..92706aca06 100644 --- a/_user_controller_8cs_source.html +++ b/_user_controller_8cs_source.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +
UserController(IDatabaseContext databaseContext, IAuthenticationContextFactory authenticationContextFactory, ISystemIdentityFactory systemIdentityFactory, ICryptographySuite cryptographySuite, ILogger< UserController > logger, IOptions< GeneralConfiguration > generalConfigurationOptions)
Construct a UserController
@@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
InstanceManagerRights
Rights for managing Models.Instances
- +
override async Task< IActionResult > Update([FromBody] UserUpdate model, CancellationToken cancellationToken)
An ApiController representing a TModel
diff --git a/annotated.html b/annotated.html index e647fa6632..20fe53eb69 100644 --- a/annotated.html +++ b/annotated.html @@ -401,14 +401,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  CMSInitialCreateThe initial database migration for MSSQL  CMSNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MSSQL  CMSReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MSSQL - CMYAddMinimumSecurityAdd the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB - CMYInitialCreateThe initial database migration for MySQL/MariaDB - CMYNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MySQL/MariaDB - CMYReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB - CMySqlDatabaseContextModelSnapshot - CMySqlDesignTimeDbContextFactory - CSqlServerDatabaseContextModelSnapshot - CSqlServerDesignTimeDbContextFactory + CMSToggleTestmergeCommentsAdd the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL + CMYAddMinimumSecurityAdd the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB + CMYInitialCreateThe initial database migration for MySQL/MariaDB + CMYNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MySQL/MariaDB + CMYReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB + CMySqlDatabaseContextModelSnapshot + CMySqlDesignTimeDbContextFactory + CMYToggleTestmergeCommentsAdd the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB + CSqlServerDatabaseContextModelSnapshot + CSqlServerDesignTimeDbContextFactory  CChatBot  CChatChannel  CCompileJob diff --git a/class_auto_generated_program.html b/class_auto_generated_program.html index 180eeab0e0..126ab2dcb0 100644 --- a/class_auto_generated_program.html +++ b/class_auto_generated_program.html @@ -295,12 +295,12 @@ Static Private Member Functions

The documentation for this class was generated from the following files: diff --git a/class_migration.html b/class_migration.html index 803bfd69b4..9b02336f67 100644 --- a/class_migration.html +++ b/class_migration.html @@ -101,10 +101,12 @@ Inheritance diagram for Migration: Tgstation.Server.Host.Models.Migrations.MSInitialCreate Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired -Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity -Tgstation.Server.Host.Models.Migrations.MYInitialCreate -Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup -Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments +Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity +Tgstation.Server.Host.Models.Migrations.MYInitialCreate +Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup +Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
The documentation for this class was generated from the following file:
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_0c9add60ab05c04ed8367ecaedf67c01.html b/dir_0c9add60ab05c04ed8367ecaedf67c01.html index d168fb6958..28a3e9407a 100644 --- a/dir_0c9add60ab05c04ed8367ecaedf67c01.html +++ b/dir_0c9add60ab05c04ed8367ecaedf67c01.html @@ -127,6 +127,14 @@ Files   file  20180926034014_MYReattachCompileJobRequired.Designer.cs [code]   +file  20181124231534_MSToggleTestmergeComments.cs [code] +  +file  20181124231534_MSToggleTestmergeComments.Designer.cs [code] +  +file  20181124231549_MYToggleTestmergeComments.cs [code] +  +file  20181124231549_MYToggleTestmergeComments.Designer.cs [code] +  file  DesignTimeDbContextFactoryHelpers.cs [code]   file  MySqlDatabaseContextModelSnapshot.cs [code] diff --git a/dir_103b33cf1ab7043de6f87dfa61afa23f.html b/dir_103b33cf1ab7043de6f87dfa61afa23f.html index aa10758ae0..7501f6c633 100644 --- a/dir_103b33cf1ab7043de6f87dfa61afa23f.html +++ b/dir_103b33cf1ab7043de6f87dfa61afa23f.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_b2c89c850c962495793d09ea3a2ee385.html b/dir_1083fcf52a7d94a2efffb6ca88246acf.html similarity index 95% rename from dir_b2c89c850c962495793d09ea3a2ee385.html rename to dir_1083fcf52a7d94a2efffb6ca88246acf.html index 9e631c4d68..e8b31798d9 100644 --- a/dir_b2c89c850c962495793d09ea3a2ee385.html +++ b/dir_1083fcf52a7d94a2efffb6ca88246acf.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_177c182c6d1f29bec543c3fdad3072d5.html b/dir_177c182c6d1f29bec543c3fdad3072d5.html index c5f1f80c35..de1657aed2 100644 --- a/dir_177c182c6d1f29bec543c3fdad3072d5.html +++ b/dir_177c182c6d1f29bec543c3fdad3072d5.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_53aae571c66a052729f8e64ccc397130.html b/dir_2553b13cbb871373b0c30fb90d66217c.html similarity index 94% rename from dir_53aae571c66a052729f8e64ccc397130.html rename to dir_2553b13cbb871373b0c30fb90d66217c.html index 41068033a6..fae236a9e2 100644 --- a/dir_53aae571c66a052729f8e64ccc397130.html +++ b/dir_2553b13cbb871373b0c30fb90d66217c.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Host.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_90400719279795a0c5ea912516a4c874.html b/dir_2b9d136d9ffdab429a63a74fca28b300.html similarity index 92% rename from dir_90400719279795a0c5ea912516a4c874.html rename to dir_2b9d136d9ffdab429a63a74fca28b300.html index 80c2dd4c01..5f8a13ad47 100644 --- a/dir_90400719279795a0c5ea912516a4c874.html +++ b/dir_2b9d136d9ffdab429a63a74fca28b300.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release Directory Reference +tgstation-server: src/Tgstation.Server.Host/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_ec133cefc1442f53ec97e0d7a57cf129.html b/dir_2e39d68cad3f83629c74ea67329dead9.html similarity index 92% rename from dir_ec133cefc1442f53ec97e0d7a57cf129.html rename to dir_2e39d68cad3f83629c74ea67329dead9.html index c66705fb2e..448b1a1888 100644 --- a/dir_ec133cefc1442f53ec97e0d7a57cf129.html +++ b/dir_2e39d68cad3f83629c74ea67329dead9.html @@ -4,7 +4,7 @@ -tgstation-server: tools/ReleaseNotes/obj/Release Directory Reference +tgstation-server: tools/ReleaseNotes/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_7ae0efc0613c36c848fa310214e0aee3.html b/dir_2e67631cb23401d696bcfdbe81f86f0f.html similarity index 92% rename from dir_7ae0efc0613c36c848fa310214e0aee3.html rename to dir_2e67631cb23401d696bcfdbe81f86f0f.html index 6f771886e7..dd30a6f223 100644 --- a/dir_7ae0efc0613c36c848fa310214e0aee3.html +++ b/dir_2e67631cb23401d696bcfdbe81f86f0f.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Api/obj/Release Directory Reference +tgstation-server: src/Tgstation.Server.Api/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netstandard2.0
directory  netstandard2.0
 
diff --git a/dir_446bdfc1cd19b69c11765b5665ebfd45.html b/dir_446bdfc1cd19b69c11765b5665ebfd45.html index e9184ffb05..00898166ed 100644 --- a/dir_446bdfc1cd19b69c11765b5665ebfd45.html +++ b/dir_446bdfc1cd19b69c11765b5665ebfd45.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_4122b363a9d577bed19bef337e757ff3.html b/dir_48968f849f7ddb061f7130e079fe66a6.html similarity index 92% rename from dir_4122b363a9d577bed19bef337e757ff3.html rename to dir_48968f849f7ddb061f7130e079fe66a6.html index b3a9b1e4ea..196118d239 100644 --- a/dir_4122b363a9d577bed19bef337e757ff3.html +++ b/dir_48968f849f7ddb061f7130e079fe66a6.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Client/obj/Release Directory Reference +tgstation-server: src/Tgstation.Server.Client/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netstandard2.0
directory  netstandard2.0
 
diff --git a/dir_d45f494620bc0048ee4a31fa4f7391e1.html b/dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html similarity index 94% rename from dir_d45f494620bc0048ee4a31fa4f7391e1.html rename to dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html index f7d7774036..2f3126d81e 100644 --- a/dir_d45f494620bc0048ee4a31fa4f7391e1.html +++ b/dir_4c0c7e2f4fc60f51e2347a2d8dda94ce.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_685b5aa2d8a661ab5bc3f68b331887b0.html b/dir_685b5aa2d8a661ab5bc3f68b331887b0.html index 218f75929a..c1123aed64 100644 --- a/dir_685b5aa2d8a661ab5bc3f68b331887b0.html +++ b/dir_685b5aa2d8a661ab5bc3f68b331887b0.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_689f0584ee97ae9ca308532531d9c5d2.html b/dir_689f0584ee97ae9ca308532531d9c5d2.html index 6c9954610a..fd4c537aa3 100644 --- a/dir_689f0584ee97ae9ca308532531d9c5d2.html +++ b/dir_689f0584ee97ae9ca308532531d9c5d2.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_74017a19412e2f90cc6ad11fcac82495.html b/dir_74017a19412e2f90cc6ad11fcac82495.html index 7f8fa7d13d..6be6b1c3a2 100644 --- a/dir_74017a19412e2f90cc6ad11fcac82495.html +++ b/dir_74017a19412e2f90cc6ad11fcac82495.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_0e792d76844bf2d7c79795a56a50ebec.html b/dir_87039fa7b841d848ca75981d64237477.html similarity index 92% rename from dir_0e792d76844bf2d7c79795a56a50ebec.html rename to dir_87039fa7b841d848ca75981d64237477.html index 23a89b0749..adbdcbf855 100644 --- a/dir_0e792d76844bf2d7c79795a56a50ebec.html +++ b/dir_87039fa7b841d848ca75981d64237477.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Tests/obj/Release Directory Reference +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_87a4f2035ed18e30422f4b60aebc4381.html b/dir_87a4f2035ed18e30422f4b60aebc4381.html index 758e9f5842..bf16019436 100644 --- a/dir_87a4f2035ed18e30422f4b60aebc4381.html +++ b/dir_87a4f2035ed18e30422f4b60aebc4381.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_6db5af7fcfa17a34c7abf23e195af4db.html b/dir_9257d56e926145e494a5aa5279887044.html similarity index 94% rename from dir_6db5af7fcfa17a34c7abf23e195af4db.html rename to dir_9257d56e926145e494a5aa5279887044.html index c6f101d612..f1c9e65896 100644 --- a/dir_6db5af7fcfa17a34c7abf23e195af4db.html +++ b/dir_9257d56e926145e494a5aa5279887044.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_13bee0ed20ecc83b9bcd4b869b726d42.html b/dir_a3714ab037275c284988fc90b4d045a5.html similarity index 95% rename from dir_13bee0ed20ecc83b9bcd4b869b726d42.html rename to dir_a3714ab037275c284988fc90b4d045a5.html index 22a0a8b491..8da0204063 100644 --- a/dir_13bee0ed20ecc83b9bcd4b869b726d42.html +++ b/dir_a3714ab037275c284988fc90b4d045a5.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release/netstandard2.0 Directory Reference +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug/netstandard2.0 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_fcc41a8faa41492aba200a49fc7d0aed.html b/dir_a8807eef6592489c6a360d587f5b1a66.html similarity index 93% rename from dir_fcc41a8faa41492aba200a49fc7d0aed.html rename to dir_a8807eef6592489c6a360d587f5b1a66.html index 31f97c168e..884a51bfcb 100644 --- a/dir_fcc41a8faa41492aba200a49fc7d0aed.html +++ b/dir_a8807eef6592489c6a360d587f5b1a66.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Console/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_b524b00ec2259c3c83b44909fd47f6e3.html b/dir_b524b00ec2259c3c83b44909fd47f6e3.html index 4404253378..77ef1a1ebc 100644 --- a/dir_b524b00ec2259c3c83b44909fd47f6e3.html +++ b/dir_b524b00ec2259c3c83b44909fd47f6e3.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_900257602d294c4a4799e88420919068.html b/dir_b551a02288ef39e099594710382363a0.html similarity index 95% rename from dir_900257602d294c4a4799e88420919068.html rename to dir_b551a02288ef39e099594710382363a0.html index bc123d8ffe..e45deffdd4 100644 --- a/dir_900257602d294c4a4799e88420919068.html +++ b/dir_b551a02288ef39e099594710382363a0.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_e928c7e494884ad322b5f6005c2954e1.html b/dir_b87cbb2c60cf682b61fbfcceb9bced43.html similarity index 94% rename from dir_e928c7e494884ad322b5f6005c2954e1.html rename to dir_b87cbb2c60cf682b61fbfcceb9bced43.html index f848936f1a..1a266fb6a8 100644 --- a/dir_e928c7e494884ad322b5f6005c2954e1.html +++ b/dir_b87cbb2c60cf682b61fbfcceb9bced43.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: src/Tgstation.Server.Host/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_40138fd4849573e743490d583f6d06d6.html b/dir_b92573f47b933d7a3661c26d1af2098b.html similarity index 93% rename from dir_40138fd4849573e743490d583f6d06d6.html rename to dir_b92573f47b933d7a3661c26d1af2098b.html index bcd2178ae4..8845501d3a 100644 --- a/dir_40138fd4849573e743490d583f6d06d6.html +++ b/dir_b92573f47b933d7a3661c26d1af2098b.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Release Directory Reference +tgstation-server: tests/Tgstation.Server.Host.Console.Tests/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_18a5e30c14613227f95d12bd9fddc614.html b/dir_be9f3ed3485a880e3213506a311823d1.html similarity index 92% rename from dir_18a5e30c14613227f95d12bd9fddc614.html rename to dir_be9f3ed3485a880e3213506a311823d1.html index 2d245f3bd5..b2ae8d72ef 100644 --- a/dir_18a5e30c14613227f95d12bd9fddc614.html +++ b/dir_be9f3ed3485a880e3213506a311823d1.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Release Directory Reference +tgstation-server: tests/Tgstation.Server.Api.Tests/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_bf23e1e49f40264f2966f02ed35d8142.html b/dir_bf23e1e49f40264f2966f02ed35d8142.html index 628590894f..40d54d7173 100644 --- a/dir_bf23e1e49f40264f2966f02ed35d8142.html +++ b/dir_bf23e1e49f40264f2966f02ed35d8142.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_298f2a364723f4f4cea115538f944a94.html b/dir_c5f98c05147bcbba78e71856485f5049.html similarity index 95% rename from dir_298f2a364723f4f4cea115538f944a94.html rename to dir_c5f98c05147bcbba78e71856485f5049.html index 38023d24fb..aa66f45877 100644 --- a/dir_298f2a364723f4f4cea115538f944a94.html +++ b/dir_c5f98c05147bcbba78e71856485f5049.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Release/netcoreapp2.1 Directory Reference +tgstation-server: tests/Tgstation.Server.Client.Tests/obj/Debug/netcoreapp2.1 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_83a6f600c846cd444f33e44bb9b4f9cb.html b/dir_d8a279f7113e0073f6cd65dd050c1475.html similarity index 94% rename from dir_83a6f600c846cd444f33e44bb9b4f9cb.html rename to dir_d8a279f7113e0073f6cd65dd050c1475.html index a8019a6a86..67523f1be3 100644 --- a/dir_83a6f600c846cd444f33e44bb9b4f9cb.html +++ b/dir_d8a279f7113e0073f6cd65dd050c1475.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Api/obj/Release/netstandard2.0 Directory Reference +tgstation-server: src/Tgstation.Server.Api/obj/Debug/netstandard2.0 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_e0c1bccb03249d93bc42ac0968ce43fd.html b/dir_e0c1bccb03249d93bc42ac0968ce43fd.html index 3c01320942..97505085b3 100644 --- a/dir_e0c1bccb03249d93bc42ac0968ce43fd.html +++ b/dir_e0c1bccb03249d93bc42ac0968ce43fd.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_c65d377d3c73fb4a07b3637f9c0caf4d.html b/dir_e97d380c3eebaf0856a4ec180d749620.html similarity index 93% rename from dir_c65d377d3c73fb4a07b3637f9c0caf4d.html rename to dir_e97d380c3eebaf0856a4ec180d749620.html index 8850253690..06713a10d6 100644 --- a/dir_c65d377d3c73fb4a07b3637f9c0caf4d.html +++ b/dir_e97d380c3eebaf0856a4ec180d749620.html @@ -4,7 +4,7 @@ -tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Release Directory Reference +tgstation-server: tests/Tgstation.Server.Host.Watchdog.Tests/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_6c8d8f20501e8e412458f542d0998195.html b/dir_ea36b5ab01ad6e8b607438a02ae91964.html similarity index 93% rename from dir_6c8d8f20501e8e412458f542d0998195.html rename to dir_ea36b5ab01ad6e8b607438a02ae91964.html index 0a0cbe414e..a76bac9127 100644 --- a/dir_6c8d8f20501e8e412458f542d0998195.html +++ b/dir_ea36b5ab01ad6e8b607438a02ae91964.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Release Directory Reference +tgstation-server: src/Tgstation.Server.Host.Watchdog/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netstandard2.0
directory  netstandard2.0
 
diff --git a/dir_f0581cdd528a911f791df57d0f438bcb.html b/dir_f0581cdd528a911f791df57d0f438bcb.html index 92fb7d8e33..56a5aee82e 100644 --- a/dir_f0581cdd528a911f791df57d0f438bcb.html +++ b/dir_f0581cdd528a911f791df57d0f438bcb.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/dir_383ca23c40357ede4cca827b4a365c76.html b/dir_f88948f9bde0555374e8a59a663bdfc9.html similarity index 94% rename from dir_383ca23c40357ede4cca827b4a365c76.html rename to dir_f88948f9bde0555374e8a59a663bdfc9.html index f0da92e2cc..f4794e143b 100644 --- a/dir_383ca23c40357ede4cca827b4a365c76.html +++ b/dir_f88948f9bde0555374e8a59a663bdfc9.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Client/obj/Release/netstandard2.0 Directory Reference +tgstation-server: src/Tgstation.Server.Client/obj/Debug/netstandard2.0 Directory Reference @@ -84,7 +84,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html b/dir_fab1362e86740a2c573ef875dd474a67.html similarity index 92% rename from dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html rename to dir_fab1362e86740a2c573ef875dd474a67.html index 445fc56436..1dedab1f09 100644 --- a/dir_7a9d035dcfcd6d9c7aa1efef4b6b58a4.html +++ b/dir_fab1362e86740a2c573ef875dd474a67.html @@ -4,7 +4,7 @@ -tgstation-server: src/Tgstation.Server.Host.Console/obj/Release Directory Reference +tgstation-server: src/Tgstation.Server.Host.Console/obj/Debug Directory Reference @@ -84,18 +84,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
-
Release Directory Reference
+
Debug Directory Reference
- +

Directories

directory  netcoreapp2.1
directory  netcoreapp2.1
 
diff --git a/dir_fb12273b841438c2f2c9b5bc5398c636.html b/dir_fb12273b841438c2f2c9b5bc5398c636.html index a687d3898e..aaa3255164 100644 --- a/dir_fb12273b841438c2f2c9b5bc5398c636.html +++ b/dir_fb12273b841438c2f2c9b5bc5398c636.html @@ -95,7 +95,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - +

Directories

directory  Release
directory  Debug
 
diff --git a/files.html b/files.html index 7f31656514..7597c475f9 100644 --- a/files.html +++ b/files.html @@ -133,8 +133,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  User.cs  UserUpdate.cs   obj -  Release -  netstandard2.0 +  Debug +  netstandard2.0  Tgstation.Server.Api.AssemblyInfo.cs   Rights  AdministrationRights.cs @@ -171,8 +171,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  JobsClient.cs  RepositoryClient.cs   obj -  Release -  netstandard2.0 +  Debug +  netstandard2.0  Tgstation.Server.Client.AssemblyInfo.cs  AdministrationClient.cs  ApiClient.cs @@ -395,11 +395,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  20180926033145_MSReattachCompileJobRequired.Designer.cs  20180926034014_MYReattachCompileJobRequired.cs  20180926034014_MYReattachCompileJobRequired.Designer.cs - DesignTimeDbContextFactoryHelpers.cs - MySqlDatabaseContextModelSnapshot.cs - MySqlDesignTimeDbContextFactory.cs - SqlServerDatabaseContextModelSnapshot.cs - SqlServerDesignTimeDbContextFactory.cs + 20181124231534_MSToggleTestmergeComments.cs + 20181124231534_MSToggleTestmergeComments.Designer.cs + 20181124231549_MYToggleTestmergeComments.cs + 20181124231549_MYToggleTestmergeComments.Designer.cs + DesignTimeDbContextFactoryHelpers.cs + MySqlDatabaseContextModelSnapshot.cs + MySqlDesignTimeDbContextFactory.cs + SqlServerDatabaseContextModelSnapshot.cs + SqlServerDesignTimeDbContextFactory.cs  ChatBot.cs  ChatChannel.cs  CompileJob.cs @@ -424,8 +428,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  WatchdogReattachInformation.cs  WatchdogReattachInformationBase.cs   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Host.AssemblyInfo.cs  Tgstation.Server.Host.RazorAssemblyInfo.cs   Security @@ -456,8 +460,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  ServerFactory.cs   Tgstation.Server.Host.Console   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Host.Console.AssemblyInfo.cs  AssemblyInfo.cs  Program.cs @@ -469,8 +473,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  ServerService.cs   Tgstation.Server.Host.Watchdog   obj -  Release -  netstandard2.0 +  Debug +  netstandard2.0  Tgstation.Server.Host.Watchdog.AssemblyInfo.cs  AssemblyInfo.cs  IWatchdog.cs @@ -482,8 +486,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');   Models  TestIrcConnectionStringBuilder.cs   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Api.Tests.AssemblyInfo.cs  Tgstation.Server.Api.Tests.Program.cs   Rights @@ -493,16 +497,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');   Components  TestDreamDaemonClient.cs   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Client.Tests.AssemblyInfo.cs  Tgstation.Server.Client.Tests.Program.cs  TestApiClient.cs  TestServerClientFactory.cs   Tgstation.Server.Host.Console.Tests   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Host.Console.Tests.AssemblyInfo.cs  Tgstation.Server.Host.Console.Tests.Program.cs  TestProgram.cs @@ -535,8 +539,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  TestPostWriteHandler.cs  TestSymlinkFactory.cs   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Host.Tests.AssemblyInfo.cs  Tgstation.Server.Host.Tests.Program.cs   Security @@ -544,8 +548,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  TestServerFactory.cs   Tgstation.Server.Host.Watchdog.Tests   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Host.Watchdog.Tests.AssemblyInfo.cs  Tgstation.Server.Host.Watchdog.Tests.Program.cs  TestWatchdog.cs @@ -556,8 +560,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  ConfigurationTest.cs  InstanceTest.cs   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  Tgstation.Server.Tests.AssemblyInfo.cs  Tgstation.Server.Tests.Program.cs  AdministrationTest.cs @@ -567,8 +571,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');   tools   ReleaseNotes   obj -  Release -  netcoreapp2.1 +  Debug +  netcoreapp2.1  ReleaseNotes.AssemblyInfo.cs  Program.cs diff --git a/functions_b.html b/functions_b.html index efe8b97c70..f961e80461 100644 --- a/functions_b.html +++ b/functions_b.html @@ -171,10 +171,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • builtinCommands : Tgstation.Server.Host.Components.Chat.Chat diff --git a/functions_d.html b/functions_d.html index 533b9e85d3..6c4010421b 100644 --- a/functions_d.html +++ b/functions_d.html @@ -446,10 +446,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • downgradeVersion : Tgstation.Server.Host.Components.InstanceManager diff --git a/functions_func_b.html b/functions_func_b.html index cdaaf78a7a..50e337d97d 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -136,10 +136,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • Byond() : Tgstation.Server.Client.Components.ByondClient diff --git a/functions_func_d.html b/functions_func_d.html index d4a3e083d0..23839dec3e 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -277,10 +277,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • DownloadFile() : Tgstation.Server.Host.IO.DefaultIOManager diff --git a/functions_func_u.html b/functions_func_u.html index 8edbda9bc0..7d2a1eeaac 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -138,10 +138,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • Update() : Tgstation.Server.Client.AdministrationClient @@ -178,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • Update< TBody, TResult >() : Tgstation.Server.Client.ApiClient -, Tgstation.Server.Client.IApiClient +, Tgstation.Server.Client.IApiClient
  • Update< TResult >() : Tgstation.Server.Client.ApiClient diff --git a/functions_p.html b/functions_p.html index c2b72c914f..5169e7a2dd 100644 --- a/functions_p.html +++ b/functions_p.html @@ -210,6 +210,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • PostComplete : Tgstation.Server.Host.Models.Job
  • +
  • PostTestMergeComment +: Tgstation.Server.Api.Models.Internal.RepositorySettings +
  • postWriteHandler : Tgstation.Server.Host.Components.Byond.PosixByondInstaller , Tgstation.Server.Host.Components.InstanceFactory diff --git a/functions_prop_p.html b/functions_prop_p.html index 0d3257b822..5df900ff03 100644 --- a/functions_prop_p.html +++ b/functions_prop_p.html @@ -155,6 +155,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • PostComplete : Tgstation.Server.Host.Models.Job
  • +
  • PostTestMergeComment +: Tgstation.Server.Api.Models.Internal.RepositorySettings +
  • PrimaryDirectory : Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider , Tgstation.Server.Host.Components.IDmbProvider diff --git a/functions_r.html b/functions_r.html index 658e1ed031..b052c7e471 100644 --- a/functions_r.html +++ b/functions_r.html @@ -295,13 +295,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Client.Components.IInstanceClient , Tgstation.Server.Client.Components.InstanceClient , Tgstation.Server.Client.Components.RepositoryClient +, Tgstation.Server.Host.Components.Repository.Repository
  • repository : Tgstation.Server.Host.Components.Repository.Repository
  • -
  • Repository() -: Tgstation.Server.Host.Components.Repository.Repository -
  • RepositoryClient() : Tgstation.Server.Client.Components.RepositoryClient
  • diff --git a/functions_u.html b/functions_u.html index d58c23d67c..73554b8f1d 100644 --- a/functions_u.html +++ b/functions_u.html @@ -149,10 +149,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); , Tgstation.Server.Host.Models.Migrations.MSInitialCreate , Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments , Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity , Tgstation.Server.Host.Models.Migrations.MYInitialCreate , Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup , Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired +, Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments
  • Update() : Tgstation.Server.Client.AdministrationClient diff --git a/hierarchy.html b/hierarchy.html index ba20303712..f26611b85b 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -380,10 +380,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  CTgstation.Server.Host.Models.Migrations.MSInitialCreateThe initial database migration for MSSQL  CTgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MSSQL  CTgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MSSQL - CTgstation.Server.Host.Models.Migrations.MYAddMinimumSecurityAdd the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB - CTgstation.Server.Host.Models.Migrations.MYInitialCreateThe initial database migration for MySQL/MariaDB - CTgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MySQL/MariaDB - CTgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB + CTgstation.Server.Host.Models.Migrations.MSToggleTestmergeCommentsAdd the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL + CTgstation.Server.Host.Models.Migrations.MYAddMinimumSecurityAdd the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB + CTgstation.Server.Host.Models.Migrations.MYInitialCreateThe initial database migration for MySQL/MariaDB + CTgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanupCleans up of nullable columns and foreign keys MySQL/MariaDB + CTgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequiredMarks the CompileJobs of ReattachInformations as non-nullable for MySQL/MariaDB + CTgstation.Server.Host.Models.Migrations.MYToggleTestmergeCommentsAdd the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB  CTgstation.Server.Host.Controllers.ModelController< Administration >  CTgstation.Server.Host.Controllers.AdministrationControllerModelController<TModel> for Administration  CTgstation.Server.Host.Controllers.ModelController< Api.Models.Byond > @@ -411,9 +413,9 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  CTgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot  CTgstation.Server.Host.Components.Watchdog.MonitorStateThe (absolute) state of the Watchdog  CTgstation.Server.Host.NativeMethodsNative methods used by the code - CReleaseNotes.ProgramContains the application entrypoint - CTgstation.Server.Host.ProgramEntrypoint for the Process - CTgstation.Server.Host.Service.ProgramContains the entrypoint for the application + CTgstation.Server.Host.Service.ProgramContains the entrypoint for the application + CReleaseNotes.ProgramContains the application entrypoint + CTgstation.Server.Host.ProgramEntrypoint for the Process  CTgstation.Server.Host.Console.ProgramContains the entrypoint for the application  CTgstation.Server.Api.Models.Internal.RepositorySettingsRepresents configurable settings for a Repository  CTgstation.Server.Api.Models.RepositoryRepresents a git repository @@ -466,11 +468,11 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  CTgstation.Server.Host.Watchdog.Tests.TestWatchdogFactoryTests for WatchdogFactory  CTgstation.Server.Api.Models.TokenRepresents a JWT returned by the API  CTgstation.Server.Host.Configuration.UpdatesConfigurationConfiguration for the automatic update system - CTgstation.Server.Api.Models.Internal.UserRepresents a server User - CTgstation.Server.Api.Models.User - CTgstation.Server.Api.Models.UserUpdateFor editing a given User. Will never be returned by the API - CTgstation.Server.Host.Models.User - CTgstation.Server.Host.Components.Chat.UserRepresents a tgs_chat_user datum + CTgstation.Server.Host.Components.Chat.UserRepresents a tgs_chat_user datum + CTgstation.Server.Api.Models.Internal.UserRepresents a server User + CTgstation.Server.Api.Models.User + CTgstation.Server.Api.Models.UserUpdateFor editing a given User. Will never be returned by the API + CTgstation.Server.Host.Models.User  CTgstation.Server.Host.Models.WatchdogReattachInformationBaseBase class for WatchdogReattachInformation  CTgstation.Server.Host.Components.Watchdog.WatchdogReattachInformationReattach information for a IWatchdog  CTgstation.Server.Host.Models.WatchdogReattachInformationDatabase representation of Components.Watchdog.WatchdogReattachInformation diff --git a/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html b/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html index fdb0730638..7d4aabbca1 100644 --- a/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html +++ b/namespace_tgstation_1_1_server_1_1_api_1_1_rights.html @@ -755,7 +755,7 @@ Enumerations

    User may change Models.Internal.RepositorySettings.CommitterName and Models.Internal.RepositorySettings.CommitterEmail

    ChangeTestMergeCommits  -

    User may change Models.Internal.RepositorySettings.PushTestMergeCommits

    +

    User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models.Internal.RepositorySettings.PostTestMergeComment

    ChangeCredentials 

    User may read and change Models.Internal.RepositorySettings.AccessUser and Models.Internal.RepositorySettings.AccessToken

    @@ -781,7 +781,7 @@ Enumerations
    9  : ulong
    10  {
    14  None = 0,
    15 
    20 
    24  SetOrigin = 2,
    25 
    29  SetSha = 4,
    30 
    34  MergePullRequest = 8,
    35 
    39  UpdateBranch = 16,
    40 
    44  ChangeCommitter = 32,
    45 
    50 
    54  ChangeCredentials = 128,
    55 
    59  SetReference = 256,
    60 
    64  Read = 512,
    65 
    70 
    74  Delete = 2048,
    75 
    79  CancelClone = 4096
    80  }
    User may change Models.Internal.RepositorySettings.AutoUpdatesKeepTestMerges and Models.Internal.RepositorySettings.AutoUpdatesSynchronize
    User may fetch and merge GitHub pull requests
    -
    User may change Models.Internal.RepositorySettings.PushTestMergeCommits
    +
    User may change Models.Internal.RepositorySettings.PushTestMergeCommits and Models.Internal.RepositorySettings.PostTestMergeComment
    diff --git a/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html b/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html index a1fcd93a52..3ac71cf583 100644 --- a/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html +++ b/namespace_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations.html @@ -113,6 +113,9 @@ Classes class  MSReattachCompileJobRequired  Marks the CompileJobs of ReattachInformations as non-nullable for MSSQL More...
      +class  MSToggleTestmergeComments + Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MSSQL More...
    +  class  MYAddMinimumSecurity  Add the Api.Models.Internal.CompileJob.MinimumSecurityLevel and DreamMaker.ApiValidationSecurityLevel columns for MySQL/MariaDB More...
      @@ -129,6 +132,9 @@ Classes   class  MySqlDesignTimeDbContextFactory   +class  MYToggleTestmergeComments + Add the Api.Models.Internal.RepositorySettings.PostTestMergeComment column for MySQL/MariaDB More...
    +  class  SqlServerDatabaseContextModelSnapshot   class  SqlServerDesignTimeDbContextFactory diff --git a/search/all_0.js b/search/all_0.js index 04352cdd3f..b8ed98366a 100644 --- a/search/all_0.js +++ b/search/all_0.js @@ -15,5 +15,9 @@ var searchData= ['20180926033145_5fmsreattachcompilejobrequired_2ecs',['20180926033145_MSReattachCompileJobRequired.cs',['../20180926033145___m_s_reattach_compile_job_required_8cs.html',1,'']]], ['20180926033145_5fmsreattachcompilejobrequired_2edesigner_2ecs',['20180926033145_MSReattachCompileJobRequired.Designer.cs',['../20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html',1,'']]], ['20180926034014_5fmyreattachcompilejobrequired_2ecs',['20180926034014_MYReattachCompileJobRequired.cs',['../20180926034014___m_y_reattach_compile_job_required_8cs.html',1,'']]], - ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]] + ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2ecs',['20181124231534_MSToggleTestmergeComments.cs',['../20181124231534___m_s_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2edesigner_2ecs',['20181124231534_MSToggleTestmergeComments.Designer.cs',['../20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2ecs',['20181124231549_MYToggleTestmergeComments.cs',['../20181124231549___m_y_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2edesigner_2ecs',['20181124231549_MYToggleTestmergeComments.Designer.cs',['../20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html',1,'']]] ]; diff --git a/search/all_10.js b/search/all_10.js index 36d24eb57f..aa451664a4 100644 --- a/search/all_10.js +++ b/search/all_10.js @@ -29,6 +29,7 @@ var searchData= ['posixsystemidentityfactory',['PosixSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], ['posixsystemidentityfactory_2ecs',['PosixSystemIdentityFactory.cs',['../_posix_system_identity_factory_8cs.html',1,'']]], ['postcomplete',['PostComplete',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#ab2680675a7b2124d03a899f45a09e08e',1,'Tgstation::Server::Host::Models::Job']]], + ['posttestmergecomment',['PostTestMergeComment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a2897ad062e3663f0eb12062c4393f1e8',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], ['postwritehandler',['postWriteHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#abaa57b4cd2fdf1ea15b08b81ccd88023',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#aca83a69059579020791c6d62721c08fd',1,'Tgstation.Server.Host.Components.InstanceFactory.postWriteHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#a9070bfae5692e48611c410eeef52c7af',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.postWriteHandler()']]], ['pressanykeyasync',['PressAnyKeyAsync',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_console.html#ad10bdc2971cb4068b3fe0d46aa7cb167',1,'Tgstation.Server.Host.IO.Console.PressAnyKeyAsync()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_console.html#ad674c458bbe343698fb0da3494bf3e37',1,'Tgstation.Server.Host.IO.IConsole.PressAnyKeyAsync()']]], ['primarydirectory',['PrimaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a2a2e015f0196f86632485bd3dd94bd4e',1,'Tgstation.Server.Host.Components.Compiler.DmbProvider.PrimaryDirectory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a0bc97032ff316e913dd373e68a2232c2',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa3e399fe1533b15a2e0814b3634037bc',1,'Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory()']]], @@ -36,7 +37,7 @@ var searchData= ['primaryrevisioninformation',['PrimaryRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a4fb69a83c0ff12c00dc7db7905003709',1,'Tgstation::Server::Host::Models::TestMerge']]], ['primaryrevisioninformationid',['PrimaryRevisionInformationId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a4bcf9795fa6b73278d66c64809714e61',1,'Tgstation::Server::Host::Models::TestMerge']]], ['primarytestmerge',['PrimaryTestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_revision_information.html#a628bb81ae3a0621e5e3ad472d0dab742',1,'Tgstation.Server.Api.Models.RevisionInformation.PrimaryTestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#adbe03f25ff741698ab92816bf7b511c5',1,'Tgstation.Server.Host.Models.RevisionInformation.PrimaryTestMerge()']]], - ['process',['process',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ad5dd4ef0f1bda6f26c3fe9a93223204f',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.process()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a622737e9c97152cfe56a81f2721dca04',1,'Tgstation.Server.Host.Core.Process.Process()']]], + ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a622737e9c97152cfe56a81f2721dca04',1,'Tgstation.Server.Host.Core.Process.Process()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#ad5dd4ef0f1bda6f26c3fe9a93223204f',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.process()']]], ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html',1,'Tgstation::Server::Host::Core']]], ['process_2ecs',['Process.cs',['../_process_8cs.html',1,'']]], ['processexecutor',['ProcessExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html',1,'Tgstation::Server::Host::Core']]], @@ -45,14 +46,14 @@ var searchData= ['processid',['ProcessId',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_daemon_settings.html#a2ffd7ce9d614fee77ab5d038d7b528e0',1,'Tgstation.Server.Host.Models.DreamDaemonSettings.ProcessId()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#a6f8d698913ca0c40775eaa9a1ec8a787',1,'Tgstation.Server.Host.Models.ReattachInformationBase.ProcessId()']]], ['processmessage',['ProcessMessage',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a57210321fe78dea227d4aa8c9764ba9a',1,'Tgstation::Server::Host::Components::Chat::Chat']]], ['productheadervalue',['productHeaderValue',['../class_tgstation_1_1_server_1_1_client_1_1_server_client_factory.html#a5db19a315f04b37200db2761f678661b',1,'Tgstation.Server.Client.ServerClientFactory.productHeaderValue()'],['../class_tgstation_1_1_server_1_1_api_1_1_tests_1_1_test_api_headers.html#a380531ccea4ef4d6191490bc6d513ee0',1,'Tgstation.Server.Api.Tests.TestApiHeaders.productHeaderValue()']]], + ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation::Server::Host::Service']]], ['program',['Program',['../class_release_notes_1_1_program.html',1,'ReleaseNotes']]], ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_program.html',1,'Tgstation::Server::Host']]], - ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation::Server::Host::Service']]], ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation::Server::Host::Console']]], - ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_2_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html',1,'']]], ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_8_service_2_program_8cs.html',1,'']]], ['program_2ecs',['Program.cs',['../tools_2_release_notes_2_program_8cs.html',1,'']]], - ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_8_console_2_program_8cs.html',1,'']]], + ['program_2ecs',['Program.cs',['../src_2_tgstation_8_server_8_host_2_program_8cs.html',1,'']]], ['progress',['Progress',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_job.html#ae2ec2fb03329836c26cdaa3cb6b451c6',1,'Tgstation.Server.Api.Models.Job.Progress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a0f1d18fd7297e239e431009cd72d439b',1,'Tgstation.Server.Host.Core.JobHandler.Progress()']]], ['projectname',['ProjectName',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_dream_maker.html#ad36bc7e479eaaaeeee6b5d0164296cf0',1,'Tgstation::Server::Api::Models::DreamMaker']]], ['promptforhostingport',['PromptForHostingPort',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a8768c71828396ea36792de7e1e0d68b0',1,'Tgstation::Server::Host::Core::SetupWizard']]], @@ -62,14 +63,14 @@ var searchData= ['provider',['Provider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], ['provider_2ecs',['Provider.cs',['../_provider_8cs.html',1,'']]], ['providerchannelid',['ProviderChannelId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#af9b20c51cf6dad7a37b048111026abcf',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], + ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#aa29104de105fbc85b60b43d6f6a6fa85',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.ProviderFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab0fc5acc521bee160dffaf45bdb9afe5',1,'Tgstation.Server.Host.Components.Chat.Chat.providerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a524251049a9a7f960681e4f1e6c68b97',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory()']]], ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], - ['providerfactory',['providerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab0fc5acc521bee160dffaf45bdb9afe5',1,'Tgstation.Server.Host.Components.Chat.Chat.providerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#a524251049a9a7f960681e4f1e6c68b97',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.providerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#aa29104de105fbc85b60b43d6f6a6fa85',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.ProviderFactory()']]], ['providerfactory_2ecs',['ProviderFactory.cs',['../_provider_factory_8cs.html',1,'']]], ['providerid',['ProviderId',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_channel_mapping.html#a647f007fe6e42d97d736747f6069c584',1,'Tgstation::Server::Host::Components::Chat::ChannelMapping']]], ['providers',['providers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a01b888e7f83c86acb162c6107c662876',1,'Tgstation::Server::Host::Components::Chat::Chat']]], ['pullrequestrevision',['PullRequestRevision',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html#adbe0060eb8405c4d27f40031913c5bf0',1,'Tgstation::Server::Api::Models::TestMergeParameters']]], - ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a96ba3e78b38424740cda93576b897bf6',1,'Tgstation::Server::Host::Components::Chat::Commands::PullRequestsCommand']]], + ['pullrequestscommand',['PullRequestsCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html',1,'Tgstation::Server::Host::Components::Chat::Commands']]], ['pullrequestscommand_2ecs',['PullRequestsCommand.cs',['../_pull_requests_command_8cs.html',1,'']]], ['pushheadtotemporarybranch',['PushHeadToTemporaryBranch',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a96553d378f9b7d9cfc4eb169f12bdba7',1,'Tgstation::Server::Host::Components::Repository::Repository']]], ['pushtestmergecommits',['PushTestMergeCommits',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a120439ca07d4b05156cdf433eb9f22d3',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]] diff --git a/search/all_12.js b/search/all_12.js index ee6ea9b4b8..158ed7ed45 100644 --- a/search/all_12.js +++ b/search/all_12.js @@ -25,7 +25,7 @@ var searchData= ['realserver',['realServer',['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a292747ef36a9f260dbe9b62591e2c93d',1,'Tgstation::Server::Tests::TestingServer']]], ['reattach',['Reattach',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller_factory.html#ac777b68fbfe9c7f37eb054cb1bbe3f42',1,'Tgstation.Server.Host.Components.Watchdog.ISessionControllerFactory.Reattach()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#afc88772088200c0924fdfb2373a5a6c8',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.Reattach()']]], ['reattachinfohandler',['ReattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html',1,'Tgstation::Server::Host::Components']]], - ['reattachinfohandler',['ReattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a8f936ffcb62ef8c77edba65bf4cfd674',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.ReattachInfoHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aed6e0e27662e31247ac29588da0c938d',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.reattachInfoHandler()']]], + ['reattachinfohandler',['reattachInfoHandler',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#aed6e0e27662e31247ac29588da0c938d',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.reattachInfoHandler()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#a8f936ffcb62ef8c77edba65bf4cfd674',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.ReattachInfoHandler()']]], ['reattachinfohandler_2ecs',['ReattachInfoHandler.cs',['../_reattach_info_handler_8cs.html',1,'']]], ['reattachinformation',['reattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a017d1f82539ec09794f736e9ae04e7fd',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.reattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a644624c553fc70200479f14a8baf8b2f',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html#a1ed22cba2a3f2732e762802ca4e14e40',1,'Tgstation.Server.Host.Components.Watchdog.ReattachInformation.ReattachInformation(Models.ReattachInformation copy, IDmbProvider dmb)']]], ['reattachinformation',['ReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_reattach_information.html',1,'Tgstation::Server::Host::Components::Watchdog']]], @@ -63,7 +63,7 @@ var searchData= ['repomergepullrequest',['RepoMergePullRequest',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381afc010e2f845e7e0e6b7507a47c17363b',1,'Tgstation::Server::Host::Components']]], ['repopresynchronize',['RepoPreSynchronize',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a28b74db9a0a4619b28a21c0573fbc0d8',1,'Tgstation::Server::Host::Components']]], ['reporesetorigin',['RepoResetOrigin',['../namespace_tgstation_1_1_server_1_1_host_1_1_components.html#a67a04fc5ffb3b43b0f887df8796d6381a2d081595fabf6ba0facdc9d1fb7921e6',1,'Tgstation::Server::Host::Components']]], - ['repository',['repository',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#adf8d664f59d973f69aa15c22fba93735',1,'Tgstation.Server.Client.Components.IInstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a507ef7665b72f494e56b997e19835367',1,'Tgstation.Server.Client.Components.InstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a1c314570d2e4f3c0a6dfb7e8aa6c68a0',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#afdfb89430d7fd8aef04c95b025c587f2',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository??throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad21b7cd54ab824159e7828aea9598fe3',1,'Tgstation.Server.Host.Components.Repository.Repository.Repository()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a33fcf2b3ec4686d9cd06051c726d0ba2',1,'Tgstation.Server.Api.Rights.Repository()']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#adf8d664f59d973f69aa15c22fba93735',1,'Tgstation.Server.Client.Components.IInstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a507ef7665b72f494e56b997e19835367',1,'Tgstation.Server.Client.Components.InstanceClient.Repository()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a1c314570d2e4f3c0a6dfb7e8aa6c68a0',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository, instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#afdfb89430d7fd8aef04c95b025c587f2',1,'Tgstation.Server.Client.Components.RepositoryClient.Repository(Routes.Repository, repository??throw new ArgumentNullException(nameof(repository)), instance.Id, cancellationToken)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#ad21b7cd54ab824159e7828aea9598fe3',1,'Tgstation.Server.Host.Components.Repository.Repository.Repository(LibGit2Sharp.IRepository repository, IIOManager ioMananger, IEventConsumer eventConsumer, ICredentialsProvider credentialsProvider, ILogger< Repository > logger, Action onDispose)'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a33fcf2b3ec4686d9cd06051c726d0ba2',1,'Tgstation.Server.Api.Rights.Repository()']]], ['repository',['Repository',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html',1,'Tgstation::Server::Host::Components::Repository']]], ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_repository.html',1,'Tgstation::Server::Api::Models']]], ['repository_2ecs',['Repository.cs',['../_tgstation_8_server_8_api_2_models_2_repository_8cs.html',1,'']]], @@ -109,7 +109,7 @@ var searchData= ['restarthost',['RestartHost',['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#affda1440f9c5e2dfcca65138d2f89a21a4ebebe34711c9ddafa1eff5faa9a377e',1,'Tgstation::Server::Api::Rights']]], ['restartnotsupportedexception',['RestartNotSupportedException',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a69d9c2b017d6ecbc121fef1661528c50',1,'Tgstation::Server::Host::Controllers::AdministrationController']]], ['restartregistration',['RestartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html',1,'Tgstation::Server::Host::Core']]], - ['restartregistration',['RestartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a4391d21de43d098a833168620dc24dc4',1,'Tgstation.Server.Host.Core.RestartRegistration.RestartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab1ff05d250d5aa61c90d5b1a1afa2a3b',1,'Tgstation.Server.Host.Components.Chat.Chat.restartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a8fc101bf364f77e0ba3e3fbc8d30a2e9',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.restartRegistration()']]], + ['restartregistration',['restartRegistration',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab1ff05d250d5aa61c90d5b1a1afa2a3b',1,'Tgstation.Server.Host.Components.Chat.Chat.restartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a8fc101bf364f77e0ba3e3fbc8d30a2e9',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.restartRegistration()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_restart_registration.html#a4391d21de43d098a833168620dc24dc4',1,'Tgstation.Server.Host.Core.RestartRegistration.RestartRegistration()']]], ['restartregistration_2ecs',['RestartRegistration.cs',['../_restart_registration_8cs.html',1,'']]], ['restartrequested',['RestartRequested',['../interface_tgstation_1_1_server_1_1_host_1_1_i_server.html#ac87902a08c496cd40add682a2ec6c616',1,'Tgstation.Server.Host.IServer.RestartRequested()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#add86891cdb4011d078e94671466ef14e',1,'Tgstation.Server.Host.Server.RestartRequested()'],['../class_tgstation_1_1_server_1_1_tests_1_1_testing_server.html#a61f844c9c2459cc3ab86153678e938db',1,'Tgstation.Server.Tests.TestingServer.RestartRequested()']]], ['retryafter',['RetryAfter',['../class_tgstation_1_1_server_1_1_client_1_1_rate_limit_exception.html#a1aad8b621a8b13f9671908f0bc6b3025',1,'Tgstation::Server::Client::RateLimitException']]], diff --git a/search/all_14.js b/search/all_14.js index 8b43519c0b..d48ddc8e07 100644 --- a/search/all_14.js +++ b/search/all_14.js @@ -98,9 +98,9 @@ var searchData= ['testjobhandler_2ecs',['TestJobHandler.cs',['../_test_job_handler_8cs.html',1,'']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Api::Models']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Host::Models']]], - ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation::Server::Api::Models::Internal']]], - ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a76c0f83e9fc28eeefb8ed97592cd368b',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.TestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#ae3a6a4e2db1710eb3f1d17967aa3f5d2',1,'Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge()']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_rev_info_test_merge.html#a76c0f83e9fc28eeefb8ed97592cd368b',1,'Tgstation.Server.Host.Models.RevInfoTestMerge.TestMerge()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html#ae3a6a4e2db1710eb3f1d17967aa3f5d2',1,'Tgstation.Server.Host.Components.Interop.TestMerge.TestMerge()']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation::Server::Api::Models::Internal']]], ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_test_merge_8cs.html',1,'']]], ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_api_2_models_2_test_merge_8cs.html',1,'']]], ['testmerge_2ecs',['TestMerge.cs',['../_tgstation_8_server_8_host_2_models_2_test_merge_8cs.html',1,'']]], @@ -209,7 +209,7 @@ var searchData= ['timertask',['timerTask',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#abf825c028f20cd903db1362892dbd833',1,'Tgstation::Server::Host::Components::Instance']]], ['titleatmerge',['TitleAtMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html#a959c2922c726be725daac329f9b21e46',1,'Tgstation::Server::Api::Models::Internal::TestMergeBase']]], ['toapi',['ToApi',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_bot.html#ac6049a16c80f49d1503935589a5e0042',1,'Tgstation.Server.Host.Models.ChatBot.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_chat_channel.html#a01525688d871d70d1ab28cdda6083011',1,'Tgstation.Server.Host.Models.ChatChannel.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_compile_job.html#a64a9fc0f8da344e311b5b754eec10611',1,'Tgstation.Server.Host.Models.CompileJob.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_dream_maker_settings.html#ab477e13756ea540790df3e245e17173b',1,'Tgstation.Server.Host.Models.DreamMakerSettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a169bffb644b7ff7c3686c29373f662c1',1,'Tgstation.Server.Host.Models.Instance.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance_user.html#aad0b6b9eaf0b0a9462987564aa254b68',1,'Tgstation.Server.Host.Models.InstanceUser.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#aaea7f482968921045b73cbdaca4dd652',1,'Tgstation.Server.Host.Models.Job.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_repository_settings.html#acff6370af1842c659c6f8ecb85dd0ea3',1,'Tgstation.Server.Host.Models.RepositorySettings.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_revision_information.html#a8e6f5b4375c0594f10c413c4119515b1',1,'Tgstation.Server.Host.Models.RevisionInformation.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#ac2943458d2fc3077a6684408fb26ab09',1,'Tgstation.Server.Host.Models.TestMerge.ToApi()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a8effbd8cd0ce7ba4c72f40efc08a9b50',1,'Tgstation.Server.Host.Models.User.ToApi(bool recursive, bool showDetails)'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html#a1d6fee3f42a73a1505d6d0d12d68b3d9',1,'Tgstation.Server.Host.Models.User.ToApi(bool showDetails)']]], - ['token',['token',['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7137670591717642aa084370ed40377e',1,'Tgstation.Server.Client.ServerClient.token()'],['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6a6105b1f7b3dafd096e5e11057aac8d',1,'Tgstation.Server.Api.ApiHeaders.Token()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#ab3363ffdb533616bd2b6688559f9def1',1,'Tgstation.Server.Client.IServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a208bd87b1345c14d9da5e89df13d965f',1,'Tgstation.Server.Client.ServerClient.Token()']]], + ['token',['Token',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a6a6105b1f7b3dafd096e5e11057aac8d',1,'Tgstation.Server.Api.ApiHeaders.Token()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_server_client.html#ab3363ffdb533616bd2b6688559f9def1',1,'Tgstation.Server.Client.IServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a208bd87b1345c14d9da5e89df13d965f',1,'Tgstation.Server.Client.ServerClient.Token()'],['../class_tgstation_1_1_server_1_1_client_1_1_server_client.html#a7137670591717642aa084370ed40377e',1,'Tgstation.Server.Client.ServerClient.token()']]], ['token',['Token',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_token.html',1,'Tgstation::Server::Api::Models']]], ['token_2ecs',['Token.cs',['../_token_8cs.html',1,'']]], ['tokenclockskewminutes',['TokenClockSkewMinutes',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_token_factory.html#abbf0169740f418e6ffd4f8c783fdff50',1,'Tgstation::Server::Host::Security::TokenFactory']]], diff --git a/search/all_15.js b/search/all_15.js index a206e8eed5..cbf6ad8554 100644 --- a/search/all_15.js +++ b/search/all_15.js @@ -11,7 +11,7 @@ var searchData= ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html',1,'Tgstation::Server::Client']]], ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#af774506fc563e92696b477d71ab16ab4',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string data, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#ada8a7b87eb9de50dd5b9e43b749ab1be',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a783856ad9431193f65c6b76381fb9990',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a299e46f1692182ca4c908d6bed931e00',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message, Exception innerException)']]], ['unrecognizedresponseexception_2ecs',['UnrecognizedResponseException.cs',['../_unrecognized_response_exception_8cs.html',1,'']]], - ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()']]], + ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a8ada361967d2d91205c1c30e967972c1',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a15e679e5293d3ee883366254eb384835',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Up()']]], ['update',['Update',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a43842f5f15ef0b33c5450accdb18609f',1,'Tgstation.Server.Client.AdministrationClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a8f60027fc85212c9b35249cccc88d1e3',1,'Tgstation.Server.Client.Components.ChatBotsClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a1bc64b3c8ac57f22694751cccf580f90',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#ae428fd6c9fad6e1d019b3ded7579c0b5',1,'Tgstation.Server.Client.Components.DreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ab2356151d04b5f17d797b22dc82c6354',1,'Tgstation.Server.Client.Components.IChatBotsClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a9cc6c3e2db7c4491f00ff9347acfe634',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a328b3fb9bebf37474ab554894b43eb54',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a96063a725f2be7f6891ab46e66e7006b',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#adf513d69fe64d03119446eba42df5250',1,'Tgstation.Server.Client.Components.InstanceUserClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a24995226be87730e9b7d49d6c53f5b2c',1,'Tgstation.Server.Client.Components.IRepositoryClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a718c5e27cfe0ddbfcc9c0746ec16a6e0',1,'Tgstation.Server.Client.Components.RepositoryClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a666df801432630c494c916d35834a38b',1,'Tgstation.Server.Client.IAdministrationClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a337b3e0676570d2ba2928b0d2cef5595',1,'Tgstation.Server.Client.IInstanceManagerClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aed0303f71e96db6fa88fc10cdfb196d3',1,'Tgstation.Server.Client.InstanceManagerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aecbd14842867cfdce083b793f91ab14e',1,'Tgstation.Server.Client.IUsersClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a89d2d761849b9b8f2932920841d996e1',1,'Tgstation.Server.Client.UsersClient.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40caa3e1b29a3de1e7e7a4e131ca9f2d',1,'Tgstation.Server.Host.Controllers.AdministrationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#ad07b67c1ae0820a03abf7298a84a7c2a',1,'Tgstation.Server.Host.Controllers.ByondController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a89f50a9a23fd57a4bfcec0334a1b185f',1,'Tgstation.Server.Host.Controllers.ChatController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a491c50407160ee87a06015b9d096cb8f',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a8cee89ced886340c58a9345cf2e7ad78',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#af08a424065abb1a672b1349839136a5d',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a813ab8ed0c6ef7ad5af02f70e899add1',1,'Tgstation.Server.Host.Controllers.InstanceController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a565dd9da819ea79d6c1de133877cd8dd',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2bc81566ec1a9690d2feabf1a7dec0d4',1,'Tgstation.Server.Host.Controllers.ModelController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a49f03b0091b65ab1fa7349d2b65a8b22',1,'Tgstation.Server.Host.Controllers.RepositoryController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a96e07e4cf2101eeaba70987a9e03600b',1,'Tgstation.Server.Host.Controllers.UserController.Update()']]], ['update_3c_20tbody_20_3e',['Update< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a92a748d5262e33c6ece011016d780c35',1,'Tgstation.Server.Client.ApiClient.Update< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a036ef64cf33e776c9042fa59aecbc9ba',1,'Tgstation.Server.Client.IApiClient.Update< TBody >()']]], ['update_3c_20tbody_2c_20tresult_20_3e',['Update< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aeba489d6ab822da7fe59b46cf0cb2ad4',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7c36add8f2943a7505b20213322be406',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a1573e017176db0b603a72944c5373e12',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#aed63658d4aa92fc6c6860bab59bb1b2d',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], @@ -30,11 +30,11 @@ var searchData= ['usedbconflicthandling',['UseDbConflictHandling',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_application_builder_extensions.html#aca3ed141beb5a8e4d82767043f87ff67',1,'Tgstation::Server::Host::Core::ApplicationBuilderExtensions']]], ['useexecutables',['UseExecutables',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a3767b16e9f00578e385dcca6b7e6b816',1,'Tgstation.Server.Host.Components.Byond.ByondManager.UseExecutables()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_manager.html#ae897f63dc75160c7378292be017a50b1',1,'Tgstation.Server.Host.Components.Byond.IByondManager.UseExecutables()']]], ['usemysqlmigrations',['UseMySQLMigrations',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a1ee865fd988335db6c17c69af5fdfae2',1,'Tgstation.Server.Host.Models.DatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html#a0a0f59db7bff22ff20ce4a9490d9848d',1,'Tgstation.Server.Host.Models.MySqlDatabaseContext.UseMySQLMigrations()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_sql_server_database_context.html#a01267b79be35689bff79854ebcbfcdee',1,'Tgstation.Server.Host.Models.SqlServerDatabaseContext.UseMySQLMigrations()']]], - ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation::Server::Api::Models::Internal']]], ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation::Server::Host::Models']]], - ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a12784e8b5b7ac25c0684c9d4c7c59178',1,'Tgstation.Server.Api.Routes.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a0a9daf5887cdd378b7c0a1997c037f4c',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a2d336aec28cd11a3c07d11e506f91026',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c',1,'Tgstation.Server.Host.Security.AuthenticationContext.User()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#ae2e7c0c04d2797b9a24a9776277ec77b',1,'Tgstation.Server.Host.Security.IAuthenticationContext.User()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a67aaaea73d5c7a55860fb55f783f0534',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user??throw new ArgumentNullException(nameof(user)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a67aaaea73d5c7a55860fb55f783f0534',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user??throw new ArgumentNullException(nameof(user)), cancellationToken)']]], ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html',1,'Tgstation::Server::Api::Models']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a12784e8b5b7ac25c0684c9d4c7c59178',1,'Tgstation.Server.Api.Routes.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_message.html#a0a9daf5887cdd378b7c0a1997c037f4c',1,'Tgstation.Server.Host.Components.Chat.Providers.Message.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_chat_command.html#a2d336aec28cd11a3c07d11e506f91026',1,'Tgstation.Server.Host.Components.Interop.ChatCommand.User()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context.html#a0846ac9679599a99923987863edb0d5c',1,'Tgstation.Server.Host.Security.AuthenticationContext.User()'],['../interface_tgstation_1_1_server_1_1_host_1_1_security_1_1_i_authentication_context.html#ae2e7c0c04d2797b9a24a9776277ec77b',1,'Tgstation.Server.Host.Security.IAuthenticationContext.User()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a67aaaea73d5c7a55860fb55f783f0534',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user??throw new ArgumentNullException(nameof(user)), cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a67aaaea73d5c7a55860fb55f783f0534',1,'Tgstation.Server.Client.UsersClient.User(Routes.User, user??throw new ArgumentNullException(nameof(user)), cancellationToken)']]], ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html',1,'Tgstation::Server::Host::Components::Chat']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation::Server::Api::Models::Internal']]], ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_internal_2_user_8cs.html',1,'']]], ['user_2ecs',['User.cs',['../_tgstation_8_server_8_host_2_components_2_chat_2_user_8cs.html',1,'']]], ['user_2ecs',['User.cs',['../_tgstation_8_server_8_api_2_models_2_user_8cs.html',1,'']]], diff --git a/search/all_17.js b/search/all_17.js index 63f2a1accc..341384fa30 100644 --- a/search/all_17.js +++ b/search/all_17.js @@ -2,13 +2,13 @@ var searchData= [ ['wait',['Wait',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_handler.html#a8139e340599a1bb5d3c0862c20072835',1,'Tgstation::Server::Host::Core::JobHandler']]], ['waitforjobcompletion',['WaitForJobCompletion',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#aa07b23b3ce401447337f4b026c34a77d',1,'Tgstation.Server.Host.Core.IJobManager.WaitForJobCompletion()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a63a8e2fe5a07e8e8c040e555a5d13d4d',1,'Tgstation.Server.Host.Core.JobManager.WaitForJobCompletion()']]], - ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], - ['watchdog',['watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a90292e2c1149c3d0e92a79d98968be44',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aec51431b45d46994bbe24550640833d0',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75363c8266024cf66cb86d1c44545bdc',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#aeabbea7c18623b8fb74c64a3b90aa453',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a50dc15cecba1cb334d01e08a9433c2dd',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#ac460374f4a77377ed95d0474e93dac22',1,'Tgstation.Server.Host.Components.EventConsumer.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a92f39be2b47f571fe439f78ccadd2acc',1,'Tgstation.Server.Host.Service.ServerService.watchdog()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ae03ea9eb9252aed389443f3bc038cfb2',1,'Tgstation.Server.Host.Components.IInstance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a902e9a3917553cae8ec372948e98d6ec',1,'Tgstation.Server.Host.Components.Instance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a9a4134527b003d1f96b7ab2ff66bcf6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation.Server.Host.Watchdog.Watchdog.Watchdog()']]], + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['watchdog',['Watchdog',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_instance.html#ae03ea9eb9252aed389443f3bc038cfb2',1,'Tgstation.Server.Host.Components.IInstance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a902e9a3917553cae8ec372948e98d6ec',1,'Tgstation.Server.Host.Components.Instance.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a9a4134527b003d1f96b7ab2ff66bcf6f',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#ada6c36ef01a0cdaf67ea13a350c3f073',1,'Tgstation.Server.Host.Watchdog.Watchdog.Watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a90292e2c1149c3d0e92a79d98968be44',1,'Tgstation.Server.Host.Components.Chat.Commands.ByondCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#aec51431b45d46994bbe24550640833d0',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#a75363c8266024cf66cb86d1c44545bdc',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#aeabbea7c18623b8fb74c64a3b90aa453',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a50dc15cecba1cb334d01e08a9433c2dd',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_event_consumer.html#ac460374f4a77377ed95d0474e93dac22',1,'Tgstation.Server.Host.Components.EventConsumer.watchdog()'],['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_server_service.html#a92f39be2b47f571fe439f78ccadd2acc',1,'Tgstation.Server.Host.Service.ServerService.watchdog()']]], ['watchdog_2ecs',['Watchdog.cs',['../_watchdog_2_watchdog_8cs.html',1,'']]], ['watchdog_2ecs',['Watchdog.cs',['../_components_2_watchdog_2_watchdog_8cs.html',1,'']]], - ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog']]], ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog']]], ['watchdogfactory',['watchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#ab5bda9a81248be0498e668f2b148aa82',1,'Tgstation.Server.Host.Components.InstanceFactory.watchdogFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a7cfce286ab4950cdead6b8bdb346c664',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.WatchdogFactory()']]], ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_components_2_watchdog_2_watchdog_factory_8cs.html',1,'']]], ['watchdogfactory_2ecs',['WatchdogFactory.cs',['../_watchdog_2_watchdog_factory_8cs.html',1,'']]], diff --git a/search/all_2.js b/search/all_2.js index 1b12a6690a..546e78c42e 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -17,7 +17,7 @@ var searchData= ['break',['Break',['../namespace_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog.html#a97c1a4a168451bd7e3be23c467aa2812ae4c38d6d45baf080943d323dd51a2ce8',1,'Tgstation::Server::Host::Components::Watchdog']]], ['browserresolver',['browserResolver',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a291e832dea111e7c46387fa96d212cb3',1,'Tgstation::Server::Host::Controllers::HomeController']]], ['buildmodel',['BuildModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html#a32d495bf8758a3f62e39f0e5e39cf2e7',1,'Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html#a13c592085ed6534ff12d1b1c179e06f7',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel()']]], - ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()']]], + ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a97ef9497f79738d08ddcc670606412e0',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a5b1cf5bef170a124e2ef5e120c056c92',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.BuildTargetModel()']]], ['builtincommands',['builtinCommands',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#ab3e79a7fe69140182ec0881103c72385',1,'Tgstation::Server::Host::Components::Chat::Chat']]], ['byond',['byond',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#af10fd8e9368c9ff17b96370108e7c466',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.byond()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#a79e21f63bc3460961ea59be3636a32e4',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.byond()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a9846874e39579d320e53020346944a60',1,'Tgstation.Server.Api.Routes.Byond()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#a9232f67ce6e82fce57740789d0202357',1,'Tgstation.Server.Client.Components.IInstanceClient.Byond()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a473bf90090e8d3c2b5d4e6689b5ea31f',1,'Tgstation.Server.Client.Components.InstanceClient.Byond()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a587e646654bf8da5649d9000b4477fd0',1,'Tgstation.Server.Client.Components.ByondClient.Byond()'],['../namespace_tgstation_1_1_server_1_1_api_1_1_rights.html#a7b02c8c3dadd90810a9eaa24712a0a20a2f4b44b678b37bcd3239cd83e64d0eb0',1,'Tgstation.Server.Api.Rights.Byond()']]], ['byond',['Byond',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_byond.html',1,'Tgstation::Server::Api::Models']]], diff --git a/search/all_4.js b/search/all_4.js index 2b887f2b38..0e5533206b 100644 --- a/search/all_4.js +++ b/search/all_4.js @@ -98,7 +98,7 @@ var searchData= ['dmtopicevent',['DMTopicEvent',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#a4e512e97be9a5ef91c921d30662a29c3',1,'Tgstation::Server::Host::Components::Interop::Constants']]], ['dmtopicinteropresponse',['DMTopicInteropResponse',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_constants.html#aca3a447a172e5e80d21701dc80da0f4a',1,'Tgstation::Server::Host::Components::Interop::Constants']]], ['donotdeletethissession',['DoNotDeleteThisSession',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ae54582fd5e1f354554c9a0402eb72a2b',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DoNotDeleteThisSession()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aefcf67dd06a656e319e6d6e42a2aef81',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession()']]], - ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()']]], + ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#acb8bff6be45c396886c413c2f531c14a',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a0a073717d8541e39b758f7f303bcd6eb',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Down()']]], ['downgradeversion',['downgradeVersion',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a909262eddcaca553541c052dbf98b325',1,'Tgstation::Server::Host::Components::InstanceManager']]], ['downloadfile',['DownloadFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a509e05cc7905cda41869f57bee5c6c58',1,'Tgstation.Server.Host.IO.DefaultIOManager.DownloadFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a20647d9e4dd09b806e407cd5c8a23b9b',1,'Tgstation.Server.Host.IO.IIOManager.DownloadFile()']]], ['downloadversion',['DownloadVersion',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a827552d8311f380aecac2fd75beecc52',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#aeac3c26b791aa9ce7e6651883d7ec9fe',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a509d23a163b9b7dcd94ee7e682af944a',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion()']]], diff --git a/search/all_9.js b/search/all_9.js index 11a4828e7b..4d457084ee 100644 --- a/search/all_9.js +++ b/search/all_9.js @@ -64,7 +64,7 @@ var searchData= ['idbconnectionfactory_2ecs',['IDBConnectionFactory.cs',['../_i_d_b_connection_factory_8cs.html',1,'']]], ['identity',['identity',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity.html#a4e5cb06d84c679a3a2d2fbfdd60e1335',1,'Tgstation::Server::Host::Security::WindowsSystemIdentity']]], ['identitycache',['IdentityCache',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html',1,'Tgstation::Server::Host::Security']]], - ['identitycache',['identityCache',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a75b914d5a6ea3a3ef3eaa2ab87b61859',1,'Tgstation.Server.Host.Controllers.HomeController.identityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a94c0a91ac1bdb6d25c9546a583fb44e3',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#aa3cdd5649c32a1249a2398343e82f343',1,'Tgstation.Server.Host.Security.IdentityCache.IdentityCache()']]], + ['identitycache',['IdentityCache',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#aa3cdd5649c32a1249a2398343e82f343',1,'Tgstation.Server.Host.Security.IdentityCache.IdentityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_home_controller.html#a75b914d5a6ea3a3ef3eaa2ab87b61859',1,'Tgstation.Server.Host.Controllers.HomeController.identityCache()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_authentication_context_factory.html#a94c0a91ac1bdb6d25c9546a583fb44e3',1,'Tgstation.Server.Host.Security.AuthenticationContextFactory.identityCache()']]], ['identitycache_2ecs',['IdentityCache.cs',['../_identity_cache_8cs.html',1,'']]], ['identitycacheobject',['IdentityCacheObject',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html',1,'Tgstation::Server::Host::Security']]], ['identitycacheobject',['IdentityCacheObject',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache_object.html#a77e5495fa90b8eed2f2d86c6fb711da8',1,'Tgstation::Server::Host::Security::IdentityCacheObject']]], diff --git a/search/all_a.js b/search/all_a.js index fb2aa576e4..94a5db85b7 100644 --- a/search/all_a.js +++ b/search/all_a.js @@ -22,7 +22,7 @@ var searchData= ['jobmanager',['jobManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a8442698876a3b1aab29cb968cd97203e',1,'Tgstation.Server.Host.Components.Instance.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a6913b05824f8ac83a8b5d87386ca96aa',1,'Tgstation.Server.Host.Components.InstanceFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a26d85ac963bb5258ff0ff1041fce7fa3',1,'Tgstation.Server.Host.Components.InstanceManager.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a2a584a5aa2482d9633d9ce43f6f9b678',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a9cf783832be989be4ccc542d0b738710',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a8e1ba9fcd8b44116da4230580c5cdbca',1,'Tgstation.Server.Host.Controllers.ByondController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ace2a566cc7ff09b10c0bbf448aaeae69',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#ae195b225516fe09da8661438fb1dc03f',1,'Tgstation.Server.Host.Controllers.DreamMakerController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34',1,'Tgstation.Server.Host.Controllers.InstanceController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a6386df07802db9cdbf34ffe40b031921',1,'Tgstation.Server.Host.Controllers.JobController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad15c0217bf9e5ce926a198191d0a04c4',1,'Tgstation.Server.Host.Controllers.RepositoryController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a600fa1321291e3efc38017257e2d4970',1,'Tgstation.Server.Host.Core.JobManager.JobManager()']]], ['jobmanager_2ecs',['JobManager.cs',['../_job_manager_8cs.html',1,'']]], ['jobprogress',['JobProgress',['../interface_tgstation_1_1_server_1_1_host_1_1_core_1_1_i_job_manager.html#a4ad9e9f0e2c8b563ced74e92016fca15',1,'Tgstation.Server.Host.Core.IJobManager.JobProgress()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a2d57c5575e0567728756688920dbab40',1,'Tgstation.Server.Host.Core.JobManager.JobProgress()']]], - ['jobs',['jobs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#ae0df68e17fa23d0ed3445a2c8b2a00b4',1,'Tgstation.Server.Client.Components.IInstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a84709639847ef446f64be8be1da70c36',1,'Tgstation.Server.Client.Components.InstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a6f7859cdfa8c1fb81352102ace4e6609',1,'Tgstation.Server.Host.Models.DatabaseContext.Jobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#adb2f37e11b8be23855d35e90ad312d3e',1,'Tgstation.Server.Host.Models.IDatabaseContext.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a60948c8acd4bca48ce5ea294bcc2e0b6',1,'Tgstation.Server.Host.Models.Instance.Jobs()']]], + ['jobs',['Jobs',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_client.html#ae0df68e17fa23d0ed3445a2c8b2a00b4',1,'Tgstation.Server.Client.Components.IInstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_client.html#a84709639847ef446f64be8be1da70c36',1,'Tgstation.Server.Client.Components.InstanceClient.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a6f7859cdfa8c1fb81352102ace4e6609',1,'Tgstation.Server.Host.Models.DatabaseContext.Jobs()'],['../interface_tgstation_1_1_server_1_1_host_1_1_models_1_1_i_database_context.html#adb2f37e11b8be23855d35e90ad312d3e',1,'Tgstation.Server.Host.Models.IDatabaseContext.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_instance.html#a60948c8acd4bca48ce5ea294bcc2e0b6',1,'Tgstation.Server.Host.Models.Instance.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()']]], ['jobsclient',['JobsClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html',1,'Tgstation::Server::Client::Components']]], ['jobsclient',['jobsClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a19f34ff37dc6b3f9a83533602d914a70',1,'Tgstation.Server.Tests.Instance.ByondTest.jobsClient()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_jobs_client.html#a9ffef36f7b69e7c76e31af3958797846',1,'Tgstation.Server.Client.Components.JobsClient.JobsClient()']]], ['jobsclient_2ecs',['JobsClient.cs',['../_jobs_client_8cs.html',1,'']]], diff --git a/search/all_c.js b/search/all_c.js index 4027e488b2..904e5c45f3 100644 --- a/search/all_c.js +++ b/search/all_c.js @@ -27,7 +27,7 @@ var searchData= ['lock',['Lock',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#a01e4f4e2d775bd2bf0910a1f5c2f24ef',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], ['lockedsemaphore',['lockedSemaphore',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_semaphore_slim_context.html#ada2fac68aaa78fbd25c0cb1337925f00',1,'Tgstation::Server::Host::Core::SemaphoreSlimContext']]], ['locknextdmb',['LockNextDmb',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#add7411c3c24ecb4111738e6ef9c57332',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.LockNextDmb()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_i_dmb_factory.html#adefdd87ce308d4dfe89f1639fd2c94d4',1,'Tgstation.Server.Host.Components.Compiler.IDmbFactory.LockNextDmb()']]], - ['logger',['logger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a25f231d9dcbd28c75f9665fb7f0b5e80',1,'Tgstation.Server.Host.Components.Byond.ByondManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#acc36317dcbca8c0270c3268e6baa97ce',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a840e56bd491d1ccc2137a6672158f813',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a77069300c653d422a86fbf24424b5354',1,'Tgstation.Server.Host.Components.Chat.Chat.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a68ad649d2610bcca56d5cb810b889594',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8423dac685aea12cdce24d5743a2554f',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a7f84b758cc7548eee2e01b86d8944721',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a4406ae1b1c13c74410a4587287015405',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a1ac7c72870daea9b8fcd6b700dc19573',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab4e452661f1c4a25ad903315e42e023e',1,'Tgstation.Server.Host.Components.Instance.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a968fedca8d4cc5ff16c77c0cbc782bda',1,'Tgstation.Server.Host.Components.InstanceManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9896d4d9823b5c5fe8454faaebe05727',1,'Tgstation.Server.Host.Components.Interop.CommContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab7edf14c652d29baf9cd01eaa8580bac',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afb01908cc420ca848e289cd9f3b2a9f8',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aaaf20e963c78e114158f07652efc7986',1,'Tgstation.Server.Host.Components.Repository.Repository.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab48210b91ab8add64013a209d4223070',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab3c240ff7f92402a96f36d29f6ede284',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a807538e13ba482e904ffe0289f1a45a0',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a5c31f1451dc2f882f6b6f2b2de5d1802',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa2d55f04b784aa065ea29038fbe50936',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aa5a69729c97d0a6eefe433fa956ce556',1,'Tgstation.Server.Host.Controllers.UserController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#af83d95abda82865799d652b73909612e',1,'Tgstation.Server.Host.Core.JobManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6441bc215e4fa67e76cf1a97bda66cb1',1,'Tgstation.Server.Host.Core.Process.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af70a41847bfc5c6210618ee35a8df429',1,'Tgstation.Server.Host.Core.ProcessExecutor.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a3ac53d10c0c2b3ddd10d474bb0d64f8b',1,'Tgstation.Server.Host.Core.SetupWizard.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a382d063e7f62559b994c5639504737b6',1,'Tgstation.Server.Host.Security.IdentityCache.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a384470b6fd596dcc97a6e39a0dcdbe74',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#aed53aa0f4276d05a985604f291c70f29',1,'Tgstation.Server.Host.Server.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a247d89dab45478183870bbdac843dbde',1,'Tgstation.Server.Host.Watchdog.Watchdog.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1351fb29bf0d6c411585098aed5616c6',1,'Tgstation.Server.Host.Controllers.ApiController.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a43445d9d612fbdf104974bab5a741af0',1,'Tgstation.Server.Host.Models.DatabaseContext.Logger()']]], + ['logger',['Logger',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_api_controller.html#a1351fb29bf0d6c411585098aed5616c6',1,'Tgstation.Server.Host.Controllers.ApiController.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_database_context.html#a43445d9d612fbdf104974bab5a741af0',1,'Tgstation.Server.Host.Models.DatabaseContext.Logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_manager.html#a25f231d9dcbd28c75f9665fb7f0b5e80',1,'Tgstation.Server.Host.Components.Byond.ByondManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#acc36317dcbca8c0270c3268e6baa97ce',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a840e56bd491d1ccc2137a6672158f813',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a77069300c653d422a86fbf24424b5354',1,'Tgstation.Server.Host.Components.Chat.Chat.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_json_tracking_context.html#a68ad649d2610bcca56d5cb810b889594',1,'Tgstation.Server.Host.Components.Chat.JsonTrackingContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_discord_provider.html#a8423dac685aea12cdce24d5743a2554f',1,'Tgstation.Server.Host.Components.Chat.Providers.DiscordProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_irc_provider.html#a7f84b758cc7548eee2e01b86d8944721',1,'Tgstation.Server.Host.Components.Chat.Providers.IrcProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a4406ae1b1c13c74410a4587287015405',1,'Tgstation.Server.Host.Components.Compiler.DmbFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dream_maker.html#a1ac7c72870daea9b8fcd6b700dc19573',1,'Tgstation.Server.Host.Components.Compiler.DreamMaker.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#ab4e452661f1c4a25ad903315e42e023e',1,'Tgstation.Server.Host.Components.Instance.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a968fedca8d4cc5ff16c77c0cbc782bda',1,'Tgstation.Server.Host.Components.InstanceManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_comm_context.html#a9896d4d9823b5c5fe8454faaebe05727',1,'Tgstation.Server.Host.Components.Interop.CommContext.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_reattach_info_handler.html#ab7edf14c652d29baf9cd01eaa8580bac',1,'Tgstation.Server.Host.Components.ReattachInfoHandler.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_credentials_provider.html#afb01908cc420ca848e289cd9f3b2a9f8',1,'Tgstation.Server.Host.Components.Repository.CredentialsProvider.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#aaaf20e963c78e114158f07652efc7986',1,'Tgstation.Server.Host.Components.Repository.Repository.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab48210b91ab8add64013a209d4223070',1,'Tgstation.Server.Host.Components.Repository.RepositoryManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_static_files_1_1_configuration.html#ab3c240ff7f92402a96f36d29f6ede284',1,'Tgstation.Server.Host.Components.StaticFiles.Configuration.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a807538e13ba482e904ffe0289f1a45a0',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a5c31f1451dc2f882f6b6f2b2de5d1802',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_windows_network_prompt_reaper.html#aa2d55f04b784aa065ea29038fbe50936',1,'Tgstation.Server.Host.Components.Watchdog.WindowsNetworkPromptReaper.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#aa5a69729c97d0a6eefe433fa956ce556',1,'Tgstation.Server.Host.Controllers.UserController.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#af83d95abda82865799d652b73909612e',1,'Tgstation.Server.Host.Core.JobManager.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html#a6441bc215e4fa67e76cf1a97bda66cb1',1,'Tgstation.Server.Host.Core.Process.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af70a41847bfc5c6210618ee35a8df429',1,'Tgstation.Server.Host.Core.ProcessExecutor.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_setup_wizard.html#a3ac53d10c0c2b3ddd10d474bb0d64f8b',1,'Tgstation.Server.Host.Core.SetupWizard.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_identity_cache.html#a382d063e7f62559b994c5639504737b6',1,'Tgstation.Server.Host.Security.IdentityCache.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_windows_system_identity_factory.html#a384470b6fd596dcc97a6e39a0dcdbe74',1,'Tgstation.Server.Host.Security.WindowsSystemIdentityFactory.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_server.html#aed53aa0f4276d05a985604f291c70f29',1,'Tgstation.Server.Host.Server.logger()'],['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html#a247d89dab45478183870bbdac843dbde',1,'Tgstation.Server.Host.Watchdog.Watchdog.logger()']]], ['loggerfactory',['loggerFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat.html#a145c7ddb0aef295db2a26fa302a0907d',1,'Tgstation.Server.Host.Components.Chat.Chat.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_chat_factory.html#ae7a8fc22bc98072deb02ac6801de37d5',1,'Tgstation.Server.Host.Components.Chat.ChatFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html#a8d321b369f849147a5713738bc16c713',1,'Tgstation.Server.Host.Components.Chat.ProviderFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#afe93210d51c3cd078d16a4b510c3ebe8',1,'Tgstation.Server.Host.Components.InstanceFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller_factory.html#aea415938b2e88e3b63478a46faec41d2',1,'Tgstation.Server.Host.Components.Watchdog.SessionControllerFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a31fb20da622d47726730ae6249bb3f20',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.loggerFactory()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html#af64b0c00b2fa5e14e6a0c05cd52564f6',1,'Tgstation.Server.Host.Core.ProcessExecutor.loggerFactory()']]], ['loglevel',['LogLevel',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_file_logging_configuration.html#a77b327379b355d7569c118e85e25a3e7',1,'Tgstation::Server::Host::Configuration::FileLoggingConfiguration']]], ['logonuser',['LogonUser',['../class_tgstation_1_1_server_1_1_host_1_1_native_methods.html#a1dfa561b475b805169687e321251038c',1,'Tgstation::Server::Host::NativeMethods']]], diff --git a/search/all_d.js b/search/all_d.js index 390efe4182..03846f8ca3 100644 --- a/search/all_d.js +++ b/search/all_d.js @@ -60,6 +60,7 @@ var searchData= ['msinitialcreate',['MSInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['msnullableandforeignkeycleanup',['MSNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['msreattachcompilejobrequired',['MSReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mstoggletestmergecomments',['MSToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['myaddminimumsecurity',['MYAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['myinitialcreate',['MYInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['mynullableandforeignkeycleanup',['MYNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], @@ -72,5 +73,6 @@ var searchData= ['mysqldatabasecontextmodelsnapshot_2ecs',['MySqlDatabaseContextModelSnapshot.cs',['../_my_sql_database_context_model_snapshot_8cs.html',1,'']]], ['mysqldesigntimedbcontextfactory',['MySqlDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['mysqldesigntimedbcontextfactory_2ecs',['MySqlDesignTimeDbContextFactory.cs',['../_my_sql_design_time_db_context_factory_8cs.html',1,'']]], - ['mysqlserverversion',['MySqlServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#abb0513764b16289df15f08e8127d0582',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]] + ['mysqlserverversion',['MySqlServerVersion',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_database_configuration.html#abb0513764b16289df15f08e8127d0582',1,'Tgstation::Server::Host::Configuration::DatabaseConfiguration']]], + ['mytoggletestmergecomments',['MYToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]] ]; diff --git a/search/classes_11.js b/search/classes_11.js index 789b6d7466..e965524971 100644 --- a/search/classes_11.js +++ b/search/classes_11.js @@ -18,8 +18,8 @@ var searchData= ['testjobhandler',['TestJobHandler',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_job_handler.html',1,'Tgstation::Server::Host::Core::Tests']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Api::Models']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html',1,'Tgstation::Server::Host::Models']]], - ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation::Server::Api::Models::Internal']]], ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_interop_1_1_test_merge.html',1,'Tgstation::Server::Host::Components::Interop']]], + ['testmerge',['TestMerge',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge.html',1,'Tgstation::Server::Api::Models::Internal']]], ['testmergebase',['TestMergeBase',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_test_merge_base.html',1,'Tgstation::Server::Api::Models::Internal']]], ['testmergeparameters',['TestMergeParameters',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_test_merge_parameters.html',1,'Tgstation::Server::Api::Models']]], ['testplatformidentifier',['TestPlatformIdentifier',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_tests_1_1_test_platform_identifier.html',1,'Tgstation::Server::Host::Core::Tests']]], diff --git a/search/classes_12.js b/search/classes_12.js index f5874b26c7..692ea6cf07 100644 --- a/search/classes_12.js +++ b/search/classes_12.js @@ -3,10 +3,10 @@ var searchData= ['unauthorizedexception',['UnauthorizedException',['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html',1,'Tgstation::Server::Client']]], ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html',1,'Tgstation::Server::Client']]], ['updatesconfiguration',['UpdatesConfiguration',['../class_tgstation_1_1_server_1_1_host_1_1_configuration_1_1_updates_configuration.html',1,'Tgstation::Server::Host::Configuration']]], - ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation::Server::Api::Models::Internal']]], - ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html',1,'Tgstation::Server::Host::Components::Chat']]], ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_user.html',1,'Tgstation::Server::Host::Models']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_user.html',1,'Tgstation::Server::Api::Models::Internal']]], ['user',['User',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user.html',1,'Tgstation::Server::Api::Models']]], + ['user',['User',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_user.html',1,'Tgstation::Server::Host::Components::Chat']]], ['usercontroller',['UserController',['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html',1,'Tgstation::Server::Host::Controllers']]], ['usersclient',['UsersClient',['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html',1,'Tgstation::Server::Client']]], ['userupdate',['UserUpdate',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_user_update.html',1,'Tgstation::Server::Api::Models']]] diff --git a/search/classes_14.js b/search/classes_14.js index 30222686ab..2e5ee4135b 100644 --- a/search/classes_14.js +++ b/search/classes_14.js @@ -1,9 +1,9 @@ var searchData= [ - ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Components::Watchdog']]], - ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog']]], + ['watchdog',['Watchdog',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog.html',1,'Tgstation::Server::Host::Watchdog']]], ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Components::Watchdog']]], + ['watchdogfactory',['WatchdogFactory',['../class_tgstation_1_1_server_1_1_host_1_1_watchdog_1_1_watchdog_factory.html',1,'Tgstation::Server::Host::Watchdog']]], ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information.html',1,'Tgstation::Server::Host::Models']]], ['watchdogreattachinformation',['WatchdogReattachInformation',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_reattach_information.html',1,'Tgstation::Server::Host::Components::Watchdog']]], ['watchdogreattachinformationbase',['WatchdogReattachInformationBase',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_watchdog_reattach_information_base.html',1,'Tgstation::Server::Host::Models']]], diff --git a/search/classes_c.js b/search/classes_c.js index 4b54ad70d8..f43ada762b 100644 --- a/search/classes_c.js +++ b/search/classes_c.js @@ -23,11 +23,13 @@ var searchData= ['msinitialcreate',['MSInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['msnullableandforeignkeycleanup',['MSNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['msreattachcompilejobrequired',['MSReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mstoggletestmergecomments',['MSToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['myaddminimumsecurity',['MYAddMinimumSecurity',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['myinitialcreate',['MYInitialCreate',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['mynullableandforeignkeycleanup',['MYNullableAndForeignKeyCleanup',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['myreattachcompilejobrequired',['MYReattachCompileJobRequired',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html',1,'Tgstation::Server::Host::Models::Migrations']]], ['mysqldatabasecontext',['MySqlDatabaseContext',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_my_sql_database_context.html',1,'Tgstation::Server::Host::Models']]], ['mysqldatabasecontextmodelsnapshot',['MySqlDatabaseContextModelSnapshot',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html',1,'Tgstation::Server::Host::Models::Migrations']]], - ['mysqldesigntimedbcontextfactory',['MySqlDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]] + ['mysqldesigntimedbcontextfactory',['MySqlDesignTimeDbContextFactory',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_design_time_db_context_factory.html',1,'Tgstation::Server::Host::Models::Migrations']]], + ['mytoggletestmergecomments',['MYToggleTestmergeComments',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html',1,'Tgstation::Server::Host::Models::Migrations']]] ]; diff --git a/search/classes_e.js b/search/classes_e.js index 230b5e4758..99f0a24a18 100644 --- a/search/classes_e.js +++ b/search/classes_e.js @@ -8,9 +8,9 @@ var searchData= ['posixsystemidentityfactory',['PosixSystemIdentityFactory',['../class_tgstation_1_1_server_1_1_host_1_1_security_1_1_posix_system_identity_factory.html',1,'Tgstation::Server::Host::Security']]], ['process',['Process',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process.html',1,'Tgstation::Server::Host::Core']]], ['processexecutor',['ProcessExecutor',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_process_executor.html',1,'Tgstation::Server::Host::Core']]], - ['program',['Program',['../class_release_notes_1_1_program.html',1,'ReleaseNotes']]], ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_service_1_1_program.html',1,'Tgstation::Server::Host::Service']]], ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_program.html',1,'Tgstation::Server::Host']]], + ['program',['Program',['../class_release_notes_1_1_program.html',1,'ReleaseNotes']]], ['program',['Program',['../class_tgstation_1_1_server_1_1_host_1_1_console_1_1_program.html',1,'Tgstation::Server::Host::Console']]], ['provider',['Provider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_providers_1_1_provider.html',1,'Tgstation::Server::Host::Components::Chat::Providers']]], ['providerfactory',['ProviderFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_provider_factory.html',1,'Tgstation::Server::Host::Components::Chat']]], diff --git a/search/files_0.js b/search/files_0.js index 04352cdd3f..b8ed98366a 100644 --- a/search/files_0.js +++ b/search/files_0.js @@ -15,5 +15,9 @@ var searchData= ['20180926033145_5fmsreattachcompilejobrequired_2ecs',['20180926033145_MSReattachCompileJobRequired.cs',['../20180926033145___m_s_reattach_compile_job_required_8cs.html',1,'']]], ['20180926033145_5fmsreattachcompilejobrequired_2edesigner_2ecs',['20180926033145_MSReattachCompileJobRequired.Designer.cs',['../20180926033145___m_s_reattach_compile_job_required_8_designer_8cs.html',1,'']]], ['20180926034014_5fmyreattachcompilejobrequired_2ecs',['20180926034014_MYReattachCompileJobRequired.cs',['../20180926034014___m_y_reattach_compile_job_required_8cs.html',1,'']]], - ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]] + ['20180926034014_5fmyreattachcompilejobrequired_2edesigner_2ecs',['20180926034014_MYReattachCompileJobRequired.Designer.cs',['../20180926034014___m_y_reattach_compile_job_required_8_designer_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2ecs',['20181124231534_MSToggleTestmergeComments.cs',['../20181124231534___m_s_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231534_5fmstoggletestmergecomments_2edesigner_2ecs',['20181124231534_MSToggleTestmergeComments.Designer.cs',['../20181124231534___m_s_toggle_testmerge_comments_8_designer_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2ecs',['20181124231549_MYToggleTestmergeComments.cs',['../20181124231549___m_y_toggle_testmerge_comments_8cs.html',1,'']]], + ['20181124231549_5fmytoggletestmergecomments_2edesigner_2ecs',['20181124231549_MYToggleTestmergeComments.Designer.cs',['../20181124231549___m_y_toggle_testmerge_comments_8_designer_8cs.html',1,'']]] ]; diff --git a/search/functions_1.js b/search/functions_1.js index 5274af267e..a3544e9ea6 100644 --- a/search/functions_1.js +++ b/search/functions_1.js @@ -1,7 +1,7 @@ var searchData= [ ['buildmodel',['BuildModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_my_sql_database_context_model_snapshot.html#a32d495bf8758a3f62e39f0e5e39cf2e7',1,'Tgstation.Server.Host.Models.Migrations.MySqlDatabaseContextModelSnapshot.BuildModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_sql_server_database_context_model_snapshot.html#a13c592085ed6534ff12d1b1c179e06f7',1,'Tgstation.Server.Host.Models.Migrations.SqlServerDatabaseContextModelSnapshot.BuildModel()']]], - ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()']]], + ['buildtargetmodel',['BuildTargetModel',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a0b50357f52fda0a140c17c0004a117ac',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#acabe78145ddeea131efdf8e09481cc86',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a5d8914ad6eef1cd43ef831ef8c2eda01',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#aca8fc216984500a0d660548a9dada3be',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#ad82088299eaf799f643661111e1d1877',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a14285a0c35c5570d9bf33af7eaae5976',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a0b3b826dabd222a804eddd53ae93e329',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a9fef7b3cdc39a92a3717c1f041d85340',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a97ef9497f79738d08ddcc670606412e0',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.BuildTargetModel()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a5b1cf5bef170a124e2ef5e120c056c92',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.BuildTargetModel()']]], ['byond',['Byond',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a587e646654bf8da5649d9000b4477fd0',1,'Tgstation::Server::Client::Components::ByondClient']]], ['byondclient',['ByondClient',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_byond_client.html#a330467d91ed28edace4990dce15c6991',1,'Tgstation::Server::Client::Components::ByondClient']]], ['byondcommand',['ByondCommand',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_byond_command.html#a04c8863ccdb6d8f93c56eec22e3015d5',1,'Tgstation::Server::Host::Components::Chat::Commands::ByondCommand']]], diff --git a/search/functions_13.js b/search/functions_13.js index 95b74d8ec7..17aecbfde8 100644 --- a/search/functions_13.js +++ b/search/functions_13.js @@ -2,7 +2,7 @@ var searchData= [ ['unauthorizedexception',['UnauthorizedException',['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ade207842b48576c6f0fb5f4ee0ef326e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#ab5b729c4ff826ad5fdd574db0942b8f7',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unauthorized_exception.html#af481bddb4a0e255b1430b6e9f4b62a7e',1,'Tgstation.Server.Client.UnauthorizedException.UnauthorizedException(string message, Exception innerException)']]], ['unrecognizedresponseexception',['UnrecognizedResponseException',['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#af774506fc563e92696b477d71ab16ab4',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string data, HttpStatusCode statusCode)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#ada8a7b87eb9de50dd5b9e43b749ab1be',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException()'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a783856ad9431193f65c6b76381fb9990',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message)'],['../class_tgstation_1_1_server_1_1_client_1_1_unrecognized_response_exception.html#a299e46f1692182ca4c908d6bed931e00',1,'Tgstation.Server.Client.UnrecognizedResponseException.UnrecognizedResponseException(string message, Exception innerException)']]], - ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()']]], + ['up',['Up',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a46e535f1b0e37230f3ae9ae2d4768719',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a61031d082139e9125a4ccea487d10b45',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#afb9883f3d1ddba5f19b2b75fc92da518',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a277da60ba33c15814a36a2465b3a46b0',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#aa138d5c7f89f8de85085a95492cc2fb1',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#afedd51b63ec46e82a644d88f4655ab02',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#a55bccf5330ee9028dcbc7545f86e81a2',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a911c174c70a661a00dd36c55a246649a',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#a8ada361967d2d91205c1c30e967972c1',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Up()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a15e679e5293d3ee883366254eb384835',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Up()']]], ['update',['Update',['../class_tgstation_1_1_server_1_1_client_1_1_administration_client.html#a43842f5f15ef0b33c5450accdb18609f',1,'Tgstation.Server.Client.AdministrationClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_chat_bots_client.html#a8f60027fc85212c9b35249cccc88d1e3',1,'Tgstation.Server.Client.Components.ChatBotsClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a1bc64b3c8ac57f22694751cccf580f90',1,'Tgstation.Server.Client.Components.DreamDaemonClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_maker_client.html#ae428fd6c9fad6e1d019b3ded7579c0b5',1,'Tgstation.Server.Client.Components.DreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_chat_bots_client.html#ab2356151d04b5f17d797b22dc82c6354',1,'Tgstation.Server.Client.Components.IChatBotsClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_daemon_client.html#a9cc6c3e2db7c4491f00ff9347acfe634',1,'Tgstation.Server.Client.Components.IDreamDaemonClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_dream_maker_client.html#a328b3fb9bebf37474ab554894b43eb54',1,'Tgstation.Server.Client.Components.IDreamMakerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_instance_user_client.html#a96063a725f2be7f6891ab46e66e7006b',1,'Tgstation.Server.Client.Components.IInstanceUserClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_instance_user_client.html#adf513d69fe64d03119446eba42df5250',1,'Tgstation.Server.Client.Components.InstanceUserClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_components_1_1_i_repository_client.html#a24995226be87730e9b7d49d6c53f5b2c',1,'Tgstation.Server.Client.Components.IRepositoryClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_repository_client.html#a718c5e27cfe0ddbfcc9c0746ec16a6e0',1,'Tgstation.Server.Client.Components.RepositoryClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_administration_client.html#a666df801432630c494c916d35834a38b',1,'Tgstation.Server.Client.IAdministrationClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_instance_manager_client.html#a337b3e0676570d2ba2928b0d2cef5595',1,'Tgstation.Server.Client.IInstanceManagerClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_instance_manager_client.html#aed0303f71e96db6fa88fc10cdfb196d3',1,'Tgstation.Server.Client.InstanceManagerClient.Update()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_users_client.html#aecbd14842867cfdce083b793f91ab14e',1,'Tgstation.Server.Client.IUsersClient.Update()'],['../class_tgstation_1_1_server_1_1_client_1_1_users_client.html#a89d2d761849b9b8f2932920841d996e1',1,'Tgstation.Server.Client.UsersClient.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_administration_controller.html#a40caa3e1b29a3de1e7e7a4e131ca9f2d',1,'Tgstation.Server.Host.Controllers.AdministrationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#ad07b67c1ae0820a03abf7298a84a7c2a',1,'Tgstation.Server.Host.Controllers.ByondController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_chat_controller.html#a89f50a9a23fd57a4bfcec0334a1b185f',1,'Tgstation.Server.Host.Controllers.ChatController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_configuration_controller.html#a491c50407160ee87a06015b9d096cb8f',1,'Tgstation.Server.Host.Controllers.ConfigurationController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#a8cee89ced886340c58a9345cf2e7ad78',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#af08a424065abb1a672b1349839136a5d',1,'Tgstation.Server.Host.Controllers.DreamMakerController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a813ab8ed0c6ef7ad5af02f70e899add1',1,'Tgstation.Server.Host.Controllers.InstanceController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_user_controller.html#a565dd9da819ea79d6c1de133877cd8dd',1,'Tgstation.Server.Host.Controllers.InstanceUserController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_model_controller.html#a2bc81566ec1a9690d2feabf1a7dec0d4',1,'Tgstation.Server.Host.Controllers.ModelController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#a49f03b0091b65ab1fa7349d2b65a8b22',1,'Tgstation.Server.Host.Controllers.RepositoryController.Update()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_user_controller.html#a96e07e4cf2101eeaba70987a9e03600b',1,'Tgstation.Server.Host.Controllers.UserController.Update()']]], ['update_3c_20tbody_20_3e',['Update< TBody >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a92a748d5262e33c6ece011016d780c35',1,'Tgstation.Server.Client.ApiClient.Update< TBody >()'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a036ef64cf33e776c9042fa59aecbc9ba',1,'Tgstation.Server.Client.IApiClient.Update< TBody >()']]], ['update_3c_20tbody_2c_20tresult_20_3e',['Update< TBody, TResult >',['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#aeba489d6ab822da7fe59b46cf0cb2ad4',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../class_tgstation_1_1_server_1_1_client_1_1_api_client.html#a7c36add8f2943a7505b20213322be406',1,'Tgstation.Server.Client.ApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#a1573e017176db0b603a72944c5373e12',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, CancellationToken cancellationToken)'],['../interface_tgstation_1_1_server_1_1_client_1_1_i_api_client.html#aed63658d4aa92fc6c6860bab59bb1b2d',1,'Tgstation.Server.Client.IApiClient.Update< TBody, TResult >(string route, TBody body, long instanceId, CancellationToken cancellationToken)']]], diff --git a/search/functions_3.js b/search/functions_3.js index 83d960f7a3..48202b62fe 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -25,7 +25,7 @@ var searchData= ['dmbfactory',['DmbFactory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a52e9bb5f3fdb7e52468afa0ba740e535',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], ['dmbprovider',['DmbProvider',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_provider.html#a1537e8b8f8b55841d8d1b51104acb521',1,'Tgstation::Server::Host::Components::Compiler::DmbProvider']]], ['donotdeletethissession',['DoNotDeleteThisSession',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_byond_executable_lock.html#ae54582fd5e1f354554c9a0402eb72a2b',1,'Tgstation.Server.Host.Components.Byond.ByondExecutableLock.DoNotDeleteThisSession()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_executable_lock.html#aefcf67dd06a656e319e6d6e42a2aef81',1,'Tgstation.Server.Host.Components.Byond.IByondExecutableLock.DoNotDeleteThisSession()']]], - ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()']]], + ['down',['Down',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_initial_create.html#a469e01870addd0180bf8f990143b7dfc',1,'Tgstation.Server.Host.Models.Migrations.MSInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_initial_create.html#a6ab7991e1cc2bd0e72632d8b8dec4855',1,'Tgstation.Server.Host.Models.Migrations.MYInitialCreate.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_add_minimum_security.html#a743a5621955d43df4e9780cf76183e23',1,'Tgstation.Server.Host.Models.Migrations.MYAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_add_minimum_security.html#a2221d0ff68cbf208df1b312c6864f263',1,'Tgstation.Server.Host.Models.Migrations.MSAddMinimumSecurity.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_nullable_and_foreign_key_cleanup.html#a17867b620f610dcfea1677ea948f6433',1,'Tgstation.Server.Host.Models.Migrations.MYNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_nullable_and_foreign_key_cleanup.html#a182d1024fbd7af021730f7604dcf3dcb',1,'Tgstation.Server.Host.Models.Migrations.MSNullableAndForeignKeyCleanup.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_reattach_compile_job_required.html#abcd54980626daace56399a31c3256640',1,'Tgstation.Server.Host.Models.Migrations.MSReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_reattach_compile_job_required.html#a813507ad90afe25188b1fbb76e8d850d',1,'Tgstation.Server.Host.Models.Migrations.MYReattachCompileJobRequired.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_s_toggle_testmerge_comments.html#acb8bff6be45c396886c413c2f531c14a',1,'Tgstation.Server.Host.Models.Migrations.MSToggleTestmergeComments.Down()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_migrations_1_1_m_y_toggle_testmerge_comments.html#a0a073717d8541e39b758f7f303bcd6eb',1,'Tgstation.Server.Host.Models.Migrations.MYToggleTestmergeComments.Down()']]], ['downloadfile',['DownloadFile',['../class_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_default_i_o_manager.html#a509e05cc7905cda41869f57bee5c6c58',1,'Tgstation.Server.Host.IO.DefaultIOManager.DownloadFile()'],['../interface_tgstation_1_1_server_1_1_host_1_1_i_o_1_1_i_i_o_manager.html#a20647d9e4dd09b806e407cd5c8a23b9b',1,'Tgstation.Server.Host.IO.IIOManager.DownloadFile()']]], ['downloadversion',['DownloadVersion',['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_i_byond_installer.html#a827552d8311f380aecac2fd75beecc52',1,'Tgstation.Server.Host.Components.Byond.IByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_posix_byond_installer.html#aeac3c26b791aa9ce7e6651883d7ec9fe',1,'Tgstation.Server.Host.Components.Byond.PosixByondInstaller.DownloadVersion()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_byond_1_1_windows_byond_installer.html#a509d23a163b9b7dcd94ee7e682af944a',1,'Tgstation.Server.Host.Components.Byond.WindowsByondInstaller.DownloadVersion()']]], ['dreamdaemon',['DreamDaemon',['../class_tgstation_1_1_server_1_1_client_1_1_components_1_1_dream_daemon_client.html#a07ea709f152d79ddf11c1dfdaa939212',1,'Tgstation::Server::Client::Components::DreamDaemonClient']]], diff --git a/search/properties_e.js b/search/properties_e.js index 17091cf9cc..231cf0eace 100644 --- a/search/properties_e.js +++ b/search/properties_e.js @@ -8,6 +8,7 @@ var searchData= ['path',['Path',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_configuration_file.html#aefbf190e4363fe3095963d1d40a36fd1',1,'Tgstation.Server.Api.Models.ConfigurationFile.Path()'],['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_instance.html#ae390e04ad03e5f6daaefcfa96ed9a6d2',1,'Tgstation.Server.Api.Models.Instance.Path()']]], ['port',['Port',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_irc_connection_string_builder.html#a70bde9bd8b2a01b079ff0996a379081d',1,'Tgstation.Server.Api.Models.IrcConnectionStringBuilder.Port()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_i_session_controller.html#aa343d746e958dbfe2a22f4a7a4fb33cd',1,'Tgstation.Server.Host.Components.Watchdog.ISessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#a6e727c55d5b952ece68a965c80437082',1,'Tgstation.Server.Host.Components.Watchdog.SessionController.Port()'],['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_reattach_information_base.html#afcf987dfdf8f483388bfd832582c6a8b',1,'Tgstation.Server.Host.Models.ReattachInformationBase.Port()']]], ['postcomplete',['PostComplete',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_job.html#ab2680675a7b2124d03a899f45a09e08e',1,'Tgstation::Server::Host::Models::Job']]], + ['posttestmergecomment',['PostTestMergeComment',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_repository_settings.html#a2897ad062e3663f0eb12062c4393f1e8',1,'Tgstation::Server::Api::Models::Internal::RepositorySettings']]], ['primarydirectory',['PrimaryDirectory',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_temporary_dmb_provider.html#a0bc97032ff316e913dd373e68a2232c2',1,'Tgstation.Server.Host.Components.Compiler.TemporaryDmbProvider.PrimaryDirectory()'],['../interface_tgstation_1_1_server_1_1_host_1_1_components_1_1_i_dmb_provider.html#aa3e399fe1533b15a2e0814b3634037bc',1,'Tgstation.Server.Host.Components.IDmbProvider.PrimaryDirectory()']]], ['primaryport',['PrimaryPort',['../class_tgstation_1_1_server_1_1_api_1_1_models_1_1_internal_1_1_dream_daemon_launch_parameters.html#aa81a7a474b859cbf827c4c9f5aaaa3e1',1,'Tgstation::Server::Api::Models::Internal::DreamDaemonLaunchParameters']]], ['primaryrevisioninformation',['PrimaryRevisionInformation',['../class_tgstation_1_1_server_1_1_host_1_1_models_1_1_test_merge.html#a4fb69a83c0ff12c00dc7db7905003709',1,'Tgstation::Server::Host::Models::TestMerge']]], diff --git a/search/variables_11.js b/search/variables_11.js index c62ee49bf0..dd76c3219f 100644 --- a/search/variables_11.js +++ b/search/variables_11.js @@ -11,7 +11,7 @@ var searchData= ['released',['released',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_session_controller.html#aa59a34a24d122357d081403d95a76e78',1,'Tgstation::Server::Host::Components::Watchdog::SessionController']]], ['releaseservers',['releaseServers',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a4716774c95335450d0bb96b2ecd0908f',1,'Tgstation::Server::Host::Components::Watchdog::Watchdog']]], ['remotetemporarybranchname',['RemoteTemporaryBranchName',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a4ad624c2294a1cc28f47d251ed3a17f8',1,'Tgstation::Server::Host::Components::Repository::Repository']]], - ['repository',['repository',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()']]], + ['repository',['Repository',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a738817663facf9293a084ab4c5a155ef',1,'Tgstation.Server.Api.Routes.Repository()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository.html#a46c9b5f872d0225fd0c8f6364ccf3489',1,'Tgstation.Server.Host.Components.Repository.Repository.repository()']]], ['repositorylogger',['repositoryLogger',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#a215c5b936673287ad252f01b1b87f9bf',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], ['repositorymanager',['repositoryManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_command_factory.html#ac6eb0ebb09860c076b09529a92963592',1,'Tgstation.Server.Host.Components.Chat.Commands.CommandFactory.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_pull_requests_command.html#af5857133d7544a45ce4b4e75210830b2',1,'Tgstation.Server.Host.Components.Chat.Commands.PullRequestsCommand.repositoryManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_chat_1_1_commands_1_1_revision_command.html#acdac2dc61b95355e78f8a1b008b7f7b4',1,'Tgstation.Server.Host.Components.Chat.Commands.RevisionCommand.repositoryManager()']]], ['repositorysettings',['repositorySettings',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_repository_1_1_repository_manager.html#ab33fc190fb7655d0ed75fc400e260d2e',1,'Tgstation::Server::Host::Components::Repository::RepositoryManager']]], diff --git a/search/variables_9.js b/search/variables_9.js index bbb102b2d1..6e00f90aab 100644 --- a/search/variables_9.js +++ b/search/variables_9.js @@ -2,7 +2,7 @@ var searchData= [ ['joblockcounts',['jobLockCounts',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_compiler_1_1_dmb_factory.html#a5f646af3c627f87b1d1ad93823dac1d1',1,'Tgstation::Server::Host::Components::Compiler::DmbFactory']]], ['jobmanager',['jobManager',['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance.html#a8442698876a3b1aab29cb968cd97203e',1,'Tgstation.Server.Host.Components.Instance.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_factory.html#a6913b05824f8ac83a8b5d87386ca96aa',1,'Tgstation.Server.Host.Components.InstanceFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_instance_manager.html#a26d85ac963bb5258ff0ff1041fce7fa3',1,'Tgstation.Server.Host.Components.InstanceManager.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog.html#a2a584a5aa2482d9633d9ce43f6f9b678',1,'Tgstation.Server.Host.Components.Watchdog.Watchdog.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_components_1_1_watchdog_1_1_watchdog_factory.html#a9cf783832be989be4ccc542d0b738710',1,'Tgstation.Server.Host.Components.Watchdog.WatchdogFactory.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_byond_controller.html#a8e1ba9fcd8b44116da4230580c5cdbca',1,'Tgstation.Server.Host.Controllers.ByondController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_daemon_controller.html#ace2a566cc7ff09b10c0bbf448aaeae69',1,'Tgstation.Server.Host.Controllers.DreamDaemonController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_dream_maker_controller.html#ae195b225516fe09da8661438fb1dc03f',1,'Tgstation.Server.Host.Controllers.DreamMakerController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_instance_controller.html#a38f7f9669773242d177345e38be2dd34',1,'Tgstation.Server.Host.Controllers.InstanceController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_job_controller.html#a6386df07802db9cdbf34ffe40b031921',1,'Tgstation.Server.Host.Controllers.JobController.jobManager()'],['../class_tgstation_1_1_server_1_1_host_1_1_controllers_1_1_repository_controller.html#ad15c0217bf9e5ce926a198191d0a04c4',1,'Tgstation.Server.Host.Controllers.RepositoryController.jobManager()']]], - ['jobs',['jobs',['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()'],['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()']]], + ['jobs',['Jobs',['../class_tgstation_1_1_server_1_1_api_1_1_routes.html#a85c563262244bd21fe1bfa1ce5de6a1d',1,'Tgstation.Server.Api.Routes.Jobs()'],['../class_tgstation_1_1_server_1_1_host_1_1_core_1_1_job_manager.html#a8a9c1a9f80ee10d57d0bb37c7dcaf546',1,'Tgstation.Server.Host.Core.JobManager.jobs()']]], ['jobsclient',['jobsClient',['../class_tgstation_1_1_server_1_1_tests_1_1_instance_1_1_byond_test.html#a19f34ff37dc6b3f9a83533602d914a70',1,'Tgstation::Server::Tests::Instance::ByondTest']]], ['jwtauthenticationscheme',['JwtAuthenticationScheme',['../class_tgstation_1_1_server_1_1_api_1_1_api_headers.html#a3d49a18342b81d0427f09e51c29544c2',1,'Tgstation::Server::Api::ApiHeaders']]] ];