FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
git/cache.h at master · shashankkumar/git · GitHub
shashankkumar
/
git
Public
forked from
git/git
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
git
/
cache.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
1336 lines (1175 loc) · 47.7 KB
Breadcrumbs
git
/
cache.h
Copy path
File metadata and controls
1336 lines (1175 loc) · 47.7 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#ifndef
CACHE_H
#define
CACHE_H
#include
"git-compat-util.h"
#include
"strbuf.h"
#include
"hash.h"
#include
"advice.h"
#include
"gettext.h"
#include
"convert.h"
#include
SHA1_HEADER
#ifndef
git_SHA_CTX
#define
git_SHA_CTX
SHA_CTX
#define
git_SHA1_Init
SHA1_Init
#define
git_SHA1_Update
SHA1_Update
#define
git_SHA1_Final
SHA1_Final
#endif
#include
<zlib.h>
typedef
struct
git_zstream
{
z_stream
z
;
unsigned long
avail_in
;
unsigned long
avail_out
;
unsigned long
total_in
;
unsigned long
total_out
;
unsigned
char
*
next_in
;
unsigned
char
*
next_out
;
}
git_zstream
;
void
git_inflate_init
(
git_zstream
*
);
void
git_inflate_init_gzip_only
(
git_zstream
*
);
void
git_inflate_end
(
git_zstream
*
);
int
git_inflate
(
git_zstream
*
,
int
flush
);
void
git_deflate_init
(
git_zstream
*
,
int
level
);
void
git_deflate_init_gzip
(
git_zstream
*
,
int
level
);
void
git_deflate_init_raw
(
git_zstream
*
,
int
level
);
void
git_deflate_end
(
git_zstream
*
);
int
git_deflate_abort
(
git_zstream
*
);
int
git_deflate_end_gently
(
git_zstream
*
);
int
git_deflate
(
git_zstream
*
,
int
flush
);
unsigned long
git_deflate_bound
(
git_zstream
*
,
unsigned long
);
#if
defined(
DT_UNKNOWN
)
&&
!defined(
NO_D_TYPE_IN_DIRENT
)
#define
DTYPE
(
de
) ((de)->d_type)
#else
#undef
DT_UNKNOWN
#undef
DT_DIR
#undef
DT_REG
#undef
DT_LNK
#define
DT_UNKNOWN
0
#define
DT_DIR
1
#define
DT_REG
2
#define
DT_LNK
3
#define
DTYPE
(
de
) DT_UNKNOWN
#endif
/* unknown mode (impossible combination S_IFIFO|S_IFCHR) */
#define
S_IFINVALID
0030000
/*
* A "directory link" is a link to another git directory.
*
* The value 0160000 is not normally a valid mode, and
* also just happens to be S_IFDIR + S_IFLNK
*
* NOTE! We *really* shouldn't depend on the S_IFxxx macros
* always having the same values everywhere. We should use
* our internal git values for these things, and then we can
* translate that to the OS-specific value. It just so
* happens that everybody shares the same bit representation
* in the UNIX world (and apparently wider too..)
*/
#define
S_IFGITLINK
0160000
#define
S_ISGITLINK
(
m
) (((m) & S_IFMT) == S_IFGITLINK)
/*
* Intensive research over the course of many years has shown that
* port 9418 is totally unused by anything else. Or
*
* Your search - "port 9418" - did not match any documents.
*
* as www.google.com puts it.
*
* This port has been properly assigned for git use by IANA:
* git (Assigned-9418) [I06-050728-0001].
*
* git 9418/tcp git pack transfer service
* git 9418/udp git pack transfer service
*
* with Linus Torvalds <torvalds@osdl.org> as the point of
* contact. September 2005.
*
* See http://www.iana.org/assignments/port-numbers
*/
#define
DEFAULT_GIT_PORT
9418
/*
* Basic data structures for the directory cache
*/
#define
CACHE_SIGNATURE
0x44495243
/* "DIRC" */
struct
cache_header
{
uint32_t
hdr_signature
;
uint32_t
hdr_version
;
uint32_t
hdr_entries
;
};
#define
INDEX_FORMAT_LB
2
#define
INDEX_FORMAT_UB
4
/*
* The "cache_time" is just the low 32 bits of the
* time. It doesn't matter if it overflows - we only
* check it for equality in the 32 bits we save.
*/
struct
cache_time
{
uint32_t
sec
;
uint32_t
nsec
;
};
struct
stat_data
{
struct
cache_time
sd_ctime
;
struct
cache_time
sd_mtime
;
unsigned
int
sd_dev
;
unsigned
int
sd_ino
;
unsigned
int
sd_uid
;
unsigned
int
sd_gid
;
unsigned
int
sd_size
;
};
struct
cache_entry
{
struct
stat_data
ce_stat_data
;
unsigned
int
ce_mode
;
unsigned
int
ce_flags
;
unsigned
int
ce_namelen
;
unsigned
char
sha1
[
20
];
struct
cache_entry
*
next
;
char
name
[
FLEX_ARRAY
];
/* more */
};
#define
CE_STAGEMASK
(0x3000)
#define
CE_EXTENDED
(0x4000)
#define
CE_VALID
(0x8000)
#define
CE_STAGESHIFT
12
/*
* Range 0xFFFF0000 in ce_flags is divided into
* two parts: in-memory flags and on-disk ones.
* Flags in CE_EXTENDED_FLAGS will get saved on-disk
* if you want to save a new flag, add it in
* CE_EXTENDED_FLAGS
*
* In-memory only flags
*/
#define
CE_UPDATE
(1 << 16)
#define
CE_REMOVE
(1 << 17)
#define
CE_UPTODATE
(1 << 18)
#define
CE_ADDED
(1 << 19)
#define
CE_HASHED
(1 << 20)
#define
CE_UNHASHED
(1 << 21)
#define
CE_WT_REMOVE
(1 << 22)
/* remove in work directory */
#define
CE_CONFLICTED
(1 << 23)
#define
CE_UNPACKED
(1 << 24)
#define
CE_NEW_SKIP_WORKTREE
(1 << 25)
/* used to temporarily mark paths matched by pathspecs */
#define
CE_MATCHED
(1 << 26)
/*
* Extended on-disk flags
*/
#define
CE_INTENT_TO_ADD
(1 << 29)
#define
CE_SKIP_WORKTREE
(1 << 30)
/* CE_EXTENDED2 is for future extension */
#define
CE_EXTENDED2
(1 << 31)
#define
CE_EXTENDED_FLAGS
(CE_INTENT_TO_ADD | CE_SKIP_WORKTREE)
/*
* Safeguard to avoid saving wrong flags:
* - CE_EXTENDED2 won't get saved until its semantic is known
* - Bits in 0x0000FFFF have been saved in ce_flags already
* - Bits in 0x003F0000 are currently in-memory flags
*/
#if
CE_EXTENDED_FLAGS
&
0x803FFFFF
#error
"CE_EXTENDED_FLAGS out of range"
#endif
struct
pathspec
;
/*
* Copy the sha1 and stat state of a cache entry from one to
* another. But we never change the name, or the hash state!
*/
#define
CE_STATE_MASK
(CE_HASHED | CE_UNHASHED)
static
inline
void
copy_cache_entry
(
struct
cache_entry
*
dst
,
const
struct
cache_entry
*
src
)
{
unsigned
int
state
=
dst
->
ce_flags
&
CE_STATE_MASK
;
/* Don't copy hash chain and name */
memcpy
(
dst
,
src
, offsetof(
struct
cache_entry
,
next
));
/* Restore the hash state */
dst
->
ce_flags
=
(
dst
->
ce_flags
&
~
CE_STATE_MASK
) |
state
;
}
static
inline
unsigned
create_ce_flags
(
unsigned
stage
)
{
return
(
stage
<<
CE_STAGESHIFT
);
}
#define
ce_namelen
(
ce
) ((ce)->ce_namelen)
#define
ce_size
(
ce
) cache_entry_size(ce_namelen(ce))
#define
ce_stage
(
ce
) ((CE_STAGEMASK & (ce)->ce_flags) >> CE_STAGESHIFT)
#define
ce_uptodate
(
ce
) ((ce)->ce_flags & CE_UPTODATE)
#define
ce_skip_worktree
(
ce
) ((ce)->ce_flags & CE_SKIP_WORKTREE)
#define
ce_mark_uptodate
(
ce
) ((ce)->ce_flags |= CE_UPTODATE)
#define
ce_permissions
(
mode
) (((mode) & 0100) ? 0755 : 0644)
static
inline
unsigned
int
create_ce_mode
(
unsigned
int
mode
)
{
if
(
S_ISLNK
(
mode
))
return
S_IFLNK
;
if
(
S_ISDIR
(
mode
)
||
S_ISGITLINK
(
mode
))
return
S_IFGITLINK
;
return
S_IFREG
|
ce_permissions
(
mode
);
}
static
inline
unsigned
int
ce_mode_from_stat
(
const
struct
cache_entry
*
ce
,
unsigned
int
mode
)
{
extern
int
trust_executable_bit
,
has_symlinks
;
if
(!
has_symlinks
&&
S_ISREG
(
mode
)
&&
ce
&&
S_ISLNK
(
ce
->
ce_mode
))
return
ce
->
ce_mode
;
if
(!
trust_executable_bit
&&
S_ISREG
(
mode
)) {
if
(
ce
&&
S_ISREG
(
ce
->
ce_mode
))
return
ce
->
ce_mode
;
return
create_ce_mode
(
0666
);
}
return
create_ce_mode
(
mode
);
}
static
inline
int
ce_to_dtype
(
const
struct
cache_entry
*
ce
)
{
unsigned
ce_mode
=
ntohl
(
ce
->
ce_mode
);
if
(
S_ISREG
(
ce_mode
))
return
DT_REG
;
else
if
(
S_ISDIR
(
ce_mode
)
||
S_ISGITLINK
(
ce_mode
))
return
DT_DIR
;
else
if
(
S_ISLNK
(
ce_mode
))
return
DT_LNK
;
else
return
DT_UNKNOWN
;
}
static
inline
unsigned
int
canon_mode
(
unsigned
int
mode
)
{
if
(
S_ISREG
(
mode
))
return
S_IFREG
|
ce_permissions
(
mode
);
if
(
S_ISLNK
(
mode
))
return
S_IFLNK
;
if
(
S_ISDIR
(
mode
))
return
S_IFDIR
;
return
S_IFGITLINK
;
}
#define
cache_entry_size
(
len
) (offsetof(struct cache_entry,name) + (len) + 1)
struct
index_state
{
struct
cache_entry
*
*
cache
;
unsigned
int
version
;
unsigned
int
cache_nr
,
cache_alloc
,
cache_changed
;
struct
string_list
*
resolve_undo
;
struct
cache_tree
*
cache_tree
;
struct
cache_time
timestamp
;
unsigned
name_hash_initialized
:
1
,
initialized
:
1
;
struct
hash_table
name_hash
;
struct
hash_table
dir_hash
;
};
extern
struct
index_state
the_index
;
/* Name hashing */
extern
void
add_name_hash
(
struct
index_state
*
istate
,
struct
cache_entry
*
ce
);
extern
void
remove_name_hash
(
struct
index_state
*
istate
,
struct
cache_entry
*
ce
);
extern
void
free_name_hash
(
struct
index_state
*
istate
);
#ifndef
NO_THE_INDEX_COMPATIBILITY_MACROS
#define
active_cache
(the_index.cache)
#define
active_nr
(the_index.cache_nr)
#define
active_alloc
(the_index.cache_alloc)
#define
active_cache_changed
(the_index.cache_changed)
#define
active_cache_tree
(the_index.cache_tree)
#define
read_cache
() read_index(&the_index)
#define
read_cache_from
(
path
) read_index_from(&the_index, (path))
#define
read_cache_preload
(
pathspec
) read_index_preload(&the_index, (pathspec))
#define
is_cache_unborn
() is_index_unborn(&the_index)
#define
read_cache_unmerged
() read_index_unmerged(&the_index)
#define
write_cache
(
newfd
,
cache
,
entries
) write_index(&the_index, (newfd))
#define
discard_cache
() discard_index(&the_index)
#define
unmerged_cache
() unmerged_index(&the_index)
#define
cache_name_pos
(
name
,
namelen
) index_name_pos(&the_index,(name),(namelen))
#define
add_cache_entry
(
ce
,
option
) add_index_entry(&the_index, (ce), (option))
#define
rename_cache_entry_at
(
pos
,
new_name
) rename_index_entry_at(&the_index, (pos), (new_name))
#define
remove_cache_entry_at
(
pos
) remove_index_entry_at(&the_index, (pos))
#define
remove_file_from_cache
(
path
) remove_file_from_index(&the_index, (path))
#define
add_to_cache
(
path
,
st
,
flags
) add_to_index(&the_index, (path), (st), (flags))
#define
add_file_to_cache
(
path
,
flags
) add_file_to_index(&the_index, (path), (flags))
#define
refresh_cache
(
flags
) refresh_index(&the_index, (flags), NULL, NULL, NULL)
#define
ce_match_stat
(
ce
,
st
,
options
) ie_match_stat(&the_index, (ce), (st), (options))
#define
ce_modified
(
ce
,
st
,
options
) ie_modified(&the_index, (ce), (st), (options))
#define
cache_dir_exists
(
name
,
namelen
) index_dir_exists(&the_index, (name), (namelen))
#define
cache_file_exists
(
name
,
namelen
,
igncase
) index_file_exists(&the_index, (name), (namelen), (igncase))
#define
cache_name_exists
(
name
,
namelen
,
igncase
) index_name_exists(&the_index, (name), (namelen), (igncase))
#define
cache_name_is_other
(
name
,
namelen
) index_name_is_other(&the_index, (name), (namelen))
#define
resolve_undo_clear
() resolve_undo_clear_index(&the_index)
#define
unmerge_cache_entry_at
(
at
) unmerge_index_entry_at(&the_index, at)
#define
unmerge_cache
(
pathspec
) unmerge_index(&the_index, pathspec)
#define
read_blob_data_from_cache
(
path
,
sz
) read_blob_data_from_index(&the_index, (path), (sz))
#endif
enum
object_type
{
OBJ_BAD
=
-1
,
OBJ_NONE
=
0
,
OBJ_COMMIT
=
1
,
OBJ_TREE
=
2
,
OBJ_BLOB
=
3
,
OBJ_TAG
=
4
,
/* 5 for future expansion */
OBJ_OFS_DELTA
=
6
,
OBJ_REF_DELTA
=
7
,
OBJ_ANY
,
OBJ_MAX
};
static
inline
enum
object_type
object_type
(
unsigned
int
mode
)
{
return
S_ISDIR
(
mode
) ?
OBJ_TREE
:
S_ISGITLINK
(
mode
) ?
OBJ_COMMIT
:
OBJ_BLOB
;
}
/* Double-check local_repo_env below if you add to this list. */
#define
GIT_DIR_ENVIRONMENT
"GIT_DIR"
#define
GIT_NAMESPACE_ENVIRONMENT
"GIT_NAMESPACE"
#define
GIT_WORK_TREE_ENVIRONMENT
"GIT_WORK_TREE"
#define
GIT_PREFIX_ENVIRONMENT
"GIT_PREFIX"
#define
DEFAULT_GIT_DIR_ENVIRONMENT
".git"
#define
DB_ENVIRONMENT
"GIT_OBJECT_DIRECTORY"
#define
INDEX_ENVIRONMENT
"GIT_INDEX_FILE"
#define
GRAFT_ENVIRONMENT
"GIT_GRAFT_FILE"
#define
TEMPLATE_DIR_ENVIRONMENT
"GIT_TEMPLATE_DIR"
#define
CONFIG_ENVIRONMENT
"GIT_CONFIG"
#define
CONFIG_DATA_ENVIRONMENT
"GIT_CONFIG_PARAMETERS"
#define
EXEC_PATH_ENVIRONMENT
"GIT_EXEC_PATH"
#define
CEILING_DIRECTORIES_ENVIRONMENT
"GIT_CEILING_DIRECTORIES"
#define
NO_REPLACE_OBJECTS_ENVIRONMENT
"GIT_NO_REPLACE_OBJECTS"
#define
GITATTRIBUTES_FILE
".gitattributes"
#define
INFOATTRIBUTES_FILE
"info/attributes"
#define
ATTRIBUTE_MACRO_PREFIX
"[attr]"
#define
GIT_NOTES_REF_ENVIRONMENT
"GIT_NOTES_REF"
#define
GIT_NOTES_DEFAULT_REF
"refs/notes/commits"
#define
GIT_NOTES_DISPLAY_REF_ENVIRONMENT
"GIT_NOTES_DISPLAY_REF"
#define
GIT_NOTES_REWRITE_REF_ENVIRONMENT
"GIT_NOTES_REWRITE_REF"
#define
GIT_NOTES_REWRITE_MODE_ENVIRONMENT
"GIT_NOTES_REWRITE_MODE"
#define
GIT_LITERAL_PATHSPECS_ENVIRONMENT
"GIT_LITERAL_PATHSPECS"
#define
GIT_GLOB_PATHSPECS_ENVIRONMENT
"GIT_GLOB_PATHSPECS"
#define
GIT_NOGLOB_PATHSPECS_ENVIRONMENT
"GIT_NOGLOB_PATHSPECS"
#define
GIT_ICASE_PATHSPECS_ENVIRONMENT
"GIT_ICASE_PATHSPECS"
/*
* This environment variable is expected to contain a boolean indicating
* whether we should or should not treat:
*
* GIT_DIR=foo.git git ...
*
* as if GIT_WORK_TREE=. was given. It's not expected that users will make use
* of this, but we use it internally to communicate to sub-processes that we
* are in a bare repo. If not set, defaults to true.
*/
#define
GIT_IMPLICIT_WORK_TREE_ENVIRONMENT
"GIT_IMPLICIT_WORK_TREE"
/*
* Repository-local GIT_* environment variables; these will be cleared
* when git spawns a sub-process that runs inside another repository.
* The array is NULL-terminated, which makes it easy to pass in the "env"
* parameter of a run-command invocation, or to do a simple walk.
*/
extern
const
char
*
const
local_repo_env
[];
extern
int
is_bare_repository_cfg
;
extern
int
is_bare_repository
(
void
);
extern
int
is_inside_git_dir
(
void
);
extern
char
*
git_work_tree_cfg
;
extern
int
is_inside_work_tree
(
void
);
extern
const
char
*
get_git_dir
(
void
);
extern
int
is_git_directory
(
const
char
*
path
);
extern
char
*
get_object_directory
(
void
);
extern
char
*
get_index_file
(
void
);
extern
char
*
get_graft_file
(
void
);
extern
int
set_git_dir
(
const
char
*
path
);
extern
const
char
*
get_git_namespace
(
void
);
extern
const
char
*
strip_namespace
(
const
char
*
namespaced_ref
);
extern
const
char
*
get_git_work_tree
(
void
);
extern
const
char
*
read_gitfile
(
const
char
*
path
);
extern
const
char
*
resolve_gitdir
(
const
char
*
suspect
);
extern
void
set_git_work_tree
(
const
char
*
tree
);
#define
ALTERNATE_DB_ENVIRONMENT
"GIT_ALTERNATE_OBJECT_DIRECTORIES"
extern
const
char
*
*
get_pathspec
(
const
char
*
prefix
,
const
char
*
*
pathspec
);
extern
void
setup_work_tree
(
void
);
extern
const
char
*
setup_git_directory_gently
(
int
*
);
extern
const
char
*
setup_git_directory
(
void
);
extern
char
*
prefix_path
(
const
char
*
prefix
,
int
len
,
const
char
*
path
);
extern
char
*
prefix_path_gently
(
const
char
*
prefix
,
int
len
,
int
*
remaining
,
const
char
*
path
);
extern
const
char
*
prefix_filename
(
const
char
*
prefix
,
int
len
,
const
char
*
path
);
extern
int
check_filename
(
const
char
*
prefix
,
const
char
*
name
);
extern
void
verify_filename
(
const
char
*
prefix
,
const
char
*
name
,
int
diagnose_misspelt_rev
);
extern
void
verify_non_filename
(
const
char
*
prefix
,
const
char
*
name
);
extern
int
path_inside_repo
(
const
char
*
prefix
,
const
char
*
path
);
#define
INIT_DB_QUIET
0x0001
extern
int
set_git_dir_init
(
const
char
*
git_dir
,
const
char
*
real_git_dir
,
int
);
extern
int
init_db
(
const
char
*
template_dir
,
unsigned
int
flags
);
extern
void
sanitize_stdfds
(
void
);
#define
alloc_nr
(
x
) (((x)+16)*3/2)
/*
* Realloc the buffer pointed at by variable 'x' so that it can hold
* at least 'nr' entries; the number of entries currently allocated
* is 'alloc', using the standard growing factor alloc_nr() macro.
*
* DO NOT USE any expression with side-effect for 'x', 'nr', or 'alloc'.
*/
#define
ALLOC_GROW
(
x
,
nr
,
alloc
) \
do { \
if ((nr) > alloc) { \
if (alloc_nr(alloc) < (nr)) \
alloc = (nr); \
else \
alloc = alloc_nr(alloc); \
x = xrealloc((x), alloc * sizeof(*(x))); \
} \
} while (0)
/* Initialize and use the cache information */
extern
int
read_index
(
struct
index_state
*
);
extern
int
read_index_preload
(
struct
index_state
*
,
const
struct
pathspec
*
pathspec
);
extern
int
read_index_from
(
struct
index_state
*
,
const
char
*
path
);
extern
int
is_index_unborn
(
struct
index_state
*
);
extern
int
read_index_unmerged
(
struct
index_state
*
);
extern
int
write_index
(
struct
index_state
*
,
int
newfd
);
extern
int
discard_index
(
struct
index_state
*
);
extern
int
unmerged_index
(
const
struct
index_state
*
);
extern
int
verify_path
(
const
char
*
path
);
extern
struct
cache_entry
*
index_dir_exists
(
struct
index_state
*
istate
,
const
char
*
name
,
int
namelen
);
extern
struct
cache_entry
*
index_file_exists
(
struct
index_state
*
istate
,
const
char
*
name
,
int
namelen
,
int
igncase
);
extern
struct
cache_entry
*
index_name_exists
(
struct
index_state
*
istate
,
const
char
*
name
,
int
namelen
,
int
igncase
);
extern
int
index_name_pos
(
const
struct
index_state
*
,
const
char
*
name
,
int
namelen
);
#define
ADD_CACHE_OK_TO_ADD
1
/* Ok to add */
#define
ADD_CACHE_OK_TO_REPLACE
2
/* Ok to replace file/directory */
#define
ADD_CACHE_SKIP_DFCHECK
4
/* Ok to skip DF conflict checks */
#define
ADD_CACHE_JUST_APPEND
8
/* Append only; tree.c::read_tree() */
#define
ADD_CACHE_NEW_ONLY
16
/* Do not replace existing ones */
extern
int
add_index_entry
(
struct
index_state
*
,
struct
cache_entry
*
ce
,
int
option
);
extern
void
rename_index_entry_at
(
struct
index_state
*
,
int
pos
,
const
char
*
new_name
);
extern
int
remove_index_entry_at
(
struct
index_state
*
,
int
pos
);
extern
void
remove_marked_cache_entries
(
struct
index_state
*
istate
);
extern
int
remove_file_from_index
(
struct
index_state
*
,
const
char
*
path
);
#define
ADD_CACHE_VERBOSE
1
#define
ADD_CACHE_PRETEND
2
#define
ADD_CACHE_IGNORE_ERRORS
4
#define
ADD_CACHE_IGNORE_REMOVAL
8
#define
ADD_CACHE_INTENT
16
#define
ADD_CACHE_IMPLICIT_DOT
32
/* internal to "git add -u/-A" */
extern
int
add_to_index
(
struct
index_state
*
,
const
char
*
path
,
struct
stat
*
,
int
flags
);
extern
int
add_file_to_index
(
struct
index_state
*
,
const
char
*
path
,
int
flags
);
extern
struct
cache_entry
*
make_cache_entry
(
unsigned
int
mode
,
const
unsigned
char
*
sha1
,
const
char
*
path
,
int
stage
,
int
refresh
);
extern
int
ce_same_name
(
const
struct
cache_entry
*
a
,
const
struct
cache_entry
*
b
);
extern
int
index_name_is_other
(
const
struct
index_state
*
,
const
char
*
,
int
);
extern
void
*
read_blob_data_from_index
(
struct
index_state
*
,
const
char
*
,
unsigned long
*
);
/* do stat comparison even if CE_VALID is true */
#define
CE_MATCH_IGNORE_VALID
01
/* do not check the contents but report dirty on racily-clean entries */
#define
CE_MATCH_RACY_IS_DIRTY
02
/* do stat comparison even if CE_SKIP_WORKTREE is true */
#define
CE_MATCH_IGNORE_SKIP_WORKTREE
04
extern
int
ie_match_stat
(
const
struct
index_state
*
,
const
struct
cache_entry
*
,
struct
stat
*
,
unsigned
int
);
extern
int
ie_modified
(
const
struct
index_state
*
,
const
struct
cache_entry
*
,
struct
stat
*
,
unsigned
int
);
extern
int
ce_path_match
(
const
struct
cache_entry
*
ce
,
const
struct
pathspec
*
pathspec
);
#define
HASH_WRITE_OBJECT
1
#define
HASH_FORMAT_CHECK
2
extern
int
index_fd
(
unsigned
char
*
sha1
,
int
fd
,
struct
stat
*
st
,
enum
object_type
type
,
const
char
*
path
,
unsigned
flags
);
extern
int
index_path
(
unsigned
char
*
sha1
,
const
char
*
path
,
struct
stat
*
st
,
unsigned
flags
);
/*
* Record to sd the data from st that we use to check whether a file
* might have changed.
*/
extern
void
fill_stat_data
(
struct
stat_data
*
sd
,
struct
stat
*
st
);
/*
* Return 0 if st is consistent with a file not having been changed
* since sd was filled. If there are differences, return a
* combination of MTIME_CHANGED, CTIME_CHANGED, OWNER_CHANGED,
* INODE_CHANGED, and DATA_CHANGED.
*/
extern
int
match_stat_data
(
const
struct
stat_data
*
sd
,
struct
stat
*
st
);
extern
void
fill_stat_cache_info
(
struct
cache_entry
*
ce
,
struct
stat
*
st
);
#define
REFRESH_REALLY
0x0001
/* ignore_valid */
#define
REFRESH_UNMERGED
0x0002
/* allow unmerged */
#define
REFRESH_QUIET
0x0004
/* be quiet about it */
#define
REFRESH_IGNORE_MISSING
0x0008
/* ignore non-existent */
#define
REFRESH_IGNORE_SUBMODULES
0x0010
/* ignore submodules */
#define
REFRESH_IN_PORCELAIN
0x0020
/* user friendly output, not "needs update" */
extern
int
refresh_index
(
struct
index_state
*
,
unsigned
int
flags
,
const
struct
pathspec
*
pathspec
,
char
*
seen
,
const
char
*
header_msg
);
struct
lock_file
{
struct
lock_file
*
next
;
int
fd
;
pid_t
owner
;
char
on_list
;
char
filename
[
PATH_MAX
];
};
#define
LOCK_DIE_ON_ERROR
1
#define
LOCK_NODEREF
2
extern
int
unable_to_lock_error
(
const
char
*
path
,
int
err
);
extern
NORETURN
void
unable_to_lock_index_die
(
const
char
*
path
,
int
err
);
extern
int
hold_lock_file_for_update
(
struct
lock_file
*
,
const
char
*
path
,
int
);
extern
int
hold_lock_file_for_append
(
struct
lock_file
*
,
const
char
*
path
,
int
);
extern
int
commit_lock_file
(
struct
lock_file
*
);
extern
void
update_index_if_able
(
struct
index_state
*
,
struct
lock_file
*
);
extern
int
hold_locked_index
(
struct
lock_file
*
,
int
);
extern
int
commit_locked_index
(
struct
lock_file
*
);
extern
void
set_alternate_index_output
(
const
char
*
);
extern
int
close_lock_file
(
struct
lock_file
*
);
extern
void
rollback_lock_file
(
struct
lock_file
*
);
extern
int
delete_ref
(
const
char
*
,
const
unsigned
char
*
sha1
,
int
delopt
);
/* Environment bits from configuration mechanism */
extern
int
trust_executable_bit
;
extern
int
trust_ctime
;
extern
int
check_stat
;
extern
int
quote_path_fully
;
extern
int
has_symlinks
;
extern
int
minimum_abbrev
,
default_abbrev
;
extern
int
ignore_case
;
extern
int
assume_unchanged
;
extern
int
prefer_symlink_refs
;
extern
int
log_all_ref_updates
;
extern
int
warn_ambiguous_refs
;
extern
int
warn_on_object_refname_ambiguity
;
extern
int
shared_repository
;
extern
const
char
*
apply_default_whitespace
;
extern
const
char
*
apply_default_ignorewhitespace
;
extern
const
char
*
git_attributes_file
;
extern
int
zlib_compression_level
;
extern
int
core_compression_level
;
extern
int
core_compression_seen
;
extern
size_t
packed_git_window_size
;
extern
size_t
packed_git_limit
;
extern
size_t
delta_base_cache_limit
;
extern
unsigned long
big_file_threshold
;
extern
unsigned long
pack_size_limit_cfg
;
extern
int
read_replace_refs
;
extern
int
fsync_object_files
;
extern
int
core_preload_index
;
extern
int
core_apply_sparse_checkout
;
extern
int
precomposed_unicode
;
/*
* The character that begins a commented line in user-editable file
* that is subject to stripspace.
*/
extern
char
comment_line_char
;
enum
branch_track
{
BRANCH_TRACK_UNSPECIFIED
=
-1
,
BRANCH_TRACK_NEVER
=
0
,
BRANCH_TRACK_REMOTE
,
BRANCH_TRACK_ALWAYS
,
BRANCH_TRACK_EXPLICIT
,
BRANCH_TRACK_OVERRIDE
};
enum
rebase_setup_type
{
AUTOREBASE_NEVER
=
0
,
AUTOREBASE_LOCAL
,
AUTOREBASE_REMOTE
,
AUTOREBASE_ALWAYS
};
enum
push_default_type
{
PUSH_DEFAULT_NOTHING
=
0
,
PUSH_DEFAULT_MATCHING
,
PUSH_DEFAULT_SIMPLE
,
PUSH_DEFAULT_UPSTREAM
,
PUSH_DEFAULT_CURRENT
,
PUSH_DEFAULT_UNSPECIFIED
};
extern
enum
branch_track
git_branch_track
;
extern
enum
rebase_setup_type
autorebase
;
extern
enum
push_default_type
push_default
;
enum
object_creation_mode
{
OBJECT_CREATION_USES_HARDLINKS
=
0
,
OBJECT_CREATION_USES_RENAMES
=
1
};
extern
enum
object_creation_mode
object_creation_mode
;
extern
char
*
notes_ref_name
;
extern
int
grafts_replace_parents
;
#define
GIT_REPO_VERSION
0
extern
int
repository_format_version
;
extern
int
check_repository_format
(
void
);
#define
MTIME_CHANGED
0x0001
#define
CTIME_CHANGED
0x0002
#define
OWNER_CHANGED
0x0004
#define
MODE_CHANGED
0x0008
#define
INODE_CHANGED
0x0010
#define
DATA_CHANGED
0x0020
#define
TYPE_CHANGED
0x0040
extern
char
*
mksnpath
(
char
*
buf
,
size_t
n
,
const
char
*
fmt
, ...)
__attribute__((
format
(
printf
,
3
,
4
)));
extern
char
*
git_snpath
(
char
*
buf
,
size_t
n
,
const
char
*
fmt
, ...)
__attribute__((
format
(
printf
,
3
,
4
)));
extern
char
*
git_pathdup
(
const
char
*
fmt
, ...)
__attribute__((
format
(
printf
,
1
,
2
)));
extern
char
*
mkpathdup
(
const
char
*
fmt
, ...)
__attribute__((
format
(
printf
,
1
,
2
)));
/* Return a statically allocated filename matching the sha1 signature */
extern
char
*
mkpath
(
const
char
*
fmt
, ...) __attribute__((
format
(
printf
,
1
,
2
)));
extern
char
*
git_path
(
const
char
*
fmt
, ...) __attribute__((
format
(
printf
,
1
,
2
)));
extern
char
*
git_path_submodule
(
const
char
*
path
,
const
char
*
fmt
, ...)
__attribute__((
format
(
printf
,
2
,
3
)));
extern
char
*
sha1_file_name
(
const
unsigned
char
*
sha1
);
extern
char
*
sha1_pack_name
(
const
unsigned
char
*
sha1
);
extern
char
*
sha1_pack_index_name
(
const
unsigned
char
*
sha1
);
extern
const
char
*
find_unique_abbrev
(
const
unsigned
char
*
sha1
,
int
);
extern
const
unsigned
char
null_sha1
[
20
];
static
inline
int
hashcmp
(
const
unsigned
char
*
sha1
,
const
unsigned
char
*
sha2
)
{
int
i
;
for
(
i
=
0
;
i
<
20
;
i
++
,
sha1
++
,
sha2
++
) {
if
(
*
sha1
!=
*
sha2
)
return
*
sha1
-
*
sha2
;
}
return
0
;
}
static
inline
int
is_null_sha1
(
const
unsigned
char
*
sha1
)
{
return
!
hashcmp
(
sha1
,
null_sha1
);
}
static
inline
void
hashcpy
(
unsigned
char
*
sha_dst
,
const
unsigned
char
*
sha_src
)
{
memcpy
(
sha_dst
,
sha_src
,
20
);
}
static
inline
void
hashclr
(
unsigned
char
*
hash
)
{
memset
(
hash
,
0
,
20
);
}
#define
EMPTY_TREE_SHA1_HEX
\
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
#define
EMPTY_TREE_SHA1_BIN_LITERAL
\
"\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60" \
"\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04"
#define
EMPTY_TREE_SHA1_BIN
\
((const unsigned char *) EMPTY_TREE_SHA1_BIN_LITERAL)
#define
EMPTY_BLOB_SHA1_HEX
\
"e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
#define
EMPTY_BLOB_SHA1_BIN_LITERAL
\
"\xe6\x9d\xe2\x9b\xb2\xd1\xd6\x43\x4b\x8b" \
"\x29\xae\x77\x5a\xd8\xc2\xe4\x8c\x53\x91"
#define
EMPTY_BLOB_SHA1_BIN
\
((const unsigned char *) EMPTY_BLOB_SHA1_BIN_LITERAL)
static
inline
int
is_empty_blob_sha1
(
const
unsigned
char
*
sha1
)
{
return
!
hashcmp
(
sha1
,
EMPTY_BLOB_SHA1_BIN
);
}
int
git_mkstemp
(
char
*
path
,
size_t
n
,
const
char
*
template
);
int
git_mkstemps
(
char
*
path
,
size_t
n
,
const
char
*
template
,
int
suffix_len
);
/* set default permissions by passing mode arguments to open(2) */
int
git_mkstemps_mode
(
char
*
pattern
,
int
suffix_len
,
int
mode
);
int
git_mkstemp_mode
(
char
*
pattern
,
int
mode
);
/*
* NOTE NOTE NOTE!!
*
* PERM_UMASK, OLD_PERM_GROUP and OLD_PERM_EVERYBODY enumerations must
* not be changed. Old repositories have core.sharedrepository written in
* numeric format, and therefore these values are preserved for compatibility
* reasons.
*/
enum
sharedrepo
{
PERM_UMASK
=
0
,
OLD_PERM_GROUP
=
1
,
OLD_PERM_EVERYBODY
=
2
,
PERM_GROUP
=
0660
,
PERM_EVERYBODY
=
0664
};
int
git_config_perm
(
const
char
*
var
,
const
char
*
value
);
int
adjust_shared_perm
(
const
char
*
path
);
int
safe_create_leading_directories
(
char
*
path
);
int
safe_create_leading_directories_const
(
const
char
*
path
);
int
mkdir_in_gitdir
(
const
char
*
path
);
extern
void
home_config_paths
(
char
*
*
global
,
char
*
*
xdg
,
char
*
file
);
extern
char
*
expand_user_path
(
const
char
*
path
);
const
char
*
enter_repo
(
const
char
*
path
,
int
strict
);
static
inline
int
is_absolute_path
(
const
char
*
path
)
{
return
is_dir_sep
(
path
[
0
])
||
has_dos_drive_prefix
(
path
);
}
int
is_directory
(
const
char
*
);
const
char
*
real_path
(
const
char
*
path
);
const
char
*
real_path_if_valid
(
const
char
*
path
);
const
char
*
absolute_path
(
const
char
*
path
);
const
char
*
remove_leading_path
(
const
char
*
in
,
const
char
*
prefix
);
const
char
*
relative_path
(
const
char
*
in
,
const
char
*
prefix
,
struct
strbuf
*
sb
);
int
normalize_path_copy_len
(
char
*
dst
,
const
char
*
src
,
int
*
prefix_len
);
int
normalize_path_copy
(
char
*
dst
,
const
char
*
src
);
int
longest_ancestor_length
(
const
char
*
path
,
struct
string_list
*
prefixes
);
char
*
strip_path_suffix
(
const
char
*
path
,
const
char
*
suffix
);
int
daemon_avoid_alias
(
const
char
*
path
);
int
offset_1st_component
(
const
char
*
path
);
/* object replacement */
#define
READ_SHA1_FILE_REPLACE
1
extern
void
*
read_sha1_file_extended
(
const
unsigned
char
*
sha1
,
enum
object_type
*
type
,
unsigned long
*
size
,
unsigned
flag
);
static
inline
void
*
read_sha1_file
(
const
unsigned
char
*
sha1
,
enum
object_type
*
type
,
unsigned long
*
size
)
{
return
read_sha1_file_extended
(
sha1
,
type
,
size
,
READ_SHA1_FILE_REPLACE
);
}
extern
const
unsigned
char
*
do_lookup_replace_object
(
const
unsigned
char
*
sha1
);
static
inline
const
unsigned
char
*
lookup_replace_object
(
const
unsigned
char
*
sha1
)
{
if
(!
read_replace_refs
)
return
sha1
;
return
do_lookup_replace_object
(
sha1
);
}
/* Read and unpack a sha1 file into memory, write memory to a sha1 file */
extern
int
sha1_object_info
(
const
unsigned
char
*
,
unsigned long
*
);
extern
int
hash_sha1_file
(
const
void
*
buf
,
unsigned long
len
,
const
char
*
type
,
unsigned
char
*
sha1
);
extern
int
write_sha1_file
(
const
void
*
buf
,
unsigned long
len
,
const
char
*
type
,
unsigned
char
*
return_sha1
);
extern
int
pretend_sha1_file
(
void
*
,
unsigned long
,
enum
object_type
,
unsigned
char
*
);
extern
int
force_object_loose
(
const
unsigned
char
*
sha1
,
time_t
mtime
);
extern
void
*
map_sha1_file
(
const
unsigned
char
*
sha1
,
unsigned long
*
size
);
extern
int
unpack_sha1_header
(
git_zstream
*
stream
,
unsigned
char
*
map
,
unsigned long
mapsize
,
void
*
buffer
,
unsigned long
bufsiz
);
extern
int
parse_sha1_header
(
const
char
*
hdr
,
unsigned long
*
sizep
);
/* global flag to enable extra checks when accessing packed objects */
extern
int
do_check_packed_object_crc
;
extern
int
check_sha1_signature
(
const
unsigned
char
*
sha1
,
void
*
buf
,
unsigned long
size
,
const
char
*
type
);
extern
int
move_temp_to_file
(
const
char
*
tmpfile
,
const
char
*
filename
);
extern
int
has_sha1_pack
(
const
unsigned
char
*
sha1
);
extern
int
has_sha1_file
(
const
unsigned
char
*
sha1
);
extern
int
has_loose_object_nonlocal
(
const
unsigned
char
*
sha1
);
extern
int
has_pack_index
(
const
unsigned
char
*
sha1
);
extern
void
assert_sha1_type
(
const
unsigned
char
*
sha1
,
enum
object_type
expect
);
extern
const
signed
char
hexval_table
[
256
];
static
inline
unsigned
int
hexval
(
unsigned
char
c
)
{
return
hexval_table
[
c
];
}
/* Convert to/from hex/sha1 representation */
#define
MINIMUM_ABBREV
minimum_abbrev
#define
DEFAULT_ABBREV
default_abbrev
struct
object_context
{
unsigned
char
tree
[
20
];
char
path
[
PATH_MAX
];
unsigned
mode
;
};
#define
GET_SHA1_QUIETLY
01
#define
GET_SHA1_COMMIT
02
#define
GET_SHA1_COMMITTISH
04
#define
GET_SHA1_TREE
010
#define
GET_SHA1_TREEISH
020
#define
GET_SHA1_BLOB
040
#define
GET_SHA1_ONLY_TO_DIE
04000
extern
int
get_sha1
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
get_sha1_commit
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
get_sha1_committish
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
get_sha1_tree
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
get_sha1_treeish
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
get_sha1_blob
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
void
maybe_die_on_misspelt_object_name
(
const
char
*
name
,
const
char
*
prefix
);
extern
int
get_sha1_with_context
(
const
char
*
str
,
unsigned
flags
,
unsigned
char
*
sha1
,
struct
object_context
*
orc
);
typedef
int
each_abbrev_fn
(
const
unsigned
char
*
sha1
,
void
*
);
extern
int
for_each_abbrev
(
const
char
*
prefix
,
each_abbrev_fn
,
void
*
);
/*
* Try to read a SHA1 in hexadecimal format from the 40 characters
* starting at hex. Write the 20-byte result to sha1 in binary form.
* Return 0 on success. Reading stops if a NUL is encountered in the
* input, so it is safe to pass this function an arbitrary
* null-terminated string.
*/
extern
int
get_sha1_hex
(
const
char
*
hex
,
unsigned
char
*
sha1
);
extern
char
*
sha1_to_hex
(
const
unsigned
char
*
sha1
);
/* static buffer result! */
extern
int
read_ref_full
(
const
char
*
refname
,
unsigned
char
*
sha1
,
int
reading
,
int
*
flags
);
extern
int
read_ref
(
const
char
*
refname
,
unsigned
char
*
sha1
);
/*
* Resolve a reference, recursively following symbolic refererences.
*
* Store the referred-to object's name in sha1 and return the name of
* the non-symbolic reference that ultimately pointed at it. The
* return value, if not NULL, is a pointer into either a static buffer
* or the input ref.
*
* If the reference cannot be resolved to an object, the behavior
* depends on the "reading" argument:
*
* - If reading is set, return NULL.
*
* - If reading is not set, clear sha1 and return the name of the last
* reference name in the chain, which will either be a non-symbolic
* reference or an undefined reference. If this is a prelude to
* "writing" to the ref, the return value is the name of the ref
* that will actually be created or changed.
*
* If flag is non-NULL, set the value that it points to the
* combination of REF_ISPACKED (if the reference was found among the
* packed references) and REF_ISSYMREF (if the initial reference was a
* symbolic reference).
*
* If ref is not a properly-formatted, normalized reference, return
* NULL. If more than MAXDEPTH recursive symbolic lookups are needed,
* give up and return NULL.
*
* errno is sometimes set on errors, but not always.
*/
extern
const
char
*
resolve_ref_unsafe
(
const
char
*
ref
,
unsigned
char
*
sha1
,
int
reading
,
int
*
flag
);
extern
char
*
resolve_refdup
(
const
char
*
ref
,
unsigned
char
*
sha1
,
int
reading
,
int
*
flag
);
extern
int
dwim_ref
(
const
char
*
str
,
int
len
,
unsigned
char
*
sha1
,
char
*
*
ref
);
extern
int
dwim_log
(
const
char
*
str
,
int
len
,
unsigned
char
*
sha1
,
char
*
*
ref
);
extern
int
interpret_branch_name
(
const
char
*
str
,
int
len
,
struct
strbuf
*
);
extern
int
get_sha1_mb
(
const
char
*
str
,
unsigned
char
*
sha1
);
extern
int
refname_match
(
const
char
*
abbrev_name
,
const
char
*
full_name
,
const
char
*
*
rules
);
extern
const
char
*
ref_rev_parse_rules
[];
#define
ref_fetch_rules
ref_rev_parse_rules
extern
int
create_symref
(
const
char
*
ref
,
const
char
*
refs_heads_master
,
const
char
*
logmsg
);
extern
int
validate_headref
(
const
char
*
ref
);
extern
int
base_name_compare
(
const
char
*
name1
,
int
len1
,
int
mode1
,
const
char
*
name2
,
int
len2
,
int
mode2
);
extern
int
df_name_compare
(
const
char
*
name1
,
int
len1
,
int
mode1
,
const
char
*
name2
,
int
len2
,
int
mode2
);
extern
int
cache_name_compare
(
const
char
*
name1
,
int
len1
,
const
char
*
name2
,
int
len2
);
extern
int
cache_name_stage_compare
(
const
char
*
name1
,
int
len1
,
int
stage1
,
const
char
*
name2
,
int
len2
,
int
stage2
);
extern
void
*
read_object_with_reference
(
const
unsigned
char
*
sha1
,
const
char
*
required_type
,
unsigned long
*
size
,
unsigned
char
*
sha1_ret
);
extern
struct
object
*
peel_to_type
(
const
char
*
name
,
int
namelen
,
struct
object
*
o
,
enum
object_type
);
enum
date_mode
{
DATE_NORMAL
=
0
,
DATE_RELATIVE
,
DATE_SHORT
,
DATE_LOCAL
,
DATE_ISO8601
,
DATE_RFC2822
,
DATE_RAW
};
const
char
*
show_date
(
unsigned long
time
,
int
timezone
,
enum
date_mode
mode
);
void
show_date_relative
(
unsigned long
time
,
int
tz
,
const
struct
timeval
*
now
,
struct
strbuf
*
timebuf
);
int
parse_date
(
const
char
*
date
,
char
*
buf
,
int
bufsize
);
int
parse_date_basic
(
const
char
*
date
,
unsigned long
*
timestamp
,
int
*
offset
);
int
parse_expiry_date
(
const
char
*
date
,
unsigned long
*
timestamp
);
void
datestamp
(
char
*
buf
,
int
bufsize
);
#define
approxidate
(
s
) approxidate_careful((s), NULL)
unsigned long
approxidate_careful
(
const
char
*
,
int
*
);
unsigned long
approxidate_relative
(
const
char
*
date
,
const
struct
timeval
*
now
);
enum
date_mode
parse_date_format
(
const
char
*
format
);
#define
IDENT_STRICT
1
#define
IDENT_NO_DATE
2
#define
IDENT_NO_NAME
4
extern
const
char
*
git_author_info
(
int
);
extern
const
char
*
git_committer_info
(
int
);
extern
const
char
*
fmt_ident
(
const
char
*
name
,
const
char
*
email
,
const
char
*
date_str
,
int
);
extern
const
char
*
fmt_name
(
const
char
*
name
,
const
char
*
email
);
extern
const
char
*
ident_default_email
(
void
);
extern
const
char
*
git_editor
(
void
);
extern
const
char
*
git_pager
(
int
stdout_is_tty
);
extern
int
git_ident_config
(
const
char
*
,
const
char
*
,
void
*
);
struct
ident_split
{
const
char
*
name_begin
;
const
char
*
name_end
;
const
char
*
mail_begin
;
const
char
*
mail_end
;
const
char
*
date_begin
;
const
char
*
date_end
;
const
char
*
tz_begin
;
const
char
*
tz_end
;
};
/*
* Signals an success with 0, but time part of the result may be NULL
* if the input lacks timestamp and zone
*/
extern
int
split_ident_line
(
struct
ident_split
*
,
const
char
*
,
int
);
/*
* Compare split idents for equality or strict ordering. Note that we
* compare only the ident part of the line, ignoring any timestamp.
*
* Because there are two fields, we must choose one as the primary key; we
* currently arbitrarily pick the email.
*/
extern
int
ident_cmp
(
const
struct
ident_split
*
,
const
struct
ident_split
*
);
struct
checkout
{
const
char
*
base_dir
;
int
base_dir_len
;
unsigned
force
:
1
,
quiet
:
1
,
not_new
:
1
,
refresh_cache
:
1
;
};
#define
TEMPORARY_FILENAME_LENGTH
25
extern
int
checkout_entry
(
struct
cache_entry
*
ce
,
const
struct
checkout
*
state
,
char
*
topath
);
struct
cache_def
{
char
path
[
PATH_MAX
+
1
];
int
len
;
int
flags
;
int
track_flags
;
int
prefix_len_stat_func
;
};
extern
int
has_symlink_leading_path
(
const
char
*
name
,
int
len
);
extern
int
threaded_has_symlink_leading_path
(
struct
cache_def
*
,
const
char
*
,
int
);
extern
int
check_leading_path
(
const
char
*
name
,
int
len
);
extern
int
has_dirs_only_path
(
const
char
*
name
,
int
len
,
int
prefix_len
);
extern
void
schedule_dir_for_removal
(
const
char
*
name
,
int
len
);
extern
void
remove_scheduled_dirs
(
void
);
extern
struct
alternate_object_database
{
struct
alternate_object_database
*
next
;
char
*
name
;
char
base
[
FLEX_ARRAY
];
/* more */
}
*
alt_odb_list
;
View remainder of file in raw view
Back
|
FazBrowse Home
|
New Git URL