(doCreate bool)
| 837 | } |
| 838 | |
| 839 | func (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 | |
| 895 | func (d *DotGit) rewritePackedRefsWithoutRef(name plumbing.ReferenceName) (err error) { |
| 896 | pr, err := d.openAndLockPackedRefs(false) |
no test coverage detected