aboutsummaryrefslogtreecommitdiff
path: root/t/t6023-merge-file.sh
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2017-09-25 10:00:11 +0200
committerJunio C Hamano <gitster@pobox.com>2017-09-25 18:02:45 +0900
commit02b920f3f79422582793c9b4801baf91f2f64344 (patch)
tree88c2afb484ee78e112ce8e5dcd441668d6e7c9ef /t/t6023-merge-file.sh
parent5b633610ec7a6c10f55e4758b047892652da8e05 (diff)
downloadgit-02b920f3f79422582793c9b4801baf91f2f64344.tar.gz
git-02b920f3f79422582793c9b4801baf91f2f64344.tar.xz
read_packed_refs(): ensure that references are ordered when read
It doesn't actually matter now, because the references are only iterated over to fill the associated `ref_cache`, which itself puts them in the correct order. But we want to get rid of the `ref_cache`, so we want to be able to iterate directly over the `packed-refs` buffer, and then the iteration will need to be ordered correctly. In fact, we already write the `packed-refs` file sorted, but it is possible that other Git clients don't get it right. So let's not assume that a `packed-refs` file is sorted unless it is explicitly declared to be so via a `sorted` trait in its header line. If it is *not* declared to be sorted, then scan quickly through the file to check. If it is found to be out of order, then sort the records into a new memory-only copy. This checking and sorting is done quickly, without parsing the full file contents. However, it needs a little bit of care to avoid reading past the end of the buffer even if the `packed-refs` file is corrupt. Since *we* always write the file correctly sorted, include that trait when we write or rewrite a `packed-refs` file. This means that the scan described in the previous paragraph should only have to be done for `packed-refs` files that were written by older versions of the Git command-line client, or by other clients that haven't yet learned to write the `sorted` trait. If `packed-refs` was already sorted, then (if the system allows it) we can use the mmapped file contents directly. But if the system doesn't allow a file that is currently mmapped to be replaced using `rename()`, then it would be bad for us to keep the file mmapped for any longer than necessary. So, on such systems, always make a copy of the file contents, either as part of the sorting process, or afterwards. Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t6023-merge-file.sh')
0 files changed, 0 insertions, 0 deletions