Skip to content
This repository was archived by the owner on Oct 17, 2021. It is now read-only.

Commit 36a444e

Browse files
committed
Implement tagNames methods
Fix implementation of tag methods
1 parent 80338e5 commit 36a444e

File tree

4 files changed

+24
-8
lines changed

4 files changed

+24
-8
lines changed

Sources/Git/Extensions/Array+Extensions.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ import Clibgit2
22
import Foundation
33

44
extension Array where Element == String {
5+
init(_ git_strarray: git_strarray) {
6+
self.init((0..<git_strarray.count).map { String(validatingUTF8: git_strarray.strings[$0]!)! })
7+
}
8+
59
@discardableResult
610
func withGitStringArray<T>(_ body: (git_strarray) throws -> T) rethrows -> T {
711
let cStrings = UnsafeMutablePointer<UnsafeMutablePointer<CChar>?>.allocate(capacity: count)

Sources/Git/Remote.swift

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,9 +142,3 @@ extension Optional /*: internal RawRepresentable */ where Wrapped == Remote.Fetc
142142
}
143143
}
144144
}
145-
146-
fileprivate extension Array where Element == String {
147-
init(_ git_strarray: git_strarray) {
148-
self.init((0..<git_strarray.count).map { String(validatingUTF8: git_strarray.strings[$0]!)! })
149-
}
150-
}

Sources/Git/Repository.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,18 +210,31 @@ public final class Repository {
210210

211211
/// Creates a lightweight tag.
212212
public func tag(name: String, target: Object, force: Bool = false) throws {
213-
let name = try Reference.normalize(name: name)
214213
let _ = try Object.ID { oid in
215214
try attempt { git_tag_create_lightweight(oid, self.pointer, name, target.pointer, force ? 1 : 0) }
216215
}
217216
}
218217

219218
/// Creates an annotated tag.
220219
public func tag(name: String, target: Object, tagger: Signature? = nil, message: String, force: Bool = false) throws {
221-
let name = try Reference.normalize(name: name)
222220
var signature = try (tagger ?? Signature.default(for: self)).rawValue
223221
let _ = try Object.ID { oid in
224222
try attempt { git_tag_create(oid, self.pointer, name, target.pointer, &signature, message, force ? 1 : 0) }
225223
}
226224
}
225+
226+
public func tagNames() throws -> [String] {
227+
let pointer = UnsafeMutablePointer<git_strarray>.allocate(capacity: 1)
228+
defer { pointer.deallocate() }
229+
try attempt { git_tag_list(pointer, self.pointer) }
230+
return Array(pointer.pointee)
231+
}
232+
233+
public func tagNames(matching pattern: String) throws -> [String] {
234+
let pointer = UnsafeMutablePointer<git_strarray>.allocate(capacity: 1)
235+
defer { pointer.deallocate() }
236+
// let pattern = try Reference.normalize(name: pattern, format: .refspecPattern)
237+
try attempt { git_tag_list_match(pointer, pattern, self.pointer) }
238+
return Array(pointer.pointee)
239+
}
227240
}

Tests/GitTests/GitTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ final class GitTests: XCTestCase {
100100

101101
let note = try commit.add(note: #"{"test": true }"#, author: signature, committer: signature)
102102
XCTAssertNotNil(note?.message, #"{"test": true }"#)
103+
104+
try repository.tag(name: "0.0.1", target: commit)
105+
let names = try repository.tagNames()
106+
XCTAssertFalse(names.isEmpty)
107+
XCTAssert(names.contains("0.0.1"))
103108
}
104109
}
105110

0 commit comments

Comments
 (0)