Skip to content

Commit 201ab79

Browse files
authored
Changes from Tidepool (LoopKit#55)
* Changes from Tidepool * Update to dev * Add merges for NightscoutRemoteCGM and G7SensorKit * Fix tests
1 parent 1803e01 commit 201ab79

15 files changed

+173
-12
lines changed

InfoCustomizations.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
TidepoolServiceClientId=diy-loop

Loop

Submodule Loop updated 48 files

LoopKit

Submodule LoopKit updated 39 files

LoopWorkspace.xcworkspace/contents.xcworkspacedata

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Scripts/sync.swift

+157
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
#!/usr/bin/swift sh
2+
3+
// Depends on swift-sh. Install with: `brew install swift-sh`
4+
5+
import Foundation
6+
import Cocoa
7+
8+
import AsyncSwiftGit // @bdewey
9+
import OctoKit // /Users/pete/dev/octokit.swift
10+
11+
struct Project {
12+
let project: String
13+
let branch: String
14+
15+
init(_ project: String, _ branch: String) {
16+
self.project = project
17+
self.branch = branch
18+
}
19+
}
20+
21+
let projects = [
22+
Project("Loop", "dev"),
23+
Project("LoopKit", "dev"),
24+
Project("CGMBLEKit", "dev"),
25+
Project("dexcom-share-client-swift", "dev"),
26+
//Project("RileyLinkKit", "dev"),
27+
//Project("MKRingProgressView", "dev"),
28+
Project("NightscoutService", "dev"),
29+
//Project("Minizip", "dev"),
30+
//Project("TrueTime.swift", "dev"),
31+
Project("LoopOnboarding", "dev"),
32+
Project("AmplitudeService", "dev"),
33+
Project("LogglyService", "dev"),
34+
Project("OmniBLE", "dev"),
35+
Project("NightscoutRemoteCGM", "dev"),
36+
Project("LoopSupport", "dev"),
37+
Project("G7SensorKit", "dev"),
38+
Project("TidepoolService", "dev"),
39+
Project("TidepoolKit", "dev"),
40+
Project("OmniKit", "main"),
41+
Project("MinimedKit", "main")
42+
]
43+
44+
let fm = FileManager.default
45+
let loopkit = URL(string: "https://github.com/LoopKit")!
46+
let tidepool = URL(string: "https://github.com/tidepool-org")!
47+
let syncBranch = "tidepool-sync"
48+
let incomingRemote = "tidepool"
49+
50+
enum EnvError: Error {
51+
case missing(String)
52+
}
53+
54+
func getEnv(_ name: String) throws -> String {
55+
guard let value = ProcessInfo.processInfo.environment[name] else {
56+
throw EnvError.missing(name)
57+
}
58+
return value
59+
}
60+
61+
let ghUsername = try getEnv("GH_USERNAME")
62+
let ghToken = try getEnv("GH_TOKEN")
63+
let ghCommitterName = try getEnv("GH_COMMITTER_NAME")
64+
let ghCommitterEmail = try getEnv("GH_COMMITTER_EMAIL")
65+
66+
let octokit = Octokit(TokenConfiguration(ghToken))
67+
68+
let credentials = Credentials.plaintext(username: ghUsername, password: ghToken)
69+
let signature = try! Signature(name: ghCommitterName, email: ghCommitterEmail)
70+
71+
for project in projects {
72+
let dest = URL(string: fm.currentDirectoryPath)!.appendingPathComponent(project.project)
73+
let repository: AsyncSwiftGit.Repository
74+
if !fm.fileExists(atPath: project.project) {
75+
print("Cloning \(project.project)")
76+
let url = loopkit.appendingPathComponent(project.project)
77+
repository = try await Repository.clone(from: url, to: dest)
78+
print("Cloned \(project.project)")
79+
} else {
80+
print("Already Exists: \(project.project)")
81+
repository = try Repository(openAt: dest)
82+
}
83+
84+
let incomingRemoteURL = tidepool.appendingPathComponent(project.project)
85+
86+
// Add remote if it doesn't exist, and fetch latest changes
87+
if (try? repository.remoteURL(for: incomingRemote)) == nil {
88+
try repository.addRemote(incomingRemote, url: incomingRemoteURL)
89+
}
90+
try await repository.fetch(remote: incomingRemote)
91+
92+
// Create and checkout the branch where sync changesets will go ("tidepool-sync")
93+
if !(try repository.branchExists(named: syncBranch)) {
94+
try repository.createBranch(named: syncBranch, target: project.branch)
95+
}
96+
try await repository.checkout(revspec: syncBranch)
97+
98+
// Merge changes from tidepool to diy
99+
try await repository.merge(revisionSpecification: "\(incomingRemote)/\(project.branch)", signature: signature)
100+
101+
// Push changes up to origin
102+
let refspec = "refs/heads/" + syncBranch + ":refs/heads/" + syncBranch
103+
print("Pushing \(refspec) to \(project.project)")
104+
try await repository.push(remoteName: "origin", refspecs: [refspec], credentials: credentials)
105+
106+
// Make sure a PR exists, or create it
107+
let prs = try await octokit.listPullRequests(owner: "LoopKit", repo: project.project, base: project.branch, head:"LoopKit:tidepool-sync")
108+
let pr: PullRequest
109+
if prs.count == 0 {
110+
pr = try await octokit.createPullRequest(owner: "LoopKit", repo: project.project, title: "Tidepool Sync", head: "LoopKit:" + syncBranch, base: project.branch, body: "")
111+
print("PR = \(pr)")
112+
} else {
113+
pr = prs.first!
114+
}
115+
if let url = pr.htmlURL {
116+
if NSWorkspace.shared.open(url) {
117+
print("default browser was successfully opened")
118+
119+
}
120+
}
121+
}
122+
123+
extension Octokit {
124+
func createPullRequest(owner: String,
125+
repo: String,
126+
title: String,
127+
head: String,
128+
headRepo: String? = nil,
129+
base: String,
130+
body: String? = nil,
131+
maintainerCanModify: Bool? = nil,
132+
draft: Bool? = nil) async throws -> PullRequest
133+
{
134+
return try await withCheckedThrowingContinuation { continuation in
135+
octokit.pullRequest(owner: owner, repo: repo, title: title, head: head, headRepo: headRepo, base: base, body: body, maintainerCanModify: maintainerCanModify, draft: draft)
136+
{ response in
137+
continuation.resume(with: response)
138+
}
139+
}
140+
}
141+
142+
func listPullRequests(owner: String,
143+
repo: String,
144+
base: String? = nil,
145+
head: String? = nil,
146+
state: Openness = .open,
147+
sort: SortType = .created,
148+
direction: SortDirection = .desc) async throws -> [PullRequest]
149+
{
150+
return try await withCheckedThrowingContinuation { continuation in
151+
octokit.pullRequests(owner: owner, repository: repo, base: base, head: head, state: state, sort: sort, direction: direction)
152+
{ response in
153+
continuation.resume(with: response)
154+
}
155+
}
156+
}
157+
}

Scripts/update_submodule_refs.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/bin/zsh
22

3-
projects=(LoopKit:AmplitudeService:dev LoopKit:CGMBLEKit:dev LoopKit:G7SensorKit:main LoopKit:LogglyService:dev LoopKit:Loop:dev LoopKit:LoopKit:dev LoopKit:LoopOnboarding:dev LoopKit:LoopSupport:dev LoopKit:NightscoutAPIClient:master ps2:NightscoutService:dev LoopKit:OmniBLE:dev LoopKit:TidepoolKit:dev LoopKit:TidepoolService:dev LoopKit:dexcom-share-client-swift:dev ps2:rileylink_ios:dev LoopKit:OmniKit:main LoopKit:MinimedKit:main)
3+
projects=(LoopKit:AmplitudeService:dev LoopKit:CGMBLEKit:dev LoopKit:G7SensorKit:main LoopKit:LogglyService:dev LoopKit:Loop:dev LoopKit:LoopKit:dev LoopKit:LoopOnboarding:dev LoopKit:LoopSupport:dev LoopKit:NightscoutRemoteCGM:dev LoopKit:NightscoutService:dev LoopKit:OmniBLE:dev LoopKit:TidepoolKit:dev LoopKit:TidepoolService:dev LoopKit:dexcom-share-client-swift:dev ps2:RileyLinkKit:dev LoopKit:OmniKit:main LoopKit:MinimedKit:main)
44

55
for project in ${projects}; do
66
echo "Updating to $project"

0 commit comments

Comments
 (0)