Passed
Push — ci ( 3d0aed...c9c5cb )
by litefeel
02:33
created
lib/import.php 1 patch
Indentation   +300 added lines, -300 removed lines patch added patch discarded remove patch
@@ -10,304 +10,304 @@
 block discarded – undo
10 10
  */
11 11
 class Writing_On_GitHub_Import {
12 12
 
13
-    /**
14
-     * Application container.
15
-     *
16
-     * @var Writing_On_GitHub
17
-     */
18
-    protected $app;
19
-
20
-    /**
21
-     * Initializes a new import manager.
22
-     *
23
-     * @param Writing_On_GitHub $app Application container.
24
-     */
25
-    public function __construct( Writing_On_GitHub $app ) {
26
-        $this->app = $app;
27
-    }
28
-
29
-    /**
30
-     * Imports a payload.
31
-     * @param  Writing_On_GitHub_Payload $payload
32
-     *
33
-     * @return string|WP_Error
34
-     */
35
-    public function payload( Writing_On_GitHub_Payload $payload ) {
36
-
37
-        $result = $this->app->api()->fetch()->compare( $payload->get_before_commit_id() );
38
-
39
-        if ( is_wp_error( $result ) ) {
40
-            /* @var WP_Error $result */
41
-            return $result;
42
-        }
43
-
44
-        if ( is_array( $result ) ) {
45
-            $result = $this->import_files( $result );
46
-        }
47
-
48
-        if ( is_wp_error( $result ) ) {
49
-            return $files;
50
-        }
51
-
52
-        return __( 'Payload processed', 'writing-on-github' );
53
-    }
54
-
55
-    /**
56
-     * import blob by files
57
-     * @param  Writing_On_GitHub_File_Info[] $files
58
-     *
59
-     * @return true|WP_Error
60
-     */
61
-    protected function import_files( $files ) {
62
-
63
-        $error = true;
64
-
65
-        foreach ( $files as $file ) {
66
-            if ( ! $this->importable_file( $file ) ) {
67
-                continue;
68
-            }
69
-
70
-            $blob = $this->app->api()->fetch()->blob( $file );
71
-            // network error ?
72
-            if ( ! $blob instanceof Writing_On_GitHub_Blob ) {
73
-                continue;
74
-            }
75
-
76
-            $is_remove = 'removed' == $file->status;
77
-
78
-            $result = false;
79
-            if ( $this->importable_raw_file( $blob ) ) {
80
-                $result = $this->import_raw_file( $blob, $is_remove );
81
-            } elseif ( $this->importable_post( $blob ) ) {
82
-                $result = $this->import_post( $blob, $is_remove );
83
-            }
84
-
85
-            if ( is_wp_error( $result ) ) {
86
-                /* @var WP_Error $result */
87
-                $error = wogh_append_error( $error, $result );
88
-            }
89
-        }
90
-
91
-        return $error;
92
-    }
93
-
94
-    /**
95
-     * Imports the latest commit on the master branch.
96
-     *
97
-     * @return string|WP_Error
98
-     */
99
-    public function master() {
100
-        $result = $this->app->api()->fetch()->tree_recursive();
101
-
102
-        if ( is_wp_error( $result ) ) {
103
-            /* @var WP_Error $result */
104
-            return $result;
105
-        }
106
-
107
-        if ( is_array( $result ) ) {
108
-            $result = $this->import_files( $result );
109
-        }
110
-
111
-        if ( is_wp_error( $result ) ) {
112
-            /* @var WP_Error $result */
113
-            return $result;
114
-        }
115
-
116
-        return __( 'Payload processed', 'writing-on-github' );
117
-    }
118
-
119
-    /**
120
-     * Checks whether the provided blob should be imported.
121
-     *
122
-     * @param Writing_On_GitHub_File_Info $file
123
-     *
124
-     * @return bool
125
-     */
126
-    protected function importable_file( Writing_On_GitHub_File_Info $file ) {
127
-
128
-        $path = $file->path;
129
-
130
-        // only _pages, _posts and images
131
-        $prefixs = array( '_pages/', '_posts/', 'images/');
132
-        foreach ($prefixs as $prefix) {
133
-            if ( ! strncasecmp($path, $prefix, strlen( $prefix ) ) ) {
134
-                return true;
135
-            }
136
-        }
137
-        return false;
138
-    }
139
-
140
-    /**
141
-     * Checks whether the provided blob should be imported.
142
-     *
143
-     * @param Writing_On_GitHub_Blob $blob Blob to validate.
144
-     *
145
-     * @return bool
146
-     */
147
-    protected function importable_post( Writing_On_GitHub_Blob $blob ) {
148
-        // global $wpdb;
149
-
150
-        // // Skip the repo's readme.
151
-        // if ( 'readme' === strtolower( substr( $blob->path(), 0, 6 ) ) ) {
152
-        //  return false;
153
-        // }
154
-
155
-        // // If the blob sha already matches a post, then move on.
156
-        // if ( ! is_wp_error( $this->app->database()->fetch_by_sha( $blob->sha() ) ) ) {
157
-        //  return false;
158
-        // }
159
-
160
-        if ( ! $blob->has_frontmatter() ) {
161
-            return false;
162
-        }
163
-
164
-        return true;
165
-    }
166
-
167
-    /**
168
-     * Imports a post into wordpress
169
-     * @param  Writing_On_GitHub_Blob $blob
170
-     * @param  bool                   $is_remove
171
-     * @return WP_Error|bool
172
-     */
173
-    protected function import_post( Writing_On_GitHub_Blob $blob, $is_remove ) {
174
-
175
-        if ( $is_remove ) {
176
-            $id = $blob->id();
177
-            if ( empty( $id ) ) {
178
-                return false;
179
-            }
180
-            $result = $this->app->database()->delete_post( $id );
181
-            if ( is_wp_error( $result ) ) {
182
-                /* @var WP_Error $result */
183
-                return $result;
184
-            }
185
-            return true;
186
-        }
187
-
188
-        $post = $this->blob_to_post( $blob );
189
-
190
-        if ( ! $post instanceof Writing_On_GitHub_Post ) {
191
-            return false;
192
-        }
193
-
194
-        $result = $this->app->database()->save_post( $post );
195
-        if ( is_wp_error( $result ) ) {
196
-            /** @var WP_Error $result */
197
-            return $result;
198
-        }
199
-
200
-        if ( $post->is_new() ) {
201
-            $result = $this->app->export()->new_posts( $new );
202
-
203
-            if ( is_wp_error( $result ) ) {
204
-                /** @var WP_Error $result */
205
-                return $result;
206
-            }
207
-        }
208
-
209
-        return true;
210
-    }
211
-
212
-    /**
213
-     * import raw file
214
-     * @param  Writing_On_GitHub_Blob $blob
215
-     * @return bool
216
-     */
217
-    protected function importable_raw_file( Writing_On_GitHub_Blob $blob ) {
218
-        if ( $blob->has_frontmatter() ) {
219
-            return false;
220
-        }
221
-
222
-        // only images
223
-        if ( strncasecmp($blob->path(), 'images/', strlen('images/') ) != 0) {
224
-            return false;
225
-        }
226
-
227
-        return true;
228
-    }
229
-
230
-    /**
231
-     * Imports a raw file content into file system.
232
-     * @param  Writing_On_GitHub_Blob $blob
233
-     * @param  bool                   $is_remove
234
-     */
235
-    protected function import_raw_file( Writing_On_GitHub_Blob $blob, $is_remove ) {
236
-        $arr = wp_upload_dir();
237
-        $path = $arr['basedir'] . '/writing-on-github/' . $blob->path();
238
-        if ( $is_remove ) {
239
-            if ( file_exists($path) ) {
240
-                unlink($path);
241
-            }
242
-        } else {
243
-            $dirname = dirname($path);
244
-            if ( ! file_exists($dirname) ) {
245
-                wp_mkdir_p($dirname);
246
-            }
247
-
248
-            file_put_contents($path, $blob->content());
249
-        }
250
-    }
251
-
252
-    /**
253
-     * Imports a single blob content into matching post.
254
-     *
255
-     * @param Writing_On_GitHub_Blob $blob Blob to transform into a Post.
256
-     *
257
-     * @return Writing_On_GitHub_Post|false
258
-     */
259
-    protected function blob_to_post( Writing_On_GitHub_Blob $blob ) {
260
-        $args = array( 'post_content' => $blob->content_import() );
261
-        $meta = $blob->meta();
262
-
263
-        $id = false;
264
-
265
-        if ( ! empty( $meta ) ) {
266
-            if ( array_key_exists( 'layout', $meta ) ) {
267
-                $args['post_type'] = $meta['layout'];
268
-                unset( $meta['layout'] );
269
-            }
270
-
271
-            if ( array_key_exists( 'published', $meta ) ) {
272
-                $args['post_status'] = true === $meta['published'] ? 'publish' : 'draft';
273
-                unset( $meta['published'] );
274
-            }
275
-
276
-            if ( array_key_exists( 'post_title', $meta ) ) {
277
-                $args['post_title'] = $meta['post_title'];
278
-                unset( $meta['post_title'] );
279
-            }
280
-
281
-            if ( array_key_exists( 'post_name', $meta ) ) {
282
-                $args['post_name'] = $meta['post_name'];
283
-                unset( $meta['post_name'] );
284
-            }
285
-
286
-            if ( array_key_exists( 'ID', $meta ) ) {
287
-                $id = $args['ID'] = $meta['ID'];
288
-                $blob->set_id($id);
289
-                unset( $meta['ID'] );
290
-            }
291
-        }
292
-
293
-        $meta['_wogh_sha'] = $blob->sha();
294
-
295
-        if ( $id ) {
296
-            $old_sha = get_post_meta( $id, '_wogh_sha', true );
297
-            $old_github_path = get_post_meta( $id, '_wogh_github_path', true );
298
-
299
-            // dont save post when has same sha
300
-            if ( $old_sha  && $old_sha == $meta['_wogh_sha'] &&
301
-                 $old_github_path && $old_github_path == $blob->path() ) {
302
-                return false;
303
-            }
304
-        }
305
-
306
-        $post = new Writing_On_GitHub_Post( $args, $this->app->api() );
307
-        $post->set_old_github_path( $blob->path() );
308
-        $post->set_meta( $meta );
309
-        $blob->set_id( $post->id() );
310
-
311
-        return $post;
312
-    }
13
+	/**
14
+	 * Application container.
15
+	 *
16
+	 * @var Writing_On_GitHub
17
+	 */
18
+	protected $app;
19
+
20
+	/**
21
+	 * Initializes a new import manager.
22
+	 *
23
+	 * @param Writing_On_GitHub $app Application container.
24
+	 */
25
+	public function __construct( Writing_On_GitHub $app ) {
26
+		$this->app = $app;
27
+	}
28
+
29
+	/**
30
+	 * Imports a payload.
31
+	 * @param  Writing_On_GitHub_Payload $payload
32
+	 *
33
+	 * @return string|WP_Error
34
+	 */
35
+	public function payload( Writing_On_GitHub_Payload $payload ) {
36
+
37
+		$result = $this->app->api()->fetch()->compare( $payload->get_before_commit_id() );
38
+
39
+		if ( is_wp_error( $result ) ) {
40
+			/* @var WP_Error $result */
41
+			return $result;
42
+		}
43
+
44
+		if ( is_array( $result ) ) {
45
+			$result = $this->import_files( $result );
46
+		}
47
+
48
+		if ( is_wp_error( $result ) ) {
49
+			return $files;
50
+		}
51
+
52
+		return __( 'Payload processed', 'writing-on-github' );
53
+	}
54
+
55
+	/**
56
+	 * import blob by files
57
+	 * @param  Writing_On_GitHub_File_Info[] $files
58
+	 *
59
+	 * @return true|WP_Error
60
+	 */
61
+	protected function import_files( $files ) {
62
+
63
+		$error = true;
64
+
65
+		foreach ( $files as $file ) {
66
+			if ( ! $this->importable_file( $file ) ) {
67
+				continue;
68
+			}
69
+
70
+			$blob = $this->app->api()->fetch()->blob( $file );
71
+			// network error ?
72
+			if ( ! $blob instanceof Writing_On_GitHub_Blob ) {
73
+				continue;
74
+			}
75
+
76
+			$is_remove = 'removed' == $file->status;
77
+
78
+			$result = false;
79
+			if ( $this->importable_raw_file( $blob ) ) {
80
+				$result = $this->import_raw_file( $blob, $is_remove );
81
+			} elseif ( $this->importable_post( $blob ) ) {
82
+				$result = $this->import_post( $blob, $is_remove );
83
+			}
84
+
85
+			if ( is_wp_error( $result ) ) {
86
+				/* @var WP_Error $result */
87
+				$error = wogh_append_error( $error, $result );
88
+			}
89
+		}
90
+
91
+		return $error;
92
+	}
93
+
94
+	/**
95
+	 * Imports the latest commit on the master branch.
96
+	 *
97
+	 * @return string|WP_Error
98
+	 */
99
+	public function master() {
100
+		$result = $this->app->api()->fetch()->tree_recursive();
101
+
102
+		if ( is_wp_error( $result ) ) {
103
+			/* @var WP_Error $result */
104
+			return $result;
105
+		}
106
+
107
+		if ( is_array( $result ) ) {
108
+			$result = $this->import_files( $result );
109
+		}
110
+
111
+		if ( is_wp_error( $result ) ) {
112
+			/* @var WP_Error $result */
113
+			return $result;
114
+		}
115
+
116
+		return __( 'Payload processed', 'writing-on-github' );
117
+	}
118
+
119
+	/**
120
+	 * Checks whether the provided blob should be imported.
121
+	 *
122
+	 * @param Writing_On_GitHub_File_Info $file
123
+	 *
124
+	 * @return bool
125
+	 */
126
+	protected function importable_file( Writing_On_GitHub_File_Info $file ) {
127
+
128
+		$path = $file->path;
129
+
130
+		// only _pages, _posts and images
131
+		$prefixs = array( '_pages/', '_posts/', 'images/');
132
+		foreach ($prefixs as $prefix) {
133
+			if ( ! strncasecmp($path, $prefix, strlen( $prefix ) ) ) {
134
+				return true;
135
+			}
136
+		}
137
+		return false;
138
+	}
139
+
140
+	/**
141
+	 * Checks whether the provided blob should be imported.
142
+	 *
143
+	 * @param Writing_On_GitHub_Blob $blob Blob to validate.
144
+	 *
145
+	 * @return bool
146
+	 */
147
+	protected function importable_post( Writing_On_GitHub_Blob $blob ) {
148
+		// global $wpdb;
149
+
150
+		// // Skip the repo's readme.
151
+		// if ( 'readme' === strtolower( substr( $blob->path(), 0, 6 ) ) ) {
152
+		//  return false;
153
+		// }
154
+
155
+		// // If the blob sha already matches a post, then move on.
156
+		// if ( ! is_wp_error( $this->app->database()->fetch_by_sha( $blob->sha() ) ) ) {
157
+		//  return false;
158
+		// }
159
+
160
+		if ( ! $blob->has_frontmatter() ) {
161
+			return false;
162
+		}
163
+
164
+		return true;
165
+	}
166
+
167
+	/**
168
+	 * Imports a post into wordpress
169
+	 * @param  Writing_On_GitHub_Blob $blob
170
+	 * @param  bool                   $is_remove
171
+	 * @return WP_Error|bool
172
+	 */
173
+	protected function import_post( Writing_On_GitHub_Blob $blob, $is_remove ) {
174
+
175
+		if ( $is_remove ) {
176
+			$id = $blob->id();
177
+			if ( empty( $id ) ) {
178
+				return false;
179
+			}
180
+			$result = $this->app->database()->delete_post( $id );
181
+			if ( is_wp_error( $result ) ) {
182
+				/* @var WP_Error $result */
183
+				return $result;
184
+			}
185
+			return true;
186
+		}
187
+
188
+		$post = $this->blob_to_post( $blob );
189
+
190
+		if ( ! $post instanceof Writing_On_GitHub_Post ) {
191
+			return false;
192
+		}
193
+
194
+		$result = $this->app->database()->save_post( $post );
195
+		if ( is_wp_error( $result ) ) {
196
+			/** @var WP_Error $result */
197
+			return $result;
198
+		}
199
+
200
+		if ( $post->is_new() ) {
201
+			$result = $this->app->export()->new_posts( $new );
202
+
203
+			if ( is_wp_error( $result ) ) {
204
+				/** @var WP_Error $result */
205
+				return $result;
206
+			}
207
+		}
208
+
209
+		return true;
210
+	}
211
+
212
+	/**
213
+	 * import raw file
214
+	 * @param  Writing_On_GitHub_Blob $blob
215
+	 * @return bool
216
+	 */
217
+	protected function importable_raw_file( Writing_On_GitHub_Blob $blob ) {
218
+		if ( $blob->has_frontmatter() ) {
219
+			return false;
220
+		}
221
+
222
+		// only images
223
+		if ( strncasecmp($blob->path(), 'images/', strlen('images/') ) != 0) {
224
+			return false;
225
+		}
226
+
227
+		return true;
228
+	}
229
+
230
+	/**
231
+	 * Imports a raw file content into file system.
232
+	 * @param  Writing_On_GitHub_Blob $blob
233
+	 * @param  bool                   $is_remove
234
+	 */
235
+	protected function import_raw_file( Writing_On_GitHub_Blob $blob, $is_remove ) {
236
+		$arr = wp_upload_dir();
237
+		$path = $arr['basedir'] . '/writing-on-github/' . $blob->path();
238
+		if ( $is_remove ) {
239
+			if ( file_exists($path) ) {
240
+				unlink($path);
241
+			}
242
+		} else {
243
+			$dirname = dirname($path);
244
+			if ( ! file_exists($dirname) ) {
245
+				wp_mkdir_p($dirname);
246
+			}
247
+
248
+			file_put_contents($path, $blob->content());
249
+		}
250
+	}
251
+
252
+	/**
253
+	 * Imports a single blob content into matching post.
254
+	 *
255
+	 * @param Writing_On_GitHub_Blob $blob Blob to transform into a Post.
256
+	 *
257
+	 * @return Writing_On_GitHub_Post|false
258
+	 */
259
+	protected function blob_to_post( Writing_On_GitHub_Blob $blob ) {
260
+		$args = array( 'post_content' => $blob->content_import() );
261
+		$meta = $blob->meta();
262
+
263
+		$id = false;
264
+
265
+		if ( ! empty( $meta ) ) {
266
+			if ( array_key_exists( 'layout', $meta ) ) {
267
+				$args['post_type'] = $meta['layout'];
268
+				unset( $meta['layout'] );
269
+			}
270
+
271
+			if ( array_key_exists( 'published', $meta ) ) {
272
+				$args['post_status'] = true === $meta['published'] ? 'publish' : 'draft';
273
+				unset( $meta['published'] );
274
+			}
275
+
276
+			if ( array_key_exists( 'post_title', $meta ) ) {
277
+				$args['post_title'] = $meta['post_title'];
278
+				unset( $meta['post_title'] );
279
+			}
280
+
281
+			if ( array_key_exists( 'post_name', $meta ) ) {
282
+				$args['post_name'] = $meta['post_name'];
283
+				unset( $meta['post_name'] );
284
+			}
285
+
286
+			if ( array_key_exists( 'ID', $meta ) ) {
287
+				$id = $args['ID'] = $meta['ID'];
288
+				$blob->set_id($id);
289
+				unset( $meta['ID'] );
290
+			}
291
+		}
292
+
293
+		$meta['_wogh_sha'] = $blob->sha();
294
+
295
+		if ( $id ) {
296
+			$old_sha = get_post_meta( $id, '_wogh_sha', true );
297
+			$old_github_path = get_post_meta( $id, '_wogh_github_path', true );
298
+
299
+			// dont save post when has same sha
300
+			if ( $old_sha  && $old_sha == $meta['_wogh_sha'] &&
301
+				 $old_github_path && $old_github_path == $blob->path() ) {
302
+				return false;
303
+			}
304
+		}
305
+
306
+		$post = new Writing_On_GitHub_Post( $args, $this->app->api() );
307
+		$post->set_old_github_path( $blob->path() );
308
+		$post->set_meta( $meta );
309
+		$blob->set_id( $post->id() );
310
+
311
+		return $post;
312
+	}
313 313
 }
Please login to merge, or discard this patch.