Git Repositories

New urls and super-controler.
authorCyrille Pontvieux <jrd@enialis.net>
Thu, 11 Dec 2014 17:34:59 +0000 (17:34 +0000)
committerCyrille Pontvieux <jrd@enialis.net>
Thu, 11 Dec 2014 17:34:59 +0000 (17:34 +0000)
More bootstrap integration.

31 files changed:
homegit/gitrepo.sh
src/.admins [deleted file]
src/.copyright [new file with mode: 0644]
src/.license [new file with mode: 0644]
src/.version [new file with mode: 0644]
src/about.php [new file with mode: 0644]
src/account.php
src/admin-users.php
src/controller.config.php
src/controller.php
src/css/custom.css
src/disconnect.php
src/footer.inc.php
src/include.inc.php
src/js/repo-list.js [new file with mode: 0644]
src/nav.inc.php
src/repo-del.php
src/repo-dl-branch.php
src/repo-dl-file.php
src/repo-dl.php
src/repo-edit.php
src/repo-histo.php
src/repo-info.php
src/repo-list.php
src/repo-nav.inc.php [new file with mode: 0644]
src/repo-show-file.php
src/repo-user-del.php
src/repo-user-right.php
src/repo-users.php
src/user-del-key.php
src/user-del.php

index 57beef2..6fb24cf 100755 (executable)
@@ -32,6 +32,8 @@ Action is one of:
  - add-user Name Username [admin|user|readonly]
    Username should already exists
    Default right is user
+ - user-right Name Username
+   Return admin, user, readonly or an empty string
  - del-user Name Username
  
  - graph Name
@@ -310,6 +312,20 @@ add_user() {
   fi
 }
 
+user_right() {
+  REPO="$1"
+  USERNAME="$2"
+  check_repo "$REPO"
+  check_username "$USERNAME"
+  if [ ! -d "$REPO".git ]; then
+    echo "$REPO does not exist." >&2
+    exit 2
+  fi
+  if [ -e "$REPO".git/.users ]; then
+    sed -r -n "/^$USERNAME:/ { s/.*:(.*)/\1/; p }" "$REPO".git/.users
+  fi
+}
+
 del_user() {
   REPO="$1"
   USERNAME="$2"
@@ -530,7 +546,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\|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\|destroy\|get\|set\|show-users\|add-user\|user-right\|del-user\|graph\|fetch\|export\|sync\|unsync\|listsync\|deploy-key\)$'; then
           ACTION="$1"
           shift
         else
@@ -630,6 +646,14 @@ while [ -n "$1" ]; do
                 exit 1
               fi
             fi
+          elif [ "$ACTION" = "user-right" ]; then
+            if [ -z "$USERNAME" ]; then
+              USERNAME="$1"
+              shift
+            else
+              echo "Unrecognized parameter ($1)" >&2
+              exit 1
+            fi
           elif [ "$ACTION" = "del-user" ]; then
             if [ -z "$USERNAME" ]; then
               USERNAME="$1"
@@ -769,6 +793,11 @@ case "$ACTION" in
     [ -n "$RIGHT" ] || RIGHT=user
     add_user "$REPO" "$USERNAME" "$RIGHT"
     ;;
+  user-right)
+    REPO="$NAME"
+    checkparams REPO USERNAME
+    user_right "$REPO" "$USERNAME"
+    ;;
   del-user)
     REPO="$NAME"
     checkparams REPO USERNAME
diff --git a/src/.admins b/src/.admins
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/src/.copyright b/src/.copyright
new file mode 100644 (file)
index 0000000..5cae9fa
--- /dev/null
@@ -0,0 +1 @@
+Cyrille Pontvieux
diff --git a/src/.license b/src/.license
new file mode 100644 (file)
index 0000000..6265d19
--- /dev/null
@@ -0,0 +1 @@
+<a href="http://www.gnu.org/licenses/quick-guide-gplv3.html" target="license">GPLv3</a>
diff --git a/src/.version b/src/.version
new file mode 100644 (file)
index 0000000..d3827e7
--- /dev/null
@@ -0,0 +1 @@
+1.0
diff --git a/src/about.php b/src/about.php
new file mode 100644 (file)
index 0000000..2fea3f8
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+require_once('include.inc.php');
+$cat = 'about';
+require('header.inc.php');
+echo "<h1>About</h1>\n";
+require('footer.inc.php');
+?>
index 66301ff..5dcdfcf 100644 (file)
@@ -1,38 +1,46 @@
 <?php
 require_once('include.inc.php');
 if (!$logged) {
-  header('Location: /' . $gitwebroot);
-  exit;
-} else {
-  $username = $_SESSION['username'];
+  redirect('/');
 }
-$errorMsgKey = '';
-$errorMsgPwd = '';
+$redirect = false;
 if (isset($_POST['submit_key'])) {
   $fKey = $_POST['new-key'];
   $res = gitrepoinfo('add-key', $username, $fKey);
   if ($res === false) {
-    $errorMsgKey = "La clé n'a pas pu être ajoutée.";
+    $errorMsg = "La clé n'a pas pu être ajoutée.";
+  } else {
+    $redirect = true;
   }
 }
 if (isset($_POST['submit_pwd'])) {
   $fPwd = $_POST['new-pwd'];
   $res = gitrepoinfo('change-user', $username, md5($fPwd));
   if ($res === false) {
-    $errorMsgPwd = "Le mot de passe n'a pas pu être changé.";
+    $errorMsg = "Le mot de passe n'a pas pu être changé.";
+  } else {
+    $redirect = true;
   }
 }
+if ($redirect) {
+  redirecturl($_SERVER['REQUEST_URI']);
+}
 $pageTitle = "$title - $username";
+$cat = 'account';
 require('header.inc.php');
 ?>
     <div id="keys">
       <div class="invite">Les clés SSH de <span><?php echo $username; ?> </span>:</div>
-      <table>
-        <tr>
-          <th class="name">Nom</th>
-          <th class="key">Clé</th>
-          <th class="actions">Action</th>
-        </tr>
+      <div class="table-responsive">
+        <table class="table table-hover">
+          <thead>
+            <tr>
+              <th>Nom</th>
+              <th>Clé</th>
+              <th>Action</th>
+            </tr>
+          </thead>
+          <tbody>
 <?php
 $keys = gitrepoinfo('list-keys', $username);
 $i = 0;
@@ -44,13 +52,14 @@ foreach ($keys as $key) {
   } else {
     $name = ' — ';
   }
-  $actions = "<a class=\"delete\" href=\"/{$gitwebroot}delete_key/$i\" onclick=\"return confirm('Êtes-vous sûr de vouloir supprimer cette clé ?');\">Supprimer</a>";
-  echo "        <tr><td class=\"keyname\">$name</td><td class=\"key\"><textarea readonly=\"readonly\">$key</textarea></td><td class=\"actions\">$actions</td></tr>\n";
+  $actions = '<a class="delete" href="' . url('user-del-key', 'pos', $i) . '" onclick="return confirm(\'Êtes-vous sûr de vouloir supprimer cette clé ?\');">Supprimer</a>';
+  echo "        <tr><td>$name</td><td><textarea readonly=\"readonly\">$key</textarea></td><td class=\"actions\">$actions</td></tr>\n";
 }
 ?>
-      </table>
+          </tbody>
+        </table>
+      </div>
     </div>
-    <div class="error"><?php echo $errorMsgKey; ?></div>
     <form id="add-key" action="" method="POST">
       <fieldset>
         <legend>Ajouter une clé SSH</legend>
@@ -59,7 +68,6 @@ foreach ($keys as $key) {
         <input type="submit" name="submit_key" value="Ajouter"/>
       </fieldset>
     </form>
-    <div class="error"><?php echo $errorMsgPwd; ?></div>
     <form id="change-pwd" action="" method="POST" autocomplete="off">
       <fieldset>
         <legend>Changer le mot de passe</legend>
index 2530d70..2044d06 100644 (file)
@@ -1,40 +1,47 @@
 <?php
 require_once('include.inc.php');
 redirectifnotadmin();
-$errorMsg = '';
 if (isset($_POST['submit_user_add'])) {
   $fUser = $_POST['username'];
   $fPwd = $_POST['password'];
   $res = gitrepoinfo('create-user', $fUser, md5($fPwd));
   if ($res === false) {
-    $errorMsg = "L'utilisateur n'a pas pu être ajouté.";
+    $errorMsg = "L'utilisateur <strong>$fUser</strong> n'a pas pu être ajouté.";
+  } else {
+    redirect('admin-users');
   }
 }
 $pageTitle = "$title - Administration des utilisateurs";
+$cat = 'users';
 require('header.inc.php');
 ?>
     <div id="users">
-      <div class="invite">Les utilisateurs :</div>
-      <table>
-        <tr>
-          <th class="name">Utilisateur</th>
-          <th class="actions">Actions</th>
-        </tr>
+      <h3>Les utilisateurs :</h3>
+      <div class="table-responsive">
+        <table class="table table-hover">
+          <thead>
+            <tr>
+              <th>Utilisateur</th>
+              <th>Actions</th>
+            </tr>
+          </thead>
+          <tbody>
 <?php
 $users = gitrepoinfo('list-users');
 foreach ($users as $user) {
-  $actions = "<a class=\"delete\" href=\"/{$gitwebroot}delete_user/$user\" onclick=\"return confirm('Êtes-vous sûr de vouloir supprimer l\'utilisateur \'$user\' ?');\">Supprimer</a>";
-  echo "        <tr><td class=\"name\">$user</td><td class=\"actions\">$actions</td></tr>\n";
+  $actions = "<a href=\"".url('user-del', 'user', $user)."\" onclick=\"return confirm('Êtes-vous sûr de vouloir supprimer l\'utilisateur \'$user\' ?');\">Supprimer</a>";
+  echo "        <tr><td>$user</td><td class=\"actions\">$actions</td></tr>\n";
 }
 ?>
-      </table>
+          </tbody>
+        </table>
+      </div>
     </div>
-    <div class="error"><?php echo $errorMsg; ?></div>
     <form id="add-user" action="" method="POST" autocomplete="off">
       <fieldset>
         <legend>Ajouter un utilisateur</legend>
-        <label for="username">Login : </label><input type="text" name="username" id="username" value=""/>
-        <label for="password">MdP : </label><input type="password" name="password" id="password" value=""/>
+        <label for="username">Login : </label>&nbsp;<input type="text" name="username" id="username" value=""/>
+        <label for="password">MdP : </label>&nbsp;<input type="password" name="password" id="password" value=""/>
         <input type="submit" name="submit_user_add" value="Ajouter l'utilisateur au dépôt"/>
       </fieldset>
     </form>
index f939f4c..390f64d 100644 (file)
@@ -1,11 +1,26 @@
 <?php
-$defaultAction = 'list';
-
-function action_account($args) {
-  extract($GLOBALS);
-  include_once('account.php');
-  return true;
-}
+$defaultResource = 'list';
+$controllers = array(
+  'about' => array(',^about$,', 'about.php'),
+  'logout' => array(',^logout$,', 'disconnect.php'),
+  'admin-users' => array(',^users/admin$,', 'admin-users.php'),
+  'user-del' => array(',^users/delete/(?P<user>[^/]+)$,', 'user-del.php'),
+  '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-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'),
+  'repo-users' => array(',^repo/(?P<repo>[^/]+)/users$,', 'repo-users.php'),
+  'repo-user-right' => array(',^repo/(?P<repo>[^/]+)/user/(?P<user>[^/]+)/set_(?P<right>[^/]+)$,', 'repo-user-right.php'),
+  'repo-user-del' => array(',^repo/(?P<repo>[^/]+)/user/(?P<user>[^/]+)/remove$,', 'repo-user-del.php'),
+  'repo-dl-branch' => array(',^repo/(?P<repo>[^/]+)/branch/(?P<branch>[^/]+)/(?P<filename>[^/]+)$,', 'repo-dl-branch.php'),
+  'repo-dl-tag' => array(',^repo/(?P<repo>[^/]+)/tag/(?P<tag>[^/]+)/(?P<filename>[^/]+)$,', 'repo-dl.php'),
+  'repo-show-file' => array(',^repo/(?P<repo>[^/]+)/file/(?P<branch>[^/]+)/(?P<filename>[^/]+)/show$,', 'repo-show-file.php'),
+  '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'),
+);
 
 function action_disconnect($args) {
   extract($GLOBALS);
index f94854a..94fc67f 100644 (file)
@@ -1,27 +1,34 @@
 <?php
 require_once('include.inc.php');
 $queryString = $_SERVER['QUERY_STRING'];
-$uri = explode('?', $_SERVER['REQUEST_URI'])[0];
-$request = explode('/', $uri);
-$posoffset = substr_count($gitwebroot, '/');
-$action = $request[1 + $posoffset];
-if ($action == 'controller.php') {
-  $action = '';
+$request = explode('/', explode('?', $_SERVER['REQUEST_URI'])[0]);
+$resource = implode('/', array_slice($request, 1 + substr_count($gitwebroot, '/')));
+if ("/$gitwebroot$resource" == $_SERVER['SCRIPT_NAME']) {
+  $resource = '';
 }
-$actionVars = array_slice($request, 2 + $posoffset);
 require_once('controller.config.php');
-function call_action($name, $default, $vars) {
-  if (empty($name)) {
-    $name = $default;
-  }
-  if (function_exists("action_$name")) {
-    return call_user_func("action_$name", $vars);
-  } else {
-    return false;
-  }
+if (empty($resource)) {
+  $resource = $defaultResource;
 }
-if (!call_action($action, $defaultAction, $actionVars)) {
-  header('HTTP/1.0 404 Not Found');
-  echo "404 Not found ($action).";
+$vars = array();
+foreach ($controllers as $c) {
+  $regex = $c[0];
+  $file = $c[1];
+  if (preg_match($regex, $resource, $matches)) {
+    $vars = array();
+    foreach ($matches as $k => $v) {
+      if (!is_int($k)) {
+        $vars[$k] = $v;
+      }
+    }
+    if (include_once($file)) {
+      exit;
+    } else {
+      header('HTTP/1.0 404 Not Found');
+      die("No such file: $file");
+    }
+  }
 }
+header('HTTP/1.0 404 Not Found');
+echo "404 Not found ($resource).";
 ?>
index fa2d87e..319a07c 100644 (file)
@@ -1,5 +1,24 @@
 body {
   padding-top: 70px;
+  padding-bottom: 40px;
+}
+ul.nav > li > a:focus {
+  outline: none;
+}
+.footer {
+  padding-top: 5px;
+  border-top: 1px solid #333;
+  max-height: 40px;
+}
+.footer li {
+  color: #9D9D9D;
+}
+.footer a {
+  color: #539AD7;
+}
+.footer a:hover,
+.footer a:focus {
+  color: #73BAF7;
 }
 .inverse-dropdown {
   background-color: #222;
@@ -16,3 +35,37 @@ body {
 .inverse-dropdown>.divider {
   background-color: #000;
 }
+.table-hover > tbody > tr:hover {
+  background-color: #DDEEFF;
+}
+a.file-dl,
+a.file-dl:hover {
+  text-decoration: none;
+}
+a.download-branch img,
+a.download-tag img {
+  width: 16px;
+  height: 16px;
+}
+div.uri {
+  color: black;
+}
+div.uri:hover {
+  color: #337AB7;
+}
+div.uri::before,
+div.uri:hover:before {
+  color: #333;
+}
+div.uri-ssh:before {
+  content: "Member clone: ";
+  font-size: 0.8em;
+}
+div.uri-git:before {
+  content: "Public clone: ";
+  font-size: 0.8em;
+}
+div.uri-http:before {
+  content: "Public clone: ";
+  font-size: 0.8em;
+}
index c430b19..33fdba2 100644 (file)
@@ -3,4 +3,9 @@ require_once('include.inc.php');
 session_destroy();
 unset($_SESSION['username']);
 $logged = false;
-header('Location: /' . $gitwebroot);
+$username = null;
+if (empty($_GET['url'])) {
+  redirect('/');
+} else {
+  redirecturl($_GET['url']);
+}
index c9a94a4..cad39e4 100644 (file)
@@ -1,6 +1,20 @@
     </div>
-    <script src="js/jquery.min.js"></script>
-    <script src="js/bootstrap.min.js"></script>
+    <div class="footer navbar-fixed-bottom navbar-inverse">
+      <ul class="text-center list-inline">
+        <li><a href="https://github.com/jrd/simple-git-host" target="github">Simple Git Host</a></li>
+        <li> • </li>
+        <li>version&nbsp;<strong><?php readfile('.version'); ?></strong></li>
+        <li> • </li>
+        <li>by&nbsp;<strong><?php readfile('.copyright'); ?></strong></li>
+        <li> • </li>
+        <li>license&nbsp;<strong><?php readfile('.license'); ?></strong></li>
+      </ul>
+    </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) { ?>
+    <script type="text/javascript" src="<?php echo $js;?>"></script>
+    <?php } ?>
   </body>
 </html>
 
index 27d0ba1..2ee29d5 100644 (file)
@@ -4,8 +4,47 @@ setlocale(LC_CTYPE, 'fr_FR.UTF-8');
 session_start();
 $errorMsg = '';
 $logged = false;
+$username = null;
 $admin = false;
 
+function _getvars($args, $offset) {
+  $vars = array();
+  $n = count($args);
+  for ($i = $offset; $i < $n; $i += 2) {
+    if (array_key_exists($i + 1, $args)) {
+      $vars[$args[$i]] = $args[$i + 1];
+    }
+  }
+  return $vars;
+}
+
+function url($name, $vars) {
+  global $controllers, $gitwebroot;
+  if ($vars !== null && !is_array($vars)) {
+    $vars = _getvars(func_get_args(), 1);
+  }
+  ($name == '/' || array_key_exists($name, $controllers)) || die("controller ($name) does not exist.");
+  $url = "/$gitwebroot";
+  if ($name != '/') {
+    $regex = $controllers[$name][0];
+    $uri = substr($regex, 2, -2); // remove /^ and $/
+    $uri = preg_replace_callback(',\(\?P<([a-z0-9]+)>[^)]+\),', function($m) use (&$vars) { return array_key_exists($m[1], $vars) ? $vars[$m[1]] : $m[1]; }, $uri);
+    $bs = '\\';
+    $uri = preg_replace(
+      array("/[^$bs$bs][()]/", "/$bs$bs([()])/", "/$bs$bs(.)/"),
+      array(''               , '$1'            , '$1'),
+      $uri);
+    $url .= $uri;
+  }
+  return $url;
+}
+function purl($name, $vars) {
+  if ($vars !== null && !is_array($vars)) {
+    $vars = _getvars(func_get_args(), 1);
+  }
+  echo url($name, $vars);
+}
+
 function gitrepoinfo($params) {
   global $gituser, $gitdir;
   $p = '';
@@ -26,35 +65,38 @@ function isadmin($user) {
 }
 
 function isrepoadmin($repo, $user) {
-  $isadmin = false;
-  foreach (gitrepoinfo('show-users', $repo) as $userinfo) {
-    $info = explode(':', $userinfo);
-    if ($info[0] == $user) {
-      $isadmin = ($info[1] == 'admin');
-      break;
-    }
+  $right = gitrepoinfo('user-right', $repo, $user);
+  if ($right !== false) {
+    $right = implode('', $right);
   }
-  return $isadmin;
+  return $right == 'admin';
 }
 
+function redirecturl($url) {
+  header("Location: $url");
+  exit;
+}
 function redirectifnotadmin() {
-  global $admin, $gitwebroot;
+  global $admin;
   if (!$admin) {
-    header('Location: /' . $gitwebroot);
-    exit;
+    redirect('/');
   }
 }
-
 function redirectifnotrepoadmin($repo) {
-  global $logged, $admin, $gitwebroot;
-  if (!$logged || (!$admin && !isrepoadmin($repo, $_SESSION['username']))) {
-    header('Location: /' . $gitwebroot);
-    exit;
+  global $logged, $username, $admin;
+  if (!$logged || (!$admin && !isrepoadmin($repo, $username))) {
+    redirect('/');
+  }
+}
+function redirect($name, $vars) {
+  if ($vars !== null && !is_array($vars)) {
+    $vars = _getvars(func_get_args(), 1);
   }
+  redirecturl(url($name, $vars));
 }
 
 function auth() {
-  global $errorMsg, $logged, $admin, $gitwebroot;
+  global $errorMsg, $logged, $username, $admin;
   if (isset($_POST['submit_auth'])) {
     $fUsername = $_POST['username'];
     $fPassword = $_POST['password'];
@@ -73,21 +115,28 @@ function auth() {
       }
     } else {
       unset($_SESSION['username']);
-      $errorMsg = "L'utilisateur $fUsername n'existe pas.";
+      $errorMsg = "L'utilisateur <strong>$fUsername</strong> n'existe pas.";
     }
     $logged = !empty($_SESSION['username']);
     if ($logged) {
+      $username = $_SESSION['username'];
       // Test si l'utilisateur est admin
-      $admin = isadmin($_SESSION['username']);
+      $admin = isadmin($username);
       // Redirige pour éviter de reposter le formulaire.
-      header('Location: /' . $gitwebroot);
-      exit;
+      if (empty($_GET['url'])) {
+        redirect('/');
+      } else {
+        redirecturl($_GET['url']);
+      }
+    } else {
+      $username = null;
     }
   } else {
-    $logged = !empty($_SESSION['username']);
+    $username = $_SESSION['username'];
+    $logged = !empty($username);
     if ($logged) {
       // Test si l'utilisateur est admin
-      $admin = isadmin($_SESSION['username']);
+      $admin = isadmin($username);
     }
   }
 }
diff --git a/src/js/repo-list.js b/src/js/repo-list.js
new file mode 100644 (file)
index 0000000..7153632
--- /dev/null
@@ -0,0 +1,20 @@
+$(function() {
+  $('#tabs>li>a').each(function(index) {
+    if (!$(this).data('div')) {
+      return;
+    }
+    $(this).click(function() {
+      $(this).parent().parent().children().removeClass('active');
+      $(this).parent().parent().find('a').each(function(index2) {
+        $($(this).data('div')).hide();
+      });
+      $(this).parent().addClass('active');
+      $($(this).data('div')).show();
+      return false;
+    });
+    if (!$(this).parent().hasClass('active')) {
+      $($(this).data('div')).hide();
+    }
+  });
+});
+
index e04450f..2af9f5d 100644 (file)
@@ -7,7 +7,7 @@
         <span class="icon-bar"></span>
         <span class="icon-bar"></span>
       </button>
-      <a class="navbar-brand" href="/<?php echo $gitwebroot;?>"><?php echo $pageTitle; ?></a>
+      <a class="navbar-brand" href="<?php purl('/');?>"><?php echo $title; ?></a>
     </div>
     <div id="navbar" class="collapse navbar-collapse">
       <ul class="nav navbar-nav">
@@ -17,31 +17,48 @@ $nb = 0;
 foreach ($files as $file) {
   if ($file[0] == '.') continue;
   if (is_dir("$gitdir/$file") && preg_match('/\.git$/', $file)) {
-    $nb++;
-  }
-  if ($nb == 0) {
-    $nb = '';
+    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++;
+      }
+    }
   }
 }
+if ($nb == 0) {
+  $nb = '';
+}
+if (empty($cat)) {
+  $cat = 'repos';
+}
         ?>
-          <li class="active"><a href="/<?php echo $gitwebroot;?>list"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>&nbsp;Repositories <span class="badge"><?php echo $nb; ?></span></a></li>
-        <li><a href="#about">About</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 <span class="badge"><?php echo $nb; ?></span></a></li>
+        <?php if ($admin) { ?>
+        <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>
       </ul>
-<?php if ($logged) { $login = $_SESSION['username']; ?>
+<?php if ($logged) { ?>
       <ul class="nav navbar-nav navbar-right">
-        <li class="dropdown">
-          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="glyphicon glyphicon-user" aria-hidden="true"></span>&nbsp;<?php echo $login; ?> <span class="caret"></span></a>
+        <li class="dropdown <?php echo $cat == 'account' ? 'active' : '';?>">
+          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="glyphicon glyphicon-user" aria-hidden="true"></span>&nbsp;&nbsp;<?php echo $username; ?>&nbsp;<span class="caret"></span></a>
           <ul class="dropdown-menu inverse-dropdown" role="menu">
-            <li><a href="/<?php echo $gitwebroot;?>account"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>&nbsp;Mon compte</a></li>
-            <li class="divider"></li>
-            <li><a href="/<?php echo $gitwebroot;?>disconnect"><span class="glyphicon glyphicon-off" aria-hidden="true"></span>&nbsp;Se déconnecter</a></li>
+            <li role="presentation"><a href="<?php purl('account');?>"><span class="glyphicon glyphicon-wrench" aria-hidden="true"></span>&nbsp;&nbsp;Mon compte</a></li>
+            <li role="presentation" class="divider"></li>
+            <li role="presentation"><a href="<?php echo url('logout') . "?url=${_SERVER['REQUEST_URI']}";?>"><span class="glyphicon glyphicon-log-out" aria-hidden="true"></span>&nbsp;&nbsp;Se déconnecter</a></li>
           </ul>
         </li>
       </ul>
 <?php } else {
   $haserror = $errorMsg ? 'has-error' : '';
 ?>
-      <form class="navbar-form navbar-right" role="form" action="" method="POST">
+      <form class="navbar-form navbar-right" role="form" action="<?php echo "?url=${_SERVER['REQUEST_URI']}";?>" method="POST">
         <div class="form-group <?php echo $haserror; ?>">
           <label class="sr-only" for="username">Login</label>
           <input type="text" placeholder="Login" class="form-control" name="username" <?php if ($haserror) { echo 'aria-invalid="true"'; } ?>>
@@ -50,11 +67,13 @@ foreach ($files as $file) {
           <label class="sr-only" for="password">Password</label>
           <input type="password" placeholder="Password" class="form-control" name="password" <?php if ($haserror) { echo 'aria-invalid="true"'; } ?>>
         </div>
-        <button type="submit" name="submit_auth" class="btn btn-success" value="1">Sign in</button>
+        <button type="submit" name="submit_auth" class="btn btn-success" value="1"><span class="glyphicon glyphicon-log-in" aria-hidden="true"></span>&nbsp;&nbsp;Sign in</button>
       </form> 
 <?php } ?>
     </div>
   </div>
 </nav>
 <div class="container">
-  <?php if ($errorMsg) { ?><div class="alert alert-danger alert-dismissible pull-right" role="alert"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>&nbsp;<?php echo $errorMsg; ?><button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button></div><?php } ?>
+<?php if ($errorMsg) { ?>
+  <div class="alert alert-danger alert-dismissible" role="alert"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span>&nbsp;<?php echo $errorMsg; ?>&nbsp;<button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button></div>
+<?php } ?>
index 801a71a..b604ca3 100644 (file)
@@ -1,11 +1,10 @@
 <?php
 require_once('include.inc.php');
 redirectifnotadmin();
-if (!$logged || empty($_GET['repo'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (!$logged || empty($vars['repo'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
+  $repo = $vars['repo'];
 }
 $res = gitrepoinfo('destroy', $repo);
-header("Location: /$gitwebroot");
+redirect('repo-list');
index 4fa4182..ff1e842 100644 (file)
@@ -1,13 +1,13 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['filename'])) {
+if (empty($vars['filename'])) {
   header('HTTP/1.0 404 Not Found');
   exit;
 } else {
-  $repo = $_GET['repo'];
-  $branch = $_GET['branch'];
-  $filename = $_GET['filename'];
-  $ret = preg_match("/^{$repo}-{$branch}.tar.(gz|xz)\$/", $filename, $options);
+  $repo = $vars['repo'];
+  $branch = $vars['branch'];
+  $filename = $vars['filename'];
+  $ret = preg_match("/^$repo-$branch\.tar\.(gz|xz)\$/", $filename, $options);
   if ($ret == 0) {
     header('HTTP/1.0 404 Not Found');
     exit;
index 8c72114..d580f1c 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['filename'])) {
+if (empty($vars['filename'])) {
   header('HTTP/1.0 404 Not Found');
   exit;
 } else {
-  $repo = $_GET['repo'];
-  $branch = $_GET['branch'];
-  $filename = urldecode($_GET['filename']);
+  $repo = $vars['repo'];
+  $branch = $vars['branch'];
+  $filename = urldecode($vars['filename']);
   $hashtmp = sha1($_SERVER['REQUEST_URI'] . time());
   $mime = trim(shell_exec("cd $gitdir/$repo.git; git cat-file blob $branch:$filename > /tmp/file-$hashtmp; file --mime-type /tmp/file-$hashtmp|cut -d: -f2"));
   $bfilename = basename($filename);
index bbc2811..b67e779 100644 (file)
@@ -1,30 +1,18 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['filename'])) {
+if (empty($vars['filename'])) {
   header('HTTP/1.0 404 Not Found');
   exit;
 } else {
-  $filename = $_GET['filename'];
-  if (isset($_GET['repo'])) {
-    $repo = $_GET['repo'];
-    $ret = preg_match("/^{$_GET['repo']}-(.+).tar.(gz|xz)\$/", $filename, $options);
-    if ($ret == 0) {
-      header('HTTP/1.0 404 Not Found');
-      exit;
-    }
-    $tag = $options[1];
-    $format = $options[2];
-  } else {
-    // Guess the repo from the download name
-    $ret = preg_match('/^(.+)-([^-]+).tar.(gz|xz)$/', $filename, $options);
-    if ($ret == 0) {
-      header('HTTP/1.0 404 Not Found');
-      exit;
-    }
-    $repo = $options[1];
-    $tag = $options[2];
-    $format = $options[3];
+  $repo = $vars['repo'];
+  $tag = $vars['tag'];
+  $filename = $vars['filename'];
+  $ret = preg_match("/^$repo-$tag\.tar\.(gz|xz)\$/", $filename, $options);
+  if ($ret == 0) {
+    header('HTTP/1.0 404 Not Found');
+    exit;
   }
+  $format = $options[1];
   switch ($format) {
     case 'gz':
       $mime = 'application/x-gzip';
index 82d121e..542a644 100644 (file)
@@ -1,10 +1,9 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['repo'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (empty($vars['repo'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
+  $repo = $vars['repo'];
 }
 redirectifnotrepoadmin($repo);
 $errorMsgDesc = '';
@@ -12,11 +11,14 @@ $errorMsgConfig = '';
 $errorMsgExport = '';
 $errorMsgSyncTo = '';
 $errorMsgSyncFrom = '';
+$redirect = false;
 if (isset($_POST['submit_repo_desc'])) {
   $fDesc = $_POST['new-desc'];
   $res = gitrepoinfo('set', $repo, 'description', $fDesc);
   if ($res === false) {
     $errorMsgDesc = "La description n'a pas pu être appliquée.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_POST['submit_repo_config'])) {
   $fOption = $_POST['new-option'];
@@ -24,41 +26,58 @@ if (isset($_POST['submit_repo_desc'])) {
   $res = gitrepoinfo('set', $repo, $fOption, $fValue);
   if ($res === false) {
     $errorMsgConfig = "L'option n'a pas pu être appliquée.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_POST['submit_repo_export'])) {
   $fExport = $_POST['new-export'] == 'on' ? 'on' : 'off';
   $res = gitrepoinfo('export', $repo, $fExport);
   if ($res === false) {
     $errorMsgExport = "L'export n'a pas pu être appliqué.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_POST['submit_repo_syncto_add'])) {
   $fUrl = $_POST['new-syncto-url'];
   $res = gitrepoinfo('sync', $repo, 'to', $fUrl);
   if ($res === false) {
     $errorMsgSyncTo = "L'url n'a pas pu être ajoutée.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_POST['submit_repo_syncto_deploy'])) {
   $res = gitrepoinfo('deploy-key', $repo);
   if ($res === false) {
     $errorMsgSyncTo = "La clé de déploiement n'a pas pu être ajoutée.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_GET['delete']) && $_GET['delete'] == 'syncto') {
   $fUrl = $_GET['url'];
   $res = gitrepoinfo('unsync', $repo, 'to', $fUrl);
-  header("Location: /{$gitwebroot}edit/$repo");
+  $redirect = true;
 } else if (isset($_POST['submit_repo_syncfrom_add'])) {
   $fUrl = $_POST['new-syncfrom-url'];
   $res = gitrepoinfo('sync', $repo, 'from', $fUrl);
   if ($res === false) {
     $errorMsgSyncFrom = "L'url n'a pas pu être ajoutée.";
+  } else {
+    $redirect = true;
   }
 } else if (isset($_GET['delete']) && $_GET['delete'] == 'syncfrom') {
   $fUrl = $_GET['url'];
   $res = gitrepoinfo('unsync', $repo, 'from', $fUrl);
-  header("Location: /{$gitwebroot}edit/$repo");
+  $redirect = true;
+}
+if ($redirect) {
+  redirecturl($_SERVER['REQUEST_URI']);
 }
 $pageTitle = "$title - Configuration de $repo";
 require('header.inc.php');
+$repo_tab_active = 'admin';
+$exportok = file_exists("$gitdir/$repo.git/git-daemon-export-ok");
+$repoadmin = true;
+require('repo-nav.inc.php');
 ?>
     <div id="desc">
       <div class="error"><?php echo $errorMsgDesc; ?></div>
index 57da187..6da8e92 100644 (file)
@@ -1,19 +1,19 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['repo'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (empty($vars['repo'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
+  $repo = $vars['repo'];
 }
 $pageTitle = "$title - $repo";
 require('header.inc.php');
+$repo_tab_active = 'histo';
+$repoadmin = $admin || isrepoadmin($repo, $username);
+$exportok = file_exists("$gitdir/$repo.git/git-daemon-export-ok");
+require('repo-nav.inc.php');
 ?>
-    <div id="repo-toolbar">
-      <a href="/<?php echo $gitwebroot;?>info/<?php echo $repo; ?>">Info</a>&nbsp;<a href="/<?php echo $gitwebroot;?>histo/<?php echo $repo; ?>">Historique</a>
-    </div>
     <div id="histo">
-      <div class="invite">Le graphe d'historique de <span><?php echo $repo; ?></span> :</div>
+      <h3>Le graphe d'historique de <strong><?php echo $repo; ?></strong> :</h3>
       <pre>
 <?php
   $grapheArray = gitrepoinfo('graph', $repo);
index d4e9822..527d722 100644 (file)
@@ -1,10 +1,10 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['repo'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (empty($vars['repo'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
+  $repo = $vars['repo'];
+  $selectedBranch = array_key_exists('branch', $vars) ? $vars['branch'] : '';
 }
 $pageTitle = "$title - $repo";
 require('header.inc.php');
@@ -15,7 +15,6 @@ if (empty($desc) || preg_match('/^Unnamed repository;/', $desc)) {
 exec("GIT_DIR=$gitdir/$repo.git git branch --no-color -l", $branches);
 if ($branches[0] == "") { $branches = array(); }
 $branchesMap = array();
-$selectedBranch = $_GET['branch'];
 foreach ($branches as $branch) {
   $branch = trim($branch);
   if ($branch[0] == '*') {
@@ -31,71 +30,78 @@ foreach ($branches as $branch) {
 }
 exec("GIT_DIR=$gitdir/$repo.git git tag -l", $tags);
 if ($tags[0] == "") { $tags = array(); }
+$files = array();
 exec("GIT_DIR=$gitdir/$repo.git git ls-tree -r --name-only -z refs/heads/$selectedBranch | xargs --null -if echo f", $files);
+$repo_tab_active = 'info';
+$repoadmin = $admin || isrepoadmin($repo, $username);
+$exportok = file_exists("$gitdir/$repo.git/git-daemon-export-ok");
+require('repo-nav.inc.php');
 ?>
-    <div id="repo-toolbar">
-      <a href="/<?php echo $gitwebroot;?>info/<?php echo $repo; ?>">Info</a>&nbsp;<a href="/<?php echo $gitwebroot;?>histo/<?php echo $repo; ?>">Historique</a>
-    </div>
-    <div id="repoinfo">
-      <div class="info">
-        <div class="description">
-          <h2>Description</h2>
-          <span><?php echo $desc; ?></span>
+    <div>
+      <div class="pull-right">
+        <div class="panel panel-default">
+          <div class="panel-heading">Description</div>
+          <div class="panel-body"><?php echo $desc; ?></div>
         </div>
-        <div class="branches">
-          <h2>Branches</h2>
-          <label for"selected-branch">Branche actuelle :</label>
-          <select id="selected-branch" size="1" onchange="br=this.options[this.selectedIndex].value; location='/<?php echo $gitwebroot;?>info/<?php echo $repo; ?>/' + br;">
-            <?php foreach ($branchesMap as $branch => $def) {
-              echo "<option value=\"$branch\"";
-              if ($branch == $selectedBranch) {
-                echo ' selected="selected"';
-              }
-              echo ">$branch</option>\n";
-            } ?>
-          </select>
-          <ul>
-            <?php
-              foreach ($branchesMap as $branch => $def) {
-                if ($def) {
-                  $branchHtml = "<strong>$branch</strong>";
-                } else {
-                  $branchHtml = $branch;
+        <div class="panel panel-default">
+          <div class="panel-heading">Branches</div>
+          <div class="panel-body">
+            <label for"selected-branch">Branche actuelle :</label>
+            <select id="selected-branch" size="1" onchange="br=this.options[this.selectedIndex].value; location='<?php purl('repo-info-branch', 'repo', $repo, 'branch', ''); ?>' + br;">
+              <?php foreach ($branchesMap as $branch => $def) {
+                echo "<option value=\"$branch\"";
+                if ($branch == $selectedBranch) {
+                  echo ' selected="selected"';
+                }
+                echo ">$branch</option>\n";
+              } ?>
+            </select>
+            <ul>
+              <?php
+                foreach ($branchesMap as $branch => $def) {
+                  if ($def) {
+                    $branchHtml = "<strong>$branch</strong>";
+                  } else {
+                    $branchHtml = $branch;
+                  }
+                  echo "<li>$branchHtml <a class=\"download-branch\" href=\"" . url('repo-dl-branch', 'repo', $repo, 'branch', $branch, 'filename', "$repo-$branch.tar.gz") . "\"><img src=\"/{$gitwebroot}package.png\"/></a></li>\n";
                 }
-                echo "<li>$branchHtml <a class=\"image\" href=\"/{$gitwebroot}download_branch/$repo/$branch/$repo-$branch.tar.gz\"><img src=\"/{$gitwebroot}package.png\"/></a></li>\n";
-              }
-            ?>
-          </ul>      
+              ?>
+            </ul>
+          </div>
         </div>
-        <div class="tags">
-          <h2>Tags</h2>
-          <ul>
-            <?php
-              foreach ($tags as $tag) {
-                echo "<li>$tag <a class=\"image\" href=\"/{$gitwebroot}download/$repo/$repo-$tag.tar.gz\"><img src=\"/{$gitwebroot}package.png\"/></a></li>\n";
-              }
-            ?>
-          </ul>      
+        <div class="panel panel-default">
+          <div class="panel-heading">Tags</div>
+          <div class="panel-body">
+            <ul>
+              <?php
+                foreach ($tags as $tag) {
+                  echo "<li>$tag <a class=\"download-tag\" href=\"" . url('repo-dl-tag', 'repo', $repo, 'tag', $tag, 'filename', "$repo-$tag.tar.gz") . "\"><img src=\"/{$gitwebroot}package.png\"/></a></li>\n";
+                }
+              ?>
+            </ul>      
+          </div>
         </div>
-        <div class="tags">
-          <h2>URL</h2>
-          <div class="rw"><?php echo "$gituser@$githost:$repo.git"; ?></div>
-          <?php if (file_exists("$gitdir/$repo.git/git-daemon-export-ok")) { ?>
-            <div class="ro-git"><?php echo "git://$githost/$repo.git"; ?></div>
-            <?php $httpurl = sprintf("%s://%s/{$gitwebroot}readonly/%s.git", isset($_SERVER['HTTPS']) ? 'https' : 'http', $_SERVER['HTTP_HOST'], $repo); ?>
-            <div class="ro-http"><?php echo "$httpurl"; ?></div>
-          <?php } ?>
+        <div class="panel panel-default">
+          <div class="panel-heading">URL</div>
+          <div class="panel-body">
+            <div class="uri uri-ssh"><?php echo "$gituser@$githost:$repo.git"; ?></div>
+            <?php if (file_exists("$gitdir/$repo.git/git-daemon-export-ok")) { ?>
+              <div class="uri uri-git"><?php echo "git://$githost/$repo.git"; ?></div>
+              <?php $httpurl = sprintf("%s://%s/{$gitwebroot}readonly/%s.git", isset($_SERVER['HTTPS']) ? 'https' : 'http', $_SERVER['HTTP_HOST'], $repo); ?>
+              <div class="uri uri-http"><?php echo "$httpurl"; ?></div>
+            <?php } ?>
+          </div>
         </div>
       </div>
-      <div class="files">
+      <div id="files">
         <h2>Fichiers</h2>
         <div>
           <?php foreach ($files as $file) {
             $fileEncoded = urlencode($file);
             $fileHtml = htmlspecialchars($file);
-            echo "<a class=\"file-dl\" title=\"Télécharger $fileHtml\" href=\"/{$gitwebroot}download_file/$repo/$selectedBranch/$fileEncoded/dl\"><strong>↓</strong>";
-            echo "&nbsp;";
-            echo "<a class=\"file-show\" target=\"_blank\" title=\"Afficher $fileHtml\" href=\"/{$gitwebroot}show_file/$repo/$selectedBranch/$fileEncoded/show\">$fileHtml</a></a><br/>\n";
+            echo "<a class=\"file-dl\" title=\"Télécharger $fileHtml\" href=\"" . url('repo-dl-file', 'repo', $repo, 'branch', $selectedBranch, 'filename', $fileEncoded) . '"><span class="glyphicon glyphicon-download" aria-hidden="true"></span>&nbsp;&nbsp;</a>&nbsp;';
+            echo "<a class=\"file-show\" target=\"_blank\" title=\"Afficher $fileHtml\" href=\"" . url('repo-show-file', 'repo', $repo, 'branch', $selectedBranch, 'filename', $fileEncoded) . "\">$fileHtml</a><br/>\n";
           } ?>
         </div>
       </div>
index 56fa10c..186c608 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 require_once('include.inc.php');
+$tab_active = 'list';
 if ($logged && isset($_POST['submit_repo'])) {
+  $tab_active = 'add';
   $fRepo = $_POST['new-repo'];
   $fDesc = $_POST['new-desc'];
   $res = gitrepoinfo('create', $fRepo, $fDesc);
@@ -12,20 +14,33 @@ if ($logged && isset($_POST['submit_repo'])) {
     }
     # add current user as admin to the newly created repo.
     gitrepoinfo('add-user', $fRepo, $_SESSION['username'], 'admin');
+    $tab_active = 'list';
   }
 }
 $pageTitle = $title;
+$cat = 'repos';
+$extrajs = array("/${gitwebroot}js/repo-list.js");
 require('header.inc.php');
 ?>
-    <div id="repos">
-      <div class="invite">Les dépôts Git :</div>
-      <table>
-        <tr>
-          <th class="name">Nom</th>
-          <th class="address">Adresse</th>
-          <th class="member">Membre ?</th>
-          <th class="actions">Actions</th>
-        </tr>
+    <ul class="nav nav-pills" id="tabs">
+      <li role="presentation" class="<?php if ($tab_active == 'list') { echo 'active'; }?>"><a href="javascript:" data-div="#repo-list">Dépôts</a></li>
+      <?php if ($logged) { ?>
+      <li role="presentation" class="<?php if ($tab_active == 'add') { echo 'active'; }?>"><a href="javascript:" data-div="#repo-add"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span>&nbsp;&nbsp;Ajouter</a></li>
+      <?php } ?>
+    </ul>
+    <div id="repo-list">
+      <h3>Les dépôts Git :</h3>
+      <div class="table-responsive">
+        <table class="table table-hover">
+          <thead>
+            <tr>
+              <th>Nom</th>
+              <th>Adresses</th>
+              <th>Membre ?</th>
+              <th>Actions</th>
+            </tr>
+          </thead>
+          <tbody>
 <?php
 $files = scandir($gitdir);
 foreach ($files as $file) {
@@ -37,17 +52,20 @@ foreach ($files as $file) {
       $desc = $proj;
     }
     if ($logged) {
-      $right = 'no';
-      foreach (gitrepoinfo('show-users', $proj) as $userinfo) {
-        $info = explode(':', $userinfo);
-        if ($info[0] == $_SESSION['username']) {
-          $right = $info[1];
-          break;
-        }
+      $right = gitrepoinfo('user-right', $proj, $_SESSION['username']);
+      if ($right !== false) {
+        $right = implode('', $right);
+      }
+      if (!$right || empty($right)) {
+        $right = 'no';
       }
     } else {
       $right = null;
     }
+    $exportok = file_exists("$gitdir/$file/git-daemon-export-ok");
+    if (!$admin && !$exportok && ($right == null || $right == 'no')) {
+      continue;
+    }
     switch ($right) {
       case 'admin':
         $member = 'Admin';
@@ -65,52 +83,45 @@ foreach ($files as $file) {
         $member = '<span title="Veuillez vous identifier"> ? </span>';
         break;
     }
-    $actions = "<a href=\"/{$gitwebroot}info/$proj\">Info</a>&nbsp;<a href=\"/{$gitwebroot}users/$proj\">Utilisateurs</a>&nbsp;<a href=\"/{$gitwebroot}histo/$proj\">Historique</a>";
+    $actions = "<a href=\"".url('repo-info', 'repo', $proj)."\"><span class=\"glyphicon glyphicon-info-sign\" aria-hidden=\"true\"></span>&nbsp;Info</a>";
+    $actions .= "&nbsp;<a href=\"".url('repo-histo', 'repo', $proj)."\"><span class=\"glyphicon glyphicon-list\" aria-hidden=\"true\"></span>&nbsp;Historique</a>";
+    if ($exportok) {
+      $actions .= "&nbsp;<a href=\"/$gitwebroot$gitwebpath/?p=$file\" target=\"gitweb\"><span class=\"glyphicon glyphicon-hand-right\" aria-hidden=\"true\"></span>&nbsp;Gitweb</a>";
+    }
+    $actions .= "&nbsp;<a href=\"".url('repo-users', 'repo', $proj)."\"><span class=\"glyphicon glyphicon-user\" aria-hidden=\"true\"></span>&nbsp;Utilisateurs</a>";
     if ($admin || $right == 'admin') {
-      $actions .= "&nbsp;<a class=\"edit\" href=\"/{$gitwebroot}edit/$proj\">Éditer</a>";
-      $actions .= "&nbsp;<a class=\"delete\" href=\"/{$gitwebroot}delete/$proj\" onclick=\"return confirm('Êtes-vous sûr de vouloir supprimer le dépôt \'$proj\' ?');\">Supprimer</a>";
+      $actions .= "&nbsp;<a class=\"edit\" href=\"".url('repo-edit', 'repo', $proj)."\"><span class=\"glyphicon glyphicon-pencil\" aria-hidden=\"true\"></span>&nbsp;Éditer</a>";
+      $actions .= "&nbsp;<a class=\"delete\" href=\"".url('repo-del', 'repo', $proj)."\" onclick=\"return confirm('Êtes-vous sûr de vouloir supprimer le dépôt \'$proj\' ?');\"><span class=\"glyphicon glyphicon-trash\" aria-hidden=\"true\"></span>&nbsp;Supprimer</a>";
     }
     $name = $proj;
-    $exportok = file_exists("$gitdir/$file/git-daemon-export-ok");
-    if (!empty($gitwebpath) && $exportok) {
-      $name .= "&nbsp;<a href=\"$gitwebpath/?p=$file\">⇒</a>";
-    }
-    echo "        <tr><td class=\"name\" title=\"$desc\">$name</td><td class=\"address\">";
-    echo "<div class=\"rw\">$gituser@$githost:$file</div>";
+    echo "        <tr><td title=\"$desc\"><a href=\"".url('repo-info', 'repo', $proj)."\">$name</a></td><td class=\"address\">";
+    echo "<div class=\"uri uri-ssh\">$gituser@$githost:$file</div>";
     if ($exportok) {
-      echo "<div class=\"ro-git\">git://$githost/$file</div>";
+      echo "<div class=\"uri uri-git\">git://$githost/$file</div>";
       $httpurl = sprintf("%s://%s/{$gitwebroot}readonly/%s", isset($_SERVER['HTTPS']) ? 'https' : 'http', $_SERVER['HTTP_HOST'], $file);
-      echo "<div class=\"ro-http\">$httpurl</div>";
+      echo "<div class=\"uri uri-http\">$httpurl</div>";
     }
     echo "</td><td class=\"member\">$member</td><td class=\"actions\">$actions</td></tr>\n";
   }
 }
 ?>
-      </table>
+            </tbody>
+        </table>
+      </div>
     </div>
 <?php if ($logged) { ?>
-    <div class="error"><?php echo $errorMsg; ?></div>
-    <form id="repo-add" action="" method="POST">
-      <fieldset>
-        <legend>Ajouter un dépôt</legend>
-        <table>
-          <tr>
-            <td>
-              <label for="new-repo">Nom du nouveau dépôt :</label>&nbsp;<input type="text" name="new-repo" id="new-repo" value=""/>
-              <br/><label for="new-desc">Description :</label>&nbsp;<input type="text" name="new-desc" id="new-desc" value=""/>
-              <?php if (!empty($gitwebpath)) { ?>
-              <br/><label for="new-export">Anonymous read-only access :</label>&nbsp;<input type="checkbox" name="new-export" id="new-export" value="on"/>
-              <?php } ?>
-            </td>
-            <td>
-              <input type="submit" name="submit_repo" value="Ajouter le dépôt"/>
-            </td>
-          </tr>
-        </table>
-      </fieldset>
-    </form>
-<?php } ?>
-<?php if ($admin) { ?>
-    <a href="/<?php echo $gitwebroot;?>manage_users">Gestion des utilisateurs</a>
+    <div id="repo-add">
+      <form id="repo-add" action="" method="POST">
+        <fieldset>
+          <legend>Ajouter un dépôt</legend>
+          <label for="new-repo">Nom du nouveau dépôt :</label>&nbsp;<input type="text" name="new-repo" id="new-repo" value=""/>
+          <br/><label for="new-desc">Description :</label>&nbsp;<input type="text" name="new-desc" id="new-desc" value=""/>
+          <?php if (!empty($gitwebpath)) { ?>
+          <br/><label for="new-export">Anonymous read-only access :</label>&nbsp;<input type="checkbox" name="new-export" id="new-export" value="on"/>
+          <?php } ?>
+          <br/><input type="submit" name="submit_repo" value="Ajouter le dépôt"/>
+        </fieldset>
+      </form>
+    </div>
 <?php } ?>
 <?php require('footer.inc.php'); ?>
diff --git a/src/repo-nav.inc.php b/src/repo-nav.inc.php
new file mode 100644 (file)
index 0000000..4080ec6
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+// $repo_tab_active
+// $repo
+// $repoadmin
+// $exportok
+?>
+<ul class="nav nav-pills">
+  <li role="presentation" <?php echo $repo_tab_active == 'info' ? 'class="active"' : ''; ?>><a href="<?php purl('repo-info', 'repo', $repo); ?>"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>&nbsp;&nbsp;Info</a></li>
+  <li role="presentation" <?php echo $repo_tab_active == 'histo' ? 'class="active"' : ''; ?>><a href="<?php purl('repo-histo', 'repo', $repo); ?>"><span class="glyphicon glyphicon-list" aria-hidden="true"></span>&nbsp;&nbsp;Historique</a></li>
+  <?php if ($exportok) { ?>
+  <li role="presentation"><a href="<?php echo "/$gitwebroot$gitwebpath/?p=$repo.git"; ?>" target="gitweb"><span class="glyphicon glyphicon-hand-right" aria-hidden="true"></span>&nbsp;&nbsp;Gitweb</a></li>
+  <?php } ?>
+  <li class="dropdown <?php echo $repo_tab_active == 'admin' ? 'active' : '';?>">
+    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><span class="glyphicon glyphicon-cog" aria-hidden="true"></span>&nbsp;&nbsp;Administrer&nbsp;<span class="caret"></span></a>
+    <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>
+    </ul>
+  </li>
+</ul>
index fd80b89..f3fea5a 100644 (file)
@@ -1,12 +1,12 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['filename'])) {
+if (empty($vars['filename'])) {
   header('HTTP/1.0 404 Not Found');
   exit;
 } else {
-  $repo = $_GET['repo'];
-  $branch = $_GET['branch'];
-  $filename = urldecode($_GET['filename']);
+  $repo = $vars['repo'];
+  $branch = $vars['branch'];
+  $filename = urldecode($vars['filename']);
   $hashtmp = sha1($_SERVER['REQUEST_URI'] . time());
   $mime = trim(shell_exec("cd $gitdir/$repo.git; git cat-file blob $branch:$filename > /tmp/file-$hashtmp; file --mime-type /tmp/file-$hashtmp|cut -d: -f2"));
   $filenameHtml = htmlentities($filename);
@@ -23,7 +23,7 @@ if (empty($_GET['filename'])) {
     if ($mime = 'inode/x-empty') {
       echo "<h3>Le fichier $filenameHtml est vide.</h3>";
     } else {
-      echo "<h3>Impossible d'afficher ${filenameHtml}.</h3><div><a href=\"/{$gitwebroot}download_file/$repo/$branch/{$_GET['filename']}\">Cliquez ici pour le télécharger</a></div>";
+      echo "<h3>Impossible d'afficher ${filenameHtml}.</h3><div><a href=\"" . url('repo-dl-file', 'repo', $repo, 'branch', $branch, 'filename', $vars['filename']) . "\">Cliquez ici pour le télécharger</a></div>";
     }
     echo "</body></html>";
   }
index 12d25b4..4083466 100644 (file)
@@ -1,12 +1,11 @@
 <?php
 require_once('include.inc.php');
-if (!$logged || empty($_GET['repo']) || empty($_GET['user'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (!$logged || empty($vars['repo']) || empty($vars['user'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
-  $user = $_GET['user'];
+  $repo = $vars['repo'];
+  $user = $vars['user'];
 }
 redirectifnotrepoadmin($repo);
 $res = gitrepoinfo('del-user', $repo, $user);
-header("Location: /{$gitwebroot}users/$repo");
+redirect('repo-users', 'repo', $repo);
index 18c3d95..177acc3 100644 (file)
@@ -1,13 +1,13 @@
 <?php
 require_once('include.inc.php');
-$right = $_GET['right'] or '';
-if (!$logged || empty($_GET['repo']) || empty($_GET['user']) || ($right != 'admin' && $right != 'user' && $right != 'readonly')) {
-  header('Location: /' . $gitwebroot);
-  exit;
+$right = $vars['right'] or '';
+if (empty($vars['repo']) || empty($vars['user']) || ($right != 'admin' && $right != 'user' && $right != 'readonly')) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
-  $user = $_GET['user'];
+  $repo = $vars['repo'];
+  $user = $vars['user'];
 }
+$tmp = isrepoadmin($repo, $username);
 redirectifnotrepoadmin($repo);
 $res = gitrepoinfo('add-user', $repo, $user, $right);
-header("Location: /{$gitwebroot}users/$repo");
+redirect('repo-users', 'repo', $repo);
index 9af46f1..dff2791 100644 (file)
@@ -1,13 +1,11 @@
 <?php
 require_once('include.inc.php');
-if (empty($_GET['repo'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (empty($vars['repo'])) {
+  redirect('/');
 } else {
-  $repo = $_GET['repo'];
+  $repo = $vars['repo'];
 }
-$errorMsg = '';
-$repoadmin = $admin || isrepoadmin($repo, $_SESSION['username']);
+$repoadmin = $admin || isrepoadmin($repo, $username);
 if ($repoadmin && isset($_POST['submit_user_add'])) {
   $fUser = $_POST['username'];
   $fRight = $_POST['right'];
@@ -18,15 +16,22 @@ if ($repoadmin && isset($_POST['submit_user_add'])) {
 }
 $pageTitle = "$title - Membres de $repo";
 require('header.inc.php');
+$repo_tab_active = 'admin';
+$exportok = file_exists("$gitdir/$repo.git/git-daemon-export-ok");
+require('repo-nav.inc.php');
 ?>
     <div id="users">
-      <div class="invite">Les membres de <span><?php echo $repo; ?></span> :</div>
-      <table>
-        <tr>
-          <th class="name">Utilisateur</th>
-          <th class="right">Droit</th>
-          <th class="actions">Actions</th>
-        </tr>
+      <h3>Les membres de <strong><?php echo $repo; ?></strong> :</h3>
+      <div class="table-responsive">
+        <table class="table table-hover">
+          <thead>
+            <tr>
+              <th>Utilisateur</th>
+              <th>Droit</th>
+              <th>Actions</th>
+            </tr>
+          </thead>
+          <tbody>
 <?php
 $members = array();
 foreach (gitrepoinfo('show-users', $repo) as $userinfo) {
@@ -37,18 +42,19 @@ $isExport = file_exists("$gitdir/$repo.git/git-daemon-export-ok");
 foreach ($members as $user => $right) {
   $actions = ' — ';
   if ($repoadmin) {
-    $actions = "<a href=\"/{$gitwebroot}user_right/$repo/$user/admin\">→ admin right</a>";
-    $actions .= "&nbsp;<a href=\"/{$gitwebroot}user_right/$repo/$user/user\">→ user right</a>";
-    $actions .= "&nbsp;<a href=\"/{$gitwebroot}user_right/$repo/$user/readonly\">→ readonly right</a>";
-    $actions .= "&nbsp;<a href=\"/{$gitwebroot}remove_user/$repo/$user\">Retirer</a>";
+    $actions = '<a href="' . url('repo-user-right', 'repo', $repo, 'user', $user, 'right', 'admin') . '">→ admin right</a>';
+    $actions .= '&nbsp;<a href="' . url('repo-user-right', 'repo', $repo, 'user', $user, 'right', 'user') . '">→ user right</a>';
+    $actions .= '&nbsp;<a href="' . url('repo-user-right', 'repo', $repo, 'user', $user, 'right', 'readonly') . '">→ readonly right</a>';
+    $actions .= '&nbsp;<a href="' . url('repo-user-del', 'repo', $repo, 'user', $user) . '">Retirer</a>';
   }
-  echo "        <tr><td class=\"name\">$user</td><td class=\"right\">$right</td><td class=\"actions\">$actions</td></tr>\n";
+  echo "        <tr><td>$user</td><td>$right</td><td class=\"actions\">$actions</td></tr>\n";
 }
 ?>
-      </table>
+          </tbody>
+        </table>
+      </div>
     </div>
 <?php if ($repoadmin) { ?>
-    <div class="error"><?php echo $errorMsg; ?></div>
     <form id="repo-add-user" action="" method="POST">
       <fieldset>
         <legend>Ajouter un utilisateur au dépôt</legend>
index 0c997ad..118c8ba 100644 (file)
@@ -1,11 +1,9 @@
 <?php
 require_once('include.inc.php');
-if (!$logged || empty($_GET['pos'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (!$logged || empty($vars['pos'])) {
+  redirect('/');
 } else {
-  $username = $_SESSION['username'];
-  $pos = $_GET['pos'];
+  $pos = $vars['pos'];
 }
 $res = gitrepoinfo('del-key', $username, $pos);
-header("Location: /${gitwebroot}account");
+redirect('account');
index 120dd4b..4932b99 100644 (file)
@@ -1,11 +1,10 @@
 <?php
 require_once('include.inc.php');
 redirectifnotadmin();
-if (!$logged || empty($_GET['user'])) {
-  header('Location: /' . $gitwebroot);
-  exit;
+if (!$logged || empty($vars['user'])) {
+  redirect('/');
 } else {
-  $user = $_GET['user'];
+  $user = $vars['user'];
 }
 $res = gitrepoinfo('destroy-user', $user);
-header("Location: /${gitwebroot}admin_users");
+redirect('admin-users');