Disallow working directory commands in a bare repository.
[gitweb.git] / fetch-pack.c
index c3064b94ad1d9e682014a83eb46349af5733e295..1530a947947b68d879e01bb9161654e135716a3d 100644 (file)
@@ -5,7 +5,6 @@
 #include "tag.h"
 #include "exec_cmd.h"
 #include "sideband.h"
-#include <sys/wait.h>
 
 static int keep_pack;
 static int quiet;
@@ -189,7 +188,7 @@ static int find_common(int fd[2], unsigned char *result_sha1,
        if (!fetching)
                return 1;
 
-       if (depth >  0) {
+       if (depth > 0) {
                char line[1024];
                unsigned char sha1[20];
                int len;
@@ -198,11 +197,10 @@ static int find_common(int fd[2], unsigned char *result_sha1,
                        if (!strncmp("shallow ", line, 8)) {
                                if (get_sha1_hex(line + 8, sha1))
                                        die("invalid shallow line: %s", line);
-                               /* no need making it shallow if we have it already */
-                               if (lookup_object(sha1))
-                                       continue;
                                register_shallow(sha1);
-                       }  else if (!strncmp("unshallow ", line, 10)) {
+                               continue;
+                       }
+                       if (!strncmp("unshallow ", line, 10)) {
                                if (get_sha1_hex(line + 10, sha1))
                                        die("invalid unshallow line: %s", line);
                                if (!lookup_object(sha1))
@@ -211,8 +209,9 @@ static int find_common(int fd[2], unsigned char *result_sha1,
                                parse_object(sha1);
                                if (unregister_shallow(sha1))
                                        die("no shallow found: %s", line);
-                       } else
-                               die("expected shallow/unshallow, got %s", line);
+                               continue;
+                       }
+                       die("expected shallow/unshallow, got %s", line);
                }
        }
 
@@ -342,7 +341,8 @@ static void filter_refs(struct ref **refs, int nr_match, char **match)
                if (!memcmp(ref->name, "refs/", 5) &&
                    check_ref_format(ref->name + 5))
                        ; /* trash */
-               else if (fetch_all) {
+               else if (fetch_all &&
+                        (!depth || strncmp(ref->name, "refs/tags/", 10) )) {
                        *newtail = ref;
                        ref->next = NULL;
                        newtail = &ref->next;
@@ -602,6 +602,31 @@ static int fetch_pack(int fd[2], int nr_match, char **match)
        return 0;
 }
 
+static int remove_duplicates(int nr_heads, char **heads)
+{
+       int src, dst;
+
+       for (src = dst = 0; src < nr_heads; src++) {
+               /* If heads[src] is different from any of
+                * heads[0..dst], push it in.
+                */
+               int i;
+               for (i = 0; i < dst; i++) {
+                       if (!strcmp(heads[i], heads[src]))
+                               break;
+               }
+               if (i < dst)
+                       continue;
+               if (src != dst)
+                       heads[dst] = heads[src];
+               dst++;
+       }
+       heads[dst] = 0;
+       return dst;
+}
+
+static struct lock_file lock;
+
 int main(int argc, char **argv)
 {
        int i, ret, nr_heads;
@@ -609,7 +634,6 @@ int main(int argc, char **argv)
        int fd[2];
        pid_t pid;
        struct stat st;
-       struct lock_file lock;
 
        setup_git_directory();
 
@@ -661,6 +685,8 @@ int main(int argc, char **argv)
        pid = git_connect(fd, dest, exec);
        if (pid < 0)
                return 1;
+       if (heads && nr_heads)
+               nr_heads = remove_duplicates(nr_heads, heads);
        ret = fetch_pack(fd, nr_heads, heads);
        close(fd[0]);
        close(fd[1]);
@@ -700,7 +726,7 @@ int main(int argc, char **argv)
 
                fd = hold_lock_file_for_update(&lock, shallow, 1);
                if (!write_shallow_commits(fd, 0)) {
-                       unlink(lock.filename);
+                       unlink(shallow);
                        rollback_lock_file(&lock);
                } else {
                        close(fd);