Git Repositories

Undelete on repository deletion.
authorCyrille Pontvieux <jrd@enialis.net>
Mon, 15 Dec 2014 14:05:07 +0000 (14:05 +0000)
committerCyrille Pontvieux <jrd@enialis.net>
Mon, 15 Dec 2014 14:05:07 +0000 (14:05 +0000)
Some warnings and other small corrections

12 files changed:
Makefile
configure
homegit/gitrepo.sh
src/controller.config.php
src/footer.inc.php
src/include.inc.php
src/nav.inc.php
src/repo-del.php
src/repo-deleted-list.php [new file with mode: 0644]
src/repo-destroy.php [new file with mode: 0644]
src/repo-nav.inc.php
src/repo-undel.php [new file with mode: 0644]

index 631a4c7..d088915 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -86,7 +86,7 @@ _githome:
        
 _webhome:
        @mkdir -p ${PREFIX}
-       @cp -rv gen/www/* ${PREFIX}/
+       @cp -rv gen/www/. ${PREFIX}/
 
 _sudo:
        @cp gen/sudoers.d/git /etc/sudoers.d/git
index 5736872..c15c5d8 100755 (executable)
--- a/configure
+++ b/configure
@@ -131,5 +131,5 @@ WEB_TYPE = $WEB_TYPE
 WEB_TITLE = $WEB_TITLE
 EOF
 
-[ -d git-master ] || wget https://github.com/git/git/archive/master.tar.gz -O - | tar xzf -
+[ -d git-master ] || wget --no-check-certificate https://github.com/git/git/archive/master.tar.gz -O - | tar xzf -
 sed -i 's/^GITWEB_SITE_HEADER =/& header.html/; s/^GITWEB_SITE_FOOTER =/& footer.html/;' git-master/gitweb/Makefile
index 6fb24cf..69dcde3 100755 (executable)
@@ -21,6 +21,8 @@ Action is one of:
  - destroy-user Username
  
  - create Name [Description]
+ - delete Name
+ - undelete Name
  - destroy Name
  - get Name Option
    Option can be
@@ -239,14 +241,39 @@ create_repo() {
   )
 }
 
-destroy_repo() {
+delete_repo() {
   REPO="$1"
   check_repo "$REPO"
   if [ ! -d "$REPO".git ]; then
     echo "$REPO does not exist." >&2
     exit 2
   fi
-  rm -rf "$REPO".git
+  mv "$REPO".git ."$REPO".git
+}
+
+undelete_repo() {
+  REPO="$1"
+  check_repo "$REPO"
+  if [ ! -d ."$REPO".git ]; then
+    echo "$REPO cannot be undeleted, not found." >&2
+    exit 2
+  fi
+  mv ."$REPO".git "$REPO".git
+}
+
+destroy_repo() {
+  REPO="$1"
+  check_repo "$REPO"
+  if [ ! -d ."$REPO".git ]; then
+    if [ -d "$REPO".git ]; then
+      echo "$REPO should be deleted before being destroyed." >&2
+      exit 2
+    else
+      echo "$REPO does not exist." >&2
+      exit 2
+    fi
+  fi
+  rm -rf ."$REPO".git
 }
 
 get_option() {
@@ -546,7 +573,7 @@ while [ -n "$1" ]; do
       ;;
     *)
       if [ -z "$ACTION" ]; then
-        if echo "$1" | grep -q '^\(list-users\|create-user\|change-user\|show-pwd\|user-set-admin\|user-is-admin\|list-keys\|add-key\|del-key\|destroy-user\|create\|destroy\|get\|set\|show-users\|add-user\|user-right\|del-user\|graph\|fetch\|export\|sync\|unsync\|listsync\|deploy-key\)$'; then
+        if echo "$1" | grep -q '^\(list-users\|create-user\|change-user\|show-pwd\|user-set-admin\|user-is-admin\|list-keys\|add-key\|del-key\|destroy-user\|create\|delete\|undelete\|destroy\|get\|set\|show-users\|add-user\|user-right\|del-user\|graph\|fetch\|export\|sync\|unsync\|listsync\|deploy-key\)$'; then
           ACTION="$1"
           shift
         else
@@ -616,7 +643,7 @@ while [ -n "$1" ]; do
               echo "Unrecognized parameter ($1)" >&2
               exit 1
             fi
-          elif [ "$ACTION" = "destroy" ]; then
+          elif [ "$ACTION" = "delete" ] || [ "$ACTION" = "undelete" ] || [ "$ACTION" = "destroy" ]; then
             echo "Unrecognized parameter ($1)" >&2
             exit 1
           elif [ "$ACTION" = "get" ] || [ "$ACTION" = "set" ]; then
@@ -767,6 +794,16 @@ case "$ACTION" in
     checkparams REPO
     create_repo "$REPO" "$DESC"
     ;;
+  delete)
+    REPO="$NAME"
+    checkparams REPO
+    delete_repo "$REPO"
+    ;;
+  undelete)
+    REPO="$NAME"
+    checkparams REPO
+    undelete_repo "$REPO"
+    ;;
   destroy)
     REPO="$NAME"
     checkparams REPO
index 390f64d..e1824d9 100644 (file)
@@ -8,6 +8,7 @@ $controllers = array(
   'account' => array(',^account$,', 'account.php'),
   'user-del-key' => array(',^account/delete-key/(?P<pos>[0-9]+)$,', 'user-del-key.php'),
   'repo-list' => array(',^list$,', 'repo-list.php'),
+  'repo-deleted-list' => array(',^deleted$,', 'repo-deleted-list.php'),
   'repo-info' => array(',^repo/(?P<repo>[^/]+)$,', 'repo-info.php'),
   'repo-info-branch' => array(',^repo/(?P<repo>[^/]+)/branch/(?P<branch>[^/]+)$,', 'repo-info.php'),
   'repo-histo' => array(',^repo/(?P<repo>[^/]+)/histo$,', 'repo-histo.php'),
@@ -20,179 +21,7 @@ $controllers = array(
   'repo-dl-file' => array(',^repo/(?P<repo>[^/]+)/file/(?P<branch>[^/]+)/(?P<filename>[^/]+)/dl$,', 'repo-dl-file.php'),
   'repo-edit' => array(',^repo/(?P<repo>[^/]+)/edit$,', 'repo-edit.php'),
   'repo-del' => array(',^repo/(?P<repo>[^/]+)/delete$,', 'repo-del.php'),
+  'repo-undel' => array(',^repo/(?P<repo>[^/]+)/undelete$,', 'repo-undel.php'),
+  'repo-destroy' => array(',^repo/(?P<repo>[^/]+)/destroy$,', 'repo-destroy.php'),
 );
-
-function action_disconnect($args) {
-  extract($GLOBALS);
-  include_once('disconnect.php');
-  return true;
-}
-
-function action_delete_key($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['pos'] = $args[0];
-    include_once('user-del-key.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_manage_users($args) {
-  extract($GLOBALS);
-  include_once('admin-users.php');
-  return true;
-}
-
-function action_delete_user($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['user'] = $args[0];
-    include_once('user-del.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_list($args) {
-  extract($GLOBALS);
-  include_once('repo-list.php');
-  return true;
-}
-
-function action_users($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    include_once('repo-users.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_info($args) {
-  if (count($args) >= 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    if (count($args) == 2) {
-      $_GET['branch'] = $args[1];
-    }
-    include_once('repo-info.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_histo($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    include_once('repo-histo.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_edit($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    include_once('repo-edit.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_download($args) {
-  if (count($args) == 2 && !empty($args[0]) && !empty($args[1])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['filename'] = $args[1];
-    include_once('repo-dl.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_download_branch($args) {
-  if (count($args) == 3 && !empty($args[0]) && !empty($args[1]) && !empty($args[2])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['branch'] = $args[1];
-    $_GET['filename'] = $args[2];
-    include_once('repo-dl-branch.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_show_file($args) {
-  if (count($args) == 4 && !empty($args[0]) && !empty($args[1]) && !empty($args[2]) && $args[3] == 'show') {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['branch'] = $args[1];
-    $_GET['filename'] = $args[2];
-    include_once('repo-show-file.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_download_file($args) {
-  if (count($args) == 4 && !empty($args[0]) && !empty($args[1]) && !empty($args[2]) && $args[3] == 'dl') {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['branch'] = $args[1];
-    $_GET['filename'] = $args[2];
-    include_once('repo-dl-file.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_user_right($args) {
-  if (count($args) == 3 && !empty($args[0]) && !empty($args[1]) && !empty($args[2])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['user'] = $args[1];
-    $_GET['right'] = $args[2];
-    include_once('repo-user-right.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_remove_user($args) {
-  if (count($args) == 2 && !empty($args[0]) && !empty($args[1])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    $_GET['user'] = $args[1];
-    include_once('repo-user-del.php');
-    return true;
-  } else {
-    return false;
-  }
-}
-
-function action_delete($args) {
-  if (count($args) == 1 && !empty($args[0])) {
-    extract($GLOBALS);
-    $_GET['repo'] = $args[0];
-    include_once('repo-del.php');
-    return true;
-  } else {
-    return false;
-  }
-}
 ?>
index cad39e4..97c640f 100644 (file)
@@ -12,7 +12,7 @@
     </div>
     <script type="text/javascript" src="/<?php echo $gitwebroot;?>js/jquery.min.js"></script>
     <script type="text/javascript" src="/<?php echo $gitwebroot;?>js/bootstrap.min.js"></script>
-    <?php foreach ($extrajs as $js) { ?>
+    <?php if (!isset($extrajs)) { $extrajs = array(); } foreach ($extrajs as $js) { ?>
     <script type="text/javascript" src="<?php echo $js;?>"></script>
     <?php } ?>
   </body>
index 2ee29d5..1b25dd5 100644 (file)
@@ -18,8 +18,13 @@ function _getvars($args, $offset) {
   return $vars;
 }
 
-function url($name, $vars) {
+function url($name) {
   global $controllers, $gitwebroot;
+  if (func_num_args() > 1) {
+    $vars = func_get_arg(1);
+  } else {
+    $vars = null;
+  }
   if ($vars !== null && !is_array($vars)) {
     $vars = _getvars(func_get_args(), 1);
   }
@@ -38,7 +43,12 @@ function url($name, $vars) {
   }
   return $url;
 }
-function purl($name, $vars) {
+function purl($name) {
+  if (func_num_args() > 1) {
+    $vars = func_get_arg(1);
+  } else {
+    $vars = null;
+  }
   if ($vars !== null && !is_array($vars)) {
     $vars = _getvars(func_get_args(), 1);
   }
@@ -88,7 +98,12 @@ function redirectifnotrepoadmin($repo) {
     redirect('/');
   }
 }
-function redirect($name, $vars) {
+function redirect($name) {
+  if (func_num_args() > 1) {
+    $vars = func_get_arg(1);
+  } else {
+    $vars = null;
+  }
   if ($vars !== null && !is_array($vars)) {
     $vars = _getvars(func_get_args(), 1);
   }
index 2af9f5d..816b6b9 100644 (file)
         <?php
 $files = scandir($gitdir);
 $nb = 0;
+$nbdeleted = 0;
 foreach ($files as $file) {
-  if ($file[0] == '.') continue;
   if (is_dir("$gitdir/$file") && preg_match('/\.git$/', $file)) {
-    if ($admin || file_exists("$gitdir/$file/git-daemon-export-ok")) {
-      $nb++;
-    } elseif ($logged) {
-      $repo = substr($file, 0, -4);
-      $right = gitrepoinfo('user-right', $repo, $username);
-      if ($right !== false) {
-        $right = implode('', $right);
+    if ($file[0] == '.') {
+      if ($admin) {
+        $nbdeleted++;
+      } else {
+        continue;
       }
-      if (!empty($right)) {
+    } else {
+      if ($admin || file_exists("$gitdir/$file/git-daemon-export-ok")) {
         $nb++;
+      } elseif ($logged) {
+        $repo = substr($file, 0, -4);
+        $right = gitrepoinfo('user-right', $repo, $username);
+        if ($right !== false) {
+          $right = implode('', $right);
+        }
+        if (!empty($right)) {
+          $nb++;
+        }
       }
     }
   }
@@ -38,8 +46,11 @@ if (empty($cat)) {
   $cat = 'repos';
 }
         ?>
-        <li role="presentation" class="<?php echo $cat == 'repos' ? 'active' : '';?>"><a href="<?php purl('repo-list');?>"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>&nbsp;&nbsp;Repositories <span class="badge"><?php echo $nb; ?></span></a></li>
+        <li role="presentation" class="<?php echo $cat == 'repos' ? 'active' : '';?>"><a href="<?php purl('repo-list');?>"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>&nbsp;&nbsp;Repositories&nbsp;<span class="badge"><?php echo $nb; ?></span></a></li>
         <?php if ($admin) { ?>
+        <?php if ($nbdeleted > 0) { ?>
+        <li role="presentation" class="<?php echo $cat == 'repos-deleted' ? 'active' : '';?>"><a href="<?php purl('repo-deleted-list');?>"><span class="glyphicon glyphicon-fire" aria-hidden="true"></span>&nbsp;&nbsp;Deleted&nbsp;<span class="badge"><?php echo $nbdeleted; ?></span></a></li>
+        <?php } ?>
         <li role="presentation" class="<?php echo $cat == 'users' ? 'active' : '';?>"><a href="<?php purl('admin-users')?>"><span class="glyphicon glyphicon-user" aria-hidden="true"></span>&nbsp;&nbsp;Gestion des utilisateurs</a></li>
         <?php } ?>
         <li role="presentation" class="<?php echo $cat == 'about' ? 'active' : '';?>"><a href="<?php purl('about')?>"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span>&nbsp;&nbsp;About</a></li>
index b604ca3..f9fe913 100644 (file)
@@ -6,5 +6,5 @@ if (!$logged || empty($vars['repo'])) {
 } else {
   $repo = $vars['repo'];
 }
-$res = gitrepoinfo('destroy', $repo);
+$res = gitrepoinfo('delete', $repo);
 redirect('repo-list');
diff --git a/src/repo-deleted-list.php b/src/repo-deleted-list.php
new file mode 100644 (file)
index 0000000..3a3d7a3
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+require_once('include.inc.php');
+redirectifnotadmin();
+$pageTitle = "$title - Dépôts supprimés";
+$cat = 'repos-deleted';
+require('header.inc.php');
+?>
+    <div>
+      <h3>Les dépôts Git supprimés :</h3>
+      <div class="table-responsive">
+        <table class="table table-hover">
+          <thead>
+            <tr>
+              <th>Nom</th>
+              <th>Actions</th>
+            </tr>
+          </thead>
+          <tbody>
+<?php
+$files = scandir($gitdir);
+foreach ($files as $file) {
+  if (is_dir("$gitdir/$file") && preg_match('/^\..*\.git$/', $file)) {
+    $proj = preg_replace('/^\.(.*)\.git$/', '\1', $file);
+    $desc = htmlspecialchars(file_get_contents("$gitdir/$file/description"));
+    if (empty($desc) || preg_match('/^Unnamed repository;/', $desc)) {
+      $desc = $proj;
+    }
+    $actions = "<a href=\"".url('repo-undel', 'repo', $proj)."\" onclick=\"return confirm('Réactiver le dépôt \'$proj\' ?');\"><span class=\"glyphicon glyphicon-ok-sign\" aria-hidden=\"true\"></span>&nbsp;Réactiver</a>";
+    $actions .= "&nbsp;<a href=\"".url('repo-destroy', 'repo', $proj)."\" onclick=\"return confirm('Êtes-vous sûr de vouloir détruire définitivement le dépôt \'$proj\' ?');\"><span class=\"glyphicon glyphicon-remove-sign\" aria-hidden=\"true\"></span>&nbsp;Détruire</a>";
+    echo "        <tr><td title=\"$desc\">$proj</td><td class=\"actions\">$actions</td></tr>\n";
+  }
+}
+?>
+            </tbody>
+        </table>
+      </div>
+    </div>
+<?php require('footer.inc.php'); ?>
diff --git a/src/repo-destroy.php b/src/repo-destroy.php
new file mode 100644 (file)
index 0000000..b604ca3
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+require_once('include.inc.php');
+redirectifnotadmin();
+if (!$logged || empty($vars['repo'])) {
+  redirect('/');
+} else {
+  $repo = $vars['repo'];
+}
+$res = gitrepoinfo('destroy', $repo);
+redirect('repo-list');
index 4080ec6..8f88ef1 100644 (file)
@@ -15,7 +15,7 @@
     <ul class="dropdown-menu" role="menu">
       <li role="presentation"><a href="<?php purl('repo-users', 'repo', $repo); ?>"><span class="glyphicon glyphicon-user" aria-hidden="true"></span>&nbsp;&nbsp;Utilisateurs</a></li>
       <li role="presentation" <?php if (!$repoadmin) { echo 'class="disabled"'; } ?>><?php echo $repoadmin ? '<a href="'.url('repo-edit', 'repo', $repo).'">' : '<a href="javascript:">'; ?><span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>&nbsp;&nbsp;Éditer</a></li>
-      <li role="presentation" <?php if (!$repoadmin) { echo 'class="disabled"'; } ?>><?php echo $repoadmin ? '<a href="'.url('repo-del', 'repo', $repo).'" onclick="return confirm(\'Êtes-vous sûr de vouloir supprimer le dépôt '."'$repo'".' ?\');">' : '<a href="javascript:">'; ?><span class="glyphicon glyphicon-trash" aria-hidden="true"></span>&nbsp;&nbsp;Supprimer</a></li>
+      <li role="presentation" <?php if (!$repoadmin) { echo 'class="disabled"'; } ?>><?php echo $repoadmin ? '<a href="'.url('repo-del', 'repo', $repo).'" onclick="return confirm(\'Êtes-vous sûr de vouloir supprimer le dépôt '."\'$repo\'".' ?\');">' : '<a href="javascript:">'; ?><span class="glyphicon glyphicon-trash" aria-hidden="true"></span>&nbsp;&nbsp;Supprimer</a></li>
     </ul>
   </li>
 </ul>
diff --git a/src/repo-undel.php b/src/repo-undel.php
new file mode 100644 (file)
index 0000000..60b773f
--- /dev/null
@@ -0,0 +1,10 @@
+<?php
+require_once('include.inc.php');
+redirectifnotadmin();
+if (!$logged || empty($vars['repo'])) {
+  redirect('/');
+} else {
+  $repo = $vars['repo'];
+}
+$res = gitrepoinfo('undelete', $repo);
+redirect('repo-list');