c78c4951144e04d97773a872b0663a405097874c
   1/*
   2 * GIT - The information manager from hell
   3 *
   4 * Copyright (C) Linus Torvalds, 2005
   5 */
   6#include "cache.h"
   7
   8static void safe_create_dir(const char *dir)
   9{
  10        if (mkdir(dir, 0777) < 0) {
  11                if (errno != EEXIST) {
  12                        perror(dir);
  13                        exit(1);
  14                }
  15        }
  16}
  17
  18static void create_default_files(const char *git_dir)
  19{
  20        unsigned len = strlen(git_dir);
  21        static char path[PATH_MAX];
  22
  23        if (len > sizeof(path)-50)
  24                die("insane git directory %s", git_dir);
  25        memcpy(path, git_dir, len);
  26
  27        if (len && path[len-1] != '/')
  28                path[len++] = '/';
  29
  30        /*
  31         * Create .git/refs/{heads,tags}
  32         */
  33        strcpy(path + len, "refs");
  34        safe_create_dir(path);
  35        strcpy(path + len, "refs/heads");
  36        safe_create_dir(path);
  37        strcpy(path + len, "refs/tags");
  38        safe_create_dir(path);
  39
  40        /*
  41         * Create the default symlink from ".git/HEAD" to the "master"
  42         * branch
  43         */
  44        strcpy(path + len, "HEAD");
  45        if (symlink("refs/heads/master", path) < 0) {
  46                if (errno != EEXIST) {
  47                        perror(path);
  48                        exit(1);
  49                }
  50        }
  51}
  52
  53/*
  54 * If you want to, you can share the DB area with any number of branches.
  55 * That has advantages: you can save space by sharing all the SHA1 objects.
  56 * On the other hand, it might just make lookup slower and messier. You
  57 * be the judge.  The default case is to have one DB per managed directory.
  58 */
  59int main(int argc, char **argv)
  60{
  61        const char *git_dir;
  62        const char *sha1_dir;
  63        char *path;
  64        int len, i;
  65
  66        /*
  67         * Set up the default .git directory contents
  68         */
  69        git_dir = gitenv(GIT_DIR_ENVIRONMENT);
  70        if (!git_dir) {
  71                git_dir = DEFAULT_GIT_DIR_ENVIRONMENT;
  72                fprintf(stderr, "defaulting to local storage area\n");
  73        }
  74        safe_create_dir(git_dir);
  75        create_default_files(git_dir);
  76
  77        /*
  78         * And set up the object store.
  79         */
  80        sha1_dir = get_object_directory();
  81        len = strlen(sha1_dir);
  82        path = xmalloc(len + 40);
  83        memcpy(path, sha1_dir, len);
  84
  85        safe_create_dir(sha1_dir);
  86        for (i = 0; i < 256; i++) {
  87                sprintf(path+len, "/%02x", i);
  88                safe_create_dir(path);
  89        }
  90        strcpy(path+len, "/pack");
  91        safe_create_dir(path);
  92        return 0;
  93}