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