Add git.tag state; abstract out AbstractGitState class

This commit is contained in:
garrettmills 2020-03-05 12:15:00 -06:00
parent 9dc6f9d214
commit a6c0b5884a
No known key found for this signature in database
GPG Key ID: 6ACD58D6ADACFC6E
6 changed files with 61 additions and 19 deletions

View File

@ -50,10 +50,20 @@ class Repository extends Injectable {
await this._git_cmd(`commit -m "${message}"`)
}
async tag(label) {
async create_tag(label) {
await this._git_cmd(`tag "${label}"`)
}
async delete_tag(label) {
await this._git_cmd(`tag --delete "${label}"`)
}
async get_tag(label) {
const cd_cmd = await this._host.get_directory_change_command(this._path)
const cmd = `${cd_cmd} && git rev-parse "${label}"`
return await this._host.run_line_result(cmd)
}
async push(target = false, ref = false) {
await this._git_cmd(`push${target ? ' '+target : ''}${ref ? ' '+ref : ''} --tags`)
}

View File

@ -0,0 +1,14 @@
const State = require('../State')
const Repository = require('../../git/Repository')
class AbstractGitState extends State {
async _repo() {
const path = await this._host.get_path(this._config.path)
if ( !path.is_valid() ) await path.touch(true)
return new Repository(path)
}
}
module.exports = exports = AbstractGitState

View File

@ -1,7 +1,6 @@
const State = require('../State')
const Repository = require('../../git/Repository')
const AbstractGitState = require('./AbstractGitState')
class CheckoutState extends State {
class CheckoutState extends AbstractGitState {
static get services() {
return [...super.services, 'output']
}
@ -34,12 +33,6 @@ class CheckoutState extends State {
}
}
async _repo() {
const path = await this._host.get_path(this._config.path)
if ( !path.is_valid() ) await path.touch(true)
return new Repository(path)
}
}
module.exports = exports = CheckoutState

View File

@ -1,7 +1,6 @@
const State = require('../State')
const Repository = require('../../git/Repository')
const AbstractGitState = require('./AbstractGitState')
class CloneState extends State {
class CloneState extends AbstractGitState {
async apply() {
if ( !(await this.check()) ) {
@ -22,12 +21,6 @@ class CloneState extends State {
}
}
async _repo() {
const path = await this._host.get_path(this._config.path)
if ( !path.is_valid() ) await path.touch(true)
return new Repository(path)
}
}
module.exports = exports = CloneState

View File

@ -0,0 +1,31 @@
const AbstractGitState = require('./AbstractGitState')
class TagState extends AbstractGitState {
async apply() {
if ( !(await this.check()) ) {
const repo = await this._repo()
await repo.create_tag(this._config.tag)
}
}
async check() {
const repo = await this._repo()
try {
await repo.get_tag(this._config.tag)
return true
} catch (e) {
return false
}
}
async reverse() {
if ( await this.check() ) {
const repo = await this._repo()
await repo.delete_tag(this._config.tag)
}
}
}
module.exports = exports = TagState

View File

@ -25,6 +25,7 @@ class StatesService extends Service {
'git.clone': require('../classes/state/git/CloneState'),
'git.checkout': require('../classes/state/git/CheckoutState'),
'git.tag': require('../classes/state/git/TagState'),
'os.cmd': require('../classes/state/os/CommandState'),