summaryrefslogtreecommitdiffstats
path: root/src/pmdk/utils/sort_solution
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmdk/utils/sort_solution')
-rwxr-xr-xsrc/pmdk/utils/sort_solution128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/pmdk/utils/sort_solution b/src/pmdk/utils/sort_solution
new file mode 100755
index 000000000..c14f57ece
--- /dev/null
+++ b/src/pmdk/utils/sort_solution
@@ -0,0 +1,128 @@
+#!/usr/bin/perl
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright 2016, Intel Corporation
+
+#
+# sort_solution -- sort visual studio solution projects lists
+#
+
+use strict;
+use warnings;
+# install libtext-diff-perl or perl-Text-Diff
+use Text::Diff;
+
+use Cwd 'abs_path';
+use File::Basename;
+use File::Compare;
+
+
+sub help {
+ print "Usage: sort_solution [check|sort]\n";
+ exit;
+}
+
+sub sort_global_section {
+ my ($solution_fh, $temp_fh, $section_name) = @_;
+ my $line = "";
+ my @array;
+
+ while (defined($line = <$solution_fh>) && ($line !~ $section_name)) {
+ print $temp_fh $line;
+ }
+ print $temp_fh $line;
+
+ while (defined($line = <$solution_fh>) && ($line !~ "EndGlobalSection")) {
+ push @array, $line;
+ }
+
+ @array = sort @array;
+
+ foreach (@array) {
+ print $temp_fh $_;
+ }
+
+ print $temp_fh $line; # print EndGlobalSection line
+}
+
+my $num_args = $#ARGV + 1;
+if ($num_args != 1) {
+ help;
+}
+my $arg = $ARGV[0];
+
+if($arg ne "check" && $arg ne "sort") {
+ help;
+}
+my $filename = dirname(abs_path($0)).'/../src/PMDK.sln';
+my $tempfile = dirname(abs_path($0)).'/../src/temp.sln';
+
+open(my $temp_fh, '>', $tempfile)
+ or die "Could not open file '$tempfile' $!";
+open(my $solution_fh, '<:crlf', $filename)
+ or die "Could not open file '$filename' $!";
+
+my $line;
+
+# Read a header of file
+while (defined($line = <$solution_fh>) && ($line !~ "^Project")) {
+ print $temp_fh $line;
+}
+
+my @part1;
+my $buff;
+my $guid;
+
+# Read the projects list with project dependencies
+do {
+ if($line =~ "^Project") {
+ $buff = $line;
+ $guid = (split(/\,/, $line))[2];
+ } elsif($line =~ "^EndProject") {
+ $buff .= $line;
+ my %table = (
+ guid => $guid,
+ buff => $buff,
+ );
+ push @part1, \%table;
+ } else {
+ $buff .= $line;
+ }
+
+} while (defined($line = <$solution_fh>) && $line ne "Global\n");
+
+# sort the project list by a project GIUD and write to the tempfile
+@part1 = sort { $a->{guid} cmp $b->{guid} } @part1;
+
+foreach (@part1) {
+ my %hash = %$_;
+ print $temp_fh $hash{"buff"};
+}
+print $temp_fh $line; # EndProject line
+
+sort_global_section $solution_fh, $temp_fh, "ProjectConfigurationPlatforms";
+
+sort_global_section $solution_fh, $temp_fh, "NestedProjects";
+
+# read solution file to the end and copy it to the temp file
+while (defined($line = <$solution_fh>)){
+ print $temp_fh $line;
+}
+
+close($temp_fh);
+close($solution_fh);
+
+if($arg eq "check") {
+ my $diff = diff $filename => $tempfile;
+ if ($diff eq "") {
+ unlink $tempfile;
+ exit;
+ }
+
+ print "PMDK solution file is not sorted, " .
+ "please use sort_solution script before pushing your changes\n";
+ unlink $tempfile;
+ exit 1;
+} else {
+ unlink $filename or die "Cannot replace solution file $!";
+ rename $tempfile, $filename;
+}