Passed
Push — ci ( 3d0aed...c9c5cb )
by litefeel
02:33
created

Writing_On_GitHub_Import::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 0
cts 3
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 2
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 View Code Duplication
    public function payload( Writing_On_GitHub_Payload $payload ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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
0 ignored issues
show
Documentation introduced by
Should the return type not be WP_Error|boolean?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
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 );
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $result is correct as $this->import_raw_file($blob, $is_remove) (which targets Writing_On_GitHub_Import::import_raw_file()) seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
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 View Code Duplication
    public function master() {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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;
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() ) {
0 ignored issues
show
Unused Code introduced by
This if statement, and the following return statement can be replaced with return $blob->has_frontmatter();.
Loading history...
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...
Unused Code introduced by
This if statement, and the following return statement can be replaced with return !(strncasecmp($bl...rlen('images/')) != 0);.
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 ) {
0 ignored issues
show
Complexity introduced by
This operation has 582 execution paths which exceeds the configured maximum of 200.

A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.

You can also find more information in the “Code” section of your repository.

Loading history...
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