MCPcopy
hub / github.com/go-git/go-git / openAndLockPackedRefs

Method openAndLockPackedRefs

storage/filesystem/dotgit/dotgit.go:839–893  ·  view source on GitHub ↗
(doCreate bool)

Source from the content-addressed store, hash-verified

837}
838
839func (d *DotGit) openAndLockPackedRefs(doCreate bool) (
840 pr billy.File, err error,
841) {
842 var f billy.File
843 defer func() {
844 if err != nil && f != nil {
845 ioutil.CheckClose(f, &err)
846 }
847 }()
848
849 // File mode is retrieved from a constant defined in the target specific
850 // files (dotgit_rewrite_packed_refs_*). Some modes are not available
851 // in all filesystems.
852 openFlags := d.openAndLockPackedRefsMode()
853 if doCreate {
854 openFlags |= os.O_CREATE
855 }
856
857 // Keep trying to open and lock the file until we're sure the file
858 // didn't change between the open and the lock.
859 for {
860 f, err = d.fs.OpenFile(packedRefsPath, openFlags, 0600)
861 if err != nil {
862 if os.IsNotExist(err) && !doCreate {
863 return nil, nil
864 }
865
866 return nil, err
867 }
868 fi, err := d.fs.Stat(packedRefsPath)
869 if err != nil {
870 return nil, err
871 }
872 mtime := fi.ModTime()
873
874 err = f.Lock()
875 if err != nil {
876 return nil, err
877 }
878
879 fi, err = d.fs.Stat(packedRefsPath)
880 if err != nil {
881 return nil, err
882 }
883 if mtime.Equal(fi.ModTime()) {
884 break
885 }
886 // The file has changed since we opened it. Close and retry.
887 err = f.Close()
888 if err != nil {
889 return nil, err
890 }
891 }
892 return f, nil
893}
894
895func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err error) {
896 pr, err := d.openAndLockPackedRefs(false)

Callers 2

PackRefsMethod · 0.95

Calls 6

CheckCloseFunction · 0.92
ModTimeMethod · 0.80
StatMethod · 0.65
CloseMethod · 0.65
OpenFileMethod · 0.45

Tested by

no test coverage detected