From Kromonos, 2 Months ago, written in PHP.
Embed
  1. <?php
  2.  
  3. $gitlab_source = [
  4.     'url' => 'https://gitlab.example.com/api/v4',
  5.     'token' => 'abc'
  6. ];
  7.  
  8. $gitlab_target = [
  9.     'url' => 'https://newgitlab.example.net/api/v4',
  10.     'token' => 'cde'
  11. ];
  12.  
  13.  
  14. $time = microtime(true);
  15. $expire = $time + 3;
  16. $status = 200;
  17.  
  18. $pid = pcntl_fork();
  19. if ($pid == -1) {
  20.     die('could not fork');
  21. } else if ($pid) {
  22.     $url = $gitlab_source['url'] . '/users';
  23.  
  24.     echo 'Migrating users from ' . $url . PHP_EOL;
  25.  
  26.     $ch = curl_init();
  27.     curl_setopt($ch, CURLOPT_URL, $url);
  28.     curl_setopt($ch, CURLOPT_HEADER, false);
  29.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  30.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
  31.         'Content-Type: text/json',
  32.         'Private-Token: ' . $gitlab_source['token']
  33.     ]);
  34.     $data = curl_exec($ch);
  35.     curl_close($ch);
  36.    
  37.     if(!$data) {
  38.         return false;
  39.     }
  40.    
  41.     $source_users = json_decode($data);
  42.  
  43.     foreach ($source_users as $source_user) {
  44.         $url = $gitlab_target['url'] . '/users?username=' . $source_user->username;
  45.         echo 'Check existance of ' . $source_user->name . ' using URL: ' . $url . "\t\t\t";
  46.         $ch = curl_init();
  47.         curl_setopt($ch, CURLOPT_URL, $url);
  48.         curl_setopt($ch, CURLOPT_HEADER, false);
  49.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  50.         curl_setopt($ch, CURLOPT_HTTPHEADER, [
  51.             'Content-Type: text/json',
  52.             'Private-Token: ' . $gitlab_target['token']
  53.         ]);
  54.         $data = curl_exec($ch);
  55.         curl_close($ch);
  56.  
  57.         $exists = json_decode($data);
  58.         if ( count($exists) > 0 ) {
  59.             echo '[SKIPPED]' . PHP_EOL;
  60.         } else {
  61.             if (strpos($source_user->email, 'netzbewegung') !== false) {
  62.                 echo '[IGNORED]' . PHP_EOL;
  63.             } else {
  64.                 // Create the user
  65.                 echo '[CREATING]' . ' ';
  66.  
  67.                 $ch = curl_init();
  68.                 curl_setopt($ch, CURLOPT_URL, $gitlab_target['url'] . '/users');
  69.                 curl_setopt($ch, CURLOPT_POST, 1);
  70.                 curl_setopt($ch, CURLOPT_HEADER, false);
  71.                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  72.                 curl_setopt($ch, CURLOPT_HTTPHEADER, [
  73.                     'Private-Token: ' . $gitlab_target['token']
  74.                 ]);
  75.                 curl_setopt($ch, CURLOPT_POSTFIELDS,
  76.                          http_build_query([
  77.                             'name' => $gitlab_source->name,
  78.                             'reset_password' => true,
  79.                             'username' => $gitlab_source->username,
  80.                             'email' => $gitlab_source->email,
  81.                             'can_create_group' => false
  82.  
  83.                          ])
  84.                      );
  85.                 $server_output = curl_exec($ch);
  86.                 curl_close ($ch);
  87.  
  88.                 echo '[DONE]'. PHP_EOL;
  89.             }
  90.         }
  91.     }
  92.  
  93.     $url = $gitlab_source['url'] . '/projects';
  94.  
  95.     echo 'Migrating projects from ' . $url . PHP_EOL;
  96.     $ch = curl_init();
  97.     curl_setopt($ch, CURLOPT_URL, $url);
  98.     curl_setopt($ch, CURLOPT_HEADER, false);
  99.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  100.     curl_setopt($ch, CURLOPT_HTTPHEADER, [
  101.         'Content-Type: text/json',
  102.         'Private-Token: ' . $gitlab_source['token']
  103.     ]);
  104.     $data = curl_exec($ch);
  105.     curl_close($ch);
  106.    
  107.     if(!$data) {
  108.         return false;
  109.     }
  110.    
  111.     $source_projects = json_decode($data);
  112.  
  113.     foreach ($source_projects as $source_project) {
  114.         $url = $gitlab_target['url'] . '/projects?search=' . $source_project->path;
  115.         echo 'Check existance of ' . $source_project->name . ' using URL: ' . $url . "\t\t\t";
  116.         $ch = curl_init();
  117.         curl_setopt($ch, CURLOPT_URL, $url);
  118.         curl_setopt($ch, CURLOPT_HEADER, false);
  119.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  120.         curl_setopt($ch, CURLOPT_HTTPHEADER, [
  121.             'Content-Type: text/json',
  122.             'Private-Token: ' . $gitlab_target['token']
  123.         ]);
  124.         $data = curl_exec($ch);
  125.         curl_close($ch);
  126.  
  127.         $exists = json_decode($data);
  128.         if ( count($exists) > 0 ) {
  129.             echo '[SKIPPED]' . PHP_EOL;
  130.         } else {
  131.             // TODO
  132.             echo '[CREATE] ' . PHP_EOL;
  133.         }
  134.     }
  135.  
  136.     pcntl_wait($status);
  137. } else {
  138.     while(microtime(true) < $expire) {
  139.         sleep(0.5);
  140.     }
  141.  
  142.     return false;
  143. }