Git Repositories

deploy-key action
authorCyrille Pontvieux <jrd@enialis.net>
Mon, 3 Feb 2014 20:17:20 +0000 (20:17 +0000)
committerCyrille Pontvieux <jrd@enialis.net>
Mon, 3 Feb 2014 20:17:20 +0000 (20:17 +0000)
pretty urls
download files, tags and branches
improved graph

26 files changed:
homegit/gitrepo.sh
homegit/makekeys.sh
src/account.php
src/admin-users.php
src/controller.config.php [new file with mode: 0644]
src/controller.php [new file with mode: 0644]
src/disconnect.php
src/header.inc.php
src/include.inc.php
src/nav.inc.php
src/package.png [new file with mode: 0644]
src/post-update.php
src/repo-del.php
src/repo-dl-branch.php [new file with mode: 0644]
src/repo-dl-file.php [new file with mode: 0644]
src/repo-dl.php [new file with mode: 0644]
src/repo-edit.php
src/repo-histo.php
src/repo-info.php [new file with mode: 0644]
src/repo-list.php [moved from src/index.php with 78% similarity]
src/repo-show-file.php [new file with mode: 0644]
src/repo-user-del.php
src/repo-users.php
src/style.css
src/user-del-key.php
src/user-del.php

index 920a045..1134025 100755 (executable)
@@ -1,6 +1,5 @@
 #!/bin/sh
 # vim: et ai cin sw=2 ts=2 tw=0:
-[ "$HOME" = $(dirname $(readlink -f "$0")) ] || exit 255
 cd ~/
 
 usage() {
@@ -42,6 +41,7 @@ Action is one of:
      {'repository': {'name', 'url'}
  - unsync Name from|to url
    remove sync previously set by 'sync' command.
+ - deploy-key Name
  - listsync Name from|to
    list the url that are synchronized from or to, as defined by 'sync' command.
 EOF
@@ -313,7 +313,7 @@ fetch() {
   if [ -f "$NAME".git/fetchremotes ] && grep -q -F "$URL" "$NAME".git/fetchremotes; then
     (
       cd "$NAME".git
-      git fetch "$URL"
+      git fetch -f "$URL" *:*
     )
   fi
 }
@@ -435,6 +435,14 @@ listSyncRepo() {
   fi
 }
 
+deployKeyRepo() {
+  NAME="$1"
+  check_repo "$NAME"
+  [ -e "$NAME".git/id_rsa ] && rm "$NAME".git/id_rsa
+  [ -e "$NAME".git/id_rsa.pub ] && rm "$NAME".git/id_rsa.pub
+  ssh-keygen -q -t rsa -N '' -f "$NAME".git/id_rsa
+}
+
 ACTION=''
 NAME=''
 REPO=''
@@ -455,7 +463,7 @@ while [ -n "$1" ]; do
       ;;
     *)
       if [ -z "$ACTION" ]; then
-        if echo "$1" | grep -q '^\(create\|destroy\|get\|set\|list-users\|create-user\|change-user\|show-pwd\|destroy-user\|show-users\|add-user\|del-user\|list-keys\|add-key\|del-key\|graph\|fetch\|export\|sync\|unsync\|listsync\)$'; then
+        if echo "$1" | grep -q '^\(create\|destroy\|get\|set\|list-users\|create-user\|change-user\|show-pwd\|destroy-user\|show-users\|add-user\|del-user\|list-keys\|add-key\|del-key\|graph\|fetch\|export\|sync\|unsync\|listsync\|deploy-key\)$'; then
           ACTION="$1"
           shift
         else
@@ -577,6 +585,9 @@ while [ -n "$1" ]; do
               echo "Unrecognized parameter ($1)" >&2
               exit 1
             fi
+          elif [ "$ACTION" = "deploy-key" ]; then
+            echo "Unrecognized parameter ($1)" >&2
+            exit 1
           fi
         fi
       fi
@@ -691,4 +702,9 @@ case "$ACTION" in
     checkparams REPO SYNCDIRECTION
     listSyncRepo "$REPO" "$SYNCDIRECTION"
     ;;
+  deploy-key)
+    REPO="$NAME"
+    checkparams REPO
+    deployKeyRepo "$REPO"
+    ;;
 esac
index 8af6dc1..bd4c265 100755 (executable)
@@ -1,6 +1,5 @@
 #!/bin/sh
 # vim: et ai cin sw=2 ts=2 tw=0:
-[ "$HOME" = $(dirname $(readlink -f "$0")) ] || exit 255
 cd ~/
 
 if ! [ -d .ssh ]; then
index d833ca3..6e5347d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 if (!$logged) {
-  header('Location: index.php');
+  header('Location: /');
   exit;
 } else {
   $username = $_SESSION['username'];
@@ -44,7 +44,7 @@ foreach ($keys as $key) {
   } else {
     $name = ' — ';
   }
-  $actions = "<a class=\"delete\" href=\"user-del-key.php?pos=$i\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer cette clé ?');\">Supprimer</a>";
+  $actions = "<a class=\"delete\" href=\"/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";
 }
 ?>
index a5b16fb..a992a5f 100644 (file)
@@ -1,9 +1,6 @@
 <?php
-require('include.inc.php');
-if (!$admin) {
-  header('Location: index.php');
-  exit;
-}
+require_once('include.inc.php');
+redirectifnotadmin();
 $errorMsg = '';
 if (isset($_POST['submit_user_add'])) {
   $fUser = $_POST['username'];
@@ -26,7 +23,7 @@ require('header.inc.php');
 <?php
 $users = gitrepoinfo('list-users');
 foreach ($users as $user) {
-  $actions = "<a class=\"delete\" href=\"user-del.php?user=$user\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer l\'utilisateur \'$user\' ?');\">Supprimer</a>";
+  $actions = "<a class=\"delete\" href=\"/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";
 }
 ?>
diff --git a/src/controller.config.php b/src/controller.config.php
new file mode 100644 (file)
index 0000000..7898f20
--- /dev/null
@@ -0,0 +1,170 @@
+<?php
+$defaultAction = 'list';
+
+function action_account($args) {
+  extract($GLOBALS);
+  include_once('account.php');
+  return true;
+}
+
+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) == 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-show-file.php');
+    return true;
+  } else {
+    return false;
+  }
+}
+
+function action_download_file($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-file.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;
+  }
+}
+?>
diff --git a/src/controller.php b/src/controller.php
new file mode 100644 (file)
index 0000000..8412960
--- /dev/null
@@ -0,0 +1,23 @@
+<?php
+$queryString = $_SERVER['QUERY_STRING'];
+$uri = explode('?', $_SERVER['REQUEST_URI'])[0];
+$request = explode('/', $uri);
+$action = $request[1];
+$actionVars = array_slice($request, 2);
+require_once('include.inc.php');
+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 (!call_action($action, $defaultAction, $actionVars)) {
+  header('HTTP/1.0 404 Not Found');
+  echo "404 Not found.";
+}
+?>
index 9652136..497e71d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 session_destroy();
 unset($_SESSION['username']);
 $logged = false;
-header('Location: index.php');
+header('Location: /');
index fca7a0e..5d85595 100644 (file)
@@ -2,8 +2,8 @@
 <html>
   <head>
     <title><?php echo $title; ?></title>
-    <link href="style.css" rel="stylesheet" type="text/css" />
-    <link rel="shortcut icon" href="favicon.png" type="image/png"/>
+    <link rel="stylesheet" href="/style.css" type="text/css" />
+    <link rel="shortcut icon" href="/favicon.png" type="image/png"/>
     <!--[if lt IE 9]>
     <script src="ie7/IE9.js"></script>
     <![endif]-->
index 51114fb..d121e42 100644 (file)
@@ -30,6 +30,14 @@ function isadmin($user) {
   }
 }
 
+function redirectifnotadmin() {
+  global $admin;
+  if (!$admin) {
+    header('Location: /');
+    exit;
+  }
+}
+
 function auth() {
   global $errorMsg, $logged, $admin;
   if (isset($_POST['submit_auth'])) {
@@ -56,7 +64,7 @@ function auth() {
       // Test si l'utilisateur est admin
       $admin = isadmin($_SESSION['username']);
       // Redirige pour éviter de reposter le formulaire.
-      header('Location: index.php');
+      header('Location: /');
       exit;
     }
   } else {
@@ -68,4 +76,6 @@ function auth() {
   }
 }
 
-auth();
+if (!$logged) {
+  auth();
+}
index 376c47b..3244bd4 100644 (file)
@@ -1,9 +1,9 @@
 <div id="nav">
-  <p class="breadcrumbs"><a href="index.php">Index</a></p>
+  <p class="breadcrumbs"><a href="/">Index</a></p>
 <?php
 if ($logged) {
   echo "<p>Vous êtes connecté en tant que <span>" . $_SESSION['username'] . "</span><br/>\n";
-  echo "<a href=\"account.php\">Mon compte</a>&nbsp;<a href=\"disconnect.php\">Se déconnecter</a></p>\n";
+  echo "<a href=\"/account\">Mon compte</a>&nbsp;<a href=\"/disconnect\">Se déconnecter</a></p>\n";
 } else {
   echo "<div class=\"error\">$errorMsg</div>\n";
   echo <<<EOF
diff --git a/src/package.png b/src/package.png
new file mode 100644 (file)
index 0000000..93c28d3
Binary files /dev/null and b/src/package.png differ
index 6bf6e90..0649359 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 if (isset($_POST['payload'])) {
   // github post update
   $info = json_decode($_POST['payload'], true);
@@ -11,19 +11,11 @@ if (isset($_POST['payload'])) {
   $repoUrl = $_GET['url'];
   gitrepoinfo('fetch', $repoName, $repoUrl);
 } else {
-  echo <<<'EOF'
-<html><body><pre>
-You must pass some variables to this script:
-  - name, name of the repository to synchronize to.
-  - url, full url of the repository to synchronize from.
-You can pass it through POST or GET method.
+  echo "<pre>
+You should provide a 'payload' variable in POST, with the corresponding format:
+{repository: {name: 'local repository name', url: 'remote url'}}
 
-For GET method, just supply these two variables.
-
-For POST method, you should supply a json encoded 'payload' variable.
-This variable should contains a array named 'repository' with 'name' and 'url' variable in it.
-This method is the way Github works.
-</pre></body></html>
-EOF;
+You could also provide the 'name' and 'url' variable directly by GET method.
+</pre>";
 }
 ?>
index 841a844..ab58efc 100644 (file)
@@ -1,10 +1,11 @@
 <?php
-require('include.inc.php');
-if (!$logged || !$admin || empty($_GET['repo'])) {
-  header('Location: index.php');
+require_once('include.inc.php');
+redirectifnotadmin();
+if (!$logged || empty($_GET['repo'])) {
+  header('Location: /');
   exit;
 } else {
   $repo = $_GET['repo'];
 }
 $res = gitrepoinfo('destroy', $repo);
-header('Location: index.php');
+header('Location: /');
diff --git a/src/repo-dl-branch.php b/src/repo-dl-branch.php
new file mode 100644 (file)
index 0000000..4fa4182
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+require_once('include.inc.php');
+if (empty($_GET['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);
+  if ($ret == 0) {
+    header('HTTP/1.0 404 Not Found');
+    exit;
+  }
+  $format = $options[1];
+  switch ($format) {
+    case 'gz':
+      $mime = 'application/x-gzip';
+      $tarOption = 'z';
+      break;
+    case 'xz':
+      $mime = 'applicaiton/x-xz';
+      $tarOption = 'J';
+      break;
+  }
+  $hash = str_replace("\n", '', file_get_contents("$gitdir/$repo.git/refs/heads/$branch"));
+  $hash = str_replace("\n", '', shell_exec("cd $gitdir/$repo.git; git rev-parse --short $hash"));
+  $filename = str_replace('.tar.', "-$hash.tar.", $filename);
+  header("Content-Type: $mime");
+  header("Content-Disposition: attachment; filename=\"$filename\"");
+  $hashtmp = sha1($_SERVER['REQUEST_URI'] . time());
+  passthru("folder=/tmp/$hashtmp; mkdir -p \$folder; git clone -n $gitdir/$repo.git \$folder/$repo-$hash >/dev/null && (cd \$folder/$repo-$hash && git checkout $hash >/dev/null 2>&1 && cd .. && tar -c{$tarOption} --exclude .git $repo-$hash); rm -rf \$folder");
+}
diff --git a/src/repo-dl-file.php b/src/repo-dl-file.php
new file mode 100644 (file)
index 0000000..8c72114
--- /dev/null
@@ -0,0 +1,16 @@
+<?php
+require_once('include.inc.php');
+if (empty($_GET['filename'])) {
+  header('HTTP/1.0 404 Not Found');
+  exit;
+} else {
+  $repo = $_GET['repo'];
+  $branch = $_GET['branch'];
+  $filename = urldecode($_GET['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);
+  header("Content-Type: $mime");
+  header("Content-Disposition: attachment; filename=\"$bfilename\"");
+  passthru("cat /tmp/file-$hashtmp; rm -f /tmp/file-$hashtmp");
+}
diff --git a/src/repo-dl.php b/src/repo-dl.php
new file mode 100644 (file)
index 0000000..bbc2811
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+require_once('include.inc.php');
+if (empty($_GET['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];
+  }
+  switch ($format) {
+    case 'gz':
+      $mime = 'application/x-gzip';
+      $tarOption = 'z';
+      break;
+    case 'xz':
+      $mime = 'applicaiton/x-xz';
+      $tarOption = 'J';
+      break;
+  }
+  header("Content-Type: $mime");
+  header("Content-Disposition: attachment; filename=\"$filename\"");
+  $hash = sha1($_SERVER['REQUEST_URI'] . time());
+  passthru("folder=/tmp/$hash; mkdir -p \$folder; git clone -n $gitdir/$repo.git \$folder/$repo-$tag >/dev/null && (cd \$folder/$repo-$tag && git checkout refs/tags/$tag >/dev/null 2>&1 && cd .. && tar -c{$tarOption} --exclude .git $repo-$tag); rm -rf \$folder");
+}
index b8f8116..d6b9c70 100644 (file)
@@ -1,11 +1,8 @@
 <?php
-require('include.inc.php');
-if (!$admin) {
-  header('Location: index.php');
-  exit;
-}
+require_once('include.inc.php');
+redirectifnotadmin();
 if (empty($_GET['repo'])) {
-  header('Location: index.php');
+  header('Location: /');
   exit;
 } else {
   $repo = $_GET['repo'];
@@ -40,10 +37,15 @@ if (isset($_POST['submit_repo_desc'])) {
   if ($res === false) {
     $errorMsgSyncTo = "L'url n'a pas pu être ajoutée.";
   }
+} 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 if (isset($_GET['delete']) && $_GET['delete'] == 'syncto') {
   $fUrl = $_GET['url'];
   $res = gitrepoinfo('unsync', $repo, 'to', $fUrl);
-  header("Location: repo-edit.php?repo=$repo");
+  header("Location: /edit/$repo");
 } else if (isset($_POST['submit_repo_syncfrom_add'])) {
   $fUrl = $_POST['new-syncfrom-url'];
   $res = gitrepoinfo('sync', $repo, 'from', $fUrl);
@@ -53,7 +55,7 @@ if (isset($_POST['submit_repo_desc'])) {
 } else if (isset($_GET['delete']) && $_GET['delete'] == 'syncfrom') {
   $fUrl = $_GET['url'];
   $res = gitrepoinfo('unsync', $repo, 'from', $fUrl);
-  header("Location: repo-edit.php?repo=$repo");
+  header("Location: /edit/$repo");
 }
 $pageTitle = "$title - Configuration de $repo";
 require('header.inc.php');
@@ -112,7 +114,7 @@ require('header.inc.php');
   foreach ($urls as $url) {
     echo "        <tr>\n";
     echo "          <td class=\"name\">$url</td>\n";
-    echo "          <td class=\"actions\"><a class=\"delete\" href=\"?repo=$repo&delete=syncto&url=$url\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer cette url ?');\">Supprimer</a></td>\n";
+    echo "          <td class=\"actions\"><a class=\"delete\" href=\"?delete=syncto&url=$url\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer cette url ?');\">Supprimer</a></td>\n";
     echo "        </tr>\n";
   }
 ?>
@@ -124,6 +126,15 @@ require('header.inc.php');
           <input type="submit" name="submit_repo_syncto_add" value="Ajouter l'URL"/>
         </fieldset>
       </form>
+      <div class="invite">Deploy key :</div>
+<?php
+  if (file_exists("$gitdir/$repo.git/id_rsa.pub")) {
+    $deploy = file_get_contents("$gitdir/$repo.git/id_rsa.pub");
+    echo "<div><em>$deploy</em></div>\n";
+  } else {
+    echo "<form id=\"repo-syncto-deploy\" action=\"\" method=\"POST\"><input type=\"submit\" name=\"submit_repo_syncto_deploy\" value=\"Générer une clé de déploiement\"/></form>\n";
+  }
+?>
     </div>
     <div id="syncfrom">
       <div class="error"><?php echo $errorMsgSyncFrom; ?></div>
@@ -138,12 +149,12 @@ require('header.inc.php');
   foreach ($urls as $url) {
     echo "        <tr>\n";
     echo "          <td class=\"name\">$url</td>\n";
-    echo "          <td class=\"actions\"><a class=\"delete\" href=\"?repo=$repo&delete=syncfrom&url=$url\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer cette url ?');\">Supprimer</a></td>\n";
+    echo "          <td class=\"actions\"><a class=\"delete\" href=\"?delete=syncfrom&url=$url\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer cette url ?');\">Supprimer</a></td>\n";
     echo "        </tr>\n";
   }
 ?>
       </table>
-      <p>Url to trigger synchronization: <a class="text" href="post-update.php">post-update.php</a></p>
+      <p>Url to trigger synchronization: <a class="text" href="/post-update.php">post-update.php</a></p>
       <form id="repo-syncfrom-add" action="" method="POST">
         <fieldset>
           <legend>Ajouter une URL depuis laquelle se synchroniser</legend>
index 1fcc8d0..c15e809 100644 (file)
@@ -1,7 +1,7 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 if (empty($_GET['repo'])) {
-  header('Location: index.php');
+  header('Location: /');
   exit;
 } else {
   $repo = $_GET['repo'];
@@ -9,13 +9,16 @@ if (empty($_GET['repo'])) {
 $pageTitle = "$title - $repo";
 require('header.inc.php');
 ?>
-    <div id="users">
+    <div id="repo-toolbar">
+      <a href="/info/<?php echo $repo; ?>">Info</a>&nbsp;<a href="/histo/<?php echo $repo; ?>">Historique</a>
+    </div>
+    <div id="histo">
       <div class="invite">Le graphe d'historique de <span><?php echo $repo; ?></span> :</div>
       <pre>
 <?php
   $grapheArray = gitrepoinfo('graph', $repo);
   if ($grapheArray !== false) {
-    echo implode("\n", $grapheArray);
+    echo preg_replace('/( [0-9a-f]+ )(\([^)]+\)) /', '$1<strong>$2</strong> ', implode("\n", $grapheArray));
   } else {
     echo "Le projet n'est pas initialisé.";
   }
diff --git a/src/repo-info.php b/src/repo-info.php
new file mode 100644 (file)
index 0000000..7fb73b9
--- /dev/null
@@ -0,0 +1,101 @@
+<?php
+require_once('include.inc.php');
+if (empty($_GET['repo'])) {
+  header('Location: /');
+  exit;
+} else {
+  $repo = $_GET['repo'];
+}
+$pageTitle = "$title - $repo";
+require('header.inc.php');
+$desc = gitrepoinfo('get', $repo, 'description')[0];
+if (empty($desc) || preg_match('/^Unnamed repository;/', $desc)) {
+  $desc = $repo;
+}
+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] == '*') {
+    $branch = substr($branch, 2);
+    $def = true;
+    if (empty($selectedBranch)) {
+      $selectedBranch = $branch;
+    }
+  } else {
+    $def = false;
+  }
+  $branchesMap[$branch] = $def;
+}
+exec("GIT_DIR=$gitdir/$repo.git git tag -l", $tags);
+if ($tags[0] == "") { $tags = array(); }
+exec("GIT_DIR=$gitdir/$repo.git git ls-tree -r --name-only -z refs/heads/$selectedBranch | xargs --null -if echo f", $files);
+?>
+    <div id="repo-toolbar">
+      <a href="/info/<?php echo $repo; ?>">Info</a>&nbsp;<a href="/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="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='/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;
+                }
+                echo "<li>$branchHtml <a class=\"image\" href=\"/download_branch/$repo/$branch/$repo-$branch.tar.gz\"><img src=\"/package.png\"/></a></li>\n";
+              }
+            ?>
+          </ul>      
+        </div>
+        <div class="tags">
+          <h2>Tags</h2>
+          <ul>
+            <?php
+              foreach ($tags as $tag) {
+                echo "<li>$tag <a class=\"image\" href=\"/download/$repo/$repo-$tag.tar.gz\"><img src=\"/package.png\"/></a></li>\n";
+              }
+            ?>
+          </ul>      
+        </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"><?php echo "git://$githost/$repo.git"; ?></div>
+          <?php } ?>
+        </div>
+      </div>
+      <div class="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=\"/download_file/$repo/$selectedBranch/$fileEncoded\"><strong>↓</strong>";
+            echo "&nbsp;";
+            echo "<a class=\"file-show\" target=\"_blank\" title=\"Afficher $fileHtml\" href=\"/show_file/$repo/$selectedBranch/$fileEncoded\">$fileHtml</a></a><br/>\n";
+          } ?>
+        </div>
+      </div>
+    </div>
+<?php require('footer.inc.php'); ?>
similarity index 78%
rename from src/index.php
rename to src/repo-list.php
index 7f9a31d..5d5d08d 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 $errorMsg = '';
 if ($admin && isset($_POST['submit_repo'])) {
   $fRepo = $_POST['new-repo'];
@@ -7,9 +7,11 @@ if ($admin && isset($_POST['submit_repo'])) {
   $res = gitrepoinfo('create', $fRepo, $fDesc);
   if ($res === false) {
     $errorMsg = "Le dépôt n'a pas pu être ajouté.";
-  }
-  if (isset($_POST['new-export']) && $_POST['new-export'] == 'on') {
-    gitrepoinfo('export', $fRepo, 'on');
+  } else {
+    if (isset($_POST['new-export']) && $_POST['new-export'] == 'on') {
+      gitrepoinfo('export', $fRepo, 'on');
+    }
+    gitrepoinfo('add-user', $fRepo, $_SESSION['username']); # add current user to the newly created repo.
   }
 }
 $pageTitle = $title;
@@ -43,10 +45,10 @@ foreach ($files as $file) {
         $membre = "Non";
       }
     }
-    $actions = "<a href=\"repo-users.php?repo=$proj\">Utilisateurs</a>&nbsp;<a href=\"repo-histo.php?repo=$proj\">Historique</a>";
+    $actions = "<a href=\"/info/$proj\">Info</a>&nbsp;<a href=\"/users/$proj\">Utilisateurs</a>&nbsp;<a href=\"/histo/$proj\">Historique</a>";
     if ($admin) {
-      $actions .= "&nbsp;<a class=\"edit\" href=\"repo-edit.php?repo=$proj\">Éditer</a>";
-      $actions .= "&nbsp;<a class=\"delete\" href=\"repo-del.php?repo=$proj\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer le dépôt \'$proj\' ?');\">Supprimer</a>";
+      $actions .= "&nbsp;<a class=\"edit\" href=\"/edit/$proj\">Éditer</a>";
+      $actions .= "&nbsp;<a class=\"delete\" href=\"/delete/$proj\" onclick=\"return confirm('Êtes vous sûr de vouloir supprimer le dépôt \'$proj\' ?');\">Supprimer</a>";
     }
     $name = $proj;
     $exportok = file_exists("$gitdir/$file/git-daemon-export-ok");
@@ -54,7 +56,7 @@ foreach ($files as $file) {
       $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:$gitdir/$file</div>";
+    echo "<div class=\"rw\">$gituser@$githost:$file</div>";
     if ($exportok) {
       echo "<div class=\"ro\">git://$githost/$file</div>";
     }
@@ -85,6 +87,6 @@ foreach ($files as $file) {
         </table>
       </fieldset>
     </form>
-    <a href="admin-users.php">Gestion des utilisateurs</a>
+    <a href="/manage_users">Gestion des utilisateurs</a>
 <?php } ?>
 <?php require('footer.inc.php'); ?>
diff --git a/src/repo-show-file.php b/src/repo-show-file.php
new file mode 100644 (file)
index 0000000..2269083
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+require_once('include.inc.php');
+if (empty($_GET['filename'])) {
+  header('HTTP/1.0 404 Not Found');
+  exit;
+} else {
+  $repo = $_GET['repo'];
+  $branch = $_GET['branch'];
+  $filename = urldecode($_GET['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);
+  $mimeFirst = split('/', $mime)[0];
+  if (in_array($mimeFirst, array('text', 'image'))) {
+    // hack for text files
+    if ($mimeFirst == 'text') {
+      $mime = 'text/plain';
+    }
+    header("Content-Type: $mime");
+    passthru("cat /tmp/file-$hashtmp; rm -f /tmp/file-$hashtmp");
+  } else {
+    echo "<html><body><h1>$filenameHtml</h1>";
+    if ($mime = 'inode/x-empty') {
+      echo "<h3>Le fichier $filenameHtml est vide.</h3>";
+    } else {
+      echo "<h3>Impossible d'afficher ${filenameHtml}.</h3><div><a href=\"/download_file/$repo/$branch/{$_GET['filename']}\">Cliquez ici pour le télécharger</a></div>";
+    }
+    echo "</body></html>";
+  }
+}
index 547280f..e1e2e5a 100644 (file)
@@ -1,11 +1,12 @@
 <?php
-require('include.inc.php');
-if (!$logged || !$admin || empty($_GET['repo']) || empty($_GET['user'])) {
-  header('Location: index.php');
+require_once('include.inc.php');
+redirectifnotadmin();
+if (!$logged || empty($_GET['repo']) || empty($_GET['user'])) {
+  header('Location: /');
   exit;
 } else {
   $repo = $_GET['repo'];
   $user = $_GET['user'];
 }
 $res = gitrepoinfo('del-user', $repo, $user);
-header("Location: repo-users.php?repo=$repo");
+header("Location: /users/$repo");
index f9e2b5b..4a5100d 100644 (file)
@@ -1,7 +1,7 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 if (empty($_GET['repo'])) {
-  header('Location: index.php');
+  header('Location: /');
   exit;
 } else {
   $repo = $_GET['repo'];
@@ -29,7 +29,7 @@ $users = gitrepoinfo('show-users', $repo);
 foreach ($users as $user) {
   $actions = ' — ';
   if ($admin) {
-    $actions = "<a href=\"repo-user-del.php?repo=$repo&user=$user\">Retirer</a>";
+    $actions = "<a href=\"/remove_user/$repo/$user\">Retirer</a>";
   }
   echo "        <tr><td class=\"name\">$user</td><td class=\"actions\">$actions</td></tr>\n";
 }
index e916352..fd72bcf 100644 (file)
@@ -17,6 +17,21 @@ a.text {
   background-color: transparent;
   border: none;
 }
+a.file-dl, a.file-show {
+  color: blue;
+  text-decoration: none;
+  background-color: transparent;
+  border: none;
+  padding: 0;
+}
+a.image {
+  color: navy
+  font-weight: bold;
+  text-decoration: none;
+  padding: 0;
+  background-color: transparent;
+  border: none;
+}
 h1 {
   text-align: center;
 }
@@ -91,3 +106,31 @@ div.ro:after {
 #new-desc {
   min-width: 400px;
 }
+#repoinfo {
+  margin: auto;
+  clear: both;
+}
+#repoinfo div.info {
+  width: 400px;
+  margin-left: 10px;
+  margin-right: 10px;
+  float: right;
+}
+#repoinfo div.files {
+  margin-left: 10px;
+  margin-right: 10px;
+}
+#repoinfo div.files div {
+  max-height: 300px;
+  overflow: auto;
+}
+#repo-toolbar {
+  margin: 5px;
+  float: right;
+}
+#selected-branch {
+  font-weight: bold;
+}
+#selected-branch option[selected=selected] {
+  font-style: italic;
+}
index 9f81ab4..ff84097 100644 (file)
@@ -1,11 +1,11 @@
 <?php
-require('include.inc.php');
+require_once('include.inc.php');
 if (!$logged || empty($_GET['pos'])) {
-  header('Location: index.php');
+  header('Location: /');
   exit;
 } else {
   $username = $_SESSION['username'];
   $pos = $_GET['pos'];
 }
 $res = gitrepoinfo('del-key', $username, $pos);
-header('Location: account.php');
+header('Location: /account');
index 7ad9ba4..fc72fb2 100644 (file)
@@ -1,10 +1,11 @@
 <?php
-require('include.inc.php');
-if (!$logged || !$admin || empty($_GET['user'])) {
-  header('Location: index.php');
+require_once('include.inc.php');
+redirectifnotadmin();
+if (!$logged || empty($_GET['user'])) {
+  header('Location: /');
   exit;
 } else {
   $user = $_GET['user'];
 }
 $res = gitrepoinfo('destroy-user', $user);
-header('Location: admin-users.php');
+header('Location: /admin_users');