Add git.clone and git.checkout states
This commit is contained in:
@@ -62,6 +62,20 @@ class Repository extends Injectable {
|
||||
await this._git_cmd(`checkout "${ref}"`)
|
||||
}
|
||||
|
||||
async current_branch() {
|
||||
const cd_cmd = await this._host.get_directory_change_command(this._path)
|
||||
const cmd = `${cd_cmd} && git symbolic-ref HEAD`
|
||||
const full_ref = await this._host.run_line_result(cmd)
|
||||
return full_ref.replace('refs/heads/', '')
|
||||
}
|
||||
|
||||
async current_ref() {
|
||||
const cd_cmd = await this._host.get_directory_change_command(this._path)
|
||||
const cmd = `${cd_cmd} && git show-ref HEAD`
|
||||
const ref = await this._host.run_line_result(cmd)
|
||||
return ref.split(' ')[0]
|
||||
}
|
||||
|
||||
async stash() {
|
||||
await this._git_cmd(`stash`)
|
||||
}
|
||||
|
||||
45
app/classes/state/git/CheckoutState.js
Normal file
45
app/classes/state/git/CheckoutState.js
Normal file
@@ -0,0 +1,45 @@
|
||||
const State = require('../State')
|
||||
const Repository = require('../../git/Repository')
|
||||
|
||||
class CheckoutState extends State {
|
||||
static get services() {
|
||||
return [...super.services, 'output']
|
||||
}
|
||||
|
||||
async apply() {
|
||||
if ( !(await this.check()) ) {
|
||||
const repo = await this._repo()
|
||||
await repo.checkout(this._config.target)
|
||||
}
|
||||
}
|
||||
|
||||
async check() {
|
||||
const repo = await this._repo()
|
||||
const target = await this._config.target
|
||||
try {
|
||||
if ( (await repo.current_branch()) === target ) return true
|
||||
if ( (await repo.current_ref()) === target ) return true
|
||||
} catch (e) {}
|
||||
return false
|
||||
}
|
||||
|
||||
async reverse() {
|
||||
if ( this._config.revert_to ) {
|
||||
if ( await this.check() ) {
|
||||
const repo = await this._repo()
|
||||
await repo.checkout(this._config.revert_to)
|
||||
}
|
||||
} else {
|
||||
this.output.warn('Checkout state does not currently support automatic reversal. Specify the revert_to config key to enable.')
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
33
app/classes/state/git/CloneState.js
Normal file
33
app/classes/state/git/CloneState.js
Normal file
@@ -0,0 +1,33 @@
|
||||
const State = require('../State')
|
||||
const Repository = require('../../git/Repository')
|
||||
|
||||
class CloneState extends State {
|
||||
|
||||
async apply() {
|
||||
if ( !(await this.check()) ) {
|
||||
const repo = await this._repo()
|
||||
await repo.clone(this._config.source)
|
||||
}
|
||||
}
|
||||
|
||||
async check() {
|
||||
const repo = await this._repo()
|
||||
return repo.is_repo()
|
||||
}
|
||||
|
||||
async reverse() {
|
||||
if ( await this.check() ) {
|
||||
const path = await this._host.get_path(this._config.path)
|
||||
await path.unlink()
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
@@ -18,6 +18,8 @@ class CommandState extends State {
|
||||
if ( this._config.reverse ) {
|
||||
const cmd = `${this._config.reverse}`
|
||||
await this._host.run(cmd)
|
||||
} else {
|
||||
this.output.warn(`No reversal command specified for Command State. Nothing was changed. (Host: ${this._host.name})`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user