|
8 | 8 | "io" |
9 | 9 |
|
10 | 10 | "code.gitea.io/gitea/modules/timeutil" |
| 11 | + |
| 12 | + "xorm.io/builder" |
11 | 13 | ) |
12 | 14 |
|
13 | 15 | // LFSMetaObject stores metadata for LFS tracked files. |
@@ -106,19 +108,91 @@ func (repo *Repository) GetLFSMetaObjectByOid(oid string) (*LFSMetaObject, error |
106 | 108 |
|
107 | 109 | // RemoveLFSMetaObjectByOid removes a LFSMetaObject entry from database by its OID. |
108 | 110 | // It may return ErrLFSObjectNotExist or a database error. |
109 | | -func (repo *Repository) RemoveLFSMetaObjectByOid(oid string) error { |
| 111 | +func (repo *Repository) RemoveLFSMetaObjectByOid(oid string) (int64, error) { |
110 | 112 | if len(oid) == 0 { |
111 | | - return ErrLFSObjectNotExist |
| 113 | + return 0, ErrLFSObjectNotExist |
112 | 114 | } |
113 | 115 |
|
114 | 116 | sess := x.NewSession() |
115 | 117 | defer sess.Close() |
116 | 118 | if err := sess.Begin(); err != nil { |
117 | | - return err |
| 119 | + return -1, err |
118 | 120 | } |
119 | 121 |
|
120 | 122 | m := &LFSMetaObject{Oid: oid, RepositoryID: repo.ID} |
121 | 123 | if _, err := sess.Delete(m); err != nil { |
| 124 | + return -1, err |
| 125 | + } |
| 126 | + |
| 127 | + count, err := sess.Count(&LFSMetaObject{Oid: oid}) |
| 128 | + if err != nil { |
| 129 | + return count, err |
| 130 | + } |
| 131 | + |
| 132 | + return count, sess.Commit() |
| 133 | +} |
| 134 | + |
| 135 | +// GetLFSMetaObjects returns all LFSMetaObjects associated with a repository |
| 136 | +func (repo *Repository) GetLFSMetaObjects(page, pageSize int) ([]*LFSMetaObject, error) { |
| 137 | + sess := x.NewSession() |
| 138 | + defer sess.Close() |
| 139 | + |
| 140 | + if page >= 0 && pageSize > 0 { |
| 141 | + start := 0 |
| 142 | + if page > 0 { |
| 143 | + start = (page - 1) * pageSize |
| 144 | + } |
| 145 | + sess.Limit(pageSize, start) |
| 146 | + } |
| 147 | + lfsObjects := make([]*LFSMetaObject, 0, pageSize) |
| 148 | + return lfsObjects, sess.Find(&lfsObjects, &LFSMetaObject{RepositoryID: repo.ID}) |
| 149 | +} |
| 150 | + |
| 151 | +// CountLFSMetaObjects returns a count of all LFSMetaObjects associated with a repository |
| 152 | +func (repo *Repository) CountLFSMetaObjects() (int64, error) { |
| 153 | + return x.Count(&LFSMetaObject{RepositoryID: repo.ID}) |
| 154 | +} |
| 155 | + |
| 156 | +// LFSObjectAccessible checks if a provided Oid is accessible to the user |
| 157 | +func LFSObjectAccessible(user *User, oid string) (bool, error) { |
| 158 | + if user.IsAdmin { |
| 159 | + count, err := x.Count(&LFSMetaObject{Oid: oid}) |
| 160 | + return (count > 0), err |
| 161 | + } |
| 162 | + cond := accessibleRepositoryCondition(user.ID) |
| 163 | + count, err := x.Where(cond).Join("INNER", "repository", "`lfs_meta_object`.repository_id = `repository`.id").Count(&LFSMetaObject{Oid: oid}) |
| 164 | + return (count > 0), err |
| 165 | +} |
| 166 | + |
| 167 | +// LFSAutoAssociate auto associates accessible LFSMetaObjects |
| 168 | +func LFSAutoAssociate(metas []*LFSMetaObject, user *User, repoID int64) error { |
| 169 | + sess := x.NewSession() |
| 170 | + defer sess.Close() |
| 171 | + if err := sess.Begin(); err != nil { |
| 172 | + return err |
| 173 | + } |
| 174 | + |
| 175 | + oids := make([]interface{}, len(metas)) |
| 176 | + oidMap := make(map[string]*LFSMetaObject, len(metas)) |
| 177 | + for i, meta := range metas { |
| 178 | + oids[i] = meta.Oid |
| 179 | + oidMap[meta.Oid] = meta |
| 180 | + } |
| 181 | + |
| 182 | + cond := builder.NewCond() |
| 183 | + if !user.IsAdmin { |
| 184 | + cond = builder.In("`lfs_meta_object`.repository_id", |
| 185 | + builder.Select("`repository`.id").From("repository").Where(accessibleRepositoryCondition(user.ID))) |
| 186 | + } |
| 187 | + newMetas := make([]*LFSMetaObject, 0, len(metas)) |
| 188 | + if err := sess.Cols("oid").Where(cond).In("oid", oids...).GroupBy("oid").Find(&newMetas); err != nil { |
| 189 | + return err |
| 190 | + } |
| 191 | + for i := range newMetas { |
| 192 | + newMetas[i].Size = oidMap[newMetas[i].Oid].Size |
| 193 | + newMetas[i].RepositoryID = repoID |
| 194 | + } |
| 195 | + if _, err := sess.InsertMulti(newMetas); err != nil { |
122 | 196 | return err |
123 | 197 | } |
124 | 198 |
|
|
0 commit comments