| @@ -143,16 +143,16 @@ mod peel { · 142 unmodified lines |
| 143 | 143 | self.target = Target::Peeled(peeled); |
| 144 | 144 | Ok(peeled) |
| 145 | 145 | } |
| 146 | | − None => match self.target { |
| 147 | | − Target::Peeled(peeled) => Ok(peeled), |
| 148 | | − Target::Symbolic(_) => { |
| 146 | + None => { |
| 147 | + if self.target.kind() == crate::Kind::Symbolic { |
| 149 | 148 | let mut seen = BTreeSet::new(); |
| 150 | 149 | let cursor = &mut *self; |
| 151 | 150 | while let Some(next) = cursor.follow_symbolic(store, packed) { |
| 152 | | − *cursor = next?; |
| 153 | | − if seen.contains(&cursor.name) { |
| 151 | + let next = next?; |
| 152 | + if seen.contains(&next.name) { |
| 154 | 153 | return Err(peel::to_id::Error::Cycle(store.base.join(cursor.name.to_path()))); |
| 155 | 154 | } |
| 155 | + *cursor = next; |
| 156 | 156 | seen.insert(cursor.name.clone()); |
| 157 | 157 | const MAX_REF_DEPTH: usize = 5; |
| 158 | 158 | if seen.len() == MAX_REF_DEPTH { |
| @@ -161,31 +161,30 @@ mod peel { · 2 unmodified lines |
| 161 | 161 | }); |
| 162 | 162 | } |
| 163 | 163 | } |
| 164 | | − |
| 165 | | − let mut buf = Vec::new(); |
| 166 | | − let mut oid = self.target.as_id().expect("peeled ref").to_owned(); |
| 167 | | − self.target = Target::Peeled(loop { |
| 168 | | − let (kind, data) = find(oid, &mut buf) |
| 169 | | − .map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync + 'static>)? |
| 170 | | − .ok_or_else(|| peel::to_id::Error::NotFound { |
| 171 | | − oid, |
| 172 | | − name: self.name.0.clone(), |
| 164 | + }; |
| 165 | + let mut buf = Vec::new(); |
| 166 | + let mut oid = self.target.as_id().expect("peeled ref").to_owned(); |
| 167 | + self.target = Target::Peeled(loop { |
| 168 | + let (kind, data) = find(oid, &mut buf) |
| 169 | + .map_err(|err| Box::new(err) as Box<dyn std::error::Error + Send + Sync + 'static>)? |
| 170 | + .ok_or_else(|| peel::to_id::Error::NotFound { |
| 171 | + oid, |
| 172 | + name: self.name.0.clone(), |
| 173 | + })?; |
| 174 | + match kind { |
| 175 | + git_object::Kind::Tag => { |
| 176 | + oid = git_object::TagRefIter::from_bytes(data).target_id().ok_or_else(|| { |
| 177 | + peel::to_id::Error::NotFound { |
| 178 | + oid, |
| 179 | + name: self.name.0.clone(), |
| 180 | + } |
| 173 | 181 | })?; |
| 174 | | − match kind { |
| 175 | | − git_object::Kind::Tag => { |
| 176 | | − oid = git_object::TagRefIter::from_bytes(data).target_id().ok_or_else(|| { |
| 177 | | − peel::to_id::Error::NotFound { |
| 178 | | − oid, |
| 179 | | − name: self.name.0.clone(), |
| 180 | | − } |
| 181 | | − })?; |
| 182 | | − } |
| 183 | | − _ => break oid, |
| 184 | | − }; |
| 185 | | − }); |
| 186 | | − Ok(self.target.as_id().expect("to be peeled").to_owned()) |
| 187 | | − } |
| 188 | | − }, |
| 182 | + } |
| 183 | + _ => break oid, |
| 184 | + }; |
| 185 | + }); |
| 186 | + Ok(self.target.as_id().expect("to be peeled").to_owned()) |
| 187 | + } |
| 189 | 188 | } |
| 190 | 189 | } |
| 191 | 190 | |