Commit Graph

260 Commits

Author SHA1 Message Date
David Anderson 7061a5b195 Update UpdateChecker.php
Tweak filter name
2017-07-17 21:27:23 +00:00
David Anderson ef91a9409d Make wp_remote_get result filterable
I want to filter the wp_remote_get result. In my use-case, if https fails, I switch back to http (in case the user had a bad curl setup/obsolete SSL certificates) and try again.

Until now I've been patching the code, but that is, of course, silly!
2017-07-17 14:12:39 +00:00
Yahnis Elsts be797d2f7a Suppress warnings about set_time_limit being disabled.
Some hosts disable set_time_limit() and a few other functions. Calling the disabled function triggers a warning. In our case, using set_time_limit() is optional - PUC will usually work fine even if it can't increase the time limit - so lets just ignore the warning and carry on. 

Reported in #111.
2017-06-17 22:18:41 +03:00
Yahnis Elsts 235a810e90 Fix an issue with Debug Bar 0.9 where the content of some PUC panels was not visible. See issue #102.
Cause: Debug Bar 0.9 now includes an admin bar menu that lists the available panels. This means that the special element that PUC uses to identify its panel titles (<span id="puc-debug-menu-link-$uid">) is no longer unique. This breaks the JS that's supposed to work around the fact that Debug Bar incorrectly assumes that every panel will have a unique PHP class name.
2017-05-16 21:16:08 +03:00
Yahnis Elsts ea2bf49144 Minor: Remove commented-out code. 2017-05-01 13:20:22 +03:00
Yahnis Elsts 22689ce0cc Add GitHub API response to the `Vcs_Reference` instance.
This is intended for use in subclasses, e.g. to change the `downloadUrl` from `zipball_url` to an asset URL.
2017-04-12 12:13:53 +03:00
Yahnis Elsts 164aacf4c1 Bump version number to 4.1
This may look like a lot of changes, but it's essentially a simple search & replace from "v4" to "v4p1". Note that the factory class name stays the same: Puc_v4_Factory. It will only change on a major release.
2017-04-06 16:32:40 +03:00
Yahnis Elsts 28dc39ae58 Minor: Adjust code spacing 2017-04-04 20:29:03 +03:00
Laptop 3 6cabab9179 Add plugin title to admin notice 2017-04-04 01:55:45 -04:00
Yahnis Elsts f812b2d3c0 Fix a rare error caused by a bug get_theme_root()
This is workaround that addresses a potential issue with automagic plugin vs theme detection. A user reports that sometimes get_theme_root() can return an empty string when using AMP. Also, there can be multiple theme roots. 

Instead of dealing with that mess, lets simply look for a style.css file in the same directory as $absolutePath. This approach has low specificity (i.e. a plugin could have a style.css file), so it should have lower priority. I've moved it after the isPluginFile() check.

BC note: This means that when using PUC in a theme, the second argument to buildUpdateChecker() *must* be either the theme directory path, or a path to a file at the root of the theme. That is, all of these will work fine:
 /foo/wp-content/themes/my-theme
 /foo/wp-content/themes/my-theme/functions.php
 /foo/wp-content/themes/my-theme/another-php-file.php
 
 This will NOT work:
 /foo/wp-content/themes/my-theme/includes/something.php 
 
 This shouldn't be an issue for people who followed the documentation.
2017-04-03 17:56:13 +03:00
Yahnis Elsts 5c963ff869 TODO: Work around a WP bug and multiple theme directories 2017-03-30 13:52:18 +03:00
Yahnis Elsts b1d2b98197 Send PHP version and WP locale as query parameters.
Possible uses:
- See when it's safe to raise PHP version requirements.
- Avoid showing users updates that are incompatible with their PHP version.
- Have an LTS branch for people running old PHP versions, and deliver different update packages based on the version.
- Return updates for only those language packs that match the site locale, not all available languages.
2017-02-05 15:46:03 +02:00
Yahnis Elsts e4854cdb38 BitBucket fix: When looking for the latest tags, sort them by commit date in descending order.
Previously, PUC didn't specify any explicit sorting criteria. I incorrectly assumed that BitBucket would return the most recent tags first. As a result, when a repository had enough tags to trigger API response pagination, PUC could miss some recent tags. Related: #48
2017-01-24 12:18:34 +02:00
Yahnis Elsts fbff383b7e Fix downloads from private GitHub repositories.
Cause: GitHub API client didn't sign download URLs (oops!). See #84
2017-01-17 09:13:17 +02:00
Yahnis Elsts 8a04b9679e Improve plugin detection. Related to #82.
Technically, it's possible to place a plugin anywhere outside the WordPress directory and then create a symlink inside /wp-content/plugins that points to the plugin directory. If the plugin developer then passes the real, symlink-resolved path to the PUC factory, PUC will assume it can't be a plugin because it's not inside the expected directory.
  
Semi-fixed by checking if the input file contains a valid plugin header. However, I would still recommend against using symlinks in this manner because it's likely to cause odd bugs elsewhere. For example, __FILE__ resolves symlinks but plugin_basename() doesn't. This means that the basename that WP sees and the basename you generate in your own code might not match.
2017-01-14 12:39:24 +02:00
Yahnis Elsts 467000eb73 Fail immediately if PUC can't tell whether it's being used in a plugin or a theme.
In theory, that should never happen, but the bug reported in #82 shows that it does.
2017-01-14 11:28:30 +02:00
Yahnis Elsts fd62858e90 Fix "Cannot declare class Puc_v4_Autoloader".
Oops, I knew I'd missed something! Well, this is that something.
2017-01-13 18:49:54 +02:00
Yahnis Elsts 1bf50ba942 Merge pull request #79 from YahnisElsts/version4
Fix some BitBucket and compat. bugs that were missed during testing
2017-01-12 11:38:49 +02:00
Yahnis Elsts 385ecf8df4 Fix pre-WP 4.7 compatibility.
get_user_locale() is not available in older WordPress versions. Also, according to WP docs, load_plugin_textdomain (and, presumably, its siblings) should be called in `init` or later.
2017-01-12 11:36:35 +02:00
Nicolas GEHIN e506d65915 Space in path not load language 2017-01-12 08:48:14 +01:00
Yahnis Elsts 0d5de0d4cc Fix zip error when installing update from a private BitBucket repository.
The code that updates the OAuth signature didn't account for the fact that the oauth_signature query parameter would end up in the wrong place. Instead of being sorted alphabetically with the rest of parameters, it must be the *last* one.
2017-01-11 22:17:49 +02:00
Yahnis Elsts 5d60e87cb6 Fix version number parsing.
The code that checks if the first character is a number was just plain wrong. It checked if the whole string is numeric.
2017-01-11 22:15:37 +02:00
Yahnis Elsts 6ba1aeb362 Minor: Move condition so that the fixDirectoryName filter never gets called if there's no valid directory name. 2017-01-10 17:05:07 +02:00
Yahnis Elsts d71578067d Minor: Rename parameter to $collection because it accepts both arrays and objects 2017-01-10 16:20:33 +02:00
Yahnis Elsts 4f1ec59f98 Remove unused property 2017-01-10 16:20:01 +02:00
Yahnis Elsts 57df68d407 Extract state storage as a new class.
Lazy-loading is a bit messy. Could it be improved with magic __get() and __set()?
2017-01-10 15:25:36 +02:00
Yahnis Elsts 844516d1f5 Treat null entries as non-existent. Add a startsWith() method.
This is necessary to avoid fatal errors when trying to retrieve existing but inaccessible properties (i.e. private or protected).
2017-01-10 13:13:01 +02:00
Yahnis Elsts aeeda3c330 Reduce code duplication by moving most similar code from requestUpdate and requestInfo into a new method: requestMetadata. 2017-01-06 10:40:42 +02:00
Yahnis Elsts 1905ed84dd Add API client class name to the debug panel. 2017-01-03 13:37:43 +02:00
Yahnis Elsts 1e709c6199 Add branch name and authentication state (on/off) to the Debug Bar panel.
There's some code duplication here. Unpleasant.
2017-01-03 13:22:38 +02:00
Yahnis Elsts 06eba37b27 Remove unused parameter.
Move stable tag detection to a method.
Make null-comparison explicit in the factory.
2017-01-01 14:25:18 +02:00
Yahnis Elsts b74182cb47 Minor: Simplify maybeCheckForUpdates.
We don't need to check if $state is empty; isset() suffices.
2016-12-31 21:10:48 +02:00
Yahnis Elsts b1fce3c2f4 Minor: Update PHPDoc to show that $update can be null (i.e. no update available). 2016-12-31 14:19:10 +02:00
Yahnis Elsts 13ca09ed1c Explicitly allow null input to Utils::get(). It just returns $default. 2016-12-31 14:17:24 +02:00
Yahnis Elsts e9b377e999 Simplify VCS-based theme checker. 2016-12-31 14:12:17 +02:00
Yahnis Elsts 870901b1f2 Let themes hosted on BitBucket use the "Stable tag" header to specify the latest version. 2016-12-31 13:46:10 +02:00
Yahnis Elsts 0e67e4c588 Extract VCS service detection as a method 2016-12-30 21:08:50 +02:00
Yahnis Elsts 36ef731e4f Remove redundant if condition.
is_object(null) is false, so we don't need a separate empty($state) condition.
2016-12-30 19:44:00 +02:00
Yahnis Elsts 8e5bc8c321 Extract translation filter as a method. 2016-12-30 19:29:28 +02:00
Yahnis Elsts 6e31d27187 Minor: Rename and comment.
Apparently "latest compatible version" is a more common expression than "greatest compatible version". Also, lets move away from the idea of using the factory class to build anything other than update checker instances; it's probably not necessary.
2016-12-28 22:12:32 +02:00
Yahnis Elsts 35a04faee6 Apparently BitBucket downloads only work over HTTPS.
Lest build the download URL from scratch to ensure that the correct protocol is used.
2016-12-28 18:17:11 +02:00
Yahnis Elsts 3004e10f75 Add a way to filter the HTTP options used when making GitHub/BitBucket API requests.
Example: 
 
 $updateChecker->addHttpRequestArgFilter('my_callback');
 
 function my_callback($options) {
     $options['timeout'] = 30;
     return $options;
 }
2016-12-28 17:15:42 +02:00
Yahnis Elsts f41dc30d28 Minor fixes and some comments 2016-12-28 16:09:28 +02:00
Yahnis Elsts cdf2d22243 Refactoring GitHub and BitBucket support.
Move most GitHub and BitBucket stuff to a general "VCS checker" class and put service-specific logic in API classes that follow a common interface.

Rationale: Upon further reflection, there's no need to have different theme & plugin checker implementations for each Git hosting service. The overall update detection algorithm stays the same. Only the API and authentication are different. 
 
 Not entirely happy with the code duplication in Vcs_PluginUpdateChecker and Vcs_ThemeUpdateChecker. Traits would be one solution, but can't use that in PHP 5.2. There's probably a "good enough" way to achieve the same thing through composition, but I haven't figured it out yet. 
 
 For private GH repositories, use setAuthentication('access_token_here') instead of setAccessToken().
2016-12-27 18:03:06 +02:00
Yahnis Elsts cde890f5d4 Minor: Update comments. 2016-12-24 16:03:58 +02:00
Yahnis Elsts f62a3d40fe Simplify tag sorting.
We don't need two different implementation for GitHub and BitBucket, they use the same property name. But lets make the property configurable anyway in case other APIs do differ.
2016-12-24 15:14:34 +02:00
Yahnis Elsts 365792edde Refactor BitBucket and GitHub checkers to be more similar.
In the future, it would probably be possible to add a general base class for repository-based updates.
2016-12-24 15:04:25 +02:00
Yahnis Elsts f64c3170cc BitBucket support is now semi-usable.
More testing required. Could probably refactor to reduce duplication; lots of overlap with GitHub integration.
2016-12-22 19:10:05 +02:00
Yahnis Elsts 3692f5201e Fix autoloading of files in the "vendor" subdirectory.
I was using the wrong directory path, oops.
2016-12-22 18:49:51 +02:00
Yahnis Elsts 55077f4a03 WIP: BitBucket support. Not usable yet! 2016-12-20 17:06:14 +02:00
Yahnis Elsts 16ab2457df Support themes hosted on GitHub.
What should "View version 1.2.3 details" link to? Theme URI, the changelog, the release, or the repository itself?
2016-12-19 19:26:34 +02:00
Yahnis Elsts f1e59b183c Rename DebugBar AJAX actions to prevent conflicts with previous versions. 2016-12-19 19:05:06 +02:00
Yahnis Elsts 8c7b3f80d6 Improve upgrade-in-progress detection for themes. In WP 4.6, AJAX-based upgrades use a different skin that was previously not supported. 2016-12-19 18:41:37 +02:00
Yahnis Elsts 0cd1c51c57 Autoload Parsedown and the readme parser.
Refactor requestUpdate() filtering.
Rename getFilterName to getUniqueName because it's used for more than just filter names.
Added  a couple of utility methods.
2016-12-17 19:04:52 +02:00
Yahnis Elsts 3e11878ac8 DebugBar integration for themes.
Change filter structure from puc_/tuc_* to puc_tag_[theme]-$slug. Not happy with that yet.
Fix a bunch of minor bugs.
2016-12-17 17:57:27 +02:00
Yahnis Elsts 2a176fc665 Move update injection and directory name fixes to the base UpdateChecker class. 2016-12-16 17:53:15 +02:00
Yahnis Elsts f5ae142e63 Translation, localization. Fix a bunch of crashes. 2016-12-14 21:13:51 +02:00
Yahnis Elsts 26c24167ab WIP: Theme updates.
- Refactor the scheduler so that it can be used in themes.
- Add state storage to the base update checker.
- Move the "allow metadata host" workaround to the base class.
- Rename cron hook from "check_plugin_updates-$slug" to "puc_cron_check_updates-$slug" and "tuc_cron_check_updates-$slug".
2016-12-14 11:18:58 +02:00
Yahnis Elsts 9effd33bfa WIP: Theme updates 2016-12-12 16:26:41 +02:00
Yahnis Elsts 79c2439464 Start reorganizing directory structure to comply with PSR-0 (mostly). 2016-12-08 16:56:24 +02:00