Skip to content

Commit c26494a

Browse files
committed
added level for diff file data structure
1 parent 2b61045 commit c26494a

File tree

1 file changed

+104
-58
lines changed

1 file changed

+104
-58
lines changed

src/FilesDiffCommand.php

Lines changed: 104 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -43,83 +43,131 @@ private function stylish(array $differenceContent): array
4343
return array_map(
4444
function ($differenceItem) {
4545
$result = null;
46+
$itemLevel = str_repeat(" ", $differenceItem["level"] - 1);
4647
if (!strcmp($differenceItem["status"], "not changed")) {
47-
$result = " " .
48-
$differenceItem["fileKey"] .
49-
": " .
50-
$differenceItem["file1Content"] .
51-
"\n";
48+
if (is_array($differenceItem["file1Content"])) {
49+
$result = $itemLevel .
50+
" " . $differenceItem["fileKey"] . ": " .
51+
stylish($differenceItem["file1Content"]);
52+
} else {
53+
$result = $itemLevel .
54+
" " . $differenceItem["fileKey"] . ": " .
55+
$differenceItem["file1Content"];
56+
}
5257
} elseif (!strcmp($differenceItem["status"], "changed")) {
53-
$result = " - " .
54-
$differenceItem["fileKey"] .
55-
": " .
56-
$differenceItem["file1Content"] .
57-
"\n" .
58-
" + " .
59-
$differenceItem["fileKey"] .
60-
": " .
61-
$differenceItem["file2Content"] .
62-
"\n";
58+
if (is_array($differenceItem["file1Content"])) {
59+
$result = $itemLevel .
60+
" - " . $differenceItem["fileKey"] . ": " .
61+
stylish($differenceItem["file1Content"]) . "\n" .
62+
" + " . $differenceItem["fileKey"] . ": ";
63+
if (is_array($differenceItem["file2Content"])) {
64+
$result = $result . stylish($differenceItem["file2Content"]);
65+
} else {
66+
$result = $result . $differenceItem["file2Content"];
67+
}
68+
} else {
69+
$result = $itemLevel .
70+
" - " . $differenceItem["fileKey"] . ": " .
71+
$differenceItem["file1Content"] . "\n" .
72+
$itemLevel .
73+
" + " . $differenceItem["fileKey"] . ": ";
74+
if (is_array($differenceItem["file2Content"])) {
75+
$result = $result . stylish($differenceItem["file2Content"]);
76+
} else {
77+
$result = $result . $differenceItem["file2Content"];
78+
}
79+
}
6380
} elseif (!strcmp($differenceItem["status"], "added")) {
64-
$result = " + " .
65-
$differenceItem["fileKey"] .
66-
": " .
67-
$differenceItem["file2Content"] .
68-
"\n";
81+
$result = $itemLevel .
82+
" + " . $differenceItem["fileKey"] . ": ";
83+
if (is_array($differenceItem["file2Content"])) {
84+
$result = $result .
85+
stylish($differenceItem["file2Content"]);
86+
} else {
87+
$result = $result . $differenceItem["file2Content"];
88+
}
6989
} elseif (!strcmp($differenceItem["status"], "deleted")) {
70-
$result = " - " .
71-
$differenceItem["fileKey"] .
72-
": " .
73-
$differenceItem["file1Content"] .
74-
"\n";
90+
$result = $itemLevel .
91+
" - " . $differenceItem["fileKey"] . ": " .
92+
$differenceItem["file1Content"];
7593
}
94+
$result = $result . "\n";
95+
7696
return $result;
7797
},
7898
$differenceContent
7999
);
80100
}
81101

82-
private function getDifference($contentListKeys, $file1Content, $file2Content): array
102+
private function getDifference($fileContentKeys, $file1Content, $file2Content): array
83103
{
84-
return array_map(
85-
function ($fileKey) use ($file1Content, $file2Content) {
86-
if (array_key_exists($fileKey, $file2Content)) {
87-
if (
88-
array_key_exists($fileKey, $file1Content) &&
89-
!strcmp($file1Content[$fileKey], $file2Content[$fileKey])
90-
) {
91-
$result = [
92-
"status" => "not changed",
93-
"fileKey" => $fileKey,
94-
"file1Content" => $file1Content[$fileKey],
95-
"file2Content" => $file1Content[$fileKey]
96-
];
97-
} elseif (array_key_exists($fileKey, $file1Content)) {
98-
$result = [
99-
"status" => "changed",
100-
"fileKey" => $fileKey,
101-
"file1Content" => $file1Content[$fileKey],
102-
"file2Content" => $file2Content[$fileKey]
103-
];
104+
$contentDescriptor = [];
105+
return array_reduce(
106+
$fileContentKeys,
107+
function ($contentDescriptor, $fileKey) {
108+
if (array_key_exists($fileKey, $contentDescriptor["file2Content"])) {
109+
if (array_key_exists($fileKey, $contentDescriptor["file1Content"])) {
110+
$descriptorItem = $contentDescriptor;
111+
if ($descriptorItem["file1Content"][$fileKey] === $descriptorItem["file2Content"][$fileKey]) {
112+
if (is_array($descriptorItem["file1Content"][$fileKey])) {
113+
$mergedFileKeys = array_keys(array_merge(
114+
$descriptorItem["file1Content"][$fileKey],
115+
$descriptorItem["file2Content"][$fileKey]
116+
));
117+
$contentDescriptor["result"][] = getDifference(
118+
$mergedFileKeys,
119+
$descriptorItem["file1Content"],
120+
$descriptorItem["file2Content"]
121+
);
122+
} else {
123+
$contentDescriptor["result"][] = [
124+
"level" => $descriptorItem["level"] + 1,
125+
"status" => "not changed",
126+
"fileKey" => $fileKey,
127+
"file1Content" => $descriptorItem["file1Content"][$fileKey],
128+
"file2Content" => $descriptorItem["file1Content"][$fileKey]
129+
];
130+
}
131+
} else {
132+
$descriptorItem = $contentDescriptor;
133+
$contentDescriptor["result"][] = [
134+
"level" => $descriptorItem["level"] + 1,
135+
"status" => "changed",
136+
"fileKey" => $fileKey,
137+
"file1Content" => $descriptorItem["file1Content"][$fileKey],
138+
"file2Content" => $descriptorItem["file2Content"][$fileKey]
139+
];
140+
}
104141
} else {
105-
$result = [
142+
$descriptorItem = $contentDescriptor;
143+
$contentDescriptor["result"][] = [
144+
"level" => $descriptorItem["level"] + 1,
106145
"status" => "added",
107146
"fileKey" => $fileKey,
108147
"file1Content" => null,
109-
"file2Content" => $file2Content[$fileKey]
148+
"file2Content" => $descriptorItem["file2Content"][$fileKey]
110149
];
111150
}
112-
return $result;
113151
} else {
114-
return [
152+
$descriptorItem = $contentDescriptor;
153+
$contentDescriptor["result"][] = [
154+
"level" => $descriptorItem["level"] + 1,
115155
"status" => "deleted",
116156
"fileKey" => $fileKey,
117-
"file1Content" => $file1Content[$fileKey],
157+
"file1Content" => $descriptorItem["file1Content"][$fileKey],
118158
"file2Content" => null
119159
];
120160
}
161+
162+
return $contentDescriptor;
121163
},
122-
$contentListKeys
164+
[
165+
"level" => 0,
166+
"status" => null,
167+
"fileKey" => "init",
168+
"file1Content" => $file1Content,
169+
"file2Content" => $file2Content
170+
]
123171
);
124172
}
125173

@@ -178,17 +226,15 @@ public function execute(CommandInterface $command = null): CommandInterface
178226

179227
$this->filesContentString = implode("", $this->filesContent);
180228

181-
$file1Keys = array_keys($file1Content);
182-
$file2Keys = array_keys($file2Content);
183-
$mergedFileKeys = array_unique(array_merge($file1Keys, $file2Keys));
184-
185-
$contentAnalysisResult = $this->getDifference(
229+
$mergedFileKeys = array_keys(array_merge($file1Content, $file2Content));
230+
$contentDescriptor = $this->getDifference(
186231
$mergedFileKeys,
187232
$file1Content,
188233
$file2Content
189234
);
190235

191-
$this->filesDiffs = $this->stylish($contentAnalysisResult);
236+
$this->filesDiffs = $this->stylish($contentDescriptor["result"]);
237+
192238
$this->filesDiffsString = "{\n" . implode("", $this->filesDiffs) . "}\n";
193239
}
194240

0 commit comments

Comments
 (0)