add executable option to bzr module, refactor in doing so

reviewable/pr18780/r1
Skylar Saveland 11 years ago
parent 198c4702bd
commit 3f74c2d986

@ -50,6 +50,13 @@ options:
description: description:
- If C(yes), any modified files in the working - If C(yes), any modified files in the working
tree will be discarded. tree will be discarded.
executable:
required: false
default: null
version_added: "1.4"
description:
- Path to bzr executable to use. If not supplied,
the normal mechanism for resolving binary paths will be used.
''' '''
EXAMPLES = ''' EXAMPLES = '''
@ -58,67 +65,79 @@ EXAMPLES = '''
''' '''
import re import re
import tempfile
def get_version(dest):
class Bzr(object):
def __init__(self, module, parent, dest, version, bzr_path):
self.module = module
self.parent = parent
self.dest = dest
self.version = version
self.bzr_path = bzr_path
def _command(self, args_list, **kwargs):
(rc, out, err) = self.module.run_command(
[self.bzr_path] + args_list, **kwargs)
return (rc, out, err)
def get_version(self):
'''samples the version of the bzr branch''' '''samples the version of the bzr branch'''
os.chdir(dest) os.chdir(self.dest)
cmd = "bzr revno" cmd = "%s revno" % self.bzr_path
revno = os.popen(cmd).read().strip() revno = os.popen(cmd).read().strip()
return revno return revno
def clone(module, parent, dest, version): def clone(self):
'''makes a new bzr branch if it does not already exist''' '''makes a new bzr branch if it does not already exist'''
dest_dirname = os.path.dirname(dest) dest_dirname = os.path.dirname(self.dest)
try: try:
os.makedirs(dest_dirname) os.makedirs(dest_dirname)
except: except:
pass pass
os.chdir(dest_dirname) os.chdir(dest_dirname)
if version.lower() != 'head': if self.version.lower() != 'head':
cmd = "bzr branch -r %s %s %s" % (version, parent, dest) args_list = ["branch", "-r", self.version, self.parent, self.dest]
else: else:
cmd = "bzr branch %s %s" % (parent, dest) args_list = ["branch", self.parent, self.dest]
return module.run_command(cmd, check_rc=True) return self._command(args_list, check_rc=True)
def has_local_mods(dest): def has_local_mods(self):
os.chdir(dest) os.chdir(self.dest)
cmd = "bzr status -S" cmd = "%s status -S" % self.bzr_path
lines = os.popen(cmd).read().splitlines() lines = os.popen(cmd).read().splitlines()
lines = filter(lambda c: not re.search('^\\?\\?.*$', c), lines) lines = filter(lambda c: not re.search('^\\?\\?.*$', c), lines)
return len(lines) > 0 return len(lines) > 0
def reset(module,dest,force): def reset(self, force):
''' '''
Resets the index and working tree to head. Resets the index and working tree to head.
Discards any changes to tracked files in the working Discards any changes to tracked files in the working
tree since that commit. tree since that commit.
''' '''
os.chdir(dest) os.chdir(self.dest)
if not force and has_local_mods(dest): if not force and self.has_local_mods():
module.fail_json(msg="Local modifications exist in branch (force=no).") self.module.fail_json(msg="Local modifications exist in branch (force=no).")
return module.run_command("bzr revert", check_rc=True) return self._command(["revert"], check_rc=True)
def fetch(module, dest, version): def fetch(self):
'''updates branch from remote sources''' '''updates branch from remote sources'''
os.chdir(dest) os.chdir(self.dest)
if version.lower() != 'head': if self.version.lower() != 'head':
(rc, out, err) = module.run_command("bzr pull -r %s" % version) (rc, out, err) = self._command(["pull", "-r", self.version])
else: else:
(rc, out, err) = module.run_command("bzr pull") (rc, out, err) = self._command(["pull"])
if rc != 0: if rc != 0:
module.fail_json(msg="Failed to pull") self.module.fail_json(msg="Failed to pull")
return (rc, out, err) return (rc, out, err)
def switch_version(module, dest, version): def switch_version(self):
'''once pulled, switch to a particular revno or revid''' '''once pulled, switch to a particular revno or revid'''
os.chdir(dest) os.chdir(self.dest)
cmd = '' if self.version.lower() != 'head':
if version.lower() != 'head': args_list = ["revert", "-r", self.version]
cmd = "bzr revert -r %s" % version
else: else:
cmd = "bzr revert" args_list = ["revert"]
return module.run_command(cmd, check_rc=True) return self._command(args_list, check_rc=True)
# =========================================== # ===========================================
@ -128,7 +147,8 @@ def main():
dest=dict(required=True), dest=dict(required=True),
name=dict(required=True, aliases=['parent']), name=dict(required=True, aliases=['parent']),
version=dict(default='head'), version=dict(default='head'),
force=dict(default='yes', type='bool') force=dict(default='yes', type='bool'),
executable=dict(default=None),
) )
) )
@ -136,34 +156,38 @@ def main():
parent = module.params['name'] parent = module.params['name']
version = module.params['version'] version = module.params['version']
force = module.params['force'] force = module.params['force']
bzr_path = module.params['executable'] or module.get_bin_path('bzr', True)
bzrconfig = os.path.join(dest, '.bzr', 'branch', 'branch.conf') bzrconfig = os.path.join(dest, '.bzr', 'branch', 'branch.conf')
rc, out, err, status = (0, None, None, None) rc, out, err, status = (0, None, None, None)
bzr = Bzr(module, parent, dest, version, bzr_path)
# if there is no bzr configuration, do a branch operation # if there is no bzr configuration, do a branch operation
# else pull and switch the version # else pull and switch the version
before = None before = None
local_mods = False local_mods = False
if not os.path.exists(bzrconfig): if not os.path.exists(bzrconfig):
(rc, out, err) = clone(module, parent, dest, version) (rc, out, err) = bzr.clone()
else: else:
# else do a pull # else do a pull
local_mods = has_local_mods(dest) local_mods = bzr.has_local_mods()
before = get_version(dest) before = bzr.get_version()
(rc, out, err) = reset(module, dest, force) (rc, out, err) = bzr.reset(force)
if rc != 0: if rc != 0:
module.fail_json(msg=err) module.fail_json(msg=err)
(rc, out, err) = fetch(module, dest, version) (rc, out, err) = bzr.fetch()
if rc != 0: if rc != 0:
module.fail_json(msg=err) module.fail_json(msg=err)
# switch to version specified regardless of whether # switch to version specified regardless of whether
# we cloned or pulled # we cloned or pulled
(rc, out, err) = switch_version(module, dest, version) (rc, out, err) = bzr.switch_version()
# determine if we changed anything # determine if we changed anything
after = get_version(dest) after = bzr.get_version()
changed = False changed = False
if before != after or local_mods: if before != after or local_mods:

Loading…
Cancel
Save