diff --git a/CGMBLEKit b/CGMBLEKit index 19346b5ee9..69d3e4f8e8 160000 --- a/CGMBLEKit +++ b/CGMBLEKit @@ -1 +1 @@ -Subproject commit 19346b5ee95bddd4c1a723c649cda6d56e8a0548 +Subproject commit 69d3e4f8e82583c83fff40152ab551cfe4989728 diff --git a/G7SensorKit b/G7SensorKit index 3781e2ee5f..eda0394169 160000 --- a/G7SensorKit +++ b/G7SensorKit @@ -1 +1 @@ -Subproject commit 3781e2ee5f0507e8f0b2ce55384ac4a21dc078bd +Subproject commit eda0394169ea3a3c8781658946c00270559bc64b diff --git a/InfoCustomizations.txt b/InfoCustomizations.txt new file mode 100644 index 0000000000..dc3509c649 --- /dev/null +++ b/InfoCustomizations.txt @@ -0,0 +1 @@ +TidepoolServiceClientId=diy-loop diff --git a/Loop b/Loop index 512f50df78..3d1e99fc59 160000 --- a/Loop +++ b/Loop @@ -1 +1 @@ -Subproject commit 512f50df78a3aa60a07bc3f2d36adc3b52971f3a +Subproject commit 3d1e99fc591d0e5db52c8e7313c5a3b3aff3bba4 diff --git a/LoopKit b/LoopKit index 60f804462a..a78aa8ed92 160000 --- a/LoopKit +++ b/LoopKit @@ -1 +1 @@ -Subproject commit 60f804462a45ef78d0b5939aca6c61e88f47a3bf +Subproject commit a78aa8ed92f9248c22acefbdd7a54d5cf7da9e6e diff --git a/LoopSupport b/LoopSupport index efaefcfdae..9253b5ffe5 160000 --- a/LoopSupport +++ b/LoopSupport @@ -1 +1 @@ -Subproject commit efaefcfdae5afadb5841275da07ab1f74deba0fb +Subproject commit 9253b5ffe5acc3baab33b5ff0b22ce933bf73d0f diff --git a/LoopWorkspace.xcworkspace/contents.xcworkspacedata b/LoopWorkspace.xcworkspace/contents.xcworkspacedata index b01f61dfb8..7ee2530a01 100644 --- a/LoopWorkspace.xcworkspace/contents.xcworkspacedata +++ b/LoopWorkspace.xcworkspace/contents.xcworkspacedata @@ -4,6 +4,9 @@ + + diff --git a/MinimedKit b/MinimedKit index f7b4cf5eb1..35204a6297 160000 --- a/MinimedKit +++ b/MinimedKit @@ -1 +1 @@ -Subproject commit f7b4cf5eb1cf916b77794dce28dc03db73d26931 +Subproject commit 35204a6297238ecd34ba872740d575e3c95dd0b2 diff --git a/NightscoutRemoteCGM b/NightscoutRemoteCGM index 7f5cd6b0c7..cc3e21508c 160000 --- a/NightscoutRemoteCGM +++ b/NightscoutRemoteCGM @@ -1 +1 @@ -Subproject commit 7f5cd6b0c792e4a1d55efb70ec638fa1232e5594 +Subproject commit cc3e21508c0c3c6ef52d0a986ae4bb863b8d2078 diff --git a/OmniBLE b/OmniBLE index 24063abbf6..be85ec630e 160000 --- a/OmniBLE +++ b/OmniBLE @@ -1 +1 @@ -Subproject commit 24063abbf669cc26ac7b150d40c227587cc4f4d3 +Subproject commit be85ec630e40b8fb8ee76cfca63c4a73617db6d7 diff --git a/OmniKit b/OmniKit index 8dfb5959f2..a11bb45e32 160000 --- a/OmniKit +++ b/OmniKit @@ -1 +1 @@ -Subproject commit 8dfb5959f2c9164d05e0b4e15734bb693f1fccb4 +Subproject commit a11bb45e32eaac2a20292c3aa69621614c0ec733 diff --git a/Scripts/sync.swift b/Scripts/sync.swift new file mode 100755 index 0000000000..899ad0a6b1 --- /dev/null +++ b/Scripts/sync.swift @@ -0,0 +1,157 @@ +#!/usr/bin/swift sh + +// Depends on swift-sh. Install with: `brew install swift-sh` + +import Foundation +import Cocoa + +import AsyncSwiftGit // @bdewey +import OctoKit // /Users/pete/dev/octokit.swift + +struct Project { + let project: String + let branch: String + + init(_ project: String, _ branch: String) { + self.project = project + self.branch = branch + } +} + +let projects = [ + Project("Loop", "dev"), + Project("LoopKit", "dev"), + Project("CGMBLEKit", "dev"), + Project("dexcom-share-client-swift", "dev"), + //Project("RileyLinkKit", "dev"), + //Project("MKRingProgressView", "dev"), + Project("NightscoutService", "dev"), + //Project("Minizip", "dev"), + //Project("TrueTime.swift", "dev"), + Project("LoopOnboarding", "dev"), + Project("AmplitudeService", "dev"), + Project("LogglyService", "dev"), + Project("OmniBLE", "dev"), + Project("NightscoutRemoteCGM", "dev"), + Project("LoopSupport", "dev"), + Project("G7SensorKit", "dev"), + Project("TidepoolService", "dev"), + Project("TidepoolKit", "dev"), + Project("OmniKit", "main"), + Project("MinimedKit", "main") +] + +let fm = FileManager.default +let loopkit = URL(string: "https://github.com/LoopKit")! +let tidepool = URL(string: "https://github.com/tidepool-org")! +let syncBranch = "tidepool-sync" +let incomingRemote = "tidepool" + +enum EnvError: Error { + case missing(String) +} + +func getEnv(_ name: String) throws -> String { + guard let value = ProcessInfo.processInfo.environment[name] else { + throw EnvError.missing(name) + } + return value +} + +let ghUsername = try getEnv("GH_USERNAME") +let ghToken = try getEnv("GH_TOKEN") +let ghCommitterName = try getEnv("GH_COMMITTER_NAME") +let ghCommitterEmail = try getEnv("GH_COMMITTER_EMAIL") + +let octokit = Octokit(TokenConfiguration(ghToken)) + +let credentials = Credentials.plaintext(username: ghUsername, password: ghToken) +let signature = try! Signature(name: ghCommitterName, email: ghCommitterEmail) + +for project in projects { + let dest = URL(string: fm.currentDirectoryPath)!.appendingPathComponent(project.project) + let repository: AsyncSwiftGit.Repository + if !fm.fileExists(atPath: project.project) { + print("Cloning \(project.project)") + let url = loopkit.appendingPathComponent(project.project) + repository = try await Repository.clone(from: url, to: dest) + print("Cloned \(project.project)") + } else { + print("Already Exists: \(project.project)") + repository = try Repository(openAt: dest) + } + + let incomingRemoteURL = tidepool.appendingPathComponent(project.project) + + // Add remote if it doesn't exist, and fetch latest changes + if (try? repository.remoteURL(for: incomingRemote)) == nil { + try repository.addRemote(incomingRemote, url: incomingRemoteURL) + } + try await repository.fetch(remote: incomingRemote) + + // Create and checkout the branch where sync changesets will go ("tidepool-sync") + if !(try repository.branchExists(named: syncBranch)) { + try repository.createBranch(named: syncBranch, target: project.branch) + } + try await repository.checkout(revspec: syncBranch) + + // Merge changes from tidepool to diy + try await repository.merge(revisionSpecification: "\(incomingRemote)/\(project.branch)", signature: signature) + + // Push changes up to origin + let refspec = "refs/heads/" + syncBranch + ":refs/heads/" + syncBranch + print("Pushing \(refspec) to \(project.project)") + try await repository.push(remoteName: "origin", refspecs: [refspec], credentials: credentials) + + // Make sure a PR exists, or create it + let prs = try await octokit.listPullRequests(owner: "LoopKit", repo: project.project, base: project.branch, head:"LoopKit:tidepool-sync") + let pr: PullRequest + if prs.count == 0 { + pr = try await octokit.createPullRequest(owner: "LoopKit", repo: project.project, title: "Tidepool Sync", head: "LoopKit:" + syncBranch, base: project.branch, body: "") + print("PR = \(pr)") + } else { + pr = prs.first! + } + if let url = pr.htmlURL { + if NSWorkspace.shared.open(url) { + print("default browser was successfully opened") + + } + } +} + +extension Octokit { + func createPullRequest(owner: String, + repo: String, + title: String, + head: String, + headRepo: String? = nil, + base: String, + body: String? = nil, + maintainerCanModify: Bool? = nil, + draft: Bool? = nil) async throws -> PullRequest + { + return try await withCheckedThrowingContinuation { continuation in + octokit.pullRequest(owner: owner, repo: repo, title: title, head: head, headRepo: headRepo, base: base, body: body, maintainerCanModify: maintainerCanModify, draft: draft) + { response in + continuation.resume(with: response) + } + } + } + + func listPullRequests(owner: String, + repo: String, + base: String? = nil, + head: String? = nil, + state: Openness = .open, + sort: SortType = .created, + direction: SortDirection = .desc) async throws -> [PullRequest] + { + return try await withCheckedThrowingContinuation { continuation in + octokit.pullRequests(owner: owner, repository: repo, base: base, head: head, state: state, sort: sort, direction: direction) + { response in + continuation.resume(with: response) + } + } + } +} diff --git a/Scripts/update_submodule_refs.sh b/Scripts/update_submodule_refs.sh index fe24d7f015..5ad5c71945 100755 --- a/Scripts/update_submodule_refs.sh +++ b/Scripts/update_submodule_refs.sh @@ -1,6 +1,6 @@ #!/bin/zsh -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) +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) for project in ${projects}; do echo "Updating to $project" diff --git a/TidepoolService b/TidepoolService index 0eef224636..3cad23b954 160000 --- a/TidepoolService +++ b/TidepoolService @@ -1 +1 @@ -Subproject commit 0eef2246365d981ef8fa4b5f45bb606a74875de0 +Subproject commit 3cad23b9547f5a6cd2aa8b0e27800ac36d87d9b6 diff --git a/dexcom-share-client-swift b/dexcom-share-client-swift index 20ed7a1457..792c0b5d61 160000 --- a/dexcom-share-client-swift +++ b/dexcom-share-client-swift @@ -1 +1 @@ -Subproject commit 20ed7a1457af2e5a72fcc1c91b660ae8c0478d94 +Subproject commit 792c0b5d61a071e699b9773d2f86f39f10ebffd5