Skip to content

Commit bd7a796

Browse files
authored
LOOP-4664 Capture build details in separate plist (#577)
* Capture build details in separate plist * Fixes for running in test harness
1 parent f5e62fd commit bd7a796

File tree

11 files changed

+109
-71
lines changed

11 files changed

+109
-71
lines changed

Common/Extensions/NSBundle.swift

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -53,47 +53,6 @@ extension Bundle {
5353
}
5454
}
5555

56-
var gitRevision: String? {
57-
return object(forInfoDictionaryKey: "com-loopkit-Loop-git-revision") as? String
58-
}
59-
60-
var gitBranch: String? {
61-
return object(forInfoDictionaryKey: "com-loopkit-Loop-git-branch") as? String
62-
}
63-
64-
var sourceRoot: String? {
65-
return object(forInfoDictionaryKey: "com-loopkit-Loop-srcroot") as? String
66-
}
67-
68-
var buildDateString: String? {
69-
return object(forInfoDictionaryKey: "com-loopkit-Loop-build-date") as? String
70-
}
71-
72-
var xcodeVersion: String? {
73-
return object(forInfoDictionaryKey: "com-loopkit-Loop-xcode-version") as? String
74-
}
75-
76-
var profileExpiration: Date? {
77-
return object(forInfoDictionaryKey: "com-loopkit-Loop-profile-expiration") as? Date
78-
}
79-
80-
var profileExpirationString: String {
81-
if let profileExpiration = profileExpiration {
82-
return "\(profileExpiration)"
83-
} else {
84-
return "N/A"
85-
}
86-
}
87-
88-
// These strings are only configured if it is a workspace build
89-
var workspaceGitRevision: String? {
90-
return object(forInfoDictionaryKey: "com-loopkit-LoopWorkspace-git-revision") as? String
91-
}
92-
93-
var workspaceGitBranch: String? {
94-
return object(forInfoDictionaryKey: "com-loopkit-LoopWorkspace-git-branch") as? String
95-
}
96-
9756
var localCacheDuration: TimeInterval {
9857
guard let localCacheDurationDaysString = object(forInfoDictionaryKey: "LoopLocalCacheDurationDays") as? String,
9958
let localCacheDurationDays = Double(localCacheDurationDaysString) else {
@@ -102,3 +61,4 @@ extension Bundle {
10261
return .days(localCacheDurationDays)
10362
}
10463
}
64+

Common/Models/BuildDetails.swift

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//
2+
// BuildDetails.swift
3+
// Loop
4+
//
5+
// Created by Pete Schwamb on 6/13/23.
6+
// Copyright © 2023 LoopKit Authors. All rights reserved.
7+
//
8+
9+
import Foundation
10+
11+
class BuildDetails {
12+
13+
static var `default` = BuildDetails()
14+
15+
let dict: [String: Any]
16+
17+
init() {
18+
guard let url = Bundle.main.url(forResource: "BuildDetails", withExtension: ".plist"),
19+
let data = try? Data(contentsOf: url),
20+
let parsed = try? PropertyListSerialization.propertyList(from: data, format: nil) as? [String: Any] else
21+
{
22+
dict = [:]
23+
return
24+
}
25+
dict = parsed
26+
}
27+
28+
var buildDateString: String? {
29+
return dict["com-loopkit-Loop-build-date"] as? String
30+
}
31+
32+
var xcodeVersion: String? {
33+
return dict["com-loopkit-Loop-xcode-version"] as? String
34+
}
35+
36+
var gitRevision: String? {
37+
return dict["com-loopkit-Loop-git-revision"] as? String
38+
}
39+
40+
var gitBranch: String? {
41+
return dict["com-loopkit-Loop-git-branch"] as? String
42+
}
43+
44+
var sourceRoot: String? {
45+
return dict["com-loopkit-Loop-srcroot"] as? String
46+
}
47+
48+
var profileExpiration: Date? {
49+
return dict["com-loopkit-Loop-profile-expiration"] as? Date
50+
}
51+
52+
var profileExpirationString: String {
53+
if let profileExpiration = profileExpiration {
54+
return "\(profileExpiration)"
55+
} else {
56+
return "N/A"
57+
}
58+
}
59+
60+
// These strings are only configured if it is a workspace build
61+
var workspaceGitRevision: String? {
62+
return dict["com-loopkit-LoopWorkspace-git-revision"] as? String
63+
}
64+
65+
var workspaceGitBranch: String? {
66+
return dict["com-loopkit-LoopWorkspace-git-branch"] as? String
67+
}
68+
}
69+

Loop.xcodeproj/project.pbxproj

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@
429429
C1004DF52981F5B700B8CF94 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF32981F5B700B8CF94 /* Localizable.strings */; };
430430
C1004DF82981F5B700B8CF94 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1004DF62981F5B700B8CF94 /* InfoPlist.strings */; };
431431
C10B28461EA9BA5E006EA1FC /* far_future_high_bg_forecast.json in Resources */ = {isa = PBXBuildFile; fileRef = C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */; };
432+
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = C110888C2A3913C600BA4898 /* BuildDetails.swift */; };
432433
C11613492983096D00777E7C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C11613472983096D00777E7C /* InfoPlist.strings */; };
433434
C116134C2983096D00777E7C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C116134A2983096D00777E7C /* Localizable.strings */; };
434435
C11B9D5B286778A800500CF8 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C11B9D5A286778A800500CF8 /* SwiftCharts */; };
@@ -506,6 +507,7 @@
506507
C1E3DC4728595FAA00CA19FF /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1E3DC4628595FAA00CA19FF /* SwiftCharts */; };
507508
C1E3DC4928595FAA00CA19FF /* SwiftCharts in Embed Frameworks */ = {isa = PBXBuildFile; productRef = C1E3DC4628595FAA00CA19FF /* SwiftCharts */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
508509
C1E71723292E918F00DA646F /* SmallStatusWidgetEntryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1E71721292E90CC00DA646F /* SmallStatusWidgetEntryView.swift */; };
510+
C1EE9E812A38D0FB0064784A /* BuildDetails.plist in Resources */ = {isa = PBXBuildFile; fileRef = C1EE9E802A38D0FB0064784A /* BuildDetails.plist */; };
509511
C1EF747228D6A44A00C8C083 /* CrashRecoveryManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1EF747128D6A44A00C8C083 /* CrashRecoveryManager.swift */; };
510512
C1F00C60285A802A006302C5 /* SwiftCharts in Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; };
511513
C1F00C78285A8256006302C5 /* SwiftCharts in Embed Frameworks */ = {isa = PBXBuildFile; productRef = C1F00C5F285A802A006302C5 /* SwiftCharts */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
@@ -1468,6 +1470,7 @@
14681470
C101947127DD473C004E7EB8 /* MockKitUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = MockKitUI.framework; sourceTree = BUILT_PRODUCTS_DIR; };
14691471
C1092BFD29F8116700AE3D1C /* apply-info-customizations.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "apply-info-customizations.sh"; sourceTree = "<group>"; };
14701472
C10B28451EA9BA5E006EA1FC /* far_future_high_bg_forecast.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = far_future_high_bg_forecast.json; sourceTree = "<group>"; };
1473+
C110888C2A3913C600BA4898 /* BuildDetails.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BuildDetails.swift; sourceTree = "<group>"; };
14711474
C11613482983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/InfoPlist.strings; sourceTree = "<group>"; };
14721475
C116134B2983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = "<group>"; };
14731476
C116134D2983096D00777E7C /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/ckcomplication.strings; sourceTree = "<group>"; };
@@ -1646,6 +1649,7 @@
16461649
C1EB0D20299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
16471650
C1EB0D21299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
16481651
C1EB0D22299581D900628475 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/ckcomplication.strings; sourceTree = "<group>"; };
1652+
C1EE9E802A38D0FB0064784A /* BuildDetails.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = BuildDetails.plist; sourceTree = "<group>"; };
16491653
C1EF747128D6A44A00C8C083 /* CrashRecoveryManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashRecoveryManager.swift; sourceTree = "<group>"; };
16501654
C1F2075B26D6F9B0007AB7EB /* ProfileExpirationAlerter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileExpirationAlerter.swift; sourceTree = "<group>"; };
16511655
C1F48FF62995821600C8BD69 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -2105,6 +2109,7 @@
21052109
7D7076511FE06EE1004AC8EA /* InfoPlist.strings */,
21062110
43EDEE6B1CF2E12A00393BE3 /* Loop.entitlements */,
21072111
43F5C2D41B92A4A6003EB13D /* Info.plist */,
2112+
C1EE9E802A38D0FB0064784A /* BuildDetails.plist */,
21082113
43776F8F1B8022E90074EA36 /* AppDelegate.swift */,
21092114
1D12D3B82548EFDD00B53E8B /* main.swift */,
21102115
43776F9A1B8022E90074EA36 /* LaunchScreen.storyboard */,
@@ -2614,6 +2619,7 @@
26142619
4F11D3C120DD80B3006E072C /* WatchHistoricalGlucose.swift */,
26152620
4F7E8AC620E2AC0300AEA65E /* WatchPredictedGlucose.swift */,
26162621
E9B08020253BBDE900BAD8F8 /* IntentExtensionInfo.swift */,
2622+
C110888C2A3913C600BA4898 /* BuildDetails.swift */,
26172623
);
26182624
path = Models;
26192625
sourceTree = "<group>";
@@ -3500,6 +3506,7 @@
35003506
buildActionMask = 2147483647;
35013507
files = (
35023508
C13255D6223E7BE2008AF50C /* BolusProgressTableViewCell.xib in Resources */,
3509+
C1EE9E812A38D0FB0064784A /* BuildDetails.plist in Resources */,
35033510
43FCBBC21E51710B00343C1B /* LaunchScreen.storyboard in Resources */,
35043511
B405E35A24D2B1A400DD058D /* HUDAssets.xcassets in Resources */,
35053512
A966152623EA5A26005D8B29 /* DefaultAssets.xcassets in Resources */,
@@ -3745,7 +3752,6 @@
37453752
inputFileListPaths = (
37463753
);
37473754
inputPaths = (
3748-
"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}",
37493755
);
37503756
name = "Capture Build Details";
37513757
outputFileListPaths = (
@@ -3912,6 +3918,7 @@
39123918
A98556852493F901000FD662 /* AlertStore+SimulatedCoreData.swift in Sources */,
39133919
899433B823FE129800FA4BEA /* OverrideBadgeView.swift in Sources */,
39143920
89D1503E24B506EB00EDE253 /* Dictionary.swift in Sources */,
3921+
C110888D2A3913C600BA4898 /* BuildDetails.swift in Sources */,
39153922
A96DAC2C2838F31200D94E38 /* SharedLogging.swift in Sources */,
39163923
4302F4E31D4EA54200F0FCAF /* InsulinDeliveryTableViewController.swift in Sources */,
39173924
1D63DEA526E950D400F46FA5 /* SupportManager.swift in Sources */,

Loop/BuildDetails.plist

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<!--
4+
BuildDetails.plist
5+
Loop
6+
7+
Created by Pete Schwamb on 6/13/23.
8+
Copyright (c) 2023 LoopKit Authors. All rights reserved.
9+
-->
10+
<plist version="1.0">
11+
<dict/>
12+
</plist>

Loop/Managers/DeviceDataManager.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1733,14 +1733,14 @@ extension DeviceDataManager: DeviceSupportDelegate {
17331733
let report = [
17341734
"## Build Details",
17351735
"* appNameAndVersion: \(Bundle.main.localizedNameAndVersion)",
1736-
"* profileExpiration: \(Bundle.main.profileExpirationString)",
1737-
"* gitRevision: \(Bundle.main.gitRevision ?? "N/A")",
1738-
"* gitBranch: \(Bundle.main.gitBranch ?? "N/A")",
1739-
"* workspaceGitRevision: \(Bundle.main.workspaceGitRevision ?? "N/A")",
1740-
"* workspaceGitBranch: \(Bundle.main.workspaceGitBranch ?? "N/A")",
1741-
"* sourceRoot: \(Bundle.main.sourceRoot ?? "N/A")",
1742-
"* buildDateString: \(Bundle.main.buildDateString ?? "N/A")",
1743-
"* xcodeVersion: \(Bundle.main.xcodeVersion ?? "N/A")",
1736+
"* profileExpiration: \(BuildDetails.default.profileExpirationString)",
1737+
"* gitRevision: \(BuildDetails.default.gitRevision ?? "N/A")",
1738+
"* gitBranch: \(BuildDetails.default.gitBranch ?? "N/A")",
1739+
"* workspaceGitRevision: \(BuildDetails.default.workspaceGitRevision ?? "N/A")",
1740+
"* workspaceGitBranch: \(BuildDetails.default.workspaceGitBranch ?? "N/A")",
1741+
"* sourceRoot: \(BuildDetails.default.sourceRoot ?? "N/A")",
1742+
"* buildDateString: \(BuildDetails.default.buildDateString ?? "N/A")",
1743+
"* xcodeVersion: \(BuildDetails.default.xcodeVersion ?? "N/A")",
17441744
"",
17451745
"## FeatureFlags",
17461746
"\(FeatureFlags)",

Loop/Managers/LoopAppManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ class LoopAppManager: NSObject {
244244

245245
analyticsServicesManager.identifyAppName(Bundle.main.bundleDisplayName)
246246

247-
if let workspaceGitRevision = Bundle.main.workspaceGitRevision {
247+
if let workspaceGitRevision = BuildDetails.default.workspaceGitRevision {
248248
analyticsServicesManager.identifyWorkspaceGitRevision(workspaceGitRevision)
249249
}
250250

Loop/Managers/ProfileExpirationAlerter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class ProfileExpirationAlerter {
2020

2121
let now = Date()
2222

23-
guard let profileExpiration = Bundle.main.profileExpiration, now > profileExpiration - expirationAlertWindow else {
23+
guard let profileExpiration = BuildDetails.default.profileExpiration, now > profileExpiration - expirationAlertWindow else {
2424
return
2525
}
2626

Loop/Managers/SupportManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ extension SupportManager: SupportUIDelegate {
227227
}
228228

229229
private var branchNameIfNotReleaseBranch: String? {
230-
return Bundle.main.gitBranch.filter { branch in
230+
return BuildDetails.default.gitBranch.filter { branch in
231231
return branch != "" &&
232232
branch != "main" &&
233233
branch != "master" &&

Loop/Views/SettingsView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ public struct SettingsView: View {
7070

7171
supportSection
7272

73-
if let profileExpiration = Bundle.main.profileExpiration, FeatureFlags.profileExpirationSettingsViewEnabled {
73+
if let profileExpiration = BuildDetails.default.profileExpiration, FeatureFlags.profileExpirationSettingsViewEnabled {
7474
profileExpirationSection(profileExpiration: profileExpiration)
7575
}
7676
}

Scripts/apply-info-customizations.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ info() {
2626
echo "INFO: ${*}" >&2
2727
}
2828

29-
info_plist_path="${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}"
29+
info_plist_path="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/BuildDetails.plist"
3030
while [[ $# -gt 0 ]]
3131
do
3232
case $1 in

0 commit comments

Comments
 (0)