Conversation
…CheckValidity and code cleanup
…tegrate profileutil changes
# Conflicts: # autocodesign/localcodesignasset/profilelookup.go # autocodesign/profiles.go
# Conflicts: # autocodesign/profiledownloader/profiledownloader.go # autocodesign/profiles.go # go.mod # go.sum # mocks/PathModifier.go # mocks/PathProvider.go
There was a problem hiding this comment.
Pull request overview
Migrates provisioning profile utilities and their consumers from profileutil v1’s package-level functions to the v2 struct-based, dependency-injected API (aligned with go-utils/v2), adding new helpers and tests to support the new architecture.
Changes:
- Introduces v2
profileutilcomponents (ProfileReader,ProfilePrinter,TimeProvider, expandedPlistDatahelpers) and comprehensive unit tests. - Updates multiple consumers (xcarchive, autocodesign, exportoptionsgenerator, codesign, artifacts, integration tests) to use
go-xcode/v2/profileutil. - Refactors export options generator and codesign asset writer wiring to use injected v2 dependencies; removes the legacy plist conversion helper.
Reviewed changes
Copilot reviewed 48 out of 48 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
xcarchive/macos.go |
Switches to v2 profileutil and constructs a ProfileReader for reading embedded profiles. |
xcarchive/ios.go |
Switches to v2 profileutil and uses ProfileReader.ProvisioningProfileInfoFromFile. |
xcarchive/ios_test.go |
Updates imports to v2 profileutil. |
profileutil/util.go |
Adds v2 utility helpers (KnownProfileCapabilitiesMap, IsXcodeManaged, entitlement matching). |
profileutil/util_test.go |
Adds unit tests for IsXcodeManaged and entitlement matching. |
profileutil/time_provider.go |
Adds injectable TimeProvider + DefaultTimeProvider. |
profileutil/testdata_test.go |
Adds provisioning profile plist fixtures for tests. |
profileutil/profile_reader.go |
Adds ProfileReader (DI-based) to read/list installed provisioning profiles across legacy/modern dirs. |
profileutil/profile_reader_test.go |
Adds tests for ProfileReader behaviors and error propagation. |
profileutil/profile_printer.go |
Adds ProfilePrinter to render profile info as JSON with validity/cert diagnostics. |
profileutil/profile_printer_test.go |
Adds tests validating printer JSON output and error scenarios. |
profileutil/plist_data.go |
Adds PlistData helpers (platform/type detection, export method, cert parsing, etc.). |
profileutil/plist_data_test.go |
Adds tests for PlistData parsing/type detection/export method logic. |
profileutil/info_model.go |
Adds v2 ProvisioningProfileInfoModel + constructors, validity and certificate checks. |
profileutil/info_model_test.go |
Adds tests for model constructors and methods, including time-injected validity. |
mocks/PathProvider.go |
Regenerates mock (mockery version bump). |
mocks/PathModifier.go |
Regenerates mock (mockery version bump). |
go.mod |
Promotes github.com/fullsailor/pkcs7 to a direct dependency. |
exportoptionsgenerator/profiles.go |
Refactors profile provider to use injected ProfileReader and v2 pathutil.PathProvider. |
exportoptionsgenerator/plistconverter.go |
Removes v1 plist conversion helper no longer needed after v2 migration. |
exportoptionsgenerator/internal/codesigngroup/printer_test.go |
Updates imports to v2 profileutil. |
exportoptionsgenerator/internal/codesigngroup/ios.go |
Updates imports to v2 profileutil. |
exportoptionsgenerator/internal/codesigngroup/filter.go |
Updates imports to v2 plistutil/profileutil and uses v2 entitlements map. |
exportoptionsgenerator/internal/codesigngroup/codesigngroup_test.go |
Updates imports to v2 profileutil. |
exportoptionsgenerator/internal/codesigngroup/codesigngroup.go |
Updates imports to v2 profileutil. |
exportoptionsgenerator/exportoptionsgenerator_test.go |
Updates imports to v2 profileutil. |
exportoptionsgenerator/exportoptionsgenerator.go |
Wires v2 ProfileReader/providers in generator constructor. |
exportoptionsgenerator/codesign_group_provider.go |
Replaces info.String() with v2 ProfilePrinter output; updates filtering to v2 entitlements. |
exportoptionsgenerator/certificates.go |
Adds a constructor for LocalCodesignIdentityProvider used in v2 wiring. |
codesign/inputparse.go |
Updates imports to v2 profileutil. |
codesign/codesign_test.go |
Updates imports to v2 profileutil. |
codesign/codesign.go |
Updates imports to v2 profileutil. |
autocodesign/profiles.go |
Switches raw profile parsing to NewProvisioningProfileInfoFromPKCS7Content. |
autocodesign/profiledownloader/profiledownloader.go |
Switches downloaded profile parsing to NewProvisioningProfileInfoFromPKCS7Content. |
autocodesign/localcodesignasset/profileprovider.go |
Refactors provider to use an internal v2 ProfileReader. |
autocodesign/localcodesignasset/profilelookup.go |
Updates imports to v2 profileutil. |
autocodesign/localcodesignasset/profilelookup_test.go |
Updates imports to v2 profileutil. |
autocodesign/localcodesignasset/profileconverter.go |
Refactors profile lookup/reading to v2 ProfileReader + v2 file operations. |
autocodesign/localcodesignasset/profile.go |
Updates imports to v2 profileutil and platform mapping logic. |
autocodesign/localcodesignasset/mocks/ProvisioningProfileProvider.go |
Updates mock import path to v2 profileutil. |
autocodesign/localcodesignasset/mocks/ProvisioningProfileConverter.go |
Regenerates mock with updated import path and mockery version. |
autocodesign/localcodesignasset/localcodesignasset_test.go |
Updates imports to v2 profileutil. |
autocodesign/example_test.go |
Updates example wiring to provide a v2 ProfileReader to the asset writer. |
autocodesign/codesignasset/writer.go |
Updates writer to accept a v2 ProfileReader and use it for dir path selection. |
autocodesign/codesignasset/writer_test.go |
Updates tests to provide a v2 ProfileReader to the writer. |
autocodesign/autocodesign.go |
Updates imports to v2 profileutil. |
artifacts/ipa_reader.go |
Switches embedded profile parsing to NewProvisioningProfileInfoFromPKCS7Content. |
_integration_tests/zip/ipa_reader_test.go |
Updates imports to v2 profileutil. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| for key := range targetEntitlements { | ||
| _, known := KnownProfileCapabilitiesMap[profileType][key] | ||
| if !known { |
| profile, err := c.fileManager.Open(pth) | ||
| if err != nil { | ||
| return nil, err | ||
| } |
| has := false | ||
| for _, certificate := range info.DeveloperCertificates { | ||
| for _, installedCertificate := range installedCertificates { | ||
| if certificate.Serial == installedCertificate.Serial { | ||
| has = true | ||
| break | ||
| } | ||
| } |
| } | ||
| }() | ||
|
|
||
| content, err := io.ReadAll(f) |
There was a problem hiding this comment.
Do we need to open and read contents, we could do os.ReadFile or a mocked alternative.
There was a problem hiding this comment.
Unfortunately we don't have a ReadFile utility function, os.ReadFile is something we shouldn't call directly. So I went with the easiest path: FileManager.Open + io.ReadAll.
profileutil V1→V2 Migration Summary
V1→V2 Structural Transformation
Core Types: No Changes
The primary data structures remain identical between v1 and v2:
ProvisioningProfileInfoModel
PlistData
ProfileType Constants
Key Architectural Changes
The migration introduces struct-based APIs replacing v1's function-based approach, following go-utils v2 patterns for better testability and dependency injection.
V1→V2 Function Migration
1. Profile Reading Functions → ProfileReader Struct
V1: Package-level functions
V2: ProfileReader struct with injected dependencies
Changes:
NewProvisioningProfileInfoFromFile()→ProfileReader.ProvisioningProfileInfoFromFile()InstalledProvisioningProfileInfos()→ProfileReader.InstalledProvisioningProfileInfos()ProvisioningProfilesDirPath()→ProfileReader.ProvisioningProfilesDirPath()ProfileReader.ListProfiles()— searches both modern (Xcode 16+) and legacy profile directories by type and UUID globFindProvisioningProfileInfo()— Removed (unused by consumers)ProvisioningProfileFromFile()→ privateprovisioningProfileFromFile()InstalledProvisioningProfiles()→ privateinstalledProvisioningProfiles()FindProvisioningProfile()— Removed (unused)2. Profile Printing Functions → ProfilePrinter Struct
V1: Method on ProvisioningProfileInfoModel
V2: ProfilePrinter struct
Changes:
info.String(certs...)→printer.PrintableProfile(info, certs...)TimeProviderdependency for testable time-based validationlogpackage3. Model Constructor Functions
Changes:
NewProvisioningProfileInfo(pkcs7.PKCS7)— signature unchangedPlistData.GetProfileType()V2 Addition:
4. Model Validation Methods
V1: Uses global time.Now()
V2: Injected time function for testability
Changes:
currentTime func() time.Timeparameterprofileutil.DefaultTimeProvider{}.Nowin production codeUnchanged Model Methods:
5. PlistData Methods
V1 and V2: Core methods unchanged
V2 Additions: Extracted from NewProvisioningProfileInfo constructor
V1 Function Removed:
Functionality replaced by
ProfileReader.ProvisioningProfileInfoFromFile()6. Utility Functions
V1 and V2: Unchanged
7. Time Provider (V2 Addition)
New in V2:
Used for testable time-dependent operations (e.g.,
CheckValidity,ProfilePrinter).Known Issues / TODOs
NewProvisioningProfileConverter()andNewProvisioningProfileProvider()inlocalcodesignassetstill wire their own dependencies internally instead of accepting them as constructor parameters. This is a partial migration — the structs hold the deps as fields, but injection is not yet complete. Tracked via TODO comments in those files.xcarchive.NewIosBaseApplicationandxcarchive.newMacosBaseApplicationconstructProfileReaderinline rather than receiving it as a struct dependency. Tracked via// TODO: wire in as a dep on the structcomments.