createNewObjectPack is a helper for RepackObjects taking care of creating a new pack. It is used so the PackfileWriter deferred close has the right scope.
(cfg *RepackConfig)
| 1830 | // of creating a new pack. It is used so the PackfileWriter |
| 1831 | // deferred close has the right scope. |
| 1832 | func (r *Repository) createNewObjectPack(cfg *RepackConfig) (h plumbing.Hash, err error) { |
| 1833 | ow := newObjectWalker(r.Storer) |
| 1834 | err = ow.walkAllRefs() |
| 1835 | if err != nil { |
| 1836 | return h, err |
| 1837 | } |
| 1838 | objs := make([]plumbing.Hash, 0, len(ow.seen)) |
| 1839 | for h := range ow.seen { |
| 1840 | objs = append(objs, h) |
| 1841 | } |
| 1842 | pfw, ok := r.Storer.(storer.PackfileWriter) |
| 1843 | if !ok { |
| 1844 | return h, fmt.Errorf("Repository storer is not a storer.PackfileWriter") |
| 1845 | } |
| 1846 | wc, err := pfw.PackfileWriter() |
| 1847 | if err != nil { |
| 1848 | return h, err |
| 1849 | } |
| 1850 | defer ioutil.CheckClose(wc, &err) |
| 1851 | scfg, err := r.Config() |
| 1852 | if err != nil { |
| 1853 | return h, err |
| 1854 | } |
| 1855 | enc := packfile.NewEncoder(wc, r.Storer, cfg.UseRefDeltas) |
| 1856 | h, err = enc.Encode(objs, scfg.Pack.Window) |
| 1857 | if err != nil { |
| 1858 | return h, err |
| 1859 | } |
| 1860 | |
| 1861 | // Delete the packed, loose objects. |
| 1862 | if los, ok := r.Storer.(storer.LooseObjectStorer); ok { |
| 1863 | err = los.ForEachObjectHash(func(hash plumbing.Hash) error { |
| 1864 | if ow.isSeen(hash) { |
| 1865 | err = los.DeleteLooseObject(hash) |
| 1866 | if err != nil { |
| 1867 | return err |
| 1868 | } |
| 1869 | } |
| 1870 | return nil |
| 1871 | }) |
| 1872 | if err != nil { |
| 1873 | return h, err |
| 1874 | } |
| 1875 | } |
| 1876 | |
| 1877 | return h, err |
| 1878 | } |
| 1879 | |
| 1880 | func expandPartialHash(st storer.EncodedObjectStorer, prefix []byte) (hashes []plumbing.Hash) { |
| 1881 | // The fast version is implemented by storage/filesystem.ObjectStorage. |
no test coverage detected