From 3c8c38acdef336899991df66516ac289af44ca33 Mon Sep 17 00:00:00 2001 From: Matt Batchelder Date: Fri, 20 Feb 2026 22:15:46 -0500 Subject: [PATCH] Refactor Oribi Sync settings: remove pages folder option and enhance case-insensitive directory handling --- dist/oribi-tech-sync.zip | Bin 31787 -> 31661 bytes includes/admin.php | 56 --------------------- includes/api-client.php | 8 +-- includes/push-client.php | 103 ++++++++++++++++++++++++++++++++------- includes/rest.php | 59 ---------------------- includes/sync-engine.php | 35 ++++++++----- 6 files changed, 113 insertions(+), 148 deletions(-) diff --git a/dist/oribi-tech-sync.zip b/dist/oribi-tech-sync.zip index 7bde34e4a1686b81943f554f5ad2bda84fbcf427..e1ed639ee82e5ff9ae577c741acd50fd87e08173 100644 GIT binary patch delta 21587 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 - - - - - - -

Sub-folder inside Pages/ to sync from.

- - @@ -386,42 +366,6 @@ function oribi_sync_settings_page() { - - 'page', + 'meta_key' => '_oribi_sync_source', + 'numberposts' => 1, + 'fields' => 'ids', + ] ); + + if ( ! empty( $existing ) ) { + $source = get_post_meta( $existing[0], '_oribi_sync_source', true ); + // Extract the repo-path portion after the last colon (skip 'https:'). + $colon = strrpos( $source, ':' ); + if ( $colon !== false ) { + $path_part = substr( $source, $colon + 1 ); // e.g. 'pages/about.php' + // Validate it looks like a pages/ path before trusting it. + if ( strncasecmp( $path_part, 'pages/', 6 ) === 0 ) { + return substr( $path_part, 0, 6 ); // preserve original casing + } + } + } + + return 'pages/'; +} + // ─── Auto-push on page save ────────────────────────────────────────────────── add_action( 'save_post_page', 'oribi_sync_maybe_push_on_save', 20, 3 ); @@ -242,18 +275,15 @@ function oribi_sync_generate_php_wrapper( string $content, string $slug, string $title = oribi_sync_slug_to_title( $slug ); } - $date = current_time( 'Y-m-d H:i:s' ); - // Use a nowdoc so the content is treated as a literal string (no interpolation). - // Escape the content if it accidentally contains the heredoc delimiter on its own line. $delimiter = 'ORIBI_SYNC_CONTENT'; $safe_content = str_replace( "\n" . $delimiter, "\n " . $delimiter, $content ); $php = " false, 'action' => 'error', 'message' => 'Cannot determine repo path — no pages folder configured and no source meta on this page.' ]; - } - $repo_path = 'Pages/' . $pages_folder . '/' . $post->post_name . '.php'; + // Derive from slug — files live under pages/ + $repo_path = 'pages/' . $post->post_name . '.php'; } // ── Generate content ────────────────────────────────────────────────── $slug = $post->post_name; $title = $post->post_title; $wp_content = $post->post_content; - $php_source = oribi_sync_generate_php_wrapper( $wp_content, $slug, $title ); - $new_checksum = hash( 'sha256', $php_source ); $commit_msg = $opts['message'] ?? "Sync: update {$slug} from WordPress"; @@ -350,6 +411,14 @@ function oribi_sync_push_page( int $post_id, array $opts = [] ): array { return [ 'ok' => false, 'action' => 'error', 'message' => 'Failed to check remote file: ' . $remote->get_error_message() ]; } + // Build PHP source: preserve original header for existing files, fresh wrapper for new ones. + if ( $remote !== null && ! empty( $remote['content'] ) ) { + $php_source = oribi_sync_replace_php_body( $remote['content'], $wp_content, $slug, $title ); + } else { + $php_source = oribi_sync_generate_php_wrapper( $wp_content, $slug, $title ); + } + $new_checksum = hash( 'sha256', $php_source ); + $stored_sha = get_post_meta( $post_id, '_oribi_sync_git_sha', true ); // ── Decide strategy ─────────────────────────────────────────────────── diff --git a/includes/rest.php b/includes/rest.php index 9103d79..23c768b 100644 --- a/includes/rest.php +++ b/includes/rest.php @@ -30,15 +30,6 @@ add_action( 'rest_api_init', function () { }, ] ); - // ── List Pages sub-folders from the repo ─────────────────────────── - register_rest_route( 'oribi-sync/v1', '/repo-folders', [ - 'methods' => 'GET', - 'callback' => 'oribi_sync_rest_repo_folders', - 'permission_callback' => function () { - return current_user_can( 'manage_options' ); - }, - ] ); - // ── Push page to repo ────────────────────────────────────────────────── register_rest_route( 'oribi-sync/v1', '/push', [ 'methods' => 'POST', @@ -160,53 +151,3 @@ function oribi_sync_rest_push( WP_REST_Request $request ): WP_REST_Response { /** * REST: Push all synced pages to the repo. */ -function oribi_sync_rest_push_all( WP_REST_Request $request ): WP_REST_Response { - $result = oribi_sync_push_all(); - - return new WP_REST_Response( $result, $result['ok'] ? 200 : 500 ); -} - -/** - * REST: List available sub-folders under Pages/ in the configured repository. - * - * Returns a JSON object: { folders: ["folder-a", "folder-b", …] } - */ -function oribi_sync_rest_repo_folders(): WP_REST_Response { - $repo_url = get_option( 'oribi_sync_repo', '' ); - $branch = get_option( 'oribi_sync_branch', 'main' ) ?: 'main'; - $pat = oribi_sync_get_pat(); - - if ( empty( $repo_url ) || empty( $pat ) ) { - return new WP_REST_Response( [ 'error' => 'Repository URL or PAT is not configured.' ], 400 ); - } - - $parsed = oribi_sync_parse_repo_url( $repo_url ); - if ( is_wp_error( $parsed ) ) { - return new WP_REST_Response( [ 'error' => $parsed->get_error_message() ], 400 ); - } - - $provider = oribi_sync_get_provider(); - $api_base = oribi_sync_api_base( $provider, $parsed ); - - $tree = oribi_sync_fetch_tree( $api_base, $branch, $provider, $pat ); - if ( is_wp_error( $tree ) ) { - return new WP_REST_Response( [ 'error' => 'Tree fetch failed: ' . $tree->get_error_message() ], 500 ); - } - - // Find direct sub-directories of Pages/ - $folders = []; - $prefix = 'Pages/'; - foreach ( $tree as $entry ) { - if ( $entry['type'] !== 'tree' ) continue; - if ( strpos( $entry['path'], $prefix ) !== 0 ) continue; - $relative = substr( $entry['path'], strlen( $prefix ) ); - // Only direct children (no nested slash) - if ( strpos( $relative, '/' ) !== false ) continue; - if ( $relative === '' ) continue; - $folders[] = $relative; - } - - sort( $folders ); - - return new WP_REST_Response( [ 'folders' => $folders ], 200 ); -} diff --git a/includes/sync-engine.php b/includes/sync-engine.php index 2859093..2f9ce88 100644 --- a/includes/sync-engine.php +++ b/includes/sync-engine.php @@ -9,6 +9,21 @@ if ( ! defined( 'ABSPATH' ) ) exit; +// ─── Helpers ────────────────────────────────────────────────────────────────── + +/** + * Strip a case-insensitive directory prefix from a file path. + * + * Example: oribi_sync_strip_prefix( 'Theme/header.php', 'theme' ) → 'header.php' + */ +function oribi_sync_strip_prefix( string $path, string $prefix ): string { + $prefix = rtrim( $prefix, '/' ) . '/'; + if ( strncasecmp( $path, $prefix, strlen( $prefix ) ) === 0 ) { + return substr( $path, strlen( $prefix ) ); + } + return $path; +} + // ─── Gutenberg block helpers ────────────────────────────────────────────────── /** Generate a self-closing block comment (standalone or child blocks). */ @@ -129,18 +144,12 @@ function oribi_sync_run( bool $dry_run = false ): array { return $result; } - // ── Filter to selected Pages sub-folder ──────────────────────────────── - $pages_folder = get_option( 'oribi_sync_pages_folder', '' ); + // ── Filter to Pages/ directory ───────────────────────────────────────── $synced_slugs = []; + $page_files = oribi_sync_filter_tree( $tree, 'Pages' ); - if ( empty( $pages_folder ) ) { - $result['skipped'][] = 'Pages sync skipped — no folder selected in settings.'; - $page_files = []; - } else { - $page_files = oribi_sync_filter_tree( $tree, 'Pages/' . $pages_folder ); - if ( empty( $page_files ) ) { - $result['errors'][] = 'No files found under Pages/' . $pages_folder . '/ in the repository.'; - } + if ( empty( $page_files ) ) { + $result['skipped'][] = 'No files found under Pages/ in the repository.'; } // ── Process each page file ───────────────────────────────────────────── @@ -274,7 +283,7 @@ function oribi_sync_run( bool $dry_run = false ): array { } // ── Trash pages removed from repo ────────────────────────────────────── - if ( ! $dry_run && ! empty( $pages_folder ) ) { + if ( ! $dry_run ) { $trashed = oribi_sync_trash_removed_pages( $synced_slugs ); $result['trashed'] = $trashed; } @@ -456,7 +465,7 @@ function oribi_sync_apply_theme_files( string $api_base, string $branch, string $theme_entries = oribi_sync_filter_tree( $tree, 'theme', true ); foreach ( $theme_entries as $entry ) { - $relative = substr( $entry['path'], strlen( 'theme/' ) ); + $relative = oribi_sync_strip_prefix( $entry['path'], 'theme' ); $ext = strtolower( pathinfo( $relative, PATHINFO_EXTENSION ) ); if ( ! in_array( $ext, $allowed, true ) ) { @@ -540,7 +549,7 @@ function oribi_sync_fetch_theme_files(): array { foreach ( $theme_entries as $entry ) { // Derive relative path by stripping the 'theme/' prefix - $relative = substr( $entry['path'], strlen( 'theme/' ) ); + $relative = oribi_sync_strip_prefix( $entry['path'], 'theme' ); $content = oribi_sync_fetch_file( $api_base, $branch, $entry['path'], $provider, $pat ); if ( is_wp_error( $content ) ) {