@@ -10,6 +10,7 @@ import (
1010 "net/textproto"
1111 "os"
1212 "path/filepath"
13+ "strconv"
1314 "strings"
1415 "time"
1516
@@ -49,6 +50,9 @@ func init() {
4950 packageVersionReleaseCmd .Flags ().StringP ("version-id" , "v" , "" , "Package Version ID (required)" )
5051 packageVersionReleaseCmd .MarkFlagRequired ("version-id" )
5152
53+ packageVersionGetCmd .Flags ().StringP ("version-id" , "v" , "" , "Package Version ID (required)" )
54+ packageVersionGetCmd .MarkFlagRequired ("version-id" )
55+
5256 packageVersionListCmd .Flags ().StringP ("package-id" , "i" , "" , "Package ID (optional, filter by package)" )
5357 packageVersionListCmd .Flags ().StringP ("namespace" , "" , "" , "Package namespace (alternative to --package-id)" )
5458 packageVersionListCmd .Flags ().BoolP ("released" , "r" , false , "Show only released versions" )
@@ -60,6 +64,7 @@ func init() {
6064 packageCmd .AddCommand (packageInstalledCmd )
6165 packageVersionCmd .AddCommand (packageVersionCreateCmd )
6266 packageVersionCmd .AddCommand (packageVersionReleaseCmd )
67+ packageVersionCmd .AddCommand (packageVersionGetCmd )
6368 packageVersionCmd .AddCommand (packageVersionListCmd )
6469 packageCmd .AddCommand (packageInstallCmd )
6570 packageCmd .AddCommand (packageUninstallCmd )
@@ -181,6 +186,16 @@ var packageVersionReleaseCmd = &cobra.Command{
181186 },
182187}
183188
189+ var packageVersionGetCmd = & cobra.Command {
190+ Use : "get" ,
191+ Short : "Show package version details" ,
192+ Args : cobra .NoArgs ,
193+ Run : func (cmd * cobra.Command , args []string ) {
194+ versionId , _ := cmd .Flags ().GetString ("version-id" )
195+ runGetPackageVersion (versionId )
196+ },
197+ }
198+
184199var packageVersionListCmd = & cobra.Command {
185200 Use : "list" ,
186201 Short : "List package versions" ,
@@ -190,7 +205,6 @@ var packageVersionListCmd = &cobra.Command{
190205 namespace , _ := cmd .Flags ().GetString ("namespace" )
191206 releasedOnly , _ := cmd .Flags ().GetBool ("released" )
192207 verbose , _ := cmd .Flags ().GetBool ("verbose" )
193-
194208 runListPackageVersions (packageId , namespace , releasedOnly , verbose )
195209 },
196210}
@@ -874,6 +888,104 @@ func runReleasePackageVersion(versionId string) {
874888 fmt .Printf ("Package version released successfully: %s\n " , versionId )
875889}
876890
891+ func runGetPackageVersion (versionId string ) {
892+ if versionId == "" {
893+ ErrorAndExit ("Package version ID is required" )
894+ }
895+
896+ query := fmt .Sprintf ("SELECT Id, Name, Description, Tag, MajorVersion, MinorVersion, PatchVersion, BuildNumber, Package2Id, Package2.Name, Package2.NamespacePrefix, SubscriberPackageVersionId, AncestorId, IsReleased, CreatedDate, LastModifiedDate FROM Package2Version WHERE Id = '%s'" , versionId )
897+
898+ result , err := force .Query (query , func (options * lib.QueryOptions ) {
899+ options .IsTooling = true
900+ })
901+ if err != nil {
902+ ErrorAndExit ("Failed to query package version: " + err .Error ())
903+ }
904+ if len (result .Records ) == 0 {
905+ ErrorAndExit (fmt .Sprintf ("No package version found with ID: %s" , versionId ))
906+ }
907+
908+ record := result .Records [0 ]
909+
910+ fmt .Printf ("Package Version Details:\n " )
911+ fmt .Printf (" ID: %s\n " , getStringValue (record , "Id" ))
912+ fmt .Printf (" Name: %s\n " , getStringValue (record , "Name" ))
913+ fmt .Printf (" Description: %s\n " , getStringValue (record , "Description" ))
914+ fmt .Printf (" Tag: %s\n " , getStringValue (record , "Tag" ))
915+ major := getIntValue (record , "MajorVersion" )
916+ minor := getIntValue (record , "MinorVersion" )
917+ patch := getIntValue (record , "PatchVersion" )
918+ build := getIntValue (record , "BuildNumber" )
919+
920+ fmt .Printf (" Version Number: %d.%d.%d.%d\n " , major , minor , patch , build )
921+ fmt .Printf (" Major Version: %d\n " , major )
922+ fmt .Printf (" Minor Version: %d\n " , minor )
923+ fmt .Printf (" Patch Version: %d\n " , patch )
924+ fmt .Printf (" Build Number: %d\n " , build )
925+
926+ if pkg , ok := record ["Package2" ].(map [string ]interface {}); ok && pkg != nil {
927+ fmt .Printf (" Package2 ID: %s\n " , getStringValue (record , "Package2Id" ))
928+ fmt .Printf (" Package2 Name: %s\n " , getStringValue (pkg , "Name" ))
929+ fmt .Printf (" Package2 Namespace: %s\n " , getStringValue (pkg , "NamespacePrefix" ))
930+ } else {
931+ fmt .Printf (" Package2 ID: %s\n " , getStringValue (record , "Package2Id" ))
932+ }
933+
934+ fmt .Printf (" Subscriber Package Version ID: %s\n " , getStringValue (record , "SubscriberPackageVersionId" ))
935+ fmt .Printf (" Ancestor ID: %s\n " , getStringValue (record , "AncestorId" ))
936+ fmt .Printf (" Is Released: %t\n " , getBoolValue (record , "IsReleased" ))
937+ fmt .Printf (" Created Date: %s\n " , getStringValue (record , "CreatedDate" ))
938+ fmt .Printf (" Last Modified Date: %s\n " , getStringValue (record , "LastModifiedDate" ))
939+ }
940+
941+ func getStringValue (record map [string ]interface {}, key string ) string {
942+ if value , ok := record [key ]; ok && value != nil {
943+ switch v := value .(type ) {
944+ case string :
945+ return v
946+ case fmt.Stringer :
947+ return v .String ()
948+ default :
949+ return fmt .Sprintf ("%v" , v )
950+ }
951+ }
952+ return ""
953+ }
954+
955+ func getIntValue (record map [string ]interface {}, key string ) int {
956+ if value , ok := record [key ]; ok && value != nil {
957+ switch v := value .(type ) {
958+ case float64 :
959+ return int (v )
960+ case int :
961+ return v
962+ case int32 :
963+ return int (v )
964+ case int64 :
965+ return int (v )
966+ case string :
967+ if parsed , err := strconv .Atoi (v ); err == nil {
968+ return parsed
969+ }
970+ }
971+ }
972+ return 0
973+ }
974+
975+ func getBoolValue (record map [string ]interface {}, key string ) bool {
976+ if value , ok := record [key ]; ok && value != nil {
977+ if b , ok := value .(bool ); ok {
978+ return b
979+ }
980+ if s , ok := value .(string ); ok {
981+ if parsed , err := strconv .ParseBool (s ); err == nil {
982+ return parsed
983+ }
984+ }
985+ }
986+ return false
987+ }
988+
877989func runListPackageVersions (packageId string , namespace string , releasedOnly bool , verbose bool ) {
878990 if namespace != "" {
879991 query := fmt .Sprintf ("SELECT Id, Name FROM Package2 WHERE NamespacePrefix = '%s'" , namespace )
0 commit comments