Test Failed
Push — ci ( 3a3f23...3d0aed )
by litefeel
02:31
created

Writing_On_GitHub_Import::payload()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 19
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 9
nc 5
nop 1
dl 0
loc 19
rs 9.2
c 0
b 0
f 0
ccs 0
cts 10
cp 0
crap 20
1
<?php
2
/**
3
 * GitHub Import Manager
4
 *
5
 * @package Writing_On_GitHub
6
 */
7
8
/**
9
 * Class Writing_On_GitHub_Import
10
 */
11
class Writing_On_GitHub_Import {
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/');
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
132
        foreach ($prefixs as $prefix) {
0 ignored issues
show
introduced by
No space after opening parenthesis is prohibited
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
133
            if ( ! strncasecmp($path, $prefix, strlen( $prefix ) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
134
                return true;
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_RETURN
Loading history...
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) {
0 ignored issues
show
introduced by
Found "!= 0". Use Yoda Condition checks, you must
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
introduced by
No space before closing parenthesis is prohibited
Loading history...
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) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
240
                unlink($path);
0 ignored issues
show
introduced by
Filesystem writes are forbidden, you should not be using unlink()
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
241
            }
242
        } else {
243
            $dirname = dirname($path);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
244
            if ( ! file_exists($dirname) ) {
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
245
                wp_mkdir_p($dirname);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
246
            }
247
248
            file_put_contents($path, $blob->content());
0 ignored issues
show
introduced by
Filesystem writes are forbidden, you should not be using file_put_contents()
Loading history...
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
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);
0 ignored issues
show
Coding Style introduced by
Expected 1 spaces after opening bracket; 0 found
Loading history...
Coding Style introduced by
Expected 1 spaces before closing bracket; 0 found
Loading history...
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
}
314