Coverage Report

Created: 2026-10-17 07:15

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/git/setup.c
Line
Count
Source
1
#define DISABLE_SIGN_COMPARE_WARNINGS
2
3
#include "git-compat-util.h"
4
#include "abspath.h"
5
#include "copy.h"
6
#include "environment.h"
7
#include "exec-cmd.h"
8
#include "gettext.h"
9
#include "hex.h"
10
#include "object-file.h"
11
#include "object-name.h"
12
#include "refs.h"
13
#include "repository.h"
14
#include "config.h"
15
#include "dir.h"
16
#include "setup.h"
17
#include "shallow.h"
18
#include "string-list.h"
19
#include "strvec.h"
20
#include "chdir-notify.h"
21
#include "path.h"
22
#include "quote.h"
23
#include "trace.h"
24
#include "trace2.h"
25
#include "worktree.h"
26
27
enum allowed_bare_repo {
28
  ALLOWED_BARE_REPO_EXPLICIT = 0,
29
  ALLOWED_BARE_REPO_ALL,
30
};
31
32
static struct startup_info the_startup_info;
33
struct startup_info *startup_info = &the_startup_info;
34
const char *tmp_original_cwd;
35
36
/*
37
 * The input parameter must contain an absolute path, and it must already be
38
 * normalized.
39
 *
40
 * Find the part of an absolute path that lies inside the work tree by
41
 * dereferencing symlinks outside the work tree, for example:
42
 * /dir1/repo/dir2/file   (work tree is /dir1/repo)      -> dir2/file
43
 * /dir/file              (work tree is /)               -> dir/file
44
 * /dir/symlink1/symlink2 (symlink1 points to work tree) -> symlink2
45
 * /dir/repolink/file     (repolink points to /dir/repo) -> file
46
 * /dir/repo              (exactly equal to work tree)   -> (empty string)
47
 */
48
static int abspath_part_inside_repo(struct repository *repo, char *path)
49
0
{
50
0
  size_t len;
51
0
  size_t wtlen;
52
0
  char *path0;
53
0
  int off;
54
0
  const char *work_tree = precompose_string_if_needed(repo_get_work_tree(repo));
55
0
  struct strbuf realpath = STRBUF_INIT;
56
57
0
  if (!work_tree)
58
0
    return -1;
59
0
  wtlen = strlen(work_tree);
60
0
  len = strlen(path);
61
0
  off = offset_1st_component(path);
62
63
  /* check if work tree is already the prefix */
64
0
  if (wtlen <= len && !fspathncmp(path, work_tree, wtlen)) {
65
0
    if (path[wtlen] == '/') {
66
0
      memmove(path, path + wtlen + 1, len - wtlen);
67
0
      return 0;
68
0
    } else if (path[wtlen - 1] == '/' || path[wtlen] == '\0') {
69
      /* work tree is the root, or the whole path */
70
0
      memmove(path, path + wtlen, len - wtlen + 1);
71
0
      return 0;
72
0
    }
73
    /* work tree might match beginning of a symlink to work tree */
74
0
    off = wtlen;
75
0
  }
76
0
  path0 = path;
77
0
  path += off;
78
79
  /* check each '/'-terminated level */
80
0
  while (*path) {
81
0
    path++;
82
0
    if (*path == '/') {
83
0
      *path = '\0';
84
0
      strbuf_realpath(&realpath, path0, 1);
85
0
      if (fspathcmp(realpath.buf, work_tree) == 0) {
86
0
        memmove(path0, path + 1, len - (path - path0));
87
0
        strbuf_release(&realpath);
88
0
        return 0;
89
0
      }
90
0
      *path = '/';
91
0
    }
92
0
  }
93
94
  /* check whole path */
95
0
  strbuf_realpath(&realpath, path0, 1);
96
0
  if (fspathcmp(realpath.buf, work_tree) == 0) {
97
0
    *path0 = '\0';
98
0
    strbuf_release(&realpath);
99
0
    return 0;
100
0
  }
101
102
0
  strbuf_release(&realpath);
103
0
  return -1;
104
0
}
105
106
/*
107
 * Normalize "path", prepending the "prefix" for relative paths. If
108
 * remaining_prefix is not NULL, return the actual prefix still
109
 * remains in the path. For example, prefix = sub1/sub2/ and path is
110
 *
111
 *  foo          -> sub1/sub2/foo  (full prefix)
112
 *  ../foo       -> sub1/foo       (remaining prefix is sub1/)
113
 *  ../../bar    -> bar            (no remaining prefix)
114
 *  ../../sub1/sub2/foo -> sub1/sub2/foo (but no remaining prefix)
115
 *  `pwd`/../bar -> sub1/bar       (no remaining prefix)
116
 */
117
char *prefix_path_gently(struct repository *repo,
118
       const char *prefix, int len,
119
       int *remaining_prefix, const char *path)
120
0
{
121
0
  const char *orig = path;
122
0
  char *sanitized;
123
0
  if (is_absolute_path(orig)) {
124
0
    sanitized = xmallocz(strlen(path));
125
0
    if (remaining_prefix)
126
0
      *remaining_prefix = 0;
127
0
    if (normalize_path_copy_len(sanitized, path, remaining_prefix)) {
128
0
      free(sanitized);
129
0
      return NULL;
130
0
    }
131
0
    if (abspath_part_inside_repo(repo, sanitized)) {
132
0
      free(sanitized);
133
0
      return NULL;
134
0
    }
135
0
  } else {
136
0
    sanitized = xstrfmt("%.*s%s", len, len ? prefix : "", path);
137
0
    if (remaining_prefix)
138
0
      *remaining_prefix = len;
139
0
    if (normalize_path_copy_len(sanitized, sanitized, remaining_prefix)) {
140
0
      free(sanitized);
141
0
      return NULL;
142
0
    }
143
0
  }
144
0
  return sanitized;
145
0
}
146
147
char *prefix_path(struct repository *repo, const char *prefix, int len, const char *path)
148
0
{
149
0
  char *r = prefix_path_gently(repo, prefix, len, NULL, path);
150
0
  if (!r) {
151
0
    const char *hint_path = repo_get_work_tree(repo);
152
0
    if (!hint_path)
153
0
      hint_path = repo_get_git_dir(repo);
154
0
    die(_("'%s' is outside repository at '%s'"), path,
155
0
        absolute_path(hint_path));
156
0
  }
157
0
  return r;
158
0
}
159
160
int path_inside_repo(struct repository *repo, const char *prefix, const char *path)
161
0
{
162
0
  int len = prefix ? strlen(prefix) : 0;
163
0
  char *r = prefix_path_gently(repo, prefix, len, NULL, path);
164
0
  if (r) {
165
0
    free(r);
166
0
    return 1;
167
0
  }
168
0
  return 0;
169
0
}
170
171
int check_filename(const char *prefix, const char *arg)
172
0
{
173
0
  char *to_free = NULL;
174
0
  struct stat st;
175
176
0
  if (skip_prefix(arg, ":/", &arg)) {
177
0
    if (!*arg) /* ":/" is root dir, always exists */
178
0
      return 1;
179
0
    prefix = NULL;
180
0
  } else if (skip_prefix(arg, ":!", &arg) ||
181
0
       skip_prefix(arg, ":^", &arg)) {
182
0
    if (!*arg) /* excluding everything is silly, but allowed */
183
0
      return 1;
184
0
  }
185
186
0
  if (prefix)
187
0
    arg = to_free = prefix_filename(prefix, arg);
188
189
0
  if (!lstat(arg, &st)) {
190
0
    free(to_free);
191
0
    return 1; /* file exists */
192
0
  }
193
0
  if (is_missing_file_error(errno)) {
194
0
    free(to_free);
195
0
    return 0; /* file does not exist */
196
0
  }
197
0
  die_errno(_("failed to stat '%s'"), arg);
198
0
}
199
200
static void NORETURN die_verify_filename(struct repository *r,
201
           const char *prefix,
202
           const char *arg,
203
           int diagnose_misspelt_rev)
204
0
{
205
0
  if (!diagnose_misspelt_rev)
206
0
    die(_("%s: no such path in the working tree.\n"
207
0
          "Use 'git <command> -- <path>...' to specify paths that do not exist locally."),
208
0
        arg);
209
  /*
210
   * Saying "'(icase)foo' does not exist in the index" when the
211
   * user gave us ":(icase)foo" is just stupid.  A magic pathspec
212
   * begins with a colon and is followed by a non-alnum; do not
213
   * let maybe_die_on_misspelt_object_name() even trigger.
214
   */
215
0
  if (!(arg[0] == ':' && !isalnum(arg[1])))
216
0
    maybe_die_on_misspelt_object_name(r, arg, prefix);
217
218
  /* ... or fall back the most general message. */
219
0
  die(_("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
220
0
        "Use '--' to separate paths from revisions, like this:\n"
221
0
        "'git <command> [<revision>...] -- [<file>...]'"), arg);
222
223
0
}
224
225
/*
226
 * Check for arguments that don't resolve as actual files,
227
 * but which look sufficiently like pathspecs that we'll consider
228
 * them such for the purposes of rev/pathspec DWIM parsing.
229
 */
230
static int looks_like_pathspec(const char *arg)
231
0
{
232
0
  const char *p;
233
0
  int escaped = 0;
234
235
  /*
236
   * Wildcard characters imply the user is looking to match pathspecs
237
   * that aren't in the filesystem. Note that this doesn't include
238
   * backslash even though it's a glob special; by itself it doesn't
239
   * cause any increase in the match. Likewise ignore backslash-escaped
240
   * wildcard characters.
241
   */
242
0
  for (p = arg; *p; p++) {
243
0
    if (escaped) {
244
0
      escaped = 0;
245
0
    } else if (is_glob_special(*p)) {
246
0
      if (*p == '\\')
247
0
        escaped = 1;
248
0
      else
249
0
        return 1;
250
0
    }
251
0
  }
252
253
  /* long-form pathspec magic */
254
0
  if (starts_with(arg, ":("))
255
0
    return 1;
256
257
0
  return 0;
258
0
}
259
260
/*
261
 * Verify a filename that we got as an argument for a pathspec
262
 * entry. Note that a filename that begins with "-" never verifies
263
 * as true, because even if such a filename were to exist, we want
264
 * it to be preceded by the "--" marker (or we want the user to
265
 * use a format like "./-filename")
266
 *
267
 * The "diagnose_misspelt_rev" is used to provide a user-friendly
268
 * diagnosis when dying upon finding that "name" is not a pathname.
269
 * If set to 1, the diagnosis will try to diagnose "name" as an
270
 * invalid object name (e.g. HEAD:foo). If set to 0, the diagnosis
271
 * will only complain about an inexisting file.
272
 *
273
 * This function is typically called to check that a "file or rev"
274
 * argument is unambiguous. In this case, the caller will want
275
 * diagnose_misspelt_rev == 1 when verifying the first non-rev
276
 * argument (which could have been a revision), and
277
 * diagnose_misspelt_rev == 0 for the next ones (because we already
278
 * saw a filename, there's not ambiguity anymore).
279
 */
280
void verify_filename(struct repository *repo,
281
         const char *prefix,
282
         const char *arg,
283
         int diagnose_misspelt_rev)
284
0
{
285
0
  if (*arg == '-')
286
0
    die(_("option '%s' must come before non-option arguments"), arg);
287
0
  if (looks_like_pathspec(arg) || check_filename(prefix, arg))
288
0
    return;
289
0
  die_verify_filename(repo, prefix, arg, diagnose_misspelt_rev);
290
0
}
291
292
/*
293
 * Opposite of the above: the command line did not have -- marker
294
 * and we parsed the arg as a refname.  It should not be interpretable
295
 * as a filename.
296
 */
297
void verify_non_filename(struct repository *repo, const char *prefix, const char *arg)
298
0
{
299
0
  if (!is_inside_work_tree(repo) || is_inside_git_dir(repo))
300
0
    return;
301
0
  if (*arg == '-')
302
0
    return; /* flag */
303
0
  if (!check_filename(prefix, arg))
304
0
    return;
305
0
  die(_("ambiguous argument '%s': both revision and filename\n"
306
0
        "Use '--' to separate paths from revisions, like this:\n"
307
0
        "'git <command> [<revision>...] -- [<file>...]'"), arg);
308
0
}
309
310
int get_common_dir(struct strbuf *sb, const char *gitdir)
311
0
{
312
0
  const char *git_env_common_dir = getenv(GIT_COMMON_DIR_ENVIRONMENT);
313
0
  if (git_env_common_dir) {
314
0
    strbuf_addstr(sb, git_env_common_dir);
315
0
    return 1;
316
0
  } else {
317
0
    return get_common_dir_noenv(sb, gitdir);
318
0
  }
319
0
}
320
321
int get_common_dir_noenv(struct strbuf *sb, const char *gitdir)
322
0
{
323
0
  struct strbuf data = STRBUF_INIT;
324
0
  struct strbuf path = STRBUF_INIT;
325
0
  int ret = 0;
326
327
0
  strbuf_addf(&path, "%s/commondir", gitdir);
328
0
  if (file_exists(path.buf)) {
329
0
    if (strbuf_read_file(&data, path.buf, 0) <= 0)
330
0
      die_errno(_("failed to read %s"), path.buf);
331
0
    while (data.len && (data.buf[data.len - 1] == '\n' ||
332
0
            data.buf[data.len - 1] == '\r'))
333
0
      data.len--;
334
0
    data.buf[data.len] = '\0';
335
0
    strbuf_reset(&path);
336
0
    if (!is_absolute_path(data.buf))
337
0
      strbuf_addf(&path, "%s/", gitdir);
338
0
    strbuf_addbuf(&path, &data);
339
0
    strbuf_add_real_path(sb, path.buf);
340
0
    ret = 1;
341
0
  } else {
342
0
    strbuf_addstr(sb, gitdir);
343
0
  }
344
345
0
  strbuf_release(&data);
346
0
  strbuf_release(&path);
347
0
  return ret;
348
0
}
349
350
static int validate_headref(const char *path)
351
0
{
352
0
  struct stat st;
353
0
  char buffer[256];
354
0
  const char *refname;
355
0
  struct object_id oid;
356
0
  int fd;
357
0
  ssize_t len;
358
359
0
  if (lstat(path, &st) < 0)
360
0
    return -1;
361
362
  /* Make sure it is a "refs/.." symlink */
363
0
  if (S_ISLNK(st.st_mode)) {
364
0
    len = readlink(path, buffer, sizeof(buffer)-1);
365
0
    if (len >= 5 && !memcmp("refs/", buffer, 5))
366
0
      return 0;
367
0
    return -1;
368
0
  }
369
370
  /*
371
   * Anything else, just open it and try to see if it is a symbolic ref.
372
   */
373
0
  fd = open(path, O_RDONLY);
374
0
  if (fd < 0)
375
0
    return -1;
376
0
  len = read_in_full(fd, buffer, sizeof(buffer)-1);
377
0
  close(fd);
378
379
0
  if (len < 0)
380
0
    return -1;
381
0
  buffer[len] = '\0';
382
383
  /*
384
   * Is it a symbolic ref?
385
   */
386
0
  if (skip_prefix(buffer, "ref:", &refname)) {
387
0
    while (isspace(*refname))
388
0
      refname++;
389
0
    if (starts_with(refname, "refs/"))
390
0
      return 0;
391
0
  }
392
393
  /*
394
   * Is this a detached HEAD?
395
   */
396
0
  if (get_oid_hex_any(buffer, &oid) != GIT_HASH_UNKNOWN)
397
0
    return 0;
398
399
0
  return -1;
400
0
}
401
402
/*
403
 * Test if it looks like we're at a git directory.
404
 * We want to see:
405
 *
406
 *  - either an objects/ directory _or_ the proper
407
 *    GIT_OBJECT_DIRECTORY environment variable
408
 *  - a refs/ directory
409
 *  - either a HEAD symlink or a HEAD file that is formatted as
410
 *    a proper "ref:", or a regular file HEAD that has a properly
411
 *    formatted sha1 object name.
412
 */
413
int is_git_directory(const char *suspect)
414
0
{
415
0
  struct strbuf path = STRBUF_INIT;
416
0
  int ret = 0;
417
0
  size_t len;
418
419
  /* Check worktree-related signatures */
420
0
  strbuf_addstr(&path, suspect);
421
0
  strbuf_complete(&path, '/');
422
0
  strbuf_addstr(&path, "HEAD");
423
0
  if (validate_headref(path.buf))
424
0
    goto done;
425
426
0
  strbuf_reset(&path);
427
0
  get_common_dir(&path, suspect);
428
0
  len = path.len;
429
430
  /* Check non-worktree-related signatures */
431
0
  if (getenv(DB_ENVIRONMENT)) {
432
0
    if (access(getenv(DB_ENVIRONMENT), X_OK))
433
0
      goto done;
434
0
  }
435
0
  else {
436
0
    strbuf_setlen(&path, len);
437
0
    strbuf_addstr(&path, "/objects");
438
0
    if (access(path.buf, X_OK))
439
0
      goto done;
440
0
  }
441
442
0
  strbuf_setlen(&path, len);
443
0
  strbuf_addstr(&path, "/refs");
444
0
  if (access(path.buf, X_OK))
445
0
    goto done;
446
447
0
  ret = 1;
448
0
done:
449
0
  strbuf_release(&path);
450
0
  return ret;
451
0
}
452
453
int is_nonbare_repository_dir(struct strbuf *path)
454
0
{
455
0
  int ret = 0;
456
0
  int gitfile_error;
457
0
  size_t orig_path_len = path->len;
458
0
  assert(orig_path_len != 0);
459
0
  strbuf_complete(path, '/');
460
0
  strbuf_addstr(path, ".git");
461
0
  if (read_gitfile_gently(path->buf, &gitfile_error) || is_git_directory(path->buf))
462
0
    ret = 1;
463
0
  if (gitfile_error == READ_GITFILE_ERR_OPEN_FAILED ||
464
0
      gitfile_error == READ_GITFILE_ERR_READ_FAILED)
465
0
    ret = 1;
466
0
  strbuf_setlen(path, orig_path_len);
467
0
  return ret;
468
0
}
469
470
int is_inside_git_dir(struct repository *repo)
471
0
{
472
0
  struct strbuf buf = STRBUF_INIT;
473
0
  int ret = is_inside_dir(strbuf_realpath(&buf, repo_get_git_dir(repo), 1));
474
0
  strbuf_release(&buf);
475
0
  return ret;
476
0
}
477
478
int is_inside_work_tree(struct repository *repo)
479
0
{
480
0
  struct strbuf buf = STRBUF_INIT;
481
0
  const char *worktree;
482
0
  int ret;
483
484
0
  worktree = repo_get_work_tree(repo);
485
0
  if (!worktree)
486
0
    return 0;
487
488
0
  ret = is_inside_dir(strbuf_realpath(&buf, worktree, 1));
489
490
0
  strbuf_release(&buf);
491
0
  return ret;
492
0
}
493
494
void setup_work_tree(struct repository *repo)
495
0
{
496
0
  const char *work_tree;
497
498
0
  if (repo->worktree_config_is_bogus)
499
0
    die(_("unable to set up work tree using invalid config"));
500
501
0
  work_tree = repo_get_work_tree(repo);
502
0
  if (!work_tree || chdir_notify(work_tree))
503
0
    die(_("this operation must be run in a work tree"));
504
505
  /*
506
   * Make sure subsequent git processes find correct worktree
507
   * if $GIT_WORK_TREE is set relative
508
   */
509
0
  if (getenv(GIT_WORK_TREE_ENVIRONMENT))
510
0
    setenv(GIT_WORK_TREE_ENVIRONMENT, ".", 1);
511
0
}
512
513
static void setup_original_cwd(struct repository *repo)
514
0
{
515
0
  struct strbuf tmp = STRBUF_INIT;
516
0
  const char *worktree = NULL;
517
0
  int offset = -1;
518
519
0
  if (!tmp_original_cwd)
520
0
    return;
521
522
  /*
523
   * startup_info->original_cwd points to the current working
524
   * directory we inherited from our parent process, which is a
525
   * directory we want to avoid removing.
526
   *
527
   * For convenience, we would like to have the path relative to the
528
   * worktree instead of an absolute path.
529
   *
530
   * Yes, startup_info->original_cwd is usually the same as 'prefix',
531
   * but differs in two ways:
532
   *   - prefix has a trailing '/'
533
   *   - if the user passes '-C' to git, that modifies the prefix but
534
   *     not startup_info->original_cwd.
535
   */
536
537
  /* Normalize the directory */
538
0
  if (!strbuf_realpath(&tmp, tmp_original_cwd, 0)) {
539
0
    trace2_data_string("setup", repo,
540
0
           "realpath-path", tmp_original_cwd);
541
0
    trace2_data_string("setup", repo,
542
0
           "realpath-failure", strerror(errno));
543
0
    free((char*)tmp_original_cwd);
544
0
    tmp_original_cwd = NULL;
545
0
    return;
546
0
  }
547
548
0
  free((char*)tmp_original_cwd);
549
0
  tmp_original_cwd = NULL;
550
0
  startup_info->original_cwd = strbuf_detach(&tmp, NULL);
551
552
  /*
553
   * Get our worktree; we only protect the current working directory
554
   * if it's in the worktree.
555
   */
556
0
  worktree = repo_get_work_tree(repo);
557
0
  if (!worktree)
558
0
    goto no_prevention_needed;
559
560
0
  offset = dir_inside_of(startup_info->original_cwd, worktree);
561
0
  if (offset >= 0) {
562
    /*
563
     * If startup_info->original_cwd == worktree, that is already
564
     * protected and we don't need original_cwd as a secondary
565
     * protection measure.
566
     */
567
0
    if (!*(startup_info->original_cwd + offset))
568
0
      goto no_prevention_needed;
569
570
    /*
571
     * original_cwd was inside worktree; precompose it just as
572
     * we do prefix so that built up paths will match
573
     */
574
0
    startup_info->original_cwd = \
575
0
      precompose_string_if_needed(startup_info->original_cwd
576
0
                + offset);
577
0
    return;
578
0
  }
579
580
0
no_prevention_needed:
581
0
  free((char*)startup_info->original_cwd);
582
0
  startup_info->original_cwd = NULL;
583
0
}
584
585
static int read_worktree_config(const char *var, const char *value,
586
        const struct config_context *ctx UNUSED,
587
        void *vdata)
588
0
{
589
0
  struct repository_format *data = vdata;
590
591
0
  if (strcmp(var, "core.bare") == 0) {
592
0
    data->is_bare = git_config_bool(var, value);
593
0
  } else if (strcmp(var, "core.worktree") == 0) {
594
0
    if (!value)
595
0
      return config_error_nonbool(var);
596
0
    free(data->work_tree);
597
0
    data->work_tree = xstrdup(value);
598
0
  }
599
0
  return 0;
600
0
}
601
602
enum extension_result {
603
  EXTENSION_ERROR = -1, /* compatible with error(), etc */
604
  EXTENSION_UNKNOWN = 0,
605
  EXTENSION_OK = 1
606
};
607
608
/*
609
 * Do not add new extensions to this function. It handles extensions which are
610
 * respected even in v0-format repositories for historical compatibility.
611
 */
612
static enum extension_result handle_extension_v0(const char *var,
613
             const char *value,
614
             const char *ext,
615
             struct repository_format *data)
616
0
{
617
0
    if (!strcmp(ext, "noop")) {
618
0
      return EXTENSION_OK;
619
0
    } else if (!strcmp(ext, "preciousobjects")) {
620
0
      data->precious_objects = git_config_bool(var, value);
621
0
      return EXTENSION_OK;
622
0
    } else if (!strcmp(ext, "partialclone")) {
623
0
      if (!value)
624
0
        return config_error_nonbool(var);
625
0
      data->partial_clone = xstrdup(value);
626
0
      return EXTENSION_OK;
627
0
    } else if (!strcmp(ext, "worktreeconfig")) {
628
0
      data->worktree_config = git_config_bool(var, value);
629
0
      return EXTENSION_OK;
630
0
    }
631
632
0
    return EXTENSION_UNKNOWN;
633
0
}
634
635
/*
636
 * Record any new extensions in this function.
637
 */
638
static enum extension_result handle_extension(const char *var,
639
                const char *value,
640
                const char *ext,
641
                struct repository_format *data)
642
0
{
643
0
  if (!strcmp(ext, "noop-v1")) {
644
0
    return EXTENSION_OK;
645
0
  } else if (!strcmp(ext, "objectformat")) {
646
0
    int format;
647
648
0
    if (!value)
649
0
      return config_error_nonbool(var);
650
0
    format = hash_algo_by_name(value);
651
0
    if (format == GIT_HASH_UNKNOWN)
652
0
      return error(_("invalid value for '%s': '%s'"),
653
0
             "extensions.objectformat", value);
654
0
    data->hash_algo = format;
655
0
    return EXTENSION_OK;
656
0
  } else if (!strcmp(ext, "compatobjectformat")) {
657
0
    struct string_list_item *item;
658
0
    int format;
659
660
0
    if (!value)
661
0
      return config_error_nonbool(var);
662
0
    format = hash_algo_by_name(value);
663
0
    if (format == GIT_HASH_UNKNOWN)
664
0
      return error(_("invalid value for '%s': '%s'"),
665
0
             "extensions.compatobjectformat", value);
666
    /* For now only support compatObjectFormat being specified once. */
667
0
    for_each_string_list_item(item, &data->v1_only_extensions) {
668
0
      if (!strcmp(item->string, "compatobjectformat"))
669
0
        return error(_("'%s' already specified as '%s'"),
670
0
          "extensions.compatobjectformat",
671
0
          hash_algos[data->compat_hash_algo].name);
672
0
    }
673
0
    data->compat_hash_algo = format;
674
0
    return EXTENSION_OK;
675
0
  } else if (!strcmp(ext, "refstorage")) {
676
0
    unsigned int format;
677
678
0
    if (!value)
679
0
      return config_error_nonbool(var);
680
681
0
    FREE_AND_NULL(data->ref_storage_payload);
682
0
    format = ref_storage_format_by_uri(value,
683
0
               &data->ref_storage_payload);
684
685
0
    if (format == REF_STORAGE_FORMAT_UNKNOWN)
686
0
      return error(_("invalid value for '%s': '%s'"),
687
0
             "extensions.refstorage", value);
688
0
    data->ref_storage_format = format;
689
0
    return EXTENSION_OK;
690
0
  } else if (!strcmp(ext, "relativeworktrees")) {
691
0
    data->relative_worktrees = git_config_bool(var, value);
692
0
    return EXTENSION_OK;
693
0
  } else if (!strcmp(ext, "submodulepathconfig")) {
694
0
    data->submodule_path_cfg = git_config_bool(var, value);
695
0
    return EXTENSION_OK;
696
0
  }
697
0
  return EXTENSION_UNKNOWN;
698
0
}
699
700
static int check_repo_format(const char *var, const char *value,
701
           const struct config_context *ctx, void *vdata)
702
0
{
703
0
  struct repository_format *data = vdata;
704
0
  const char *ext;
705
706
0
  if (strcmp(var, "core.repositoryformatversion") == 0)
707
0
    data->version = git_config_int(var, value, ctx->kvi);
708
0
  else if (skip_prefix(var, "extensions.", &ext)) {
709
0
    switch (handle_extension_v0(var, value, ext, data)) {
710
0
    case EXTENSION_ERROR:
711
0
      return -1;
712
0
    case EXTENSION_OK:
713
0
      return 0;
714
0
    case EXTENSION_UNKNOWN:
715
0
      break;
716
0
    }
717
718
0
    switch (handle_extension(var, value, ext, data)) {
719
0
    case EXTENSION_ERROR:
720
0
      return -1;
721
0
    case EXTENSION_OK:
722
0
      string_list_append(&data->v1_only_extensions, ext);
723
0
      return 0;
724
0
    case EXTENSION_UNKNOWN:
725
0
      string_list_append(&data->unknown_extensions, ext);
726
0
      return 0;
727
0
    }
728
0
  }
729
730
0
  return read_worktree_config(var, value, ctx, vdata);
731
0
}
732
733
static int read_and_verify_repository_format(struct repository_format *format,
734
               const char *gitdir,
735
               int *nongit_ok)
736
0
{
737
0
  struct strbuf sb = STRBUF_INIT;
738
0
  struct strbuf err = STRBUF_INIT;
739
0
  int has_common;
740
741
0
  has_common = get_common_dir(&sb, gitdir);
742
0
  strbuf_addstr(&sb, "/config");
743
0
  read_repository_format(format, sb.buf);
744
0
  strbuf_release(&sb);
745
746
  /*
747
   * For historical use of check_and_apply_repository_format() in git-init,
748
   * we treat a missing config as a silent "ok", even when nongit_ok
749
   * is unset.
750
   */
751
0
  if (format->version < 0)
752
0
    return 0;
753
754
0
  if (verify_repository_format(format, &err) < 0) {
755
0
    if (nongit_ok) {
756
0
      warning("%s", err.buf);
757
0
      strbuf_release(&err);
758
0
      *nongit_ok = -1;
759
0
      return -1;
760
0
    }
761
0
    die("%s", err.buf);
762
0
  }
763
764
0
  string_list_clear(&format->unknown_extensions, 0);
765
0
  string_list_clear(&format->v1_only_extensions, 0);
766
767
0
  if (format->worktree_config) {
768
    /*
769
     * pick up core.bare and core.worktree from per-worktree
770
     * config if present
771
     */
772
0
    strbuf_addf(&sb, "%s/config.worktree", gitdir);
773
0
    git_config_from_file(read_worktree_config, sb.buf, format);
774
0
    strbuf_release(&sb);
775
0
    has_common = 0;
776
0
  }
777
778
0
  if (startup_info->force_bare_repository) {
779
0
    format->is_bare = 1;
780
0
    FREE_AND_NULL(format->work_tree);
781
0
  } else if (has_common) {
782
    /*
783
     * When sharing a common dir with another repository (e.g. a
784
     * linked worktree), do not let this repository's config
785
     * dictate bareness; it is inherited from the main worktree.
786
     */
787
0
    format->is_bare = -1;
788
789
    /*
790
     * Furthermore, "core.worktree" is supposed to be ignored when
791
     * we have a commondir configured, unless it comes from the
792
     * per-worktree configuration.
793
     */
794
0
    FREE_AND_NULL(format->work_tree);
795
0
  }
796
797
0
  return 0;
798
0
}
799
800
int upgrade_repository_format(struct repository *repo, int target_version)
801
0
{
802
0
  struct strbuf sb = STRBUF_INIT;
803
0
  struct strbuf err = STRBUF_INIT;
804
0
  struct strbuf repo_version = STRBUF_INIT;
805
0
  struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
806
0
  int ret;
807
808
0
  repo_common_path_append(repo, &sb, "config");
809
0
  read_repository_format(&repo_fmt, sb.buf);
810
0
  strbuf_release(&sb);
811
812
0
  if (repo_fmt.version >= target_version) {
813
0
    ret = 0;
814
0
    goto out;
815
0
  }
816
817
0
  if (verify_repository_format(&repo_fmt, &err) < 0) {
818
0
    ret = error("cannot upgrade repository format from %d to %d: %s",
819
0
          repo_fmt.version, target_version, err.buf);
820
0
    goto out;
821
0
  }
822
0
  if (!repo_fmt.version && repo_fmt.unknown_extensions.nr) {
823
0
    ret = error("cannot upgrade repository format: "
824
0
          "unknown extension %s",
825
0
          repo_fmt.unknown_extensions.items[0].string);
826
0
    goto out;
827
0
  }
828
829
0
  strbuf_addf(&repo_version, "%d", target_version);
830
0
  repo_config_set(repo, "core.repositoryformatversion", repo_version.buf);
831
832
0
  ret = 1;
833
834
0
out:
835
0
  clear_repository_format(&repo_fmt);
836
0
  strbuf_release(&repo_version);
837
0
  strbuf_release(&err);
838
0
  return ret;
839
0
}
840
841
static void init_repository_format(struct repository_format *format)
842
0
{
843
0
  const struct repository_format fresh = REPOSITORY_FORMAT_INIT;
844
845
0
  memcpy(format, &fresh, sizeof(fresh));
846
0
}
847
848
int read_repository_format(struct repository_format *format, const char *path)
849
0
{
850
0
  clear_repository_format(format);
851
0
  format->hash_algo = GIT_HASH_SHA1_LEGACY;
852
0
  git_config_from_file(check_repo_format, path, format);
853
0
  if (format->version == -1) {
854
0
    clear_repository_format(format);
855
0
    format->hash_algo = GIT_HASH_SHA1_LEGACY;
856
0
  }
857
0
  return format->version;
858
0
}
859
860
void clear_repository_format(struct repository_format *format)
861
0
{
862
0
  string_list_clear(&format->unknown_extensions, 0);
863
0
  string_list_clear(&format->v1_only_extensions, 0);
864
0
  free(format->work_tree);
865
0
  free(format->partial_clone);
866
0
  free(format->ref_storage_payload);
867
0
  init_repository_format(format);
868
0
}
869
870
int verify_repository_format(const struct repository_format *format,
871
           struct strbuf *err)
872
0
{
873
0
  if (GIT_REPO_VERSION_READ < format->version) {
874
0
    strbuf_addf(err, _("Expected git repo version <= %d, found %d"),
875
0
          GIT_REPO_VERSION_READ, format->version);
876
0
    return -1;
877
0
  }
878
879
0
  if (format->version >= 1 && format->unknown_extensions.nr) {
880
0
    int i;
881
882
0
    strbuf_addstr(err, Q_("unknown repository extension found:",
883
0
              "unknown repository extensions found:",
884
0
              format->unknown_extensions.nr));
885
886
0
    for (i = 0; i < format->unknown_extensions.nr; i++)
887
0
      strbuf_addf(err, "\n\t%s",
888
0
            format->unknown_extensions.items[i].string);
889
0
    return -1;
890
0
  }
891
892
0
  if (format->version == 0 && format->v1_only_extensions.nr) {
893
0
    int i;
894
895
0
    strbuf_addstr(err,
896
0
            Q_("repo version is 0, but v1-only extension found:",
897
0
         "repo version is 0, but v1-only extensions found:",
898
0
         format->v1_only_extensions.nr));
899
900
0
    for (i = 0; i < format->v1_only_extensions.nr; i++)
901
0
      strbuf_addf(err, "\n\t%s",
902
0
            format->v1_only_extensions.items[i].string);
903
0
    return -1;
904
0
  }
905
906
0
  return 0;
907
0
}
908
909
void read_gitfile_error_die(int error_code, const char *path)
910
0
{
911
0
  switch (error_code) {
912
0
  case READ_GITFILE_ERR_NOT_A_FILE:
913
0
  case READ_GITFILE_ERR_STAT_FAILED:
914
0
  case READ_GITFILE_ERR_MISSING:
915
0
  case READ_GITFILE_ERR_IS_A_DIR:
916
    /* non-fatal; follow return path */
917
0
    break;
918
0
  case READ_GITFILE_ERR_OPEN_FAILED:
919
0
    die_errno(_("error opening '%s'"), path);
920
0
  case READ_GITFILE_ERR_TOO_LARGE:
921
0
    die(_("too large to be a .git file: '%s'"), path);
922
0
  case READ_GITFILE_ERR_READ_FAILED:
923
0
    die(_("error reading %s"), path);
924
0
  case READ_GITFILE_ERR_INVALID_FORMAT:
925
0
    die(_("invalid gitfile format: %s"), path);
926
0
  case READ_GITFILE_ERR_NO_PATH:
927
0
    die(_("no path in gitfile: %s"), path);
928
0
  case READ_GITFILE_ERR_NOT_A_REPO:
929
0
    die(_("gitfile does not point to a valid repository: %s"),
930
0
        path);
931
0
  default:
932
0
    BUG("unknown error code");
933
0
  }
934
0
}
935
936
/*
937
 * Try to read the location of the git directory from the .git file,
938
 * return path to git directory if found. The return value comes from
939
 * a shared buffer.
940
 *
941
 * On failure, if return_error_code is not NULL, return_error_code
942
 * will be set to an error code and NULL will be returned. If
943
 * return_error_code is NULL the function will die instead (for most
944
 * cases).
945
 */
946
const char *read_gitfile_gently(const char *path, int *return_error_code)
947
0
{
948
0
  int error_code = 0;
949
0
  const char *slash;
950
0
  struct strbuf contents = STRBUF_INIT;
951
0
  static struct strbuf realpath = STRBUF_INIT;
952
953
0
  error_code = read_gitfile_raw(&contents, path);
954
0
  if (error_code)
955
0
    goto cleanup_return;
956
957
0
  if (!is_absolute_path(contents.buf) && (slash = strrchr(path, '/'))) {
958
0
    size_t pathlen = slash+1 - path;
959
0
    char *dir = xstrfmt("%.*s%s", (int)pathlen, path, contents.buf);
960
0
    strbuf_reset(&contents);
961
0
    strbuf_addstr(&contents, dir);
962
0
    free(dir);
963
0
  }
964
0
  if (!is_git_directory(contents.buf)) {
965
0
    error_code = READ_GITFILE_ERR_NOT_A_REPO;
966
0
    goto cleanup_return;
967
0
  }
968
969
0
  strbuf_realpath(&realpath, contents.buf, 1);
970
971
0
cleanup_return:
972
0
  if (return_error_code)
973
0
    *return_error_code = error_code;
974
0
  else if (error_code)
975
0
    read_gitfile_error_die(error_code, path);
976
977
0
  strbuf_release(&contents);
978
0
  return error_code ? NULL : realpath.buf;
979
0
}
980
981
/*
982
 * Read the path following "gitdir: " from the .git file into strbuf.
983
 *
984
 * Unlike read_gitfile_gently(), this function does not resolve a
985
 * relative path or validate it using is_git_directory().
986
 */
987
int read_gitfile_raw(struct strbuf *contents, const char *path)
988
0
{
989
0
  const int max_file_size = 1 << 20;  /* 1MB */
990
0
  int error_code = 0;
991
0
  char *buf = NULL;
992
0
  struct stat st;
993
0
  int fd;
994
0
  ssize_t len;
995
996
0
  if (stat(path, &st)) {
997
0
    if (errno == ENOENT || errno == ENOTDIR)
998
0
      error_code = READ_GITFILE_ERR_MISSING;
999
0
    else
1000
0
      error_code = READ_GITFILE_ERR_STAT_FAILED;
1001
0
    goto cleanup_return;
1002
0
  }
1003
0
  if (S_ISDIR(st.st_mode)) {
1004
0
    error_code = READ_GITFILE_ERR_IS_A_DIR;
1005
0
    goto cleanup_return;
1006
0
  }
1007
0
  if (!S_ISREG(st.st_mode)) {
1008
0
    error_code = READ_GITFILE_ERR_NOT_A_FILE;
1009
0
    goto cleanup_return;
1010
0
  }
1011
0
  if (st.st_size > max_file_size) {
1012
0
    error_code = READ_GITFILE_ERR_TOO_LARGE;
1013
0
    goto cleanup_return;
1014
0
  }
1015
0
  fd = open(path, O_RDONLY);
1016
0
  if (fd < 0) {
1017
0
    error_code = READ_GITFILE_ERR_OPEN_FAILED;
1018
0
    goto cleanup_return;
1019
0
  }
1020
0
  buf = xmallocz(st.st_size);
1021
0
  len = read_in_full(fd, buf, st.st_size);
1022
0
  close(fd);
1023
0
  if (len != st.st_size) {
1024
0
    error_code = READ_GITFILE_ERR_READ_FAILED;
1025
0
    goto cleanup_return;
1026
0
  }
1027
0
  if (!starts_with(buf, "gitdir: ")) {
1028
0
    error_code = READ_GITFILE_ERR_INVALID_FORMAT;
1029
0
    goto cleanup_return;
1030
0
  }
1031
0
  while (buf[len - 1] == '\n' || buf[len - 1] == '\r')
1032
0
    len--;
1033
0
  if (len < 9) {
1034
0
    error_code = READ_GITFILE_ERR_NO_PATH;
1035
0
    goto cleanup_return;
1036
0
  }
1037
0
  strbuf_add(contents, buf+8, len-8);
1038
1039
0
cleanup_return:
1040
0
  free(buf);
1041
0
  return error_code;
1042
0
}
1043
1044
static void apply_gitdir_and_environment(struct repository *repo, const char *path)
1045
0
{
1046
0
  struct strvec to_free = STRVEC_INIT;
1047
0
  struct set_gitdir_args args = {
1048
0
    .commondir = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT),
1049
0
    .graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT),
1050
0
    .index_file = getenv_safe(&to_free, INDEX_ENVIRONMENT),
1051
0
    .disable_ref_updates = !!getenv(GIT_QUARANTINE_ENVIRONMENT),
1052
0
  };
1053
1054
0
  repo_set_gitdir(repo, path, &args);
1055
1056
0
  strvec_clear(&to_free);
1057
0
}
1058
1059
static void update_relative_gitdir(const char *old_cwd,
1060
           const char *new_cwd,
1061
           void *data)
1062
0
{
1063
0
  struct repository *repo = data;
1064
0
  char *path = reparent_relative_path(old_cwd, new_cwd,
1065
0
              repo_get_git_dir(repo));
1066
0
  trace_printf_key(&trace_setup_key,
1067
0
       "setup: move $GIT_DIR to '%s'",
1068
0
       path);
1069
0
  apply_gitdir_and_environment(repo, path);
1070
0
  xsetenv(GIT_DIR_ENVIRONMENT, path, 1);
1071
0
  free(path);
1072
0
}
1073
1074
static void apply_and_export_relative_gitdir(struct repository *repo, const char *path, int make_realpath)
1075
0
{
1076
0
  struct strbuf realpath = STRBUF_INIT;
1077
1078
0
  if (make_realpath) {
1079
0
    strbuf_realpath(&realpath, path, 1);
1080
0
    path = realpath.buf;
1081
0
  }
1082
1083
0
  apply_gitdir_and_environment(repo, path);
1084
0
  xsetenv(GIT_DIR_ENVIRONMENT, path, 1);
1085
1086
0
  if (!is_absolute_path(path))
1087
0
    chdir_notify_register(update_relative_gitdir, repo);
1088
1089
0
  strbuf_release(&realpath);
1090
0
}
1091
1092
struct repo_discovery {
1093
  struct repository_format format;
1094
  char *gitdir;
1095
  char *worktree;
1096
  char *prefix;
1097
};
1098
1099
0
#define REPO_DISCOVERY_INIT { \
1100
0
  .format = REPOSITORY_FORMAT_INIT, \
1101
0
}
1102
1103
static void repo_discovery_release(struct repo_discovery *r)
1104
0
{
1105
0
  clear_repository_format(&r->format);
1106
0
  free(r->gitdir);
1107
0
  free(r->worktree);
1108
0
  free(r->prefix);
1109
0
}
1110
1111
static void repo_discovery_set_gitdir(struct repo_discovery *r,
1112
              const char *gitdir,
1113
              int make_realpath)
1114
0
{
1115
0
  free(r->gitdir);
1116
0
  if (make_realpath) {
1117
0
    struct strbuf realpath = STRBUF_INIT;
1118
0
    strbuf_realpath(&realpath, gitdir, 1);
1119
0
    r->gitdir = strbuf_detach(&realpath, NULL);
1120
0
  } else {
1121
0
    r->gitdir = xstrdup(gitdir);
1122
0
  }
1123
0
}
1124
1125
static void repo_discovery_set_worktree(struct repo_discovery *r,
1126
          const char *worktree)
1127
0
{
1128
0
  free(r->worktree);
1129
0
  r->worktree = real_pathdup(worktree, 1);
1130
0
}
1131
1132
static void repo_discover_explicit_gitdir(struct repo_discovery *discovery,
1133
            const char *gitdirenv,
1134
            struct strbuf *cwd,
1135
            int *nongit_ok)
1136
0
{
1137
0
  const char *work_tree_env = getenv(GIT_WORK_TREE_ENVIRONMENT);
1138
0
  char *gitfile;
1139
0
  int offset;
1140
1141
0
  if (PATH_MAX - 40 < strlen(gitdirenv))
1142
0
    die(_("'$%s' too big"), GIT_DIR_ENVIRONMENT);
1143
1144
0
  gitfile = (char*)read_gitfile(gitdirenv);
1145
0
  if (gitfile) {
1146
0
    gitfile = xstrdup(gitfile);
1147
0
    gitdirenv = gitfile;
1148
0
  }
1149
1150
0
  if (!is_git_directory(gitdirenv)) {
1151
0
    if (nongit_ok) {
1152
0
      *nongit_ok = 1;
1153
0
      goto out;
1154
0
    }
1155
0
    die(_("not a git repository: '%s'"), gitdirenv);
1156
0
  }
1157
1158
0
  if (read_and_verify_repository_format(&discovery->format, gitdirenv, nongit_ok))
1159
0
    goto out;
1160
1161
  /* #3, #7, #11, #15, #19, #23, #27, #31 (see t1510) */
1162
0
  if (work_tree_env) {
1163
    /*
1164
     * The environment variable overrides "core.worktree". This
1165
     * also has the consequence that we don't want to flag cases as
1166
     * bogus where we have both "core.worktree" and "core.bare", so
1167
     * we have to explicitly unset the configuration.
1168
     */
1169
0
    FREE_AND_NULL(discovery->format.work_tree);
1170
0
    repo_discovery_set_worktree(discovery, work_tree_env);
1171
0
  } else if (discovery->format.is_bare > 0) {
1172
    /* #18, #26 */
1173
0
    repo_discovery_set_gitdir(discovery, gitdirenv, 0);
1174
0
    goto out;
1175
0
  } else if (discovery->format.work_tree) { /* #6, #14 */
1176
0
    if (is_absolute_path(discovery->format.work_tree)) {
1177
0
      repo_discovery_set_worktree(discovery, discovery->format.work_tree);
1178
0
    } else {
1179
0
      char *core_worktree;
1180
0
      if (chdir(gitdirenv))
1181
0
        die_errno(_("cannot chdir to '%s'"), gitdirenv);
1182
0
      if (chdir(discovery->format.work_tree))
1183
0
        die_errno(_("cannot chdir to '%s'"), discovery->format.work_tree);
1184
0
      core_worktree = xgetcwd();
1185
0
      if (chdir(cwd->buf))
1186
0
        die_errno(_("cannot come back to cwd"));
1187
0
      repo_discovery_set_worktree(discovery, core_worktree);
1188
0
      free(core_worktree);
1189
0
    }
1190
0
  } else if (!git_env_bool(GIT_IMPLICIT_WORK_TREE_ENVIRONMENT, 1)) {
1191
    /* #16d */
1192
0
    repo_discovery_set_gitdir(discovery, gitdirenv, 0);
1193
0
    goto out;
1194
0
  } else { /* #2, #10 */
1195
0
    repo_discovery_set_worktree(discovery, ".");
1196
0
  }
1197
1198
  /* both the worktree and cwd are already normalized */
1199
0
  if (!strcmp(cwd->buf, discovery->worktree)) { /* cwd == worktree */
1200
0
    repo_discovery_set_gitdir(discovery, gitdirenv, 0);
1201
0
    goto out;
1202
0
  }
1203
1204
0
  offset = dir_inside_of(cwd->buf, discovery->worktree);
1205
0
  if (offset >= 0) { /* cwd inside discovery->worktree? */
1206
0
    repo_discovery_set_gitdir(discovery, gitdirenv, 1);
1207
0
    if (chdir(discovery->worktree))
1208
0
      die_errno(_("cannot chdir to '%s'"), discovery->worktree);
1209
0
    discovery->prefix = xstrfmt("%s/", cwd->buf + offset);
1210
0
    goto out;
1211
0
  }
1212
1213
  /* cwd outside worktree */
1214
0
  repo_discovery_set_gitdir(discovery, gitdirenv, 0);
1215
1216
0
out:
1217
0
  free(gitfile);
1218
0
}
1219
1220
static void repo_discover_implicit_gitdir(struct repo_discovery *discovery,
1221
            const char *gitdir,
1222
            struct strbuf *cwd, int offset,
1223
            int *nongit_ok)
1224
0
{
1225
0
  if (read_and_verify_repository_format(&discovery->format, gitdir, nongit_ok))
1226
0
    return;
1227
1228
  /* --work-tree is set without --git-dir; use discovered one */
1229
0
  if (getenv(GIT_WORK_TREE_ENVIRONMENT) || discovery->format.work_tree) {
1230
0
    char *to_free = NULL;
1231
1232
0
    if (offset != cwd->len && !is_absolute_path(gitdir))
1233
0
      gitdir = to_free = real_pathdup(gitdir, 1);
1234
0
    if (chdir(cwd->buf))
1235
0
      die_errno(_("cannot come back to cwd"));
1236
0
    repo_discover_explicit_gitdir(discovery, gitdir, cwd,
1237
0
                nongit_ok);
1238
0
    free(to_free);
1239
0
    return;
1240
0
  }
1241
1242
  /* #16.2, #17.2, #20.2, #21.2, #24, #25, #28, #29 (see t1510) */
1243
0
  if (discovery->format.is_bare > 0) {
1244
0
    repo_discovery_set_gitdir(discovery, gitdir, (offset != cwd->len));
1245
0
    if (chdir(cwd->buf))
1246
0
      die_errno(_("cannot come back to cwd"));
1247
0
    return;
1248
0
  }
1249
1250
  /* #0, #1, #5, #8, #9, #12, #13 */
1251
0
  repo_discovery_set_worktree(discovery, ".");
1252
0
  if (strcmp(gitdir, DEFAULT_GIT_DIR_ENVIRONMENT))
1253
0
    repo_discovery_set_gitdir(discovery, gitdir, 0);
1254
0
  if (offset >= cwd->len)
1255
0
    return;
1256
1257
  /* Make "offset" point past the '/' (already the case for root dirs) */
1258
0
  if (offset != offset_1st_component(cwd->buf))
1259
0
    offset++;
1260
0
  discovery->prefix = xstrfmt("%s/", cwd->buf + offset);
1261
0
}
1262
1263
/* #16.1, #17.1, #20.1, #21.1, #22.1 (see t1510) */
1264
static void repo_discover_bare_gitdir(struct repo_discovery *discovery,
1265
              struct strbuf *cwd, int offset,
1266
              int *nongit_ok)
1267
0
{
1268
0
  int root_len;
1269
1270
0
  if (read_and_verify_repository_format(&discovery->format, ".", nongit_ok))
1271
0
    return;
1272
1273
0
  setenv(GIT_IMPLICIT_WORK_TREE_ENVIRONMENT, "0", 1);
1274
1275
  /* --work-tree is set without --git-dir; use discovered one */
1276
0
  if (getenv(GIT_WORK_TREE_ENVIRONMENT) || discovery->format.work_tree) {
1277
0
    char *gitdir = offset == cwd->len ? xstrdup(".") : xmemdupz(cwd->buf, offset);
1278
0
    if (chdir(cwd->buf))
1279
0
      die_errno(_("cannot come back to cwd"));
1280
0
    repo_discover_explicit_gitdir(discovery, gitdir, cwd, nongit_ok);
1281
0
    free(gitdir);
1282
0
    return;
1283
0
  }
1284
1285
0
  if (offset != cwd->len) {
1286
0
    if (chdir(cwd->buf))
1287
0
      die_errno(_("cannot come back to cwd"));
1288
0
    root_len = offset_1st_component(cwd->buf);
1289
0
    strbuf_setlen(cwd, offset > root_len ? offset : root_len);
1290
0
    repo_discovery_set_gitdir(discovery, cwd->buf, 0);
1291
0
  } else {
1292
0
    repo_discovery_set_gitdir(discovery, ".", 0);
1293
0
  }
1294
0
}
1295
1296
static dev_t get_device_or_die(const char *path, const char *prefix, int prefix_len)
1297
0
{
1298
0
  struct stat buf;
1299
0
  if (stat(path, &buf)) {
1300
0
    die_errno(_("failed to stat '%*s%s%s'"),
1301
0
        prefix_len,
1302
0
        prefix ? prefix : "",
1303
0
        prefix ? "/" : "", path);
1304
0
  }
1305
0
  return buf.st_dev;
1306
0
}
1307
1308
/*
1309
 * A "string_list_each_func_t" function that canonicalizes an entry
1310
 * from GIT_CEILING_DIRECTORIES using real_pathdup(), or
1311
 * discards it if unusable.  The presence of an empty entry in
1312
 * GIT_CEILING_DIRECTORIES turns off canonicalization for all
1313
 * subsequent entries.
1314
 */
1315
static int canonicalize_ceiling_entry(struct string_list_item *item,
1316
              void *cb_data)
1317
0
{
1318
0
  int *empty_entry_found = cb_data;
1319
0
  char *ceil = item->string;
1320
1321
0
  if (!*ceil) {
1322
0
    *empty_entry_found = 1;
1323
0
    return 0;
1324
0
  } else if (!is_absolute_path(ceil)) {
1325
0
    return 0;
1326
0
  } else if (*empty_entry_found) {
1327
    /* Keep entry but do not canonicalize it */
1328
0
    return 1;
1329
0
  } else {
1330
0
    char *real_path = real_pathdup(ceil, 0);
1331
0
    if (!real_path) {
1332
0
      return 0;
1333
0
    }
1334
0
    free(item->string);
1335
0
    item->string = real_path;
1336
0
    return 1;
1337
0
  }
1338
0
}
1339
1340
struct safe_directory_data {
1341
  char *path;
1342
  int is_safe;
1343
};
1344
1345
static int safe_directory_cb(const char *key, const char *value,
1346
           const struct config_context *ctx UNUSED, void *d)
1347
0
{
1348
0
  struct safe_directory_data *data = d;
1349
1350
0
  if (strcmp(key, "safe.directory"))
1351
0
    return 0;
1352
1353
0
  if (!value || !*value) {
1354
0
    data->is_safe = 0;
1355
0
  } else if (!strcmp(value, "*")) {
1356
0
    data->is_safe = 1;
1357
0
  } else {
1358
0
    char *allowed = NULL;
1359
1360
0
    if (!git_config_pathname(&allowed, key, value) && allowed) {
1361
0
      char *normalized = NULL;
1362
1363
      /*
1364
       * Setting safe.directory to a non-absolute path
1365
       * makes little sense---it won't be relative to
1366
       * the configuration file the item is defined in.
1367
       * Except for ".", which means "if we are at the top
1368
       * level of a repository, then it is OK", which is
1369
       * slightly tighter than "*" that allows discovery.
1370
       */
1371
0
      if (!is_absolute_path(allowed) && strcmp(allowed, ".")) {
1372
0
        warning(_("safe.directory '%s' not absolute"),
1373
0
          allowed);
1374
0
        goto next;
1375
0
      }
1376
1377
      /*
1378
       * A .gitconfig in $HOME may be shared across
1379
       * different machines and safe.directory entries
1380
       * may or may not exist as paths on all of these
1381
       * machines.  In other words, it is not a warning
1382
       * worthy event when there is no such path on this
1383
       * machine---the entry may be useful elsewhere.
1384
       */
1385
0
      normalized = real_pathdup(allowed, 0);
1386
0
      if (!normalized)
1387
0
        goto next;
1388
1389
0
      if (ends_with(normalized, "/*")) {
1390
0
        size_t len = strlen(normalized);
1391
0
        if (!fspathncmp(normalized, data->path, len - 1))
1392
0
          data->is_safe = 1;
1393
0
      } else if (!fspathcmp(data->path, normalized)) {
1394
0
        data->is_safe = 1;
1395
0
      }
1396
0
    next:
1397
0
      free(normalized);
1398
0
      free(allowed);
1399
0
    }
1400
0
  }
1401
1402
0
  return 0;
1403
0
}
1404
1405
/*
1406
 * Check if a repository is safe, by verifying the ownership of the
1407
 * worktree (if any), the git directory, and the gitfile (if any).
1408
 *
1409
 * Exemptions for known-safe repositories can be added via `safe.directory`
1410
 * config settings; for non-bare repositories, their worktree needs to be
1411
 * added, for bare ones their git directory.
1412
 */
1413
static int ensure_valid_ownership(const char *gitfile,
1414
          const char *worktree, const char *gitdir,
1415
          struct strbuf *report)
1416
0
{
1417
0
  struct safe_directory_data data = { 0 };
1418
1419
0
  if (!git_env_bool("GIT_TEST_ASSUME_DIFFERENT_OWNER", 0) &&
1420
0
      (!gitfile || is_path_owned_by_current_user(gitfile, report)) &&
1421
0
      (!worktree || is_path_owned_by_current_user(worktree, report)) &&
1422
0
      (!gitdir || is_path_owned_by_current_user(gitdir, report)))
1423
0
    return 1;
1424
1425
  /*
1426
   * normalize the data.path for comparison with normalized paths
1427
   * that come from the configuration file.  The path is unsafe
1428
   * if it cannot be normalized.
1429
   */
1430
0
  data.path = real_pathdup(worktree ? worktree : gitdir, 0);
1431
0
  if (!data.path)
1432
0
    return 0;
1433
1434
  /*
1435
   * data.path is the "path" that identifies the repository and it is
1436
   * constant regardless of what failed above. data.is_safe should be
1437
   * initialized to false, and might be changed by the callback.
1438
   */
1439
0
  git_protected_config(safe_directory_cb, &data);
1440
1441
0
  free(data.path);
1442
0
  return data.is_safe;
1443
0
}
1444
1445
void die_upon_dubious_ownership(const char *gitfile, const char *worktree,
1446
        const char *gitdir)
1447
0
{
1448
0
  struct strbuf report = STRBUF_INIT, quoted = STRBUF_INIT;
1449
0
  const char *path;
1450
1451
0
  if (ensure_valid_ownership(gitfile, worktree, gitdir, &report))
1452
0
    return;
1453
1454
0
  strbuf_complete(&report, '\n');
1455
0
  path = gitfile ? gitfile : gitdir;
1456
0
  sq_quote_buf_pretty(&quoted, path);
1457
1458
0
  die(_("detected dubious ownership in repository at '%s'\n"
1459
0
        "%s"
1460
0
        "To add an exception for this directory, call:\n"
1461
0
        "\n"
1462
0
        "\tgit config --global --add safe.directory %s"),
1463
0
      path, report.buf, quoted.buf);
1464
0
}
1465
1466
static int allowed_bare_repo_cb(const char *key, const char *value,
1467
        const struct config_context *ctx UNUSED,
1468
        void *d)
1469
0
{
1470
0
  enum allowed_bare_repo *allowed_bare_repo = d;
1471
1472
0
  if (strcasecmp(key, "safe.bareRepository"))
1473
0
    return 0;
1474
1475
0
  if (!strcmp(value, "explicit")) {
1476
0
    *allowed_bare_repo = ALLOWED_BARE_REPO_EXPLICIT;
1477
0
    return 0;
1478
0
  }
1479
0
  if (!strcmp(value, "all")) {
1480
0
    *allowed_bare_repo = ALLOWED_BARE_REPO_ALL;
1481
0
    return 0;
1482
0
  }
1483
0
  return -1;
1484
0
}
1485
1486
static enum allowed_bare_repo get_allowed_bare_repo(void)
1487
0
{
1488
#ifdef WITH_BREAKING_CHANGES
1489
  enum allowed_bare_repo result = ALLOWED_BARE_REPO_EXPLICIT;
1490
#else
1491
0
  enum allowed_bare_repo result = ALLOWED_BARE_REPO_ALL;
1492
0
#endif
1493
0
  git_protected_config(allowed_bare_repo_cb, &result);
1494
0
  return result;
1495
0
}
1496
1497
static const char *allowed_bare_repo_to_string(
1498
  enum allowed_bare_repo allowed_bare_repo)
1499
0
{
1500
0
  switch (allowed_bare_repo) {
1501
0
  case ALLOWED_BARE_REPO_EXPLICIT:
1502
0
    return "explicit";
1503
0
  case ALLOWED_BARE_REPO_ALL:
1504
0
    return "all";
1505
0
  default:
1506
0
    BUG("invalid allowed_bare_repo %d",
1507
0
        allowed_bare_repo);
1508
0
  }
1509
0
  return NULL;
1510
0
}
1511
1512
static int is_implicit_bare_repo(const char *path)
1513
0
{
1514
  /*
1515
   * what we found is a ".git" directory at the root of
1516
   * the working tree.
1517
   */
1518
0
  if (ends_with_path_components(path, ".git"))
1519
0
    return 1;
1520
1521
  /*
1522
   * we are inside $GIT_DIR of a secondary worktree of a
1523
   * non-bare repository.
1524
   */
1525
0
  if (strstr(path, "/.git/worktrees/"))
1526
0
    return 1;
1527
1528
  /*
1529
   * we are inside $GIT_DIR of a worktree of a non-embedded
1530
   * submodule, whose superproject is not a bare repository.
1531
   */
1532
0
  if (strstr(path, "/.git/modules/"))
1533
0
    return 1;
1534
1535
0
  return 0;
1536
0
}
1537
1538
/*
1539
 * We cannot decide in this function whether we are in the work tree or
1540
 * not, since the config can only be read _after_ this function was called.
1541
 *
1542
 * Also, we avoid changing any global state (such as the current working
1543
 * directory) to allow early callers.
1544
 *
1545
 * The directory where the search should start needs to be passed in via the
1546
 * `dir` parameter; upon return, the `dir` buffer will contain the path of
1547
 * the directory where the search ended, and `gitdir` will contain the path of
1548
 * the discovered .git/ directory, if any. If `gitdir` is not absolute, it
1549
 * is relative to `dir` (i.e. *not* necessarily the cwd).
1550
 */
1551
static enum discovery_result repo_discovery_find_dir(struct strbuf *dir,
1552
                 struct strbuf *gitdir,
1553
                 struct strbuf *report,
1554
                 int die_on_error)
1555
0
{
1556
0
  const char *env_ceiling_dirs = getenv(CEILING_DIRECTORIES_ENVIRONMENT);
1557
0
  struct string_list ceiling_dirs = STRING_LIST_INIT_DUP;
1558
0
  const char *gitdirenv;
1559
0
  int ceil_offset = -1, min_offset = offset_1st_component(dir->buf);
1560
0
  dev_t current_device = 0;
1561
0
  int one_filesystem = 1;
1562
1563
  /*
1564
   * If GIT_DIR is set explicitly, we're not going
1565
   * to do any discovery, but we still do repository
1566
   * validation.
1567
   */
1568
0
  gitdirenv = getenv(GIT_DIR_ENVIRONMENT);
1569
0
  if (gitdirenv) {
1570
0
    strbuf_addstr(gitdir, gitdirenv);
1571
0
    return GIT_DIR_EXPLICIT;
1572
0
  }
1573
1574
0
  if (env_ceiling_dirs) {
1575
0
    int empty_entry_found = 0;
1576
0
    static const char path_sep[] = { PATH_SEP, '\0' };
1577
1578
0
    string_list_split(&ceiling_dirs, env_ceiling_dirs, path_sep, -1);
1579
0
    filter_string_list(&ceiling_dirs, 0,
1580
0
           canonicalize_ceiling_entry, &empty_entry_found);
1581
0
    ceil_offset = longest_ancestor_length(dir->buf, &ceiling_dirs);
1582
0
    string_list_clear(&ceiling_dirs, 0);
1583
0
  }
1584
1585
0
  if (ceil_offset < 0)
1586
0
    ceil_offset = min_offset - 2;
1587
1588
0
  if (min_offset && min_offset == dir->len &&
1589
0
      !is_dir_sep(dir->buf[min_offset - 1])) {
1590
0
    strbuf_addch(dir, '/');
1591
0
    min_offset++;
1592
0
  }
1593
1594
  /*
1595
   * Test in the following order (relative to the dir):
1596
   * - .git (file containing "gitdir: <path>")
1597
   * - .git/
1598
   * - ./ (bare)
1599
   * - ../.git
1600
   * - ../.git/
1601
   * - ../ (bare)
1602
   * - ../../.git
1603
   *   etc.
1604
   */
1605
0
  one_filesystem = !git_env_bool("GIT_DISCOVERY_ACROSS_FILESYSTEM", 0);
1606
0
  if (one_filesystem)
1607
0
    current_device = get_device_or_die(dir->buf, NULL, 0);
1608
0
  for (;;) {
1609
0
    int offset = dir->len, error_code = 0;
1610
0
    char *gitdir_path = NULL;
1611
0
    char *gitfile = NULL;
1612
1613
0
    if (offset > min_offset)
1614
0
      strbuf_addch(dir, '/');
1615
0
    strbuf_addstr(dir, DEFAULT_GIT_DIR_ENVIRONMENT);
1616
0
    gitdirenv = read_gitfile_gently(dir->buf, &error_code);
1617
0
    if (!gitdirenv) {
1618
0
      switch (error_code) {
1619
0
      case READ_GITFILE_ERR_MISSING:
1620
        /* no .git in this directory, move on */
1621
0
        break;
1622
0
      case READ_GITFILE_ERR_IS_A_DIR:
1623
0
        if (is_git_directory(dir->buf)) {
1624
0
          gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
1625
0
          gitdir_path = xstrdup(dir->buf);
1626
0
        }
1627
0
        break;
1628
0
      case READ_GITFILE_ERR_STAT_FAILED:
1629
0
        if (die_on_error)
1630
0
          die(_("error reading '%s'"), dir->buf);
1631
0
        else
1632
0
          return GIT_DIR_INVALID_GITFILE;
1633
0
      case READ_GITFILE_ERR_NOT_A_FILE:
1634
0
        if (die_on_error)
1635
0
          die(_("not a regular file: '%s'"), dir->buf);
1636
0
        else
1637
0
          return GIT_DIR_INVALID_GITFILE;
1638
0
      default:
1639
0
        if (die_on_error)
1640
0
          read_gitfile_error_die(error_code, dir->buf);
1641
0
        else
1642
0
          return GIT_DIR_INVALID_GITFILE;
1643
0
      }
1644
0
    } else {
1645
0
      gitfile = xstrdup(dir->buf);
1646
0
    }
1647
    /*
1648
     * Earlier, we tentatively added DEFAULT_GIT_DIR_ENVIRONMENT
1649
     * to check that directory for a repository.
1650
     * Now trim that tentative addition away, because we want to
1651
     * focus on the real directory we are in.
1652
     */
1653
0
    strbuf_setlen(dir, offset);
1654
0
    if (gitdirenv) {
1655
0
      enum discovery_result ret;
1656
0
      const char *gitdir_candidate =
1657
0
        gitdir_path ? gitdir_path : gitdirenv;
1658
1659
0
      if (ensure_valid_ownership(gitfile, dir->buf,
1660
0
               gitdir_candidate, report)) {
1661
0
        strbuf_addstr(gitdir, gitdirenv);
1662
0
        ret = GIT_DIR_DISCOVERED;
1663
0
      } else
1664
0
        ret = GIT_DIR_INVALID_OWNERSHIP;
1665
1666
      /*
1667
       * Earlier, during discovery, we might have allocated
1668
       * string copies for gitdir_path or gitfile so make
1669
       * sure we don't leak by freeing them now, before
1670
       * leaving the loop and function.
1671
       *
1672
       * Note: gitdirenv will be non-NULL whenever these are
1673
       * allocated, therefore we need not take care of releasing
1674
       * them outside of this conditional block.
1675
       */
1676
0
      free(gitdir_path);
1677
0
      free(gitfile);
1678
1679
0
      return ret;
1680
0
    }
1681
1682
0
    if (is_git_directory(dir->buf)) {
1683
0
      trace2_data_string("setup", NULL, "implicit-bare-repository", dir->buf);
1684
0
      if (get_allowed_bare_repo() == ALLOWED_BARE_REPO_EXPLICIT &&
1685
0
          !is_implicit_bare_repo(dir->buf))
1686
0
        return GIT_DIR_DISALLOWED_BARE;
1687
0
      if (!ensure_valid_ownership(NULL, NULL, dir->buf, report))
1688
0
        return GIT_DIR_INVALID_OWNERSHIP;
1689
0
      strbuf_addstr(gitdir, ".");
1690
0
      return GIT_DIR_BARE;
1691
0
    }
1692
1693
0
    if (offset <= min_offset)
1694
0
      return GIT_DIR_HIT_CEILING;
1695
1696
0
    while (--offset > ceil_offset && !is_dir_sep(dir->buf[offset]))
1697
0
      ; /* continue */
1698
0
    if (offset <= ceil_offset)
1699
0
      return GIT_DIR_HIT_CEILING;
1700
1701
0
    strbuf_setlen(dir, offset > min_offset ?  offset : min_offset);
1702
0
    if (one_filesystem &&
1703
0
        current_device != get_device_or_die(dir->buf, NULL, offset))
1704
0
      return GIT_DIR_HIT_MOUNT_POINT;
1705
0
  }
1706
0
}
1707
1708
enum discovery_result discover_git_directory_reason(struct strbuf *commondir,
1709
                struct strbuf *gitdir)
1710
0
{
1711
0
  struct strbuf dir = STRBUF_INIT, err = STRBUF_INIT;
1712
0
  size_t gitdir_offset = gitdir->len, cwd_len;
1713
0
  size_t commondir_offset = commondir->len;
1714
0
  struct repository_format candidate = REPOSITORY_FORMAT_INIT;
1715
0
  enum discovery_result result;
1716
1717
0
  if (strbuf_getcwd(&dir))
1718
0
    return GIT_DIR_CWD_FAILURE;
1719
1720
0
  cwd_len = dir.len;
1721
0
  result = repo_discovery_find_dir(&dir, gitdir, NULL, 0);
1722
0
  if (result <= 0) {
1723
0
    strbuf_release(&dir);
1724
0
    return result;
1725
0
  }
1726
1727
  /*
1728
   * The returned gitdir is relative to dir, and if dir does not reflect
1729
   * the current working directory, we simply make the gitdir absolute.
1730
   */
1731
0
  if (dir.len < cwd_len && !is_absolute_path(gitdir->buf + gitdir_offset)) {
1732
    /* Avoid a trailing "/." */
1733
0
    if (!strcmp(".", gitdir->buf + gitdir_offset))
1734
0
      strbuf_setlen(gitdir, gitdir_offset);
1735
0
    else
1736
0
      strbuf_addch(&dir, '/');
1737
0
    strbuf_insert(gitdir, gitdir_offset, dir.buf, dir.len);
1738
0
  }
1739
1740
0
  get_common_dir(commondir, gitdir->buf + gitdir_offset);
1741
1742
0
  strbuf_reset(&dir);
1743
0
  strbuf_addf(&dir, "%s/config", commondir->buf + commondir_offset);
1744
0
  read_repository_format(&candidate, dir.buf);
1745
0
  strbuf_release(&dir);
1746
1747
0
  if (verify_repository_format(&candidate, &err) < 0) {
1748
0
    warning("ignoring git dir '%s': %s",
1749
0
      gitdir->buf + gitdir_offset, err.buf);
1750
0
    strbuf_release(&err);
1751
0
    strbuf_setlen(commondir, commondir_offset);
1752
0
    strbuf_setlen(gitdir, gitdir_offset);
1753
0
    clear_repository_format(&candidate);
1754
0
    return GIT_DIR_INVALID_FORMAT;
1755
0
  }
1756
1757
0
  clear_repository_format(&candidate);
1758
0
  return result;
1759
0
}
1760
1761
int apply_repository_format(struct repository *repo,
1762
          const struct repository_format *format,
1763
          enum apply_repository_format_flags flags,
1764
          struct strbuf *err)
1765
0
{
1766
0
  if (verify_repository_format(format, err) < 0)
1767
0
    return -1;
1768
1769
0
  if (format->is_bare > 0 && format->work_tree) {
1770
    /* #22.2, #30 */
1771
0
    warning("core.bare and core.worktree do not make sense");
1772
0
    repo->worktree_config_is_bogus = true;
1773
0
  }
1774
1775
0
  if (flags & APPLY_REPOSITORY_FORMAT_HONOR_ENV) {
1776
0
    const char *shallow_file;
1777
1778
0
    shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT);
1779
0
    if (shallow_file)
1780
0
      set_alternate_shallow_file(repo, shallow_file);
1781
0
  }
1782
1783
0
  repo->bare_cfg = format->is_bare;
1784
0
  repo_set_hash_algo(repo, format->hash_algo);
1785
0
  repo_set_compat_hash_algo(repo, format->compat_hash_algo);
1786
0
  repo_set_ref_storage_format(repo,
1787
0
            format->ref_storage_format,
1788
0
            format->ref_storage_payload);
1789
0
  repo->repository_format_worktree_config =
1790
0
    format->worktree_config;
1791
0
  repo->repository_format_submodule_path_cfg =
1792
0
    format->submodule_path_cfg;
1793
0
  repo->repository_format_relative_worktrees =
1794
0
    format->relative_worktrees;
1795
0
  repo->repository_format_partial_clone =
1796
0
    xstrdup_or_null(format->partial_clone);
1797
0
  repo->repository_format_precious_objects =
1798
0
    format->precious_objects;
1799
1800
0
  return 0;
1801
0
}
1802
1803
const char *enter_repo(struct repository *repo, const char *path, unsigned flags)
1804
0
{
1805
0
  static struct strbuf validated_path = STRBUF_INIT;
1806
0
  static struct strbuf used_path = STRBUF_INIT;
1807
1808
0
  if (!path)
1809
0
    return NULL;
1810
1811
0
  if (!(flags & ENTER_REPO_STRICT)) {
1812
0
    static const char *suffix[] = {
1813
0
      "/.git", "", ".git/.git", ".git", NULL,
1814
0
    };
1815
0
    const char *gitfile;
1816
0
    int len = strlen(path);
1817
0
    int i;
1818
0
    while ((1 < len) && (path[len-1] == '/'))
1819
0
      len--;
1820
1821
    /*
1822
     * We can handle arbitrary-sized buffers, but this remains as a
1823
     * sanity check on untrusted input.
1824
     */
1825
0
    if (PATH_MAX <= len)
1826
0
      return NULL;
1827
1828
0
    strbuf_reset(&used_path);
1829
0
    strbuf_reset(&validated_path);
1830
0
    strbuf_add(&used_path, path, len);
1831
0
    strbuf_add(&validated_path, path, len);
1832
1833
0
    if (used_path.buf[0] == '~') {
1834
0
      char *newpath = interpolate_path(used_path.buf, 0);
1835
0
      if (!newpath)
1836
0
        return NULL;
1837
0
      strbuf_attach(&used_path, newpath, strlen(newpath),
1838
0
              strlen(newpath));
1839
0
    }
1840
0
    for (i = 0; suffix[i]; i++) {
1841
0
      struct stat st;
1842
0
      size_t baselen = used_path.len;
1843
0
      strbuf_addstr(&used_path, suffix[i]);
1844
0
      if (!stat(used_path.buf, &st) &&
1845
0
          (S_ISREG(st.st_mode) ||
1846
0
          (S_ISDIR(st.st_mode) && is_git_directory(used_path.buf)))) {
1847
0
        strbuf_addstr(&validated_path, suffix[i]);
1848
0
        break;
1849
0
      }
1850
0
      strbuf_setlen(&used_path, baselen);
1851
0
    }
1852
0
    if (!suffix[i])
1853
0
      return NULL;
1854
0
    gitfile = read_gitfile(used_path.buf);
1855
0
    if (!(flags & ENTER_REPO_ANY_OWNER_OK))
1856
0
      die_upon_dubious_ownership(gitfile, NULL, used_path.buf);
1857
0
    if (gitfile) {
1858
0
      strbuf_reset(&used_path);
1859
0
      strbuf_addstr(&used_path, gitfile);
1860
0
    }
1861
0
    if (chdir(used_path.buf))
1862
0
      return NULL;
1863
0
    path = validated_path.buf;
1864
0
  }
1865
0
  else {
1866
0
    const char *gitfile = read_gitfile(path);
1867
0
    if (!(flags & ENTER_REPO_ANY_OWNER_OK))
1868
0
      die_upon_dubious_ownership(gitfile, NULL, path);
1869
0
    if (gitfile)
1870
0
      path = gitfile;
1871
0
    if (chdir(path))
1872
0
      return NULL;
1873
0
  }
1874
1875
0
  if (is_git_directory(".")) {
1876
0
    struct repository_format fmt = REPOSITORY_FORMAT_INIT;
1877
0
    struct strbuf err = STRBUF_INIT;
1878
1879
0
    apply_and_export_relative_gitdir(repo, ".", 0);
1880
0
    read_and_verify_repository_format(&fmt, ".", NULL);
1881
0
    if (apply_repository_format(repo, &fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
1882
0
      die("%s", err.buf);
1883
0
    repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
1884
0
    startup_info->have_repository = 1;
1885
1886
0
    clear_repository_format(&fmt);
1887
0
    strbuf_release(&err);
1888
0
    return path;
1889
0
  }
1890
1891
0
  return NULL;
1892
0
}
1893
1894
/*
1895
 * Note.  This works only before you used a work tree.  This was added
1896
 * primarily to support git-clone to work in a new repository it just
1897
 * created, and is not meant to flip between different work trees.
1898
 */
1899
static void set_git_work_tree(struct repository *repo, const char *new_work_tree)
1900
0
{
1901
0
  if (repo->worktree_initialized) {
1902
0
    struct strbuf realpath = STRBUF_INIT;
1903
1904
0
    strbuf_realpath(&realpath, new_work_tree, 1);
1905
0
    new_work_tree = realpath.buf;
1906
0
    if (strcmp(new_work_tree, repo->worktree))
1907
0
      die("internal error: work tree has already been set\n"
1908
0
          "Current worktree: %s\nNew worktree: %s",
1909
0
          repo->worktree, new_work_tree);
1910
0
    strbuf_release(&realpath);
1911
0
    return;
1912
0
  }
1913
0
  repo->worktree_initialized = true;
1914
0
  repo_set_worktree(repo, new_work_tree);
1915
0
}
1916
1917
static void repo_discover(struct repo_discovery *discovery, int *nongit_ok)
1918
0
{
1919
0
  struct strbuf cwd = STRBUF_INIT;
1920
0
  struct strbuf dir = STRBUF_INIT, gitdir = STRBUF_INIT, report = STRBUF_INIT;
1921
1922
  /*
1923
   * Let's assume that we are in a git repository.
1924
   * If it turns out later that we are somewhere else, the value will be
1925
   * updated accordingly.
1926
   */
1927
0
  if (nongit_ok)
1928
0
    *nongit_ok = 0;
1929
1930
0
  if (strbuf_getcwd(&cwd))
1931
0
    die_errno(_("Unable to read current working directory"));
1932
0
  strbuf_addbuf(&dir, &cwd);
1933
1934
0
  switch (repo_discovery_find_dir(&dir, &gitdir, &report, 1)) {
1935
0
  case GIT_DIR_EXPLICIT:
1936
0
    repo_discover_explicit_gitdir(discovery, gitdir.buf, &cwd,
1937
0
                nongit_ok);
1938
0
    break;
1939
0
  case GIT_DIR_DISCOVERED:
1940
0
    if (dir.len < cwd.len && chdir(dir.buf))
1941
0
      die(_("cannot change to '%s'"), dir.buf);
1942
0
    repo_discover_implicit_gitdir(discovery, gitdir.buf, &cwd, dir.len,
1943
0
                nongit_ok);
1944
0
    break;
1945
0
  case GIT_DIR_BARE:
1946
0
    if (dir.len < cwd.len && chdir(dir.buf))
1947
0
      die(_("cannot change to '%s'"), dir.buf);
1948
0
    repo_discover_bare_gitdir(discovery, &cwd, dir.len, nongit_ok);
1949
0
    break;
1950
0
  case GIT_DIR_HIT_CEILING:
1951
0
    if (!nongit_ok)
1952
0
      die(_("not a git repository (or any of the parent directories): %s"),
1953
0
          DEFAULT_GIT_DIR_ENVIRONMENT);
1954
0
    *nongit_ok = 1;
1955
0
    break;
1956
0
  case GIT_DIR_HIT_MOUNT_POINT:
1957
0
    if (!nongit_ok)
1958
0
      die(_("not a git repository (or any parent up to mount point %s)\n"
1959
0
            "Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set)."),
1960
0
          dir.buf);
1961
0
    *nongit_ok = 1;
1962
0
    break;
1963
0
  case GIT_DIR_INVALID_OWNERSHIP:
1964
0
    if (!nongit_ok) {
1965
0
      struct strbuf quoted = STRBUF_INIT;
1966
1967
0
      strbuf_complete(&report, '\n');
1968
0
      sq_quote_buf_pretty(&quoted, dir.buf);
1969
0
      die(_("detected dubious ownership in repository at '%s'\n"
1970
0
            "%s"
1971
0
            "To add an exception for this directory, call:\n"
1972
0
            "\n"
1973
0
            "\tgit config --global --add safe.directory %s"),
1974
0
          dir.buf, report.buf, quoted.buf);
1975
0
    }
1976
0
    *nongit_ok = 1;
1977
0
    break;
1978
0
  case GIT_DIR_DISALLOWED_BARE:
1979
0
    if (!nongit_ok) {
1980
0
      die(_("cannot use bare repository '%s' (safe.bareRepository is '%s')"),
1981
0
          dir.buf,
1982
0
          allowed_bare_repo_to_string(get_allowed_bare_repo()));
1983
0
    }
1984
0
    *nongit_ok = 1;
1985
0
    break;
1986
0
  case GIT_DIR_CWD_FAILURE:
1987
0
  case GIT_DIR_INVALID_FORMAT:
1988
    /*
1989
     * As a safeguard against repo_discovery_find_dir returning
1990
     * these values, fallthrough to BUG. Otherwise it is possible to
1991
     * set startup_info->have_repository to 1 when we did nothing to
1992
     * find a repository.
1993
     */
1994
0
  default:
1995
0
    BUG("unhandled repo_discovery_find_dir() result");
1996
0
  }
1997
1998
0
  strbuf_release(&dir);
1999
0
  strbuf_release(&cwd);
2000
0
  strbuf_release(&gitdir);
2001
0
  strbuf_release(&report);
2002
0
}
2003
2004
const char *setup_git_directory_gently(struct repository *repo, int *nongit_ok)
2005
0
{
2006
0
  struct repo_discovery discovery = REPO_DISCOVERY_INIT;
2007
2008
  /*
2009
   * We may have read an incomplete configuration before
2010
   * setting-up the git directory. If so, clear the cache so
2011
   * that the next queries to the configuration reload complete
2012
   * configuration (including the per-repo config file that we
2013
   * ignored previously).
2014
   */
2015
0
  repo_config_clear(repo);
2016
2017
0
  repo_discover(&discovery, nongit_ok);
2018
2019
  /*
2020
   * At this point, nongit_ok is stable. If it is non-NULL and points
2021
   * to a non-zero value, then this means that we haven't found a
2022
   * repository and that the caller expects startup_info to reflect
2023
   * this.
2024
   *
2025
   * Regardless of the state of nongit_ok, the_repository->prefix and
2026
   * the GIT_PREFIX environment variable must always match. For details
2027
   * see Documentation/config/alias.adoc.
2028
   */
2029
0
  if (nongit_ok && *nongit_ok)
2030
0
    startup_info->have_repository = 0;
2031
0
  else
2032
0
    startup_info->have_repository = 1;
2033
2034
  /*
2035
   * Not all paths through the setup code will have recorded a gitdir
2036
   * above, so in order to guarantee that the environment is in a
2037
   * consistent state after setup, explicitly set up the gitdir and
2038
   * environment if we have a repository.
2039
   *
2040
   * NEEDSWORK: currently we allow bogus GIT_DIR values to be set in some
2041
   * code paths so we also need to explicitly setup the environment if
2042
   * the user has set GIT_DIR.  It may be beneficial to disallow bogus
2043
   * GIT_DIR values at some point in the future.
2044
   */
2045
0
  if (/* GIT_DIR_EXPLICIT, GIT_DIR_DISCOVERED, GIT_DIR_BARE */
2046
0
      startup_info->have_repository ||
2047
      /* GIT_DIR_EXPLICIT */
2048
0
      getenv(GIT_DIR_ENVIRONMENT)) {
2049
0
    if (discovery.worktree)
2050
0
      set_git_work_tree(repo, discovery.worktree);
2051
2052
0
    if (discovery.gitdir) {
2053
0
      apply_and_export_relative_gitdir(repo, discovery.gitdir, 0);
2054
0
    } else {
2055
0
      const char *gitdir = getenv(GIT_DIR_ENVIRONMENT);
2056
0
      if (!gitdir)
2057
0
        gitdir = DEFAULT_GIT_DIR_ENVIRONMENT;
2058
0
      apply_gitdir_and_environment(repo, gitdir);
2059
0
    }
2060
2061
0
    if (startup_info->have_repository) {
2062
0
      struct strbuf err = STRBUF_INIT;
2063
0
      const char *ref_backend_uri;
2064
2065
      /*
2066
       * The env variable should override the repository config
2067
       * for 'extensions.refStorage'.
2068
       */
2069
0
      ref_backend_uri = getenv(GIT_REF_STORAGE_FORMAT_ENVIRONMENT);
2070
0
      if (!ref_backend_uri)
2071
0
        ref_backend_uri = getenv(GIT_REFERENCE_BACKEND_ENVIRONMENT);
2072
0
      if (ref_backend_uri) {
2073
0
        FREE_AND_NULL(discovery.format.ref_storage_payload);
2074
0
        discovery.format.ref_storage_format =
2075
0
          ref_storage_format_by_uri(ref_backend_uri,
2076
0
                  &discovery.format.ref_storage_payload);
2077
0
        if (discovery.format.ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2078
0
          die(_("unknown ref storage format: '%s'"), ref_backend_uri);
2079
0
      }
2080
2081
0
      if (apply_repository_format(repo, &discovery.format,
2082
0
                APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
2083
0
        die("%s", err.buf);
2084
0
      repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
2085
2086
0
      clear_repository_format(&discovery.format);
2087
0
      strbuf_release(&err);
2088
0
    }
2089
0
  }
2090
  /*
2091
   * Since precompose_string_if_needed() needs to look at
2092
   * the core.precomposeunicode configuration, this
2093
   * has to happen after the above block that finds
2094
   * out where the repository is, i.e. a preparation
2095
   * for calling repo_config_get_bool().
2096
   */
2097
0
  if (discovery.prefix) {
2098
0
    const char *prefix = precompose_string_if_needed(discovery.prefix);
2099
0
    repo->prefix = xstrdup(prefix);
2100
0
    setenv(GIT_PREFIX_ENVIRONMENT, repo->prefix, 1);
2101
0
  } else {
2102
0
    FREE_AND_NULL(repo->prefix);
2103
0
    setenv(GIT_PREFIX_ENVIRONMENT, "", 1);
2104
0
  }
2105
2106
0
  setup_original_cwd(repo);
2107
2108
0
  repo_discovery_release(&discovery);
2109
0
  return repo->prefix;
2110
0
}
2111
2112
int git_config_perm(const char *var, const char *value)
2113
0
{
2114
0
  int i;
2115
0
  char *endptr;
2116
2117
0
  if (!value)
2118
0
    return PERM_GROUP;
2119
2120
0
  if (!strcmp(value, "umask"))
2121
0
    return PERM_UMASK;
2122
0
  if (!strcmp(value, "group"))
2123
0
    return PERM_GROUP;
2124
0
  if (!strcmp(value, "all") ||
2125
0
      !strcmp(value, "world") ||
2126
0
      !strcmp(value, "everybody"))
2127
0
    return PERM_EVERYBODY;
2128
2129
  /* Parse octal numbers */
2130
0
  i = strtol(value, &endptr, 8);
2131
2132
  /* If not an octal number, maybe true/false? */
2133
0
  if (*endptr != 0)
2134
0
    return git_config_bool(var, value) ? PERM_GROUP : PERM_UMASK;
2135
2136
  /*
2137
   * Treat values 0, 1 and 2 as compatibility cases, otherwise it is
2138
   * a chmod value to restrict to.
2139
   */
2140
0
  switch (i) {
2141
0
  case PERM_UMASK:               /* 0 */
2142
0
    return PERM_UMASK;
2143
0
  case OLD_PERM_GROUP:           /* 1 */
2144
0
    return PERM_GROUP;
2145
0
  case OLD_PERM_EVERYBODY:       /* 2 */
2146
0
    return PERM_EVERYBODY;
2147
0
  }
2148
2149
  /* A filemode value was given: 0xxx */
2150
2151
0
  if ((i & 0600) != 0600)
2152
0
    die(_("problem with core.sharedRepository filemode value "
2153
0
        "(0%.3o).\nThe owner of files must always have "
2154
0
        "read and write permissions."), i);
2155
2156
  /*
2157
   * Mask filemode value. Others can not get write permission.
2158
   * x flags for directories are handled separately.
2159
   */
2160
0
  return -(i & 0666);
2161
0
}
2162
2163
/*
2164
 * Returns the "prefix", a path to the current working directory
2165
 * relative to the work tree root, or NULL, if the current working
2166
 * directory is not a strict subdirectory of the work tree root. The
2167
 * prefix always ends with a '/' character.
2168
 */
2169
const char *setup_git_directory(struct repository *repo)
2170
0
{
2171
0
  return setup_git_directory_gently(repo, NULL);
2172
0
}
2173
2174
const char *resolve_gitdir_gently(const char *suspect, int *return_error_code)
2175
0
{
2176
0
  if (is_git_directory(suspect))
2177
0
    return suspect;
2178
0
  return read_gitfile_gently(suspect, return_error_code);
2179
0
}
2180
2181
/* if any standard file descriptor is missing open it to /dev/null */
2182
void sanitize_stdfds(void)
2183
0
{
2184
0
  int fd = xopen("/dev/null", O_RDWR);
2185
0
  while (fd < 2)
2186
0
    fd = xdup(fd);
2187
0
  if (fd > 2)
2188
0
    close(fd);
2189
0
}
2190
2191
int daemonize(void)
2192
0
{
2193
#ifdef NO_POSIX_GOODIES
2194
  errno = ENOSYS;
2195
  return -1;
2196
#else
2197
0
  pid_t parent_pid = getpid();
2198
0
  pid_t child_pid = fork();
2199
2200
0
  switch (child_pid) {
2201
0
    case 0:
2202
      /*
2203
       * We're in the child process, so we take ownership of
2204
       * all tempfiles.
2205
       */
2206
0
      reassign_tempfile_ownership(parent_pid, getpid());
2207
0
      break;
2208
0
    case -1:
2209
0
      die_errno(_("fork failed"));
2210
0
    default:
2211
      /*
2212
       * We're in the parent process, so we drop ownership of
2213
       * all tempfiles to prevent us from removing them upon
2214
       * exit.
2215
       */
2216
0
      reassign_tempfile_ownership(parent_pid, child_pid);
2217
0
      exit(0);
2218
0
  }
2219
0
  if (setsid() == -1)
2220
0
    die_errno(_("setsid failed"));
2221
0
  close(0);
2222
0
  close(1);
2223
0
  close(2);
2224
0
  sanitize_stdfds();
2225
0
  return 0;
2226
0
#endif
2227
0
}
2228
2229
struct template_dir_cb_data {
2230
  char *path;
2231
  int initialized;
2232
};
2233
2234
static int template_dir_cb(const char *key, const char *value,
2235
         const struct config_context *ctx UNUSED, void *d)
2236
0
{
2237
0
  struct template_dir_cb_data *data = d;
2238
2239
0
  if (strcmp(key, "init.templatedir"))
2240
0
    return 0;
2241
2242
0
  if (!value) {
2243
0
    data->path = NULL;
2244
0
  } else {
2245
0
    char *path = NULL;
2246
2247
0
    FREE_AND_NULL(data->path);
2248
0
    if (!git_config_pathname(&path, key, value))
2249
0
      data->path = path ? path : xstrdup(value);
2250
0
  }
2251
2252
0
  return 0;
2253
0
}
2254
2255
const char *get_template_dir(const char *option_template)
2256
0
{
2257
0
  const char *template_dir = option_template;
2258
2259
0
  if (!template_dir)
2260
0
    template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
2261
0
  if (!template_dir) {
2262
0
    static struct template_dir_cb_data data;
2263
2264
0
    if (!data.initialized) {
2265
0
      git_protected_config(template_dir_cb, &data);
2266
0
      data.initialized = 1;
2267
0
    }
2268
0
    template_dir = data.path;
2269
0
  }
2270
0
  if (!template_dir) {
2271
0
    static char *dir;
2272
2273
0
    if (!dir)
2274
0
      dir = system_path(DEFAULT_GIT_TEMPLATE_DIR);
2275
0
    template_dir = dir;
2276
0
  }
2277
0
  return template_dir;
2278
0
}
2279
2280
#ifdef NO_TRUSTABLE_FILEMODE
2281
#define TEST_FILEMODE 0
2282
#else
2283
0
#define TEST_FILEMODE 1
2284
#endif
2285
2286
0
#define GIT_DEFAULT_HASH_ENVIRONMENT "GIT_DEFAULT_HASH"
2287
2288
static void copy_templates_1(struct repository *repo,
2289
           struct strbuf *path,
2290
           struct strbuf *template_path,
2291
           DIR *dir)
2292
0
{
2293
0
  size_t path_baselen = path->len;
2294
0
  size_t template_baselen = template_path->len;
2295
0
  struct dirent *de;
2296
2297
  /* Note: if ".git/hooks" file exists in the repository being
2298
   * re-initialized, /etc/core-git/templates/hooks/update would
2299
   * cause "git init" to fail here.  I think this is sane but
2300
   * it means that the set of templates we ship by default, along
2301
   * with the way the namespace under .git/ is organized, should
2302
   * be really carefully chosen.
2303
   */
2304
0
  safe_create_dir(repo, path->buf, 1);
2305
0
  while ((de = readdir(dir)) != NULL) {
2306
0
    struct stat st_git, st_template;
2307
0
    int exists = 0;
2308
2309
0
    strbuf_setlen(path, path_baselen);
2310
0
    strbuf_setlen(template_path, template_baselen);
2311
2312
0
    if (de->d_name[0] == '.')
2313
0
      continue;
2314
0
    strbuf_addstr(path, de->d_name);
2315
0
    strbuf_addstr(template_path, de->d_name);
2316
0
    if (lstat(path->buf, &st_git)) {
2317
0
      if (errno != ENOENT)
2318
0
        die_errno(_("cannot stat '%s'"), path->buf);
2319
0
    }
2320
0
    else
2321
0
      exists = 1;
2322
2323
0
    if (lstat(template_path->buf, &st_template))
2324
0
      die_errno(_("cannot stat template '%s'"), template_path->buf);
2325
2326
0
    if (S_ISDIR(st_template.st_mode)) {
2327
0
      DIR *subdir = opendir(template_path->buf);
2328
0
      if (!subdir)
2329
0
        die_errno(_("cannot opendir '%s'"), template_path->buf);
2330
0
      strbuf_addch(path, '/');
2331
0
      strbuf_addch(template_path, '/');
2332
0
      copy_templates_1(repo, path, template_path, subdir);
2333
0
      closedir(subdir);
2334
0
    }
2335
0
    else if (exists)
2336
0
      continue;
2337
0
    else if (S_ISLNK(st_template.st_mode)) {
2338
0
      struct strbuf lnk = STRBUF_INIT;
2339
0
      if (strbuf_readlink(&lnk, template_path->buf,
2340
0
              st_template.st_size) < 0)
2341
0
        die_errno(_("cannot readlink '%s'"), template_path->buf);
2342
0
      if (symlink(lnk.buf, path->buf))
2343
0
        die_errno(_("cannot symlink '%s' '%s'"),
2344
0
            lnk.buf, path->buf);
2345
0
      strbuf_release(&lnk);
2346
0
    }
2347
0
    else if (S_ISREG(st_template.st_mode)) {
2348
0
      if (copy_file(repo, path->buf, template_path->buf, st_template.st_mode))
2349
0
        die_errno(_("cannot copy '%s' to '%s'"),
2350
0
            template_path->buf, path->buf);
2351
0
    }
2352
0
    else
2353
0
      error(_("ignoring template %s"), template_path->buf);
2354
0
  }
2355
0
}
2356
2357
static void copy_templates(struct repository *repo, const char *option_template)
2358
0
{
2359
0
  const char *template_dir = get_template_dir(option_template);
2360
0
  struct strbuf path = STRBUF_INIT;
2361
0
  struct strbuf template_path = STRBUF_INIT;
2362
0
  size_t template_len;
2363
0
  struct repository_format template_format = REPOSITORY_FORMAT_INIT;
2364
0
  struct strbuf err = STRBUF_INIT;
2365
0
  DIR *dir;
2366
0
  char *to_free = NULL;
2367
2368
0
  if (!template_dir || !*template_dir)
2369
0
    return;
2370
2371
0
  strbuf_addstr(&template_path, template_dir);
2372
0
  strbuf_complete(&template_path, '/');
2373
0
  template_len = template_path.len;
2374
2375
0
  dir = opendir(template_path.buf);
2376
0
  if (!dir) {
2377
0
    warning(_("templates not found in %s"), template_dir);
2378
0
    goto free_return;
2379
0
  }
2380
2381
  /* Make sure that template is from the correct vintage */
2382
0
  strbuf_addstr(&template_path, "config");
2383
0
  read_repository_format(&template_format, template_path.buf);
2384
0
  strbuf_setlen(&template_path, template_len);
2385
2386
  /*
2387
   * No mention of version at all is OK, but anything else should be
2388
   * verified.
2389
   */
2390
0
  if (template_format.version >= 0 &&
2391
0
      verify_repository_format(&template_format, &err) < 0) {
2392
0
    warning(_("not copying templates from '%s': %s"),
2393
0
        template_dir, err.buf);
2394
0
    strbuf_release(&err);
2395
0
    goto close_free_return;
2396
0
  }
2397
2398
0
  strbuf_addstr(&path, repo_get_common_dir(repo));
2399
0
  strbuf_complete(&path, '/');
2400
0
  copy_templates_1(repo, &path, &template_path, dir);
2401
0
close_free_return:
2402
0
  closedir(dir);
2403
0
free_return:
2404
0
  free(to_free);
2405
0
  strbuf_release(&path);
2406
0
  strbuf_release(&template_path);
2407
0
  clear_repository_format(&template_format);
2408
0
}
2409
2410
/*
2411
 * If the git_dir is not directly inside the working tree, then git will not
2412
 * find it by default, and we need to set the worktree explicitly.
2413
 */
2414
static int needs_work_tree_config(const char *git_dir, const char *work_tree)
2415
0
{
2416
0
  if (!strcmp(work_tree, "/") && !strcmp(git_dir, "/.git"))
2417
0
    return 0;
2418
0
  if (skip_prefix(git_dir, work_tree, &git_dir) &&
2419
0
      !strcmp(git_dir, "/.git"))
2420
0
    return 0;
2421
0
  return 1;
2422
0
}
2423
2424
void initialize_repository_version(struct repository *repo,
2425
           int hash_algo,
2426
           enum ref_storage_format ref_storage_format,
2427
           int reinit)
2428
0
{
2429
0
  struct strbuf repo_version = STRBUF_INIT;
2430
0
  int target_version = GIT_REPO_VERSION;
2431
0
  int default_submodule_path_config = 0;
2432
2433
  /*
2434
   * Note that we initialize the repository version to 1 when the ref
2435
   * storage format is unknown. This is on purpose so that we can add the
2436
   * correct object format to the config during git-clone(1). The format
2437
   * version will get adjusted by git-clone(1) once it has learned about
2438
   * the remote repository's format.
2439
   */
2440
0
  if (hash_algo != GIT_HASH_SHA1_LEGACY ||
2441
0
      ref_storage_format != REF_STORAGE_FORMAT_FILES ||
2442
0
      repo->ref_storage_payload)
2443
0
    target_version = GIT_REPO_VERSION_READ;
2444
2445
0
  if (hash_algo != GIT_HASH_SHA1_LEGACY && hash_algo != GIT_HASH_UNKNOWN)
2446
0
    repo_config_set(repo, "extensions.objectformat",
2447
0
        hash_algos[hash_algo].name);
2448
0
  else if (reinit)
2449
0
    repo_config_set_gently(repo, "extensions.objectformat", NULL);
2450
2451
0
  if (repo->ref_storage_payload) {
2452
0
    struct strbuf ref_uri = STRBUF_INIT;
2453
2454
0
    strbuf_addf(&ref_uri, "%s://%s",
2455
0
          ref_storage_format_to_name(ref_storage_format),
2456
0
          repo->ref_storage_payload);
2457
0
    repo_config_set(repo, "extensions.refstorage", ref_uri.buf);
2458
0
    strbuf_release(&ref_uri);
2459
0
  } else if (ref_storage_format != REF_STORAGE_FORMAT_FILES) {
2460
0
    repo_config_set(repo, "extensions.refstorage",
2461
0
        ref_storage_format_to_name(ref_storage_format));
2462
0
  } else if (reinit) {
2463
0
    repo_config_set_gently(repo, "extensions.refstorage", NULL);
2464
0
  }
2465
2466
0
  if (reinit) {
2467
0
    struct strbuf config = STRBUF_INIT;
2468
0
    struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
2469
2470
0
    repo_common_path_append(repo, &config, "config");
2471
0
    read_repository_format(&repo_fmt, config.buf);
2472
2473
0
    if (repo_fmt.v1_only_extensions.nr)
2474
0
      target_version = GIT_REPO_VERSION_READ;
2475
2476
0
    strbuf_release(&config);
2477
0
    clear_repository_format(&repo_fmt);
2478
0
  }
2479
2480
0
  repo_config_get_bool(repo, "init.defaultSubmodulePathConfig",
2481
0
           &default_submodule_path_config);
2482
0
  if (default_submodule_path_config) {
2483
    /* extensions.submodulepathconfig requires at least version 1 */
2484
0
    if (target_version == 0)
2485
0
      target_version = 1;
2486
0
    repo_config_set(repo, "extensions.submodulepathconfig", "true");
2487
0
  }
2488
2489
0
  strbuf_addf(&repo_version, "%d", target_version);
2490
0
  repo_config_set(repo, "core.repositoryformatversion", repo_version.buf);
2491
2492
0
  strbuf_release(&repo_version);
2493
0
}
2494
2495
static int is_reinit(struct repository *repo)
2496
0
{
2497
0
  struct strbuf buf = STRBUF_INIT;
2498
0
  char junk[2];
2499
0
  int ret;
2500
2501
0
  repo_git_path_replace(repo, &buf, "HEAD");
2502
0
  ret = !access(buf.buf, R_OK) || readlink(buf.buf, junk, sizeof(junk) - 1) != -1;
2503
0
  strbuf_release(&buf);
2504
0
  return ret;
2505
0
}
2506
2507
void create_reference_database(struct repository *repo,
2508
             const char *initial_branch, int quiet)
2509
0
{
2510
0
  struct strbuf err = STRBUF_INIT;
2511
0
  char *to_free = NULL;
2512
0
  int reinit = is_reinit(repo);
2513
2514
0
  if (ref_store_create_on_disk(get_main_ref_store(repo), 0, &err))
2515
0
    die("failed to set up refs db: %s", err.buf);
2516
2517
  /*
2518
   * Point the HEAD symref to the initial branch with if HEAD does
2519
   * not yet exist.
2520
   */
2521
0
  if (!reinit) {
2522
0
    char *ref;
2523
2524
0
    if (!initial_branch)
2525
0
      initial_branch = to_free =
2526
0
        repo_default_branch_name(repo, quiet);
2527
2528
0
    ref = xstrfmt("refs/heads/%s", initial_branch);
2529
0
    if (check_refname_format(ref, 0) < 0)
2530
0
      die(_("invalid initial branch name: '%s'"),
2531
0
          initial_branch);
2532
2533
0
    if (refs_update_symref(get_main_ref_store(repo), "HEAD", ref, NULL) < 0)
2534
0
      exit(1);
2535
0
    free(ref);
2536
0
  }
2537
2538
0
  if (reinit && initial_branch)
2539
0
    warning(_("re-init: ignored --initial-branch=%s"),
2540
0
      initial_branch);
2541
2542
0
  strbuf_release(&err);
2543
0
  free(to_free);
2544
0
}
2545
2546
static int create_default_files(struct repository *repo,
2547
        const char *template_path,
2548
        const char *original_git_dir,
2549
        const struct repository_format *fmt,
2550
        int init_shared_repository)
2551
0
{
2552
0
  struct stat st1;
2553
0
  struct strbuf path = STRBUF_INIT;
2554
0
  int reinit;
2555
0
  int filemode;
2556
0
  const char *work_tree = repo_get_work_tree(repo);
2557
2558
  /*
2559
   * First copy the templates -- we might have the default
2560
   * config file there, in which case we would want to read
2561
   * from it after installing.
2562
   *
2563
   * Before reading that config, we also need to clear out any cached
2564
   * values (since we've just potentially changed what's available on
2565
   * disk).
2566
   */
2567
0
  copy_templates(repo, template_path);
2568
0
  repo_config_clear(repo);
2569
0
  repo_settings_reset_shared_repository(repo);
2570
0
  repo_config(repo, git_default_config, NULL);
2571
2572
0
  reinit = is_reinit(repo);
2573
2574
  /*
2575
   * We must make sure command-line options continue to override any
2576
   * values we might have just re-read from the config.
2577
   */
2578
0
  if (init_shared_repository != -1)
2579
0
    repo_settings_set_shared_repository(repo,
2580
0
                init_shared_repository);
2581
2582
0
  repo->bare_cfg = !work_tree;
2583
2584
  /*
2585
   * We would have created the above under user's umask -- under
2586
   * shared-repository settings, we would need to fix them up.
2587
   */
2588
0
  if (repo_settings_get_shared_repository(repo)) {
2589
0
    adjust_shared_perm(repo, repo_get_git_dir(repo));
2590
0
  }
2591
2592
0
  initialize_repository_version(repo, fmt->hash_algo, fmt->ref_storage_format, reinit);
2593
2594
  /* Check filemode trustability */
2595
0
  repo_git_path_replace(repo, &path, "config");
2596
0
  filemode = TEST_FILEMODE;
2597
0
  if (TEST_FILEMODE && !lstat(path.buf, &st1)) {
2598
0
    struct stat st2;
2599
0
    filemode = (!chmod(path.buf, st1.st_mode ^ S_IXUSR) &&
2600
0
        !lstat(path.buf, &st2) &&
2601
0
        st1.st_mode != st2.st_mode &&
2602
0
        !chmod(path.buf, st1.st_mode));
2603
0
    if (filemode && !reinit && (st1.st_mode & S_IXUSR))
2604
0
      filemode = 0;
2605
0
  }
2606
0
  repo_config_set(repo, "core.filemode", filemode ? "true" : "false");
2607
2608
0
  if (is_bare_repository(repo))
2609
0
    repo_config_set(repo, "core.bare", "true");
2610
0
  else {
2611
0
    const char *value;
2612
2613
0
    repo_config_set(repo, "core.bare", "false");
2614
2615
    /* allow template config file to override the default */
2616
0
    if (repo_config_get_string_tmp(repo, "core.logallrefupdates", &value))
2617
0
      repo_config_set(repo, "core.logallrefupdates", "true");
2618
2619
0
    if (needs_work_tree_config(original_git_dir, work_tree))
2620
0
      repo_config_set(repo, "core.worktree", work_tree);
2621
0
  }
2622
2623
0
  if (!reinit) {
2624
    /* Check if symlink is supported in the work tree */
2625
0
    repo_git_path_replace(repo, &path, "tXXXXXX");
2626
0
    if (!close(xmkstemp(path.buf)) &&
2627
0
        !unlink(path.buf) &&
2628
0
        !symlink("testing", path.buf) &&
2629
0
        !lstat(path.buf, &st1) &&
2630
0
        S_ISLNK(st1.st_mode))
2631
0
      unlink(path.buf); /* good */
2632
0
    else
2633
0
      repo_config_set(repo, "core.symlinks", "false");
2634
2635
    /* Check if the filesystem is case-insensitive */
2636
0
    repo_git_path_replace(repo, &path, "CoNfIg");
2637
0
    if (!access(path.buf, F_OK))
2638
0
      repo_config_set(repo, "core.ignorecase", "true");
2639
0
    probe_utf8_pathname_composition();
2640
0
  }
2641
2642
0
  strbuf_release(&path);
2643
0
  return reinit;
2644
0
}
2645
2646
void create_object_database(struct repository *repo,
2647
          const struct strvec *alternates)
2648
0
{
2649
0
  struct odb_create_on_disk_options opts = {
2650
0
    .alternates = alternates,
2651
0
  };
2652
2653
  /*
2654
   * Create the "objects" directory in the common directory. This is done
2655
   * so that the repository can be discovered regardless of the backend
2656
   * used.
2657
   *
2658
   * Note that we only do this in case the object directory wasn't
2659
   * overwritten via an environment variable. If it _is_ being overridden
2660
   * then we skip this step, as the repository won't be discoverable
2661
   * anyway without the environment variable.
2662
   */
2663
0
  if (!getenv(DB_ENVIRONMENT)) {
2664
0
    struct strbuf objects_dir = STRBUF_INIT;
2665
0
    repo_common_path_append(repo, &objects_dir, "objects");
2666
0
    safe_create_dir(repo, objects_dir.buf, 1);
2667
0
    strbuf_release(&objects_dir);
2668
0
  }
2669
2670
0
  repo->objects = odb_new(repo, ODB_NEW_HONOR_ENV);
2671
2672
0
  if (odb_source_create_on_disk(repo->objects->sources, &opts) < 0)
2673
0
    die(_("failed creating object database"));
2674
0
}
2675
2676
static void separate_git_dir(struct repository *repo,
2677
           const char *git_dir, const char *git_link)
2678
0
{
2679
0
  struct stat st;
2680
2681
0
  if (!stat(git_link, &st)) {
2682
0
    const char *src;
2683
2684
0
    if (S_ISREG(st.st_mode))
2685
0
      src = read_gitfile(git_link);
2686
0
    else if (S_ISDIR(st.st_mode))
2687
0
      src = git_link;
2688
0
    else
2689
0
      die(_("unable to handle file type %d"), (int)st.st_mode);
2690
2691
0
    if (rename(src, git_dir))
2692
0
      die_errno(_("unable to move %s to %s"), src, git_dir);
2693
0
    repair_worktrees_after_gitdir_move(repo, src);
2694
0
  }
2695
2696
0
  write_file(git_link, "gitdir: %s", git_dir);
2697
0
}
2698
2699
struct default_format_config {
2700
  int hash;
2701
  enum ref_storage_format ref_storage_format;
2702
};
2703
2704
static int read_default_format_config(const char *key, const char *value,
2705
              const struct config_context *ctx UNUSED,
2706
              void *payload)
2707
0
{
2708
0
  struct default_format_config *cfg = payload;
2709
0
  char *str = NULL;
2710
0
  int ret;
2711
2712
0
  if (!strcmp(key, "init.defaultobjectformat")) {
2713
0
    ret = git_config_string(&str, key, value);
2714
0
    if (ret)
2715
0
      goto out;
2716
0
    cfg->hash = hash_algo_by_name(str);
2717
0
    if (cfg->hash == GIT_HASH_UNKNOWN)
2718
0
      warning(_("unknown hash algorithm '%s'"), str);
2719
0
    goto out;
2720
0
  }
2721
2722
0
  if (!strcmp(key, "init.defaultrefstorageformat") ||
2723
0
      !strcmp(key, "init.defaultrefformat")) {
2724
0
    ret = git_config_string(&str, key, value);
2725
0
    if (ret)
2726
0
      goto out;
2727
0
    cfg->ref_storage_format = ref_storage_format_by_name(str);
2728
0
    if (cfg->ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2729
0
      warning(_("unknown ref storage format '%s'"), str);
2730
0
    goto out;
2731
0
  }
2732
2733
  /*
2734
   * Enable the reftable format when "features.experimental" is enabled.
2735
   * "init.defaultRefStorageFormat" takes precedence over this setting.
2736
   */
2737
0
  if (!strcmp(key, "feature.experimental") &&
2738
0
      cfg->ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN &&
2739
0
      git_config_bool(key, value)) {
2740
0
    cfg->ref_storage_format = REF_STORAGE_FORMAT_REFTABLE;
2741
0
    ret = 0;
2742
0
    goto out;
2743
0
  }
2744
2745
0
  ret = 0;
2746
0
out:
2747
0
  free(str);
2748
0
  return ret;
2749
0
}
2750
2751
static void repository_format_configure(struct repository_format *repo_fmt,
2752
          int hash,
2753
          const char *ref_storage_format_uri)
2754
0
{
2755
0
  struct default_format_config cfg = {
2756
0
    .hash = GIT_HASH_UNKNOWN,
2757
0
    .ref_storage_format = REF_STORAGE_FORMAT_UNKNOWN,
2758
0
  };
2759
0
  struct config_options opts = {
2760
0
    .respect_includes = 1,
2761
0
    .ignore_repo = 1,
2762
0
    .ignore_worktree = 1,
2763
0
  };
2764
0
  enum ref_storage_format ref_storage_format;
2765
0
  char *ref_storage_payload = NULL;
2766
0
  const char *env;
2767
2768
0
  config_with_options(read_default_format_config, &cfg, NULL, NULL, &opts);
2769
2770
  /*
2771
   * If we already have an initialized repo, don't allow the user to
2772
   * specify a different algorithm, as that could cause corruption.
2773
   * Otherwise, if the user has specified one on the command line, use it.
2774
   */
2775
0
  env = getenv(GIT_DEFAULT_HASH_ENVIRONMENT);
2776
0
  if (repo_fmt->version >= 0 && hash != GIT_HASH_UNKNOWN && hash != repo_fmt->hash_algo)
2777
0
    die(_("attempt to reinitialize repository with different hash"));
2778
0
  else if (hash != GIT_HASH_UNKNOWN)
2779
0
    repo_fmt->hash_algo = hash;
2780
0
  else if (env) {
2781
0
    int env_algo = hash_algo_by_name(env);
2782
0
    if (env_algo == GIT_HASH_UNKNOWN)
2783
0
      die(_("unknown hash algorithm '%s'"), env);
2784
0
    if (repo_fmt->version < 0 ||
2785
0
        repo_fmt->hash_algo == GIT_HASH_UNKNOWN)
2786
0
      repo_fmt->hash_algo = env_algo;
2787
0
  } else if (cfg.hash != GIT_HASH_UNKNOWN) {
2788
0
    repo_fmt->hash_algo = cfg.hash;
2789
0
  }
2790
2791
  /*
2792
   * We have the following order of preference when configuring the ref
2793
   * storage format:
2794
   *
2795
   *   1. Explicit override via the command line, like in `git init
2796
   *      --ref-storage-format=`.
2797
   *
2798
   *   2. Explicit override via the environment with
2799
   *      "GIT_REF_STORAGE_FORMAT".
2800
   *
2801
   *   3. Its deprecated equivalent "GIT_REFERENCE_BACKEND".
2802
   *
2803
   *   4. Existing repository format. All the subsequent sources only
2804
   *      kick in when there is no repository yet.
2805
   *
2806
   *   4. The default ref storage format for new repositories as
2807
   *      configured via "GIT_DEFAULT_REF_STORAGE_FORMAT".
2808
   *
2809
   *   5. Its deprecated equivalent "GIT_DEFAULT_REF_FORMAT".
2810
   *
2811
   *   6. The default ref storage format for new repositories as
2812
   *      configured via "init.defaultRefStorageFormat" or its deprecated
2813
   *      equivalent "init.defaultRefFormat".
2814
   *
2815
   *   7. Otherwise, we fall back to the default ref storage format
2816
   *      compiled into Git.
2817
   */
2818
0
  if (ref_storage_format_uri) {
2819
0
    ref_storage_format = ref_storage_format_by_uri(ref_storage_format_uri,
2820
0
                     &ref_storage_payload);
2821
0
    if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2822
0
      die(_("unknown ref storage format specified via command line: '%s'"),
2823
0
          ref_storage_format_uri);
2824
0
  } else if ((env = getenv(GIT_REF_STORAGE_FORMAT_ENVIRONMENT))) {
2825
0
    ref_storage_format = ref_storage_format_by_uri(env, &ref_storage_payload);
2826
0
    if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2827
0
      die(_("unknown ref storage format specified via %s: '%s'"),
2828
0
          GIT_REF_STORAGE_FORMAT_ENVIRONMENT, env);
2829
0
  } else if ((env = getenv(GIT_REFERENCE_BACKEND_ENVIRONMENT))) {
2830
0
    ref_storage_format = ref_storage_format_by_uri(env, &ref_storage_payload);
2831
0
    if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2832
0
      die(_("unknown ref storage format specified via %s: '%s'"),
2833
0
          GIT_REFERENCE_BACKEND_ENVIRONMENT, env);
2834
0
  } else if (repo_fmt->version >= 0) {
2835
0
    ref_storage_format = repo_fmt->ref_storage_format;
2836
0
    ref_storage_payload = xstrdup_or_null(repo_fmt->ref_storage_payload);
2837
0
  } else if ((env = getenv("GIT_DEFAULT_REF_STORAGE_FORMAT"))) {
2838
0
    ref_storage_format = ref_storage_format_by_name(env);
2839
0
    if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2840
0
      die(_("unknown ref storage format specified via %s: '%s'"),
2841
0
          "GIT_DEFAULT_REF_STORAGE_FORMAT", env);
2842
0
  } else if ((env = getenv("GIT_DEFAULT_REF_FORMAT"))) {
2843
0
    ref_storage_format = ref_storage_format_by_name(env);
2844
0
    if (ref_storage_format == REF_STORAGE_FORMAT_UNKNOWN)
2845
0
      die(_("unknown ref storage format specified via %s: '%s'"),
2846
0
          "GIT_DEFAULT_REF_FORMAT", env);
2847
0
  } else if (cfg.ref_storage_format != REF_STORAGE_FORMAT_UNKNOWN) {
2848
0
    ref_storage_format = cfg.ref_storage_format;
2849
0
  } else {
2850
0
    ref_storage_format = REF_STORAGE_FORMAT_DEFAULT;
2851
0
  }
2852
2853
  /*
2854
   * If we have a preexisting repository we need to verify that its
2855
   * current ref storage format does not change.
2856
   */
2857
0
  if (repo_fmt->version >= 0) {
2858
0
    if (ref_storage_format != repo_fmt->ref_storage_format)
2859
0
      die(_("attempt to reinitialize repository with different reference storage format"));
2860
0
    if ((ref_storage_payload || repo_fmt->ref_storage_payload) &&
2861
0
        strcmp(ref_storage_payload ? ref_storage_payload : "",
2862
0
         repo_fmt->ref_storage_payload ? repo_fmt->ref_storage_payload : ""))
2863
0
      die(_("attempt to reinitialize repository with different reference storage payload"));
2864
0
  }
2865
2866
0
  free(repo_fmt->ref_storage_payload);
2867
0
  repo_fmt->ref_storage_format = ref_storage_format;
2868
0
  repo_fmt->ref_storage_payload = ref_storage_payload;
2869
0
}
2870
2871
void create_repository(struct repository *repo,
2872
           const char *git_dir,
2873
           const char *real_git_dir,
2874
           const char *worktree,
2875
           const char *template_dir,
2876
           int hash,
2877
           const char *ref_storage_format_uri,
2878
           int init_shared_repository,
2879
           int *reinit_ok)
2880
0
{
2881
0
  int reinit_ignored;
2882
0
  char *original_git_dir = real_pathdup(git_dir, 1);
2883
0
  struct repository_format repo_fmt = REPOSITORY_FORMAT_INIT;
2884
0
  struct strbuf err = STRBUF_INIT;
2885
2886
0
  if (real_git_dir) {
2887
0
    struct stat st;
2888
2889
0
    if (!reinit_ok && !stat(git_dir, &st))
2890
0
      die(_("%s already exists"), git_dir);
2891
2892
0
    if (!reinit_ok && !stat(real_git_dir, &st))
2893
0
      die(_("%s already exists"), real_git_dir);
2894
2895
0
    apply_and_export_relative_gitdir(repo, real_git_dir, 1);
2896
0
    git_dir = repo_get_git_dir(repo);
2897
0
    separate_git_dir(repo, git_dir, original_git_dir);
2898
0
  } else {
2899
0
    apply_and_export_relative_gitdir(repo, git_dir, 1);
2900
0
    git_dir = repo_get_git_dir(repo);
2901
0
  }
2902
2903
0
  if (worktree)
2904
0
    set_git_work_tree(repo, worktree);
2905
2906
  /*
2907
   * Check to see if the repository version is right.
2908
   * Note that a newly created repository does not have
2909
   * config file, so this will not fail.  What we are catching
2910
   * is an attempt to reinitialize new repository with an old tool.
2911
   */
2912
0
  read_and_verify_repository_format(&repo_fmt, repo_get_git_dir(repo), NULL);
2913
0
  repository_format_configure(&repo_fmt, hash, ref_storage_format_uri);
2914
0
  if (apply_repository_format(repo, &repo_fmt, APPLY_REPOSITORY_FORMAT_HONOR_ENV, &err) < 0)
2915
0
    die("%s", err.buf);
2916
2917
  /*
2918
   * Ensure `core.hidedotfiles` is processed. This must happen after we
2919
   * have set up the repository format such that we can evaluate
2920
   * includeIf conditions correctly in the case of re-initialization.
2921
   */
2922
0
  repo_config(repo, git_default_core_config, NULL);
2923
2924
0
  safe_create_dir(repo, git_dir, 0);
2925
2926
0
  if (!reinit_ok)
2927
0
    reinit_ok = &reinit_ignored;
2928
0
  *reinit_ok = create_default_files(repo, template_dir, original_git_dir,
2929
0
            &repo_fmt, init_shared_repository);
2930
2931
0
  if (repo_settings_get_shared_repository(repo)) {
2932
0
    char buf[10];
2933
    /* We do not spell "group" and such, so that
2934
     * the configuration can be read by older version
2935
     * of git. Note, we use octal numbers for new share modes,
2936
     * and compatibility values for PERM_GROUP and
2937
     * PERM_EVERYBODY.
2938
     */
2939
0
    if (repo_settings_get_shared_repository(repo) < 0)
2940
      /* force to the mode value */
2941
0
      xsnprintf(buf, sizeof(buf), "0%o", -repo_settings_get_shared_repository(repo));
2942
0
    else if (repo_settings_get_shared_repository(repo) == PERM_GROUP)
2943
0
      xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_GROUP);
2944
0
    else if (repo_settings_get_shared_repository(repo) == PERM_EVERYBODY)
2945
0
      xsnprintf(buf, sizeof(buf), "%d", OLD_PERM_EVERYBODY);
2946
0
    else
2947
0
      BUG("invalid value for shared_repository");
2948
0
    repo_config_set(repo, "core.sharedrepository", buf);
2949
0
    repo_config_set(repo, "receive.denyNonFastforwards", "true");
2950
0
  }
2951
2952
0
  clear_repository_format(&repo_fmt);
2953
0
  strbuf_release(&err);
2954
0
  free(original_git_dir);
2955
0
}