diff --git a/SourceForgejo/LICENSE b/SourceForgejo/LICENSE new file mode 100644 index 000000000..5a1d1aaa2 --- /dev/null +++ b/SourceForgejo/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) 2025 Bart van Leeuwen + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + diff --git a/SourceForgejo/SourceForgejo.php b/SourceForgejo/SourceForgejo.php new file mode 100644 index 000000000..69f9996e7 --- /dev/null +++ b/SourceForgejo/SourceForgejo.php @@ -0,0 +1,438 @@ +author = 'Bart van Leeuwen'; + $this->contact = 'bart@netage.nl'; + } + + public function show_type() { + return plugin_lang_get( 'Forgejo' ); + } + + public function show_changeset( $p_repo, $p_changeset ) { + $t_ref = substr( $p_changeset->revision, 0, 8 ); + $t_branch = $p_changeset->branch; + + return "$t_branch $t_ref"; + } + + public function show_file( $p_repo, $p_changeset, $p_file ) { + return "$p_file->action - $p_file->filename"; + } + + public function url_base( $p_repo ) { + $t_root = rtrim($p_repo->info['fj_root'], '/'); + return $t_root . '/' . $p_repo->info['fj_ownerid'] . '/' . $p_repo->info['fj_repoid']; + } + + public function url_repo( $p_repo, $p_changeset=null ) { + if( empty( $p_repo->info ) ) { + return ''; + } + $t_ref = ''; + if ( !is_null( $p_changeset ) ) { + $t_ref = "/src/branch/$p_changeset->revision"; + } + return $this->url_base( $p_repo ) . $t_ref; + } + + public function url_changeset( $p_repo, $p_changeset ) { + return $this->url_base( $p_repo ) . '/commit/' . $p_changeset->revision; + } + + public function url_file( $p_repo, $p_changeset, $p_file ) { + # Can't link to a deleted file + if( $p_file->action == SourceFile::DELETED ) { + return ''; + } + $t_ref = $p_changeset->revision; + $t_filename = $p_file->getFilename(); + return $this->url_base( $p_repo ) . "/src/branch/$t_ref/$t_filename"; + } + + public function url_diff( $p_repo, $p_changeset, $p_file ) { + return $this->url_changeset( $p_repo, $p_changeset ); + } + + public function update_repo_form( $p_repo ) { + $t_fj_root = null; + $t_fj_ownerid = null; + $t_fj_repoid = null; + $t_fj_app_secret = null; + + if ( isset( $p_repo->info['fj_root'] ) ) { + $t_fj_root = $p_repo->info['fj_root']; + } + if ( isset( $p_repo->info['fj_ownerid'] ) ) { + $t_fj_ownerid = $p_repo->info['fj_ownerid']; + } + if ( isset( $p_repo->info['fj_repoid'] ) ) { + $t_fj_repoid = $p_repo->info['fj_repoid']; + } + if ( isset( $p_repo->info['fj_app_secret'] ) ) { + $t_fj_app_secret = $p_repo->info['fj_app_secret']; + } + if ( isset( $p_repo->info['master_branch'] ) ) { + $t_master_branch = $p_repo->info['master_branch']; + } else { + $t_master_branch = $this->get_default_primary_branches(); + } +?> +
';
+
+ $t_branch = $p_repo->info['master_branch'];
+ if ( is_blank( $t_branch ) ) {
+ $t_branch = $this->get_default_primary_branches();
+ }
+
+ # if we're not allowed everything, populate an array of what we are allowed
+ if( $t_branch != '*' ) {
+ $t_branches_allowed = array_map( 'trim', explode( ',', $t_branch ) );
+ }
+
+ # Always pull back full list of repos
+ $t_ownerid = $p_repo->info['fj_ownerid'];
+ $t_repoid = $p_repo->info['fj_repoid'];
+ $t_uri = $this->api_uri( $p_repo, "repos/$t_ownerid/$t_repoid/branches" );
+ echo $t_uri;
+ $t_member = null;
+ $t_json = $this->api_json_url( $p_repo,$t_uri );
+ if( $t_json === null ) {
+ echo "Could not retrieve data from Forgejo at '$t_uri'. Make sure your ";
+ print_link(
+ plugin_page( 'repo_update_page', null, 'Source' )
+ . "&id=$p_repo->id",
+ 'repository settings'
+ );
+ echo " are correct.";
+ echo '';
+ return array();
+ }
+
+ $t_branches = array();
+ foreach( $t_json as $t_branch ) {
+ if( empty( $t_branches_allowed ) || in_array( $t_branch->name, $t_branches_allowed ) ) {
+ $t_branches[] = $t_branch;
+ }
+ }
+
+ $t_changesets = array();
+
+ $t_changeset_table = plugin_table( 'changeset', 'Source' );
+
+ foreach( $t_branches as $t_branch ) {
+ $t_query = "SELECT parent FROM $t_changeset_table
+ WHERE repo_id=" . db_param() . ' AND branch=' . db_param() .
+ ' ORDER BY timestamp';
+ $t_result = db_query( $t_query, array( $p_repo->id, $t_branch->name ), 1 );
+
+ $t_commits = array( $t_branch->commit->id );
+ if ( db_num_rows( $t_result ) > 0 ) {
+ $t_parent = db_result( $t_result );
+ echo "Oldest '$t_branch->name' branch parent: '$t_parent'\n";
+
+ if ( !empty( $t_parent ) ) {
+ $t_commits[] = $t_parent;
+ echo "Parents not empty";
+ }
+ echo "Parents empty";
+ }
+
+ $t_changesets = array_merge( $t_changesets, $this->import_commits( $p_repo, $t_commits, $t_branch->name ) );
+ }
+
+ echo '';
+
+ return $t_changesets;
+ }
+
+ public function import_latest( $p_repo ) {
+ return $this->import_full( $p_repo );
+ }
+
+ public function import_commits( $p_repo, $p_commit_ids, $p_branch='' ) {
+ static $s_parents = array();
+ static $s_counter = 0;
+ $t_ownerid = $p_repo->info['fj_ownerid'];
+ $t_repoid = $p_repo->info['fj_repoid'];
+
+ if ( is_array( $p_commit_ids ) ) {
+ $s_parents = array_merge( $s_parents, $p_commit_ids );
+ } else {
+ $s_parents[] = $p_commit_ids;
+ }
+
+ $t_changesets = array();
+
+ while( count( $s_parents ) > 0 && $s_counter < 200 ) {
+ $t_commit_id = array_shift( $s_parents );
+ echo "Retrieving $t_commit_id ...