diff --git a/_integration_tests/zip/ipa_reader_test.go b/_integration_tests/zip/ipa_reader_test.go
index 54a20b1d..fa25c8cd 100644
--- a/_integration_tests/zip/ipa_reader_test.go
+++ b/_integration_tests/zip/ipa_reader_test.go
@@ -6,11 +6,11 @@ import (
"testing"
"github.com/bitrise-io/go-utils/v2/log"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
"github.com/bitrise-io/go-xcode/v2/_integration_tests"
"github.com/bitrise-io/go-xcode/v2/artifacts"
internalzip "github.com/bitrise-io/go-xcode/v2/internal/zip"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/bitrise-io/go-xcode/v2/zip"
"github.com/stretchr/testify/require"
)
diff --git a/artifacts/ios_xcarchive_reader.go b/artifacts/ios_xcarchive_reader.go
index 96b4717c..4180c9f3 100644
--- a/artifacts/ios_xcarchive_reader.go
+++ b/artifacts/ios_xcarchive_reader.go
@@ -1,7 +1,7 @@
package artifacts
import (
- "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
// IOSXCArchiveReader ...
diff --git a/artifacts/ipa_reader.go b/artifacts/ipa_reader.go
index 0ed698ee..df25abbe 100644
--- a/artifacts/ipa_reader.go
+++ b/artifacts/ipa_reader.go
@@ -3,8 +3,8 @@ package artifacts
import (
"fmt"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
// IPAReader ...
diff --git a/artifacts/xcarchive_reader.go b/artifacts/xcarchive_reader.go
index 02368165..8270ff4e 100644
--- a/artifacts/xcarchive_reader.go
+++ b/artifacts/xcarchive_reader.go
@@ -1,7 +1,7 @@
package artifacts
import (
- "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
// XCArchiveReader ...
diff --git a/autocodesign/projectmanager/projecthelper.go b/autocodesign/projectmanager/projecthelper.go
index d3a829bb..7a3baa01 100644
--- a/autocodesign/projectmanager/projecthelper.go
+++ b/autocodesign/projectmanager/projecthelper.go
@@ -7,6 +7,7 @@ import (
"regexp"
"strings"
+ "github.com/bitrise-io/go-plist"
"github.com/bitrise-io/go-utils/fileutil"
"github.com/bitrise-io/go-utils/pathutil"
"github.com/bitrise-io/go-utils/sliceutil"
@@ -17,7 +18,6 @@ import (
"github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj"
"github.com/bitrise-io/go-xcode/xcodeproject/xcscheme"
"github.com/bitrise-io/go-xcode/xcodeproject/xcworkspace"
- "howett.net/plist"
)
// BuildAction is the type of build action to be performed on the scheme.
diff --git a/codesign/codesign.go b/codesign/codesign.go
index 0e59d3c7..d6eda9e8 100644
--- a/codesign/codesign.go
+++ b/codesign/codesign.go
@@ -8,7 +8,6 @@ import (
"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/exportoptions"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
"github.com/bitrise-io/go-xcode/v2/autocodesign/devportalclient"
@@ -17,6 +16,7 @@ import (
"github.com/bitrise-io/go-xcode/v2/autocodesign/projectmanager"
"github.com/bitrise-io/go-xcode/v2/devportalservice"
"github.com/bitrise-io/go-xcode/v2/exportoptionsgenerator"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/bitrise-io/go-xcode/v2/xcarchive"
)
diff --git a/exportoptionsgenerator/codesign_group_provider.go b/exportoptionsgenerator/codesign_group_provider.go
index 04582465..60f95086 100644
--- a/exportoptionsgenerator/codesign_group_provider.go
+++ b/exportoptionsgenerator/codesign_group_provider.go
@@ -5,8 +5,8 @@ import (
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/export"
"github.com/bitrise-io/go-xcode/exportoptions"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
// CodeSignGroupProvider ...
@@ -65,7 +65,7 @@ func (g codeSignGroupProvider) DetermineCodesignGroup(certificates []certificate
if len(bundleIDEntitlementsMap) > 0 {
g.logger.Warnf("Filtering CodeSignInfo groups for target capabilities")
- codeSignGroups = export.FilterSelectableCodeSignGroups(codeSignGroups, export.CreateEntitlementsSelectableCodeSignGroupFilter(bundleIDEntitlementsMap))
+ codeSignGroups = export.FilterSelectableCodeSignGroups(codeSignGroups, export.CreateEntitlementsSelectableCodeSignGroupFilter(convertToV1PlistData(bundleIDEntitlementsMap)))
g.logger.Debugf("\nGroups after filtering for target capabilities:")
for _, group := range codeSignGroups {
diff --git a/exportoptionsgenerator/exportoptionsgenerator.go b/exportoptionsgenerator/exportoptionsgenerator.go
index aba6aaf0..61c8a533 100644
--- a/exportoptionsgenerator/exportoptionsgenerator.go
+++ b/exportoptionsgenerator/exportoptionsgenerator.go
@@ -7,8 +7,8 @@ import (
"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-xcode/export"
"github.com/bitrise-io/go-xcode/exportoptions"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/bitrise-io/go-xcode/v2/xcodeversion"
)
diff --git a/exportoptionsgenerator/exportoptionsgenerator_test.go b/exportoptionsgenerator/exportoptionsgenerator_test.go
index 20ade1af..9c2fd51a 100644
--- a/exportoptionsgenerator/exportoptionsgenerator_test.go
+++ b/exportoptionsgenerator/exportoptionsgenerator_test.go
@@ -7,9 +7,9 @@ import (
"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-xcode/certificateutil"
"github.com/bitrise-io/go-xcode/exportoptions"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
"github.com/bitrise-io/go-xcode/v2/exportoptionsgenerator/mocks"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/bitrise-io/go-xcode/v2/xcodeversion"
"github.com/stretchr/testify/require"
)
diff --git a/exportoptionsgenerator/plistconverter.go b/exportoptionsgenerator/plistconverter.go
new file mode 100644
index 00000000..cacc358a
--- /dev/null
+++ b/exportoptionsgenerator/plistconverter.go
@@ -0,0 +1,15 @@
+package exportoptionsgenerator
+
+import (
+ plistutilv1 "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
+)
+
+// TODO: remove this function when export package is migrated to v2 and uses plistutil/v2
+func convertToV1PlistData(bundleIDEntitlementsMap map[string]plistutil.PlistData) map[string]plistutilv1.PlistData {
+ converted := map[string]plistutilv1.PlistData{}
+ for bundleID, entitlements := range bundleIDEntitlementsMap {
+ converted[bundleID] = plistutilv1.PlistData(entitlements)
+ }
+ return converted
+}
diff --git a/exportoptionsgenerator/targets.go b/exportoptionsgenerator/targets.go
index d7d014ee..ee301009 100644
--- a/exportoptionsgenerator/targets.go
+++ b/exportoptionsgenerator/targets.go
@@ -3,7 +3,7 @@ package exportoptionsgenerator
import (
"fmt"
- "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/bitrise-io/go-xcode/xcodeproject/serialized"
"github.com/bitrise-io/go-xcode/xcodeproject/xcodeproj"
"github.com/bitrise-io/go-xcode/xcodeproject/xcscheme"
diff --git a/go.mod b/go.mod
index 9c7e111f..ba691387 100644
--- a/go.mod
+++ b/go.mod
@@ -7,6 +7,7 @@ toolchain go1.23.2
require (
cloud.google.com/go/secretmanager v1.14.3
cloud.google.com/go/storage v1.50.0
+ github.com/bitrise-io/go-plist v0.0.0-20210301100253-4b1a112ccd10
github.com/bitrise-io/go-steputils v1.0.5
github.com/bitrise-io/go-steputils/v2 v2.0.0-alpha.18
github.com/bitrise-io/go-utils v1.0.12
@@ -22,7 +23,6 @@ require (
golang.org/x/oauth2 v0.24.0
golang.org/x/text v0.21.0
google.golang.org/api v0.214.0
- howett.net/plist v1.0.0
)
require (
@@ -37,7 +37,6 @@ require (
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect
github.com/bitrise-io/go-pkcs12 v0.0.0-20230815095624-feb898696e02 // indirect
- github.com/bitrise-io/go-plist v0.0.0-20210301100253-4b1a112ccd10 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
@@ -80,4 +79,5 @@ require (
google.golang.org/grpc v1.67.3 // indirect
google.golang.org/protobuf v1.35.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
+ howett.net/plist v1.0.0 // indirect
)
diff --git a/plistutil/plistutil.go b/plistutil/plistutil.go
new file mode 100644
index 00000000..5b7091aa
--- /dev/null
+++ b/plistutil/plistutil.go
@@ -0,0 +1,220 @@
+package plistutil
+
+import (
+ "errors"
+ "time"
+
+ "github.com/bitrise-io/go-plist"
+)
+
+// PlistData ...
+type PlistData map[string]interface{}
+
+// NewPlistDataFromContent ...
+func NewPlistDataFromContent(plistContent string) (PlistData, error) {
+ var data PlistData
+ if _, err := plist.Unmarshal([]byte(plistContent), &data); err != nil {
+ return PlistData{}, err
+ }
+ return data, nil
+}
+
+// GetString ...
+func (data PlistData) GetString(forKey string) (string, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return "", false
+ }
+
+ casted, ok := value.(string)
+ if !ok {
+ return "", false
+ }
+
+ return casted, true
+}
+
+// GetUInt64 ...
+func (data PlistData) GetUInt64(forKey string) (uint64, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return 0, false
+ }
+
+ casted, ok := value.(uint64)
+ if !ok {
+ return 0, false
+ }
+ return casted, true
+}
+
+// GetFloat64 ...
+func (data PlistData) GetFloat64(forKey string) (float64, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return 0, false
+ }
+
+ casted, ok := value.(float64)
+ if !ok {
+ return 0, false
+ }
+ return casted, true
+}
+
+// GetBool ...
+func (data PlistData) GetBool(forKey string) (bool, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return false, false
+ }
+
+ casted, ok := value.(bool)
+ if !ok {
+ return false, false
+ }
+
+ return casted, true
+}
+
+// GetTime ...
+func (data PlistData) GetTime(forKey string) (time.Time, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return time.Time{}, false
+ }
+
+ casted, ok := value.(time.Time)
+ if !ok {
+ return time.Time{}, false
+ }
+ return casted, true
+}
+
+// GetUInt64Array ...
+func (data PlistData) GetUInt64Array(forKey string) ([]uint64, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return nil, false
+ }
+
+ if casted, ok := value.([]uint64); ok {
+ return casted, true
+ }
+
+ casted, ok := value.([]interface{})
+ if !ok {
+ return nil, false
+ }
+
+ var array []uint64
+ for _, v := range casted {
+ casted, ok := v.(uint64)
+ if !ok {
+ return nil, false
+ }
+
+ array = append(array, casted)
+ }
+ return array, true
+}
+
+// GetStringArray ...
+func (data PlistData) GetStringArray(forKey string) ([]string, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return nil, false
+ }
+
+ if casted, ok := value.([]string); ok {
+ return casted, true
+ }
+
+ casted, ok := value.([]interface{})
+ if !ok {
+ return nil, false
+ }
+
+ var array []string
+ for _, v := range casted {
+ casted, ok := v.(string)
+ if !ok {
+ return nil, false
+ }
+
+ array = append(array, casted)
+ }
+ return array, true
+}
+
+// GetByteArrayArray ...
+func (data PlistData) GetByteArrayArray(forKey string) ([][]byte, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return nil, false
+ }
+
+ if casted, ok := value.([][]byte); ok {
+ return casted, true
+ }
+
+ casted, ok := value.([]interface{})
+ if !ok {
+ return nil, false
+ }
+
+ var array [][]byte
+ for _, v := range casted {
+ casted, ok := v.([]byte)
+ if !ok {
+ return nil, false
+ }
+
+ array = append(array, casted)
+ }
+ return array, true
+}
+
+// GetMapStringInterface ...
+func (data PlistData) GetMapStringInterface(forKey string) (PlistData, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return nil, false
+ }
+
+ if casted, ok := value.(map[string]interface{}); ok {
+ return casted, true
+ }
+ return nil, false
+}
+
+func castToMapStringInterfaceArray(obj interface{}) ([]PlistData, error) {
+ array, ok := obj.([]interface{})
+ if !ok {
+ return nil, errors.New("failed to cast to []interface{}")
+ }
+
+ var casted []PlistData
+ for _, item := range array {
+ mapStringInterface, ok := item.(map[string]interface{})
+ if !ok {
+ return nil, errors.New("failed to cast to map[string]interface{}")
+ }
+ casted = append(casted, mapStringInterface)
+ }
+
+ return casted, nil
+}
+
+// GetMapStringInterfaceArray ...
+func (data PlistData) GetMapStringInterfaceArray(forKey string) ([]PlistData, bool) {
+ value, ok := data[forKey]
+ if !ok {
+ return nil, false
+ }
+ mapStringInterfaceArray, err := castToMapStringInterfaceArray(value)
+ if err != nil {
+ return nil, false
+ }
+ return mapStringInterfaceArray, true
+}
diff --git a/plistutil/plistutil_test.go b/plistutil/plistutil_test.go
new file mode 100644
index 00000000..05b8d6f4
--- /dev/null
+++ b/plistutil/plistutil_test.go
@@ -0,0 +1,542 @@
+package plistutil
+
+import (
+ "reflect"
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/require"
+)
+
+func TestAnalyzeInfoPlist(t *testing.T) {
+ infoPlistData, err := NewPlistDataFromContent(infoPlistContent)
+ require.NoError(t, err)
+
+ appTitle, ok := infoPlistData.GetString("CFBundleName")
+ require.Equal(t, true, ok)
+ require.Equal(t, "ios-simple-objc", appTitle)
+
+ bundleID, _ := infoPlistData.GetString("CFBundleIdentifier")
+ require.Equal(t, true, ok)
+ require.Equal(t, "Bitrise.ios-simple-objc", bundleID)
+
+ version, ok := infoPlistData.GetString("CFBundleShortVersionString")
+ require.Equal(t, true, ok)
+ require.Equal(t, "1.0", version)
+
+ buildNumber, ok := infoPlistData.GetString("CFBundleVersion")
+ require.Equal(t, true, ok)
+ require.Equal(t, "1", buildNumber)
+
+ minOSVersion, ok := infoPlistData.GetString("MinimumOSVersion")
+ require.Equal(t, true, ok)
+ require.Equal(t, "8.1", minOSVersion)
+
+ deviceFamilyList, ok := infoPlistData.GetUInt64Array("UIDeviceFamily")
+ require.Equal(t, true, ok)
+ require.Equal(t, 2, len(deviceFamilyList))
+ require.Equal(t, uint64(1), deviceFamilyList[0])
+ require.Equal(t, uint64(2), deviceFamilyList[1])
+}
+
+func TestAnalyzeEmbeddedProfile(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(appStoreProfileContent)
+ require.NoError(t, err)
+
+ creationDate, ok := profileData.GetTime("CreationDate")
+ require.Equal(t, true, ok)
+ expectedCreationDate, err := time.Parse("2006-01-02T15:04:05Z", "2016-09-22T11:29:12Z")
+ require.NoError(t, err)
+ require.Equal(t, true, creationDate.Equal(expectedCreationDate))
+
+ expirationDate, ok := profileData.GetTime("ExpirationDate")
+ require.Equal(t, true, ok)
+ expectedExpirationDate, err := time.Parse("2006-01-02T15:04:05Z", "2017-09-21T13:20:06Z")
+ require.NoError(t, err)
+ require.Equal(t, true, expirationDate.Equal(expectedExpirationDate))
+
+ deviceUDIDList, ok := profileData.GetStringArray("ProvisionedDevices")
+ require.Equal(t, false, ok)
+ require.Equal(t, 0, len(deviceUDIDList))
+
+ teamName, ok := profileData.GetString("TeamName")
+ require.Equal(t, true, ok)
+ require.Equal(t, "Some Dude", teamName)
+
+ profileName, ok := profileData.GetString("Name")
+ require.Equal(t, true, ok)
+ require.Equal(t, "Bitrise Test App Store", profileName)
+
+ provisionsAlldevices, ok := profileData.GetBool("ProvisionsAllDevices")
+ require.Equal(t, false, ok)
+ require.Equal(t, false, provisionsAlldevices)
+}
+
+func TestGetBool(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(enterpriseProfileContent)
+ require.NoError(t, err)
+
+ allDevices, ok := profileData.GetBool("ProvisionsAllDevices")
+ require.Equal(t, true, ok)
+ require.Equal(t, true, allDevices)
+}
+
+func TestGetTime(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(developmentProfileContent)
+ require.NoError(t, err)
+
+ expire, ok := profileData.GetTime("ExpirationDate")
+ require.Equal(t, true, ok)
+
+ // 2017-09-22T11:28:46Z
+ desiredExpire, err := time.Parse("2006-01-02T15:04:05Z", "2017-09-22T11:28:46Z")
+ require.NoError(t, err)
+ require.Equal(t, true, expire.Equal(desiredExpire))
+}
+
+func TestGetInt(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(developmentProfileContent)
+ require.NoError(t, err)
+
+ version, ok := profileData.GetUInt64("Version")
+ require.Equal(t, true, ok)
+ require.Equal(t, uint64(1), version)
+}
+
+func TestGetStringArray(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(developmentProfileContent)
+ require.NoError(t, err)
+
+ devices, ok := profileData.GetStringArray("ProvisionedDevices")
+ require.Equal(t, true, ok)
+ require.Equal(t, 1, len(devices))
+ require.Equal(t, "b138", devices[0])
+}
+
+func TestGetMapStringInterface(t *testing.T) {
+ profileData, err := NewPlistDataFromContent(developmentProfileContent)
+ require.NoError(t, err)
+
+ entitlements, ok := profileData.GetMapStringInterface("Entitlements")
+ require.Equal(t, true, ok)
+
+ teamID, ok := entitlements.GetString("com.apple.developer.team-identifier")
+ require.Equal(t, true, ok)
+ require.Equal(t, "9NS4", teamID)
+}
+
+func TestPlistData_GetMapStringInterfaceArray(t *testing.T) {
+ testSummariesData, err := NewPlistDataFromContent(paritalTestSummariesContent)
+ if err != nil {
+ t.Errorf("NewPlistDataFromContent(), got: %v, want: %v", err, nil)
+ }
+ const key = "Key"
+
+ type args struct {
+ forKey string
+ }
+ tests := []struct {
+ name string
+ data PlistData
+ args args
+ want []PlistData
+ want1 bool
+ }{
+ {
+ name: "Test ok case",
+ data: PlistData{key: []interface{}{
+ map[string]interface{}{"k1": "v1", "k2": "v2"},
+ map[string]interface{}{"k3": "v3"},
+ }},
+ args: args{key},
+ want: []PlistData{
+ map[string]interface{}{"k1": "v1", "k2": "v2"},
+ map[string]interface{}{"k3": "v3"},
+ },
+ want1: true,
+ },
+ {
+ name: "Test key not found",
+ data: PlistData{"otherKey": []PlistData{}},
+ args: args{key},
+ want: nil,
+ want1: false,
+ },
+ {
+ name: "Test failed to cast to interface{}",
+ data: PlistData{key: []PlistData{
+ map[string]interface{}{"k1": "v1", "k2": "v2"},
+ map[string]interface{}{"k3": "v3"},
+ }},
+ args: args{key},
+ want: nil,
+ want1: false,
+ },
+ {
+ name: "Failed to cast array element to map[string]interface{}",
+ data: PlistData{key: []interface{}{
+ map[string]string{"k1": "v1", "k2": "v2"},
+ map[string]string{"k3": "v3"},
+ }},
+ args: args{key},
+ want: nil,
+ want1: false,
+ },
+ {
+ name: "Intefration test with real plist data",
+ data: testSummariesData,
+ args: args{"Subtests"},
+ want: []PlistData{
+ map[string]interface{}{"TestIdentifier": "ios_simple_objcTests/testExample", "TestStatus": "Success"},
+ map[string]interface{}{"TestIdentifier": "ios_simple_objcTests/testExample2", "TestStatus": "Success"},
+ },
+ want1: true,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got, got1 := tt.data.GetMapStringInterfaceArray(tt.args.forKey)
+ if !reflect.DeepEqual(got, tt.want) {
+ t.Errorf("PlistData.GetMapStringInterfaceArray() got = %v, want %v", got, tt.want)
+ }
+ if got1 != tt.want1 {
+ t.Errorf("PlistData.GetMapStringInterfaceArray() got1 = %v, want %v", got1, tt.want1)
+ }
+ })
+ }
+}
+
+func TestPlistData_GetFloat64(t *testing.T) {
+ testSummariesData, err := NewPlistDataFromContent(paritalTestSummariesContent)
+ if err != nil {
+ t.Errorf("NewPlistDataFromContent(), got: %v, want: %v", err, nil)
+ }
+ const key = "Duration"
+ const value = 0.00072991847991943359
+
+ type args struct {
+ forKey string
+ }
+ tests := []struct {
+ name string
+ data PlistData
+ args args
+ want float64
+ want1 bool
+ }{
+ {
+ name: "Read float, ok",
+ data: map[string]interface{}{key: value},
+ args: args{key},
+ want: value,
+ want1: true,
+ },
+ {
+ name: "Key not found",
+ data: map[string]interface{}{"otherKey": value},
+ args: args{key},
+ want: 0,
+ want1: false,
+ },
+ {
+ name: "Read int value, fail",
+ data: map[string]interface{}{key: 23},
+ args: args{key},
+ want: 0,
+ want1: false,
+ },
+ {
+ name: "Integration test with real plist data",
+ data: testSummariesData,
+ args: args{"Duration"},
+ want: 0.34774100780487061,
+ want1: true,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got, got1 := tt.data.GetFloat64(tt.args.forKey)
+ if got != tt.want {
+ t.Errorf("PlistData.GetFloat64() got = %v, want %v", got, tt.want)
+ }
+ if got1 != tt.want1 {
+ t.Errorf("PlistData.GetFloat64() got1 = %v, want %v", got1, tt.want1)
+ }
+ })
+ }
+}
+
+const infoPlistContent = `
+
+
+
+ CFBundleName
+ ios-simple-objc
+ DTXcode
+ 0832
+ DTSDKName
+ iphoneos10.3
+ UILaunchStoryboardName
+ LaunchScreen
+ DTSDKBuild
+ 14E269
+ CFBundleDevelopmentRegion
+ en
+ CFBundleVersion
+ 1
+ BuildMachineOSBuild
+ 16F73
+ DTPlatformName
+ iphoneos
+ CFBundlePackageType
+ APPL
+ UIMainStoryboardFile
+ Main
+ CFBundleSupportedPlatforms
+
+ iPhoneOS
+
+ CFBundleShortVersionString
+ 1.0
+ CFBundleInfoDictionaryVersion
+ 6.0
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ CFBundleExecutable
+ ios-simple-objc
+ DTCompiler
+ com.apple.compilers.llvm.clang.1_0
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CFBundleIdentifier
+ Bitrise.ios-simple-objc
+ MinimumOSVersion
+ 8.1
+ DTXcodeBuild
+ 8E2002
+ DTPlatformVersion
+ 10.3
+ LSRequiresIPhoneOS
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ CFBundleSignature
+ ????
+ UIDeviceFamily
+
+ 1
+ 2
+
+ DTPlatformBuild
+ 14E269
+
+
+`
+
+const developmentProfileContent = `
+
+
+
+ AppIDName
+ Bitrise Test
+ ApplicationIdentifierPrefix
+
+ 9NS4
+
+ CreationDate
+ 2016-09-22T11:28:46Z
+ Platform
+
+ iOS
+
+ DeveloperCertificates
+
+
+
+ Entitlements
+
+ keychain-access-groups
+
+ 9NS4.*
+
+ get-task-allow
+
+ application-identifier
+ 9NS4.*
+ com.apple.developer.team-identifier
+ 9NS4
+
+ ExpirationDate
+ 2017-09-22T11:28:46Z
+ Name
+ Bitrise Test Development
+ ProvisionedDevices
+
+ b138
+
+ TeamIdentifier
+
+ 9NS4
+
+ TeamName
+ Some Dude
+ TimeToLive
+ 365
+ UUID
+ 4b617a5f
+ Version
+ 1
+`
+
+const appStoreProfileContent = `
+
+
+
+ AppIDName
+ Bitrise Test
+ ApplicationIdentifierPrefix
+
+ 9NS4
+
+ CreationDate
+ 2016-09-22T11:29:12Z
+ Platform
+
+ iOS
+
+ DeveloperCertificates
+
+
+
+ Entitlements
+
+ keychain-access-groups
+
+ 9NS4.*
+
+ get-task-allow
+
+ application-identifier
+ 9NS4.*
+ com.apple.developer.team-identifier
+ 9NS4
+ beta-reports-active
+
+
+ ExpirationDate
+ 2017-09-21T13:20:06Z
+ Name
+ Bitrise Test App Store
+ TeamIdentifier
+
+ 9NS4
+
+ TeamName
+ Some Dude
+ TimeToLive
+ 364
+ UUID
+ a60668dd
+ Version
+ 1
+`
+
+const enterpriseProfileContent = `
+
+
+
+ AppIDName
+ Bitrise Test
+ ApplicationIdentifierPrefix
+
+ PF3BP78LQ8
+
+ CreationDate
+ 2015-10-05T13:32:46Z
+ Platform
+
+ iOS
+
+ DeveloperCertificates
+
+
+
+ Entitlements
+
+ keychain-access-groups
+
+ PF3BP78LQ8.*
+
+ get-task-allow
+
+ application-identifier
+ 9NS4.*
+ com.apple.developer.team-identifier
+ 9NS4
+
+ ExpirationDate
+ 2016-10-04T13:32:46Z
+ Name
+ Bitrise Test Enterprise
+ ProvisionsAllDevices
+
+ TeamIdentifier
+
+ PF3BP78LQ8
+
+ TeamName
+ Some Dude
+ TimeToLive
+ 365
+ UUID
+ 8d6caa15
+ Version
+ 1
+`
+
+const paritalTestSummariesContent = `
+
+
+
+ Duration
+ 0.34774100780487061
+ Subtests
+
+
+ TestIdentifier
+ ios_simple_objcTests/testExample
+ TestStatus
+ Success
+
+
+ TestIdentifier
+ ios_simple_objcTests/testExample2
+ TestStatus
+ Success
+
+
+ TestIdentifier
+ ios_simple_objcTests
+ TestName
+ ios_simple_objcTests
+ TestObjectClass
+ IDESchemeActionTestSummaryGroup
+
+TestIdentifier
+ios-simple-objcTests.xctest
+TestName
+ios-simple-objcTests.xctest
+TestObjectClass
+IDESchemeActionTestSummaryGroup
+`
diff --git a/xcarchive/ios.go b/xcarchive/ios.go
index b92b1801..c945d99c 100644
--- a/xcarchive/ios.go
+++ b/xcarchive/ios.go
@@ -8,9 +8,9 @@ import (
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-utils/v2/env"
"github.com/bitrise-io/go-utils/v2/pathutil"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
// IosBaseApplication ...
@@ -41,7 +41,7 @@ func NewIosBaseApplication(path string) (IosBaseApplication, error) {
} else if !exist {
return IosBaseApplication{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath)
}
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return IosBaseApplication{}, err
}
@@ -240,7 +240,7 @@ func NewIosArchive(path string) (IosArchive, error) {
} else if !exist {
return IosArchive{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath)
}
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return IosArchive{}, err
}
diff --git a/xcarchive/ios_test.go b/xcarchive/ios_test.go
index 1172fad2..4ded9cb8 100644
--- a/xcarchive/ios_test.go
+++ b/xcarchive/ios_test.go
@@ -10,9 +10,9 @@ import (
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-utils/v2/env"
"github.com/bitrise-io/go-utils/v2/pathutil"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
"github.com/bitrise-io/go-xcode/v2/autocodesign"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/stretchr/testify/require"
)
@@ -217,7 +217,7 @@ func Test_applicationFromArchive(t *testing.T) {
}
func Test_applicationFromPlist(t *testing.T) {
- infoPlist, err := plistutil.NewPlistDataFromFile(filepath.Join(sampleRepoPath(t), "archives/ios.xcarchive/Info.plist"))
+ infoPlist, err := newPlistDataFromFile(filepath.Join(sampleRepoPath(t), "archives/ios.xcarchive/Info.plist"))
const appRelativePathToProduct = "Applications/code-sign-test.app"
if err != nil {
t.Errorf("setup: could not read plist, error: %s", infoPlist)
diff --git a/xcarchive/macos.go b/xcarchive/macos.go
index 2cdf1068..1d3b3c13 100644
--- a/xcarchive/macos.go
+++ b/xcarchive/macos.go
@@ -7,8 +7,8 @@ import (
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-utils/v2/env"
"github.com/bitrise-io/go-utils/v2/pathutil"
- "github.com/bitrise-io/go-xcode/plistutil"
"github.com/bitrise-io/go-xcode/profileutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
type macosBaseApplication struct {
@@ -37,7 +37,7 @@ func newMacosBaseApplication(path string) (macosBaseApplication, error) {
} else if !exist {
return macosBaseApplication{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath)
}
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return macosBaseApplication{}, err
}
@@ -144,7 +144,7 @@ func NewMacosArchive(path string) (MacosArchive, error) {
} else if !exist {
return MacosArchive{}, fmt.Errorf("Info.plist not exists at: %s", infoPlistPath)
}
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return MacosArchive{}, err
}
diff --git a/xcarchive/plistutil.go b/xcarchive/plistutil.go
new file mode 100644
index 00000000..0e239e9f
--- /dev/null
+++ b/xcarchive/plistutil.go
@@ -0,0 +1,15 @@
+package xcarchive
+
+import (
+ "os"
+
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
+)
+
+func newPlistDataFromFile(plistPth string) (plistutil.PlistData, error) {
+ content, err := os.ReadFile(plistPth)
+ if err != nil {
+ return plistutil.PlistData{}, err
+ }
+ return plistutil.NewPlistDataFromContent(string(content))
+}
diff --git a/xcarchive/utils.go b/xcarchive/utils.go
index d7958dde..e7755e0a 100644
--- a/xcarchive/utils.go
+++ b/xcarchive/utils.go
@@ -7,7 +7,7 @@ import (
"strings"
"github.com/bitrise-io/go-utils/v2/command"
- "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
)
func executableNameFromInfoPlist(infoPlist plistutil.PlistData) string {
diff --git a/xcarchive/utils_test.go b/xcarchive/utils_test.go
index 756246fa..88693448 100644
--- a/xcarchive/utils_test.go
+++ b/xcarchive/utils_test.go
@@ -9,7 +9,7 @@ import (
"github.com/bitrise-io/go-utils/v2/command"
"github.com/bitrise-io/go-utils/v2/env"
"github.com/bitrise-io/go-utils/v2/pathutil"
- "github.com/bitrise-io/go-xcode/plistutil"
+ "github.com/bitrise-io/go-xcode/v2/plistutil"
"github.com/stretchr/testify/assert"
)
@@ -52,7 +52,7 @@ func executableRelativePath(basePath, infoPlistRelativePath, executableFolderRel
return ""
}
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return ""
}
diff --git a/xcarchive/xcarchive.go b/xcarchive/xcarchive.go
index 66015747..178409d9 100644
--- a/xcarchive/xcarchive.go
+++ b/xcarchive/xcarchive.go
@@ -5,7 +5,6 @@ import (
"github.com/bitrise-io/go-utils/v2/log"
"github.com/bitrise-io/go-utils/v2/pathutil"
- "github.com/bitrise-io/go-xcode/plistutil"
)
// ArchiveReader ...
@@ -28,7 +27,7 @@ func (r ArchiveReader) IsMacOS(archPath string) (bool, error) {
r.logger.Debugf("Checking archive is MacOS or iOS")
infoPlistPath := filepath.Join(archPath, "Info.plist")
- plist, err := plistutil.NewPlistDataFromFile(infoPlistPath)
+ plist, err := newPlistDataFromFile(infoPlistPath)
if err != nil {
return false, err
}