@@ -893,6 +893,10 @@ public bool RetainFolderStructureOverride
893
893
}
894
894
}
895
895
}
896
+ /// <summary>
897
+ /// The root directory of the package
898
+ /// </summary>
899
+ private string CurrentPackageDirectory { get ; set ; }
896
900
private static MetadataLoadContext sharedMetaDataLoadContext = null ;
897
901
/// <summary>
898
902
/// A shared MetaDataLoadContext that is used for assembly inspection during package publishing.
@@ -996,7 +1000,7 @@ private void RefreshPackageContents()
996
1000
997
1001
var items = new Dictionary < string , PackageItemRootViewModel > ( ) ;
998
1002
999
- if ( ! String . IsNullOrEmpty ( RootFolder ) )
1003
+ if ( ! String . IsNullOrEmpty ( RootFolder ) )
1000
1004
{
1001
1005
var root = new PackageItemRootViewModel ( RootFolder ) ;
1002
1006
items [ RootFolder ] = root ;
@@ -1022,7 +1026,7 @@ private void RefreshPackageContents()
1022
1026
}
1023
1027
}
1024
1028
1025
- var updatedItems = BindParentToChild ( items ) ;
1029
+ var updatedItems = BindParentToChild ( items ) ;
1026
1030
1027
1031
updatedItems . AddRange ( itemsToAdd . Where ( pa => pa . DependencyType . Equals ( DependencyType . CustomNode ) ) ) ;
1028
1032
@@ -1050,8 +1054,6 @@ private bool IsDuplicateFile(PackageItemRootViewModel item1, PackageItemRootView
1050
1054
1051
1055
private List < PackageItemRootViewModel > BindParentToChild ( Dictionary < string , PackageItemRootViewModel > items )
1052
1056
{
1053
- var updatedItems = new List < PackageItemRootViewModel > ( ) ;
1054
-
1055
1057
foreach ( var parent in items )
1056
1058
{
1057
1059
foreach ( var child in items )
@@ -1060,25 +1062,53 @@ private List<PackageItemRootViewModel> BindParentToChild(Dictionary<string, Pack
1060
1062
if ( IsSubPathOfDeep ( parent . Value , child . Value ) )
1061
1063
{
1062
1064
if ( child . Value . isChild ) continue ; // if this was picked up already, don't add it again
1063
- parent . Value . AddChild ( child . Value ) ;
1065
+ parent . Value . AddChildRecursively ( child . Value ) ;
1064
1066
child . Value . isChild = true ;
1065
1067
}
1066
1068
}
1067
1069
}
1068
1070
1069
1071
// Only add the folder items, they contain the files
1070
- updatedItems = items . Values . Where ( x => ! x . isChild ) . ToList ( ) ;
1072
+ var updatedItems = GetRootItems ( items ) ;
1071
1073
return updatedItems ;
1072
1074
}
1073
1075
1076
+ /// <summary>
1077
+ /// Gets the list PackageItemRootViewModel items which will be at the root directory of the package with all the child items.
1078
+ /// </summary>
1079
+ /// <param name="items"></param>
1080
+ /// <returns></returns>
1081
+ private List < PackageItemRootViewModel > GetRootItems ( Dictionary < string , PackageItemRootViewModel > items )
1082
+ {
1083
+ var rootItems = items . Values . Where ( x => ! x . isChild ) . ToList ( ) ;
1084
+ if ( ! rootItems . Any ( ) ) return rootItems ;
1085
+ var packageSourceDir = CurrentPackageDirectory ??= GetLongestCommonPrefix ( items . Keys . ToArray ( ) ) ;
1086
+
1087
+ var root = new PackageItemRootViewModel ( packageSourceDir ) ;
1088
+ var updatedItems = new List < PackageItemRootViewModel > ( ) ;
1089
+ //check each root item and create any missing connections
1090
+ foreach ( var item in rootItems )
1091
+ {
1092
+ var itemDir = new DirectoryInfo ( item . DirectoryName ) ;
1093
+ if ( ! itemDir . Parent . FullName . Equals ( packageSourceDir ) )
1094
+ {
1095
+ root . AddChildRecursively ( item ) ;
1096
+ }
1097
+ else
1098
+ {
1099
+ root . ChildItems . Add ( item ) ;
1100
+ }
1101
+ }
1102
+ return root . ChildItems . ToList ( ) ;
1103
+ }
1104
+
1074
1105
/// <summary>
1075
1106
/// Test if path2 is subpath of path1
1076
- /// If it is, make sure all the intermediate file paths are created as separte PackageItemRootViewModel
1077
1107
/// </summary>
1078
1108
/// <param name="path1"></param>
1079
1109
/// <param name="path2"></param>
1080
1110
/// <returns></returns>
1081
- private bool IsSubPathOfDeep ( PackageItemRootViewModel path1 , PackageItemRootViewModel path2 )
1111
+ internal bool IsSubPathOfDeep ( PackageItemRootViewModel path1 , PackageItemRootViewModel path2 )
1082
1112
{
1083
1113
var di1 = new DirectoryInfo ( path1 . DirectoryName ) ;
1084
1114
var di2 = new DirectoryInfo ( path2 . DirectoryName ) ;
@@ -1089,12 +1119,37 @@ private bool IsSubPathOfDeep(PackageItemRootViewModel path1, PackageItemRootView
1089
1119
{
1090
1120
return true ;
1091
1121
}
1092
- else di2 = di2 . Parent ;
1122
+ else
1123
+ {
1124
+ if ( di2 . Parent . FullName . Length < di1 . FullName . Length ) return false ;
1125
+ di2 = di2 . Parent ;
1126
+ }
1093
1127
}
1094
1128
1095
1129
return false ;
1096
1130
}
1097
1131
1132
+ /// <summary>
1133
+ /// Utility method to get the common file path, this may fail for files with the same partial name.
1134
+ /// </summary>
1135
+ /// <param name="s">A collection of filepaths</param>
1136
+ /// <returns></returns>
1137
+ internal string GetLongestCommonPrefix ( string [ ] s )
1138
+ {
1139
+ int k = s [ 0 ] . Length ;
1140
+ for ( int i = 1 ; i < s . Length ; i ++ )
1141
+ {
1142
+ k = Math . Min ( k , s [ i ] . Length ) ;
1143
+ for ( int j = 0 ; j < k ; j ++ )
1144
+ if ( s [ i ] [ j ] != s [ 0 ] [ j ] )
1145
+ {
1146
+ k = j ;
1147
+ break ;
1148
+ }
1149
+ }
1150
+ return Path . GetDirectoryName ( s [ 0 ] . Substring ( 0 , k ) ) ;
1151
+ }
1152
+
1098
1153
/// <summary>
1099
1154
/// Return a list of HostComboboxEntry describing known hosts from PM.
1100
1155
/// Return an empty list if PM is down.
@@ -1403,6 +1458,7 @@ internal static PublishPackageViewModel FromLocalPackage(DynamoViewModel dynamoV
1403
1458
CopyrightHolder = pkg . CopyrightHolder ,
1404
1459
CopyrightYear = pkg . CopyrightYear ,
1405
1460
IsPublishFromLocalPackage = true ,
1461
+ CurrentPackageDirectory = pkg . RootDirectory ,
1406
1462
//default retain folder structure to true when publishing a new version from local.
1407
1463
RetainFolderStructureOverride = retainFolderStructure
1408
1464
} ;
@@ -1636,7 +1692,7 @@ internal IEnumerable<string> GetAllFiles()
1636
1692
// union with additional files
1637
1693
files = files . Union ( AdditionalFiles ) ;
1638
1694
// if we retain the folder structure, we don't want to lose assemblies in sub-folders
1639
- // othrewise we need to delete duplicate assemblies which will end up in the same `dll` folder
1695
+ // otherwise we need to delete duplicate assemblies which will end up in the same `dll` folder
1640
1696
files = RetainFolderStructureOverride && ! IsPublishFromLocalPackage ?
1641
1697
files . Union ( Assemblies . Select ( x => x . LocalFilePath ) ) :
1642
1698
files . Union ( Assemblies . Select ( x => x . Assembly . Location ) ) ;
@@ -2232,6 +2288,10 @@ private void PublishLocally()
2232
2288
var remapper = new CustomNodePathRemapper ( DynamoViewModel . Model . CustomNodeManager ,
2233
2289
DynamoModel . IsTestMode ) ;
2234
2290
var builder = new PackageDirectoryBuilder ( new MutatingFileSystem ( ) , remapper ) ;
2291
+ if ( string . IsNullOrEmpty ( Package . RootDirectory ) )
2292
+ {
2293
+ Package . RootDirectory = CurrentPackageDirectory ;
2294
+ }
2235
2295
builder . BuildRetainDirectory ( Package , publishPath , updatedFiles , MarkdownFiles ) ;
2236
2296
UploadState = PackageUploadHandle . State . Uploaded ;
2237
2297
}
@@ -2647,7 +2707,7 @@ internal PackageItemRootViewModel GetPreBuildRootItemViewModel(string publishPat
2647
2707
var docItemPreview = new PackageItemRootViewModel ( docDir ) { isChild = true } ;
2648
2708
2649
2709
var pkg = new PackageItemRootViewModel ( new FileInfo ( Path . Combine ( rootDir , "pkg.json" ) ) ) ;
2650
- rootItemPreview . AddChild ( pkg ) ;
2710
+ rootItemPreview . AddChildRecursively ( pkg ) ;
2651
2711
2652
2712
foreach ( var file in files )
2653
2713
{
@@ -2657,12 +2717,12 @@ internal PackageItemRootViewModel GetPreBuildRootItemViewModel(string publishPat
2657
2717
if ( Path . GetDirectoryName ( file ) . EndsWith ( PackageDirectoryBuilder . DocumentationDirectoryName ) )
2658
2718
{
2659
2719
var doc = new PackageItemRootViewModel ( new FileInfo ( Path . Combine ( docDir , fileName ) ) ) ;
2660
- docItemPreview . AddChild ( doc ) ;
2720
+ docItemPreview . AddChildRecursively ( doc ) ;
2661
2721
}
2662
2722
else if ( file . EndsWith ( ".dyf" ) )
2663
2723
{
2664
2724
var dyfPreview = new PackageItemRootViewModel ( fileName , Path . Combine ( dyfDir , fileName ) ) ;
2665
- dyfItemPreview . AddChild ( dyfPreview ) ;
2725
+ dyfItemPreview . AddChildRecursively ( dyfPreview ) ;
2666
2726
}
2667
2727
else if ( file . EndsWith ( ".dll" ) || PackageDirectoryBuilder . IsXmlDocFile ( file , files ) || PackageDirectoryBuilder . IsDynamoCustomizationFile ( file , files ) )
2668
2728
{
@@ -2677,27 +2737,27 @@ internal PackageItemRootViewModel GetPreBuildRootItemViewModel(string publishPat
2677
2737
else
2678
2738
{
2679
2739
var dll = new PackageItemRootViewModel ( new FileInfo ( Path . Combine ( binDir , fileName ) ) ) ;
2680
- binItemPreview . AddChild ( dll ) ;
2740
+ binItemPreview . AddChildRecursively ( dll ) ;
2681
2741
}
2682
2742
}
2683
2743
else
2684
2744
{
2685
2745
var extra = new PackageItemRootViewModel ( new FileInfo ( Path . Combine ( extraDir , fileName ) ) ) ;
2686
- extraItemPreview . AddChild ( extra ) ;
2746
+ extraItemPreview . AddChildRecursively ( extra ) ;
2687
2747
}
2688
2748
}
2689
2749
2690
2750
foreach ( var docFile in MarkdownFiles )
2691
2751
{
2692
2752
var fileName = Path . GetFileName ( docFile ) ;
2693
2753
var doc = new PackageItemRootViewModel ( new FileInfo ( Path . Combine ( docDir , fileName ) ) ) ;
2694
- docItemPreview . AddChild ( doc ) ;
2754
+ docItemPreview . AddChildRecursively ( doc ) ;
2695
2755
}
2696
2756
2697
- rootItemPreview . AddChild ( dyfItemPreview ) ;
2698
- rootItemPreview . AddChild ( binItemPreview ) ;
2699
- rootItemPreview . AddChild ( extraItemPreview ) ;
2700
- rootItemPreview . AddChild ( docItemPreview ) ;
2757
+ rootItemPreview . AddChildRecursively ( dyfItemPreview ) ;
2758
+ rootItemPreview . AddChildRecursively ( binItemPreview ) ;
2759
+ rootItemPreview . AddChildRecursively ( extraItemPreview ) ;
2760
+ rootItemPreview . AddChildRecursively ( docItemPreview ) ;
2701
2761
2702
2762
return rootItemPreview ;
2703
2763
}
0 commit comments